def get_free_devname(device): if device: device = ebstool.get_ebs_devname(device) used_letters = set(row['device'][-1] for row in Storage.volume_table() if row['device'] and ( \ row['state'] == 'attached' or ( \ pl.get_instance_type() == 't1.micro' and row['state'] == 'detached'))) with self.letters_lock: avail_letters = list(set(self.all_letters) - used_letters - self.acquired_letters) volumes = conn.get_all_volumes(filters={'attachment.instance-id': pl.get_instance_id()}) for volume in volumes: volume_device = volume.attach_data.device volume_device = re.sub('\d+', '', volume_device) try: avail_letters.remove(volume_device[-1]) except ValueError: pass if not device or not (device[-1] in avail_letters) or os.path.exists(device): letter = firstmatched( lambda l: not os.path.exists(ebstool.real_devname('/dev/sd%s' % l)), avail_letters ) if letter: device = '/dev/sd%s' % letter self.acquired_letters.add(letter) else: raise StorageError('No free letters for block device name remains') return device
def test_1(self): v1 = Storage.create(device='/dev/sdo') v2 = Storage.create(device='/dev/sdm') table = Storage.volume_table() self.assertEqual(len(table), 2) v1row = firstmatched(lambda row: row['device'] == '/dev/sdo', table) self.assertTrue(v1row) self.assertEqual(v1row['volume_id'], v1.id) self.assertEqual(v1row['device'], v1.device) self.assertEqual(v1row['type'], v1.type) self.assertEqual(v1row['state'], 'attached') v2.detach() table = Storage.volume_table() self.assertEqual(len(table), 2) v2row = firstmatched(lambda row: row['device'] == '/dev/sdm', table) self.assertEqual(v2row['state'], 'detached')
def get_free_devname(device): if device: device = ebstool.get_ebs_devname(device) used_letters = set(row['device'][-1] for row in Storage.volume_table() if row['device'] and ( \ row['state'] == 'attached' or ( \ pl.get_instance_type() == 't1.micro' and row['state'] == 'detached'))) with self.letters_lock: avail_letters = list( set(self.all_letters) - used_letters - self.acquired_letters) volumes = conn.get_all_volumes( filters={ 'attachment.instance-id': pl.get_instance_id() }) for volume in volumes: volume_device = volume.attach_data.device volume_device = re.sub('\d+', '', volume_device) try: avail_letters.remove(volume_device[-1]) except ValueError: pass if not device or not (device[-1] in avail_letters ) or os.path.exists(device): letter = firstmatched( lambda l: not os.path.exists( ebstool.real_devname('/dev/sd%s' % l)), avail_letters) if letter: device = '/dev/sd%s' % letter self.acquired_letters.add(letter) else: raise StorageError( 'No free letters for block device name remains' ) return device