Skip to content

Commit 9ec66b5

Browse files
authored
Log media_id when mounting tapemedia (#2325)
* Log media_id when mounting tapemedia * Update tests with slot medium_id
1 parent 380ad60 commit 9ec66b5

File tree

5 files changed

+54
-52
lines changed

5 files changed

+54
-52
lines changed

ESSArch_Core/storage/tape.py

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,84 +31,86 @@
3131

3232

3333
@retry(reraise=True, stop=stop_after_attempt(5), wait=wait_fixed(60))
34-
def mount_tape(robot, slot, drive):
34+
def mount_tape(robot, slot, drive, media_id='?'):
3535
"""
3636
Mounts tape from slot into drive
3737
3838
Args:
3939
robot: The device used to mount the tape
4040
slot: Which slot to load from
4141
drive: Which drive to load to
42+
media_id: The id for the medium, e.g. barcode (only for logging)
4243
"""
4344

4445
logger = logging.getLogger('essarch.storage.tape')
4546
cmd = 'mtx -f %s load %d %d' % (robot, slot, drive)
4647
p = Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE, universal_newlines=True)
4748
logger.debug(
48-
'Mounting tape from {slot} to {drive} using {robot}: {cmd}'.format(
49-
slot=slot, drive=drive, robot=robot, cmd=cmd
49+
'Mounting tape {media_id} from {slot} to {drive} using {robot}: {cmd}'.format(
50+
media_id=media_id, slot=slot, drive=drive, robot=robot, cmd=cmd
5051
)
5152
)
5253
out, err = p.communicate()
5354

5455
if p.returncode:
5556
if re.match(r'Drive \d+ Full \(Storage Element \d+ loaded\)', err):
5657
logger.warning(
57-
'Tried to mount already mounted tape from {slot} to {drive} using {robot}'.format(
58-
slot=slot, drive=drive, robot=robot
58+
'Tried to mount already mounted tape {media_id} from {slot} to {drive} using {robot}'.format(
59+
media_id=media_id, slot=slot, drive=drive, robot=robot
5960
)
6061
)
6162
raise TapeMountedError(err)
6263

6364
logger.error(
64-
'Failed to mount tape from {slot} to {drive} using {robot}, err: {err}, returncode: {rcode}'.format(
65-
slot=slot, drive=drive, robot=robot, err=err, rcode=p.returncode
66-
)
65+
'Failed to mount tape {media_id} from {slot} to {drive} using {robot}, err: {err}, returncode: \
66+
{rcode}'.format(media_id=media_id, slot=slot, drive=drive, robot=robot, err=err, rcode=p.returncode)
6767
)
6868
raise RobotMountException('%s, return code: %s' % (err, p.returncode))
6969

70-
logger.info('Mounted tape from {slot} to {drive} using {robot}'.format(slot=slot, drive=drive, robot=robot))
70+
logger.info('Mounted tape {media_id} from {slot} to {drive} using {robot}'.format(
71+
media_id=media_id, slot=slot, drive=drive, robot=robot))
7172
return out
7273

7374

7475
@retry(reraise=True, stop=stop_after_attempt(5), wait=wait_fixed(60))
75-
def unmount_tape(robot, slot, drive):
76+
def unmount_tape(robot, slot, drive, media_id='?'):
7677
"""
7778
Unmounts tape from drive into slot
7879
7980
Args:
8081
robot: The device used to unmount the tape
8182
slot: Which slot to unload to
8283
drive: Which drive to load from
84+
media_id: The id for the medium, e.g. barcode (only for logging)
8385
"""
8486

8587
logger = logging.getLogger('essarch.storage.tape')
8688
cmd = 'mtx -f %s unload %d %d' % (robot, slot, drive)
8789
p = Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE, universal_newlines=True)
8890
logger.debug(
89-
'Unmounting tape from {drive} to {slot} using {robot}: {cmd}'.format(
90-
drive=drive, slot=slot, robot=robot, cmd=cmd
91+
'Unmounting tape {media_id} from {drive} to {slot} using {robot}: {cmd}'.format(
92+
media_id=media_id, drive=drive, slot=slot, robot=robot, cmd=cmd
9193
)
9294
)
9395
out, err = p.communicate()
9496

9597
if p.returncode:
9698
if re.match(r'Data Transfer Element \d+ is Empty', err):
9799
logger.warning(
98-
'Tried to unmount already unmounted tape from {drive} to {slot} using {robot}'.format(
99-
drive=drive, slot=slot, robot=robot
100+
'Tried to unmount already unmounted tape {media_id} from {drive} to {slot} using {robot}'.format(
101+
media_id=media_id, drive=drive, slot=slot, robot=robot
100102
)
101103
)
102104
raise TapeUnmountedError(err)
103105

104106
logger.error(
105-
'Failed to unmount tape from {drive} to {slot} using {robot}, err: {err}, returncode: {rcode}'.format(
106-
drive=drive, slot=slot, robot=robot, err=err, rcode=p.returncode
107-
)
107+
'Failed to unmount tape {media_id} from {drive} to {slot} using {robot}, err: {err}, returncode: \
108+
{rcode}'.format(media_id=media_id, drive=drive, slot=slot, robot=robot, err=err, rcode=p.returncode)
108109
)
109110
raise RobotUnmountException('%s, return code: %s' % (err, p.returncode))
110111

111-
logger.info('Unmounted tape from {drive} to {slot} using {robot}'.format(drive=drive, slot=slot, robot=robot))
112+
logger.info('Unmounted tape {media_id} from {drive} to {slot} using {robot}'.format(
113+
media_id=media_id, drive=drive, slot=slot, robot=robot))
112114
return out
113115

114116

ESSArch_Core/tasks.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -611,23 +611,23 @@ def DownloadFile(self, src=None, dst=None):
611611

612612

613613
@app.task(bind=True, queue='io_tape', event_type=40200)
614-
def MountTape(self, medium_id, drive_id=None, timeout=120):
615-
if drive_id is None:
614+
def MountTape(self, medium_pk, drive_pk=None, timeout=120):
615+
if drive_pk is None:
616616
drive = TapeDrive.objects.filter(
617617
status=20, storage_medium__isnull=True, io_queue_entry__isnull=True, locked=False,
618618
).order_by('num_of_mounts').first()
619619

620620
if drive is None:
621621
raise ValueError('No tape drive available')
622622

623-
drive_id = drive.pk
623+
drive_pk = drive.pk
624624

625-
mount_tape_medium_into_drive(drive_id, medium_id, timeout)
625+
mount_tape_medium_into_drive(drive_pk, medium_pk, timeout)
626626

627627

628628
@app.task(bind=True, queue='io_tape', event_type=40100)
629-
def UnmountTape(self, drive_id):
630-
return unmount_tape_from_drive(drive_id)
629+
def UnmountTape(self, drive_pk):
630+
return unmount_tape_from_drive(drive_pk)
631631

632632

633633
@app.task(bind=True)

ESSArch_Core/tasks_util.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@
3939

4040
@retry(retry=retry_if_exception_type(TapeDriveLockedError), reraise=True, stop=stop_after_attempt(5),
4141
wait=wait_fixed(60))
42-
def unmount_tape_from_drive(drive):
42+
def unmount_tape_from_drive(drive_pk):
4343
"""
4444
Unmounts tape from drive into slot
4545
4646
Args:
47-
drive: Which drive to unmount from
47+
drive_pk: Which drive to unmount from
4848
"""
49-
tape_drive = TapeDrive.objects.get(pk=drive)
49+
tape_drive = TapeDrive.objects.get(pk=drive_pk)
5050

5151
# Check if reverse one to one relation exists
5252
if not hasattr(tape_drive, 'storage_medium'):
@@ -62,12 +62,12 @@ def unmount_tape_from_drive(drive):
6262
tape_drive.save(update_fields=['locked'])
6363

6464
try:
65-
res = unmount_tape(robot.device, slot.slot_id, tape_drive.drive_id)
65+
res = unmount_tape(robot.device, slot.slot_id, tape_drive.drive_id, slot.medium_id)
6666
except BaseException:
6767
StorageMedium.objects.filter(pk=tape_drive.storage_medium.pk).update(
6868
status=100, last_changed_local=timezone.now(),
6969
)
70-
TapeDrive.objects.filter(pk=drive).update(locked=False, status=100)
70+
TapeDrive.objects.filter(pk=drive_pk).update(locked=False, status=100)
7171
TapeSlot.objects.filter(pk=slot.pk).update(status=100)
7272
raise
7373

@@ -84,19 +84,19 @@ def unmount_tape_from_drive(drive):
8484

8585
@retry(retry=retry_if_exception_type(TapeDriveLockedError), reraise=True, stop=stop_after_attempt(5),
8686
wait=wait_fixed(60))
87-
def mount_tape_medium_into_drive(drive_id, medium_id, timeout):
87+
def mount_tape_medium_into_drive(drive_pk, medium_pk, timeout):
8888
"""
8989
Mounts tape into drive
9090
9191
Args:
92-
medium_id: Which medium to mount
93-
drive_id: Which drive to load to
92+
medium_pk: Which medium to mount
93+
drive_pk: Which drive to load to
9494
timeout: Number of times to try to mount the tape (1 sec sleep between each retry)
9595
"""
9696

97-
medium = StorageMedium.objects.get(pk=medium_id)
97+
medium = StorageMedium.objects.get(pk=medium_pk)
9898
slot = medium.tape_slot
99-
tape_drive = TapeDrive.objects.get(pk=drive_id)
99+
tape_drive = TapeDrive.objects.get(pk=drive_pk)
100100

101101
if tape_drive.locked:
102102
raise TapeDriveLockedError()
@@ -105,30 +105,30 @@ def mount_tape_medium_into_drive(drive_id, medium_id, timeout):
105105
tape_drive.save(update_fields=['locked'])
106106

107107
try:
108-
mount_tape(tape_drive.robot.device, slot.slot_id, tape_drive.drive_id)
108+
mount_tape(tape_drive.robot.device, slot.slot_id, tape_drive.drive_id, slot.medium_id)
109109
wait_to_come_online(tape_drive.device, timeout)
110110
except BaseException:
111-
StorageMedium.objects.filter(pk=medium_id).update(
111+
StorageMedium.objects.filter(pk=medium_pk).update(
112112
status=100, last_changed_local=timezone.now(),
113113
)
114-
TapeDrive.objects.filter(pk=drive_id).update(locked=False, status=100)
114+
TapeDrive.objects.filter(pk=drive_pk).update(locked=False, status=100)
115115
TapeSlot.objects.filter(pk=slot.pk).update(status=100)
116116
raise
117117

118-
TapeDrive.objects.filter(pk=drive_id).update(
118+
TapeDrive.objects.filter(pk=drive_pk).update(
119119
num_of_mounts=F('num_of_mounts') + 1,
120120
last_change=timezone.now(),
121121
)
122122
StorageMedium.objects.filter(pk=medium.pk).update(
123123
num_of_mounts=F('num_of_mounts') + 1,
124-
tape_drive_id=drive_id,
124+
tape_drive_id=drive_pk,
125125
last_changed_local=timezone.now(),
126126
)
127127

128-
write_medium_label_to_drive(drive_id, medium, slot, tape_drive)
128+
write_medium_label_to_drive(drive_pk, medium, slot, tape_drive)
129129

130130

131-
def write_medium_label_to_drive(drive_id, medium, slot, tape_drive):
131+
def write_medium_label_to_drive(drive_pk, medium, slot, tape_drive):
132132
xmlfile = tempfile.NamedTemporaryFile(delete=False)
133133
try:
134134
arcname = '%s_label.xml' % medium.medium_id
@@ -162,12 +162,12 @@ def write_medium_label_to_drive(drive_id, medium, slot, tape_drive):
162162
StorageMedium.objects.filter(pk=medium.pk).update(
163163
status=100, last_changed_local=timezone.now(),
164164
)
165-
TapeDrive.objects.filter(pk=drive_id).update(locked=False, status=100)
165+
TapeDrive.objects.filter(pk=drive_pk).update(locked=False, status=100)
166166
TapeSlot.objects.filter(pk=slot.pk).update(status=100)
167167
raise
168168
finally:
169169
xmlfile.close()
170-
TapeDrive.objects.filter(pk=drive_id).update(locked=False)
170+
TapeDrive.objects.filter(pk=drive_pk).update(locked=False)
171171

172172

173173
def validate_file_format(filename, format_name, format_registry_key, format_version):

ESSArch_Core/tests/test_tasks_util.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def create_tape_drive(self):
3232

3333
def create_storage_medium(self, tape_drive=None):
3434
robot = Robot.objects.create(device='slot_robot_device')
35-
tape_slot = TapeSlot.objects.create(slot_id=12, robot=robot)
35+
tape_slot = TapeSlot.objects.create(slot_id=12, robot=robot, medium_id="dummy_medium_id")
3636
storage_target = StorageTarget.objects.create()
3737
return StorageMedium.objects.create(
3838
tape_slot=tape_slot,
@@ -60,7 +60,7 @@ def test_unmount_success(self, mock_unmount_tape):
6060
storage_medium.refresh_from_db()
6161
tape_drive.refresh_from_db()
6262

63-
mock_unmount_tape.assert_called_once_with("robot_device", 12, 2)
63+
mock_unmount_tape.assert_called_once_with("robot_device", 12, 2, "dummy_medium_id")
6464
self.assertFalse(tape_drive.locked)
6565
self.assertIsNone(storage_medium.tape_drive)
6666
self.assertTrue(before <= tape_drive.last_change <= after)
@@ -82,7 +82,7 @@ def test_unmount_when_unmount_tape_raise_exception(self, mock_unmount_tape, mock
8282
storage_medium.tape_slot.refresh_from_db()
8383
tape_drive.refresh_from_db()
8484

85-
mock_unmount_tape.assert_called_once_with("robot_device", 12, 2)
85+
mock_unmount_tape.assert_called_once_with("robot_device", 12, 2, "dummy_medium_id")
8686
self.assertFalse(tape_drive.locked)
8787
self.assertEqual(storage_medium.status, 100)
8888
self.assertFalse(tape_drive.locked)
@@ -130,7 +130,7 @@ def test_mount_when_mount_tape_raise_exception(self, mock_mount_tape):
130130
storage_medium.tape_slot.refresh_from_db()
131131
tape_drive.refresh_from_db()
132132

133-
mock_mount_tape.assert_called_once_with("robot_device", 12, 2)
133+
mock_mount_tape.assert_called_once_with("robot_device", 12, 2, "dummy_medium_id")
134134
self.assertFalse(tape_drive.locked)
135135
self.assertEqual(storage_medium.status, 100)
136136
self.assertFalse(tape_drive.locked)
@@ -153,7 +153,7 @@ def test_mount_when_wait_to_come_online_raise_exception(self, mock_mount_tape, m
153153
storage_medium.tape_slot.refresh_from_db()
154154
tape_drive.refresh_from_db()
155155

156-
mock_mount_tape.assert_called_once_with("robot_device", 12, 2)
156+
mock_mount_tape.assert_called_once_with("robot_device", 12, 2, "dummy_medium_id")
157157
self.assertFalse(tape_drive.locked)
158158
self.assertEqual(storage_medium.status, 100)
159159
self.assertFalse(tape_drive.locked)
@@ -176,7 +176,7 @@ def test_mount_success(self, mount_tape, wait_to_come_online, write_medium_label
176176
storage_medium.tape_slot.refresh_from_db()
177177
tape_drive.refresh_from_db()
178178

179-
mount_tape.assert_called_once_with("robot_device", 12, 2)
179+
mount_tape.assert_called_once_with("robot_device", 12, 2, "dummy_medium_id")
180180
wait_to_come_online.assert_called_once_with("unique_char", 121)
181181
self.assertEqual(tape_drive.num_of_mounts, 1)
182182
self.assertTrue(tape_drive.locked)

ESSArch_Core/workflow/tasks.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,8 @@ def PollRobotQueue(self):
331331
name="ESSArch_Core.tasks.MountTape",
332332
queue="robot",
333333
params={
334-
'medium_id': medium.pk,
335-
'drive_id': drive.pk,
334+
'medium_pk': medium.pk,
335+
'drive_pk': drive.pk,
336336
}
337337
).run().get()
338338
except TapeMountedError:
@@ -381,7 +381,7 @@ def PollRobotQueue(self):
381381
name="ESSArch_Core.tasks.UnmountTape",
382382
queue="robot",
383383
params={
384-
'drive_id': medium.tape_drive.pk,
384+
'drive_pk': medium.tape_drive.pk,
385385
}
386386
).run().get()
387387
except TapeUnmountedError:

0 commit comments

Comments
 (0)