def test_list_multipath(self): # # multipath data partition # if platform.system() == "FreeBSD": return partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" disk = "Xda" partition = "Xda1" def get_partition_type(dev): return main.PTYPE['mpath']['osd']['ready'] with patch.multiple( main, list_all_partitions=lambda: {disk: [partition]}, get_partition_uuid=lambda dev: partition_uuid, get_partition_type=get_partition_type, is_partition=lambda dev: True, ): expect = [{'path': '/dev/' + disk, 'partitions': [{ 'dmcrypt': {}, 'fs_type': None, 'is_partition': True, 'mount': None, 'multipath': True, 'path': '/dev/' + partition, 'ptype': main.PTYPE['mpath']['osd']['ready'], 'state': 'unprepared', 'type': 'data', 'uuid': partition_uuid, }]}] assert expect == main.list_devices() # # multipath journal partition # journal_partition_uuid = "2cc40457-259e-4542-b029-785c7cc37871" def get_partition_type(dev): return main.PTYPE['mpath']['journal']['ready'] with patch.multiple( main, list_all_partitions=lambda: {disk: [partition]}, get_partition_uuid=lambda dev: journal_partition_uuid, get_partition_type=get_partition_type, is_partition=lambda dev: True, ): expect = [{'path': '/dev/' + disk, 'partitions': [{ 'dmcrypt': {}, 'is_partition': True, 'multipath': True, 'path': '/dev/' + partition, 'ptype': main.PTYPE['mpath']['journal']['ready'], 'type': 'journal', 'uuid': journal_partition_uuid, }]}] assert expect == main.list_devices()
def test_list_data(self): # # a data partition that fails to mount is silently # ignored # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" disk = "Xda" partition = "Xda1" fs_type = "ext4" def get_partition_type(dev): return main.PTYPE['regular']['osd']['ready'] with patch.multiple( main, list_all_partitions=lambda: {disk: [partition]}, get_partition_uuid=lambda dev: partition_uuid, get_partition_type=get_partition_type, get_dev_fs=lambda dev: fs_type, mount=fail_to_mount, unmount=DEFAULT, is_partition=lambda dev: True, ): expect = [{'path': '/dev/' + disk, 'partitions': [{ 'dmcrypt': {}, 'fs_type': fs_type, 'is_partition': True, 'mount': None, 'path': '/dev/' + partition, 'ptype': main.PTYPE['regular']['osd']['ready'], 'state': 'unprepared', 'type': 'data', 'uuid': partition_uuid, }]}] assert expect == main.list_devices()
def test_list_other(self): # # not swap, unknown fs type, not mounted, with uuid # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" partition_type = "e51adfb9-e9fd-4718-9fc1-7a0cb03ea3f4" disk = "Xda" partition = "Xda1" with patch.multiple( main, list_all_partitions=lambda: {disk: [partition]}, get_partition_uuid=lambda dev: partition_uuid, get_partition_type=lambda dev: partition_type, is_partition=lambda dev: True, ): expect = [{'path': '/dev/' + disk, 'partitions': [{'dmcrypt': {}, 'is_partition': True, 'path': '/dev/' + partition, 'ptype': partition_type, 'type': 'other', 'uuid': partition_uuid}]}] assert expect == main.list_devices() # # not swap, mounted, ext4 fs type, with uuid # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" partition_type = "e51adfb9-e9fd-4718-9fc1-7a0cb03ea3f4" disk = "Xda" partition = "Xda1" mount_path = '/mount/path' fs_type = 'ext4' with patch.multiple( main, list_all_partitions=lambda: {disk: [partition]}, get_dev_fs=lambda dev: fs_type, is_mounted=lambda dev: mount_path, get_partition_uuid=lambda dev: partition_uuid, get_partition_type=lambda dev: partition_type, is_partition=lambda dev: True, ): expect = [{'path': '/dev/' + disk, 'partitions': [{ 'dmcrypt': {}, 'is_partition': True, 'mount': mount_path, 'fs_type': fs_type, 'path': '/dev/' + partition, 'ptype': partition_type, 'type': 'other', 'uuid': partition_uuid, }]}] assert expect == main.list_devices() # # swap, with uuid # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" partition_type = "e51adfb9-e9fd-4718-9fc1-7a0cb03ea3f4" disk = "Xda" partition = "Xda1" with patch.multiple( main, list_all_partitions=lambda: {disk: [partition]}, is_swap=lambda dev: True, get_partition_uuid=lambda dev: partition_uuid, get_partition_type=lambda dev: partition_type, is_partition=lambda dev: True, ): expect = [{'path': '/dev/' + disk, 'partitions': [{'dmcrypt': {}, 'is_partition': True, 'path': '/dev/' + partition, 'ptype': partition_type, 'type': 'swap', 'uuid': partition_uuid}]}] assert expect == main.list_devices() # # whole disk # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" disk = "Xda" partition = "Xda1" with patch.multiple( main, list_all_partitions=lambda: {disk: []}, is_partition=lambda dev: False, ): expect = [{'path': '/dev/' + disk, 'dmcrypt': {}, 'is_partition': False, 'ptype': 'unknown', 'type': 'other'}] assert expect == main.list_devices()
def list(self, data_ptype, space_ptype): # # a single disk has a data partition and a journal # partition and the osd is active # name = main.Ptype.space_ptype_to_name(space_ptype) data_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" disk = "Xda" data = "Xda1" data_holder = "dm-dummy" space = "Xda2" space_holder = "dm-dummy" mount_path = '/mount/path' fs_type = 'ext4' space_uuid = "7ad5e65a-0ca5-40e4-a896-62a74ca61c55" ceph_fsid = "60a2ef70-d99b-4b9b-a83c-8a86e5e60091" osd_id = '1234' def get_oneliner(path, what): if '_uuid' in what: if what == name + '_uuid': return space_uuid else: return None elif what == 'ceph_fsid': return ceph_fsid elif what == 'whoami': return osd_id else: raise Exception('unknown ' + what) def get_partition_uuid(dev): if dev == '/dev/' + data: return data_uuid elif dev == '/dev/' + space: return space_uuid else: raise Exception('unknown ' + dev) def get_partition_type(dev): if (dev == '/dev/' + data or dev == '/dev/' + data_holder): return data_ptype elif (dev == '/dev/' + space or dev == '/dev/' + space_holder): return space_ptype else: raise Exception('unknown ' + dev) cluster = 'ceph' if data_ptype == main.PTYPE['regular']['osd']['ready']: data_dmcrypt = {} elif data_ptype == main.PTYPE['plain']['osd']['ready']: data_dmcrypt = { 'type': 'plain', 'holders': [data_holder], } elif data_ptype == main.PTYPE['luks']['osd']['ready']: data_dmcrypt = { 'type': 'LUKS', 'holders': [data_holder], } else: raise Exception('unknown ' + data_ptype) if space_ptype == main.PTYPE['regular'][name]['ready']: space_dmcrypt = {} elif space_ptype == main.PTYPE['plain'][name]['ready']: space_dmcrypt = { 'type': 'plain', 'holders': [space_holder], } elif space_ptype == main.PTYPE['luks'][name]['ready']: space_dmcrypt = { 'type': 'LUKS', 'holders': [space_holder], } else: raise Exception('unknown ' + space_ptype) if data_dmcrypt: def is_held(dev): if dev == '/dev/' + data: return [data_holder] elif dev == '/dev/' + space: return [space_holder] else: raise Exception('unknown ' + dev) else: def is_held(dev): return [] with patch.multiple( main, list_all_partitions=lambda: {disk: [data, space]}, get_dev_fs=lambda dev: fs_type, is_mounted=lambda dev: mount_path, get_partition_uuid=get_partition_uuid, get_partition_type=get_partition_type, find_cluster_by_uuid=lambda ceph_fsid: cluster, is_partition=lambda dev: True, mount=DEFAULT, unmount=DEFAULT, get_oneliner=get_oneliner, is_held=is_held, ): expect = [{'path': '/dev/' + disk, 'partitions': [{ 'ceph_fsid': ceph_fsid, 'cluster': cluster, 'dmcrypt': data_dmcrypt, 'fs_type': fs_type, 'is_partition': True, name + '_dev': '/dev/' + space, name + '_uuid': space_uuid, 'mount': mount_path, 'path': '/dev/' + data, 'ptype': data_ptype, 'state': 'active', 'type': 'data', 'whoami': osd_id, 'uuid': data_uuid, }, { 'dmcrypt': space_dmcrypt, 'is_partition': True, name + '_for': '/dev/' + data, 'path': '/dev/' + space, 'ptype': space_ptype, 'type': name, 'uuid': space_uuid, }]}] assert expect == main.list_devices()
def test_list_dmcrypt_data(self): partition_type2type = { main.PTYPE['plain']['osd']['ready']: 'plain', main.PTYPE['luks']['osd']['ready']: 'LUKS', } for (partition_type, type) in partition_type2type.iteritems(): # # dmcrypt data partition with one holder # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" disk = "Xda" partition = "Xda1" holders = ["dm-dummy"] with patch.multiple( main, is_held=lambda dev: holders, list_all_partitions=lambda: {disk: [partition]}, get_partition_uuid=lambda dev: partition_uuid, get_partition_type=lambda dev: partition_type, is_partition=lambda dev: True, ): expect = [{'path': '/dev/' + disk, 'partitions': [{ 'dmcrypt': { 'holders': holders, 'type': type, }, 'fs_type': None, 'is_partition': True, 'mount': None, 'path': '/dev/' + partition, 'ptype': partition_type, 'state': 'unprepared', 'type': 'data', 'uuid': partition_uuid, }]}] assert expect == main.list_devices() # # dmcrypt data partition with two holders # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" disk = "Xda" partition = "Xda1" holders = ["dm-dummy", "dm-dummy1"] with patch.multiple( main, is_held=lambda dev: holders, list_all_partitions=lambda: {disk: [partition]}, get_partition_uuid=lambda dev: partition_uuid, get_partition_type=lambda dev: partition_type, is_partition=lambda dev: True, ): expect = [{'path': '/dev/' + disk, 'partitions': [{ 'dmcrypt': { 'holders': holders, 'type': type, }, 'is_partition': True, 'path': '/dev/' + partition, 'ptype': partition_type, 'type': 'data', 'uuid': partition_uuid, }]}] assert expect == main.list_devices()
def test_list_other(self): # # not swap, unknown fs type, not mounted, with uuid # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" partition_type = "e51adfb9-e9fd-4718-9fc1-7a0cb03ea3f4" disk = "Xda" partition = "Xda1" with patch.multiple( main, list_all_partitions=lambda: {disk: [partition]}, get_partition_uuid=lambda dev: partition_uuid, get_partition_type=lambda dev: partition_type, is_partition=lambda dev: True, ): expect = [{ 'path': '/dev/' + disk, 'partitions': [{ 'dmcrypt': {}, 'is_partition': True, 'path': '/dev/' + partition, 'ptype': partition_type, 'type': 'other', 'uuid': partition_uuid }] }] assert expect == main.list_devices() # # not swap, mounted, ext4 fs type, with uuid # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" partition_type = "e51adfb9-e9fd-4718-9fc1-7a0cb03ea3f4" disk = "Xda" partition = "Xda1" mount_path = '/mount/path' fs_type = 'ext4' with patch.multiple( main, list_all_partitions=lambda: {disk: [partition]}, get_dev_fs=lambda dev: fs_type, is_mounted=lambda dev: mount_path, get_partition_uuid=lambda dev: partition_uuid, get_partition_type=lambda dev: partition_type, is_partition=lambda dev: True, ): expect = [{ 'path': '/dev/' + disk, 'partitions': [{ 'dmcrypt': {}, 'is_partition': True, 'mount': mount_path, 'fs_type': fs_type, 'path': '/dev/' + partition, 'ptype': partition_type, 'type': 'other', 'uuid': partition_uuid, }] }] assert expect == main.list_devices() # # swap, with uuid # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" partition_type = "e51adfb9-e9fd-4718-9fc1-7a0cb03ea3f4" disk = "Xda" partition = "Xda1" with patch.multiple( main, list_all_partitions=lambda: {disk: [partition]}, is_swap=lambda dev: True, get_partition_uuid=lambda dev: partition_uuid, get_partition_type=lambda dev: partition_type, is_partition=lambda dev: True, ): expect = [{ 'path': '/dev/' + disk, 'partitions': [{ 'dmcrypt': {}, 'is_partition': True, 'path': '/dev/' + partition, 'ptype': partition_type, 'type': 'swap', 'uuid': partition_uuid }] }] assert expect == main.list_devices() # # whole disk # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" disk = "Xda" partition = "Xda1" with patch.multiple( main, list_all_partitions=lambda: {disk: []}, is_partition=lambda dev: False, ): expect = [{ 'path': '/dev/' + disk, 'dmcrypt': {}, 'is_partition': False, 'ptype': 'unknown', 'type': 'other' }] assert expect == main.list_devices()
def list(self, data_ptype, space_ptype): # # a single disk has a data partition and a journal # partition and the osd is active # name = main.Ptype.space_ptype_to_name(space_ptype) data_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" disk = "Xda" data = "Xda1" data_holder = "dm-dummy" space = "Xda2" space_holder = "dm-dummy" mount_path = '/mount/path' fs_type = 'ext4' space_uuid = "7ad5e65a-0ca5-40e4-a896-62a74ca61c55" ceph_fsid = "60a2ef70-d99b-4b9b-a83c-8a86e5e60091" osd_id = '1234' def get_oneliner(path, what): if '_uuid' in what: if what == name + '_uuid': return space_uuid else: return None elif what == 'ceph_fsid': return ceph_fsid elif what == 'whoami': return osd_id else: raise Exception('unknown ' + what) def get_partition_uuid(dev): if dev == '/dev/' + data: return data_uuid elif dev == '/dev/' + space: return space_uuid else: raise Exception('unknown ' + dev) def get_partition_type(dev): if (dev == '/dev/' + data or dev == '/dev/' + data_holder): return data_ptype elif (dev == '/dev/' + space or dev == '/dev/' + space_holder): return space_ptype else: raise Exception('unknown ' + dev) cluster = 'ceph' if data_ptype == main.PTYPE['regular']['osd']['ready']: data_dmcrypt = {} elif data_ptype == main.PTYPE['plain']['osd']['ready']: data_dmcrypt = { 'type': 'plain', 'holders': [data_holder], } elif data_ptype == main.PTYPE['luks']['osd']['ready']: data_dmcrypt = { 'type': 'LUKS', 'holders': [data_holder], } else: raise Exception('unknown ' + data_ptype) if space_ptype == main.PTYPE['regular'][name]['ready']: space_dmcrypt = {} elif space_ptype == main.PTYPE['plain'][name]['ready']: space_dmcrypt = { 'type': 'plain', 'holders': [space_holder], } elif space_ptype == main.PTYPE['luks'][name]['ready']: space_dmcrypt = { 'type': 'LUKS', 'holders': [space_holder], } else: raise Exception('unknown ' + space_ptype) if data_dmcrypt: def is_held(dev): if dev == '/dev/' + data: return [data_holder] elif dev == '/dev/' + space: return [space_holder] else: raise Exception('unknown ' + dev) else: def is_held(dev): return [] with patch.multiple( main, list_all_partitions=lambda: {disk: [data, space]}, get_dev_fs=lambda dev: fs_type, is_mounted=lambda dev: mount_path, get_partition_uuid=get_partition_uuid, get_partition_type=get_partition_type, find_cluster_by_uuid=lambda ceph_fsid: cluster, is_partition=lambda dev: True, mount=DEFAULT, unmount=DEFAULT, get_oneliner=get_oneliner, is_held=is_held, ): expect = [{ 'path': '/dev/' + disk, 'partitions': [{ 'ceph_fsid': ceph_fsid, 'cluster': cluster, 'dmcrypt': data_dmcrypt, 'fs_type': fs_type, 'is_partition': True, name + '_dev': '/dev/' + space, name + '_uuid': space_uuid, 'mount': mount_path, 'path': '/dev/' + data, 'ptype': data_ptype, 'state': 'active', 'type': 'data', 'whoami': osd_id, 'uuid': data_uuid, }, { 'dmcrypt': space_dmcrypt, 'is_partition': True, name + '_for': '/dev/' + data, 'path': '/dev/' + space, 'ptype': space_ptype, 'type': name, 'uuid': space_uuid, }] }] assert expect == main.list_devices()
def test_list_dmcrypt_data(self): partition_type2type = { main.PTYPE['plain']['osd']['ready']: 'plain', main.PTYPE['luks']['osd']['ready']: 'LUKS', } for (partition_type, type) in partition_type2type.iteritems(): # # dmcrypt data partition with one holder # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" disk = "Xda" partition = "Xda1" holders = ["dm-dummy"] with patch.multiple( main, is_held=lambda dev: holders, list_all_partitions=lambda: {disk: [partition]}, get_partition_uuid=lambda dev: partition_uuid, get_partition_type=lambda dev: partition_type, is_partition=lambda dev: True, ): expect = [{ 'path': '/dev/' + disk, 'partitions': [{ 'dmcrypt': { 'holders': holders, 'type': type, }, 'fs_type': None, 'is_partition': True, 'mount': None, 'path': '/dev/' + partition, 'ptype': partition_type, 'state': 'unprepared', 'type': 'data', 'uuid': partition_uuid, }] }] assert expect == main.list_devices() # # dmcrypt data partition with two holders # partition_uuid = "56244cf5-83ef-4984-888a-2d8b8e0e04b2" disk = "Xda" partition = "Xda1" holders = ["dm-dummy", "dm-dummy1"] with patch.multiple( main, is_held=lambda dev: holders, list_all_partitions=lambda: {disk: [partition]}, get_partition_uuid=lambda dev: partition_uuid, get_partition_type=lambda dev: partition_type, is_partition=lambda dev: True, ): expect = [{ 'path': '/dev/' + disk, 'partitions': [{ 'dmcrypt': { 'holders': holders, 'type': type, }, 'is_partition': True, 'path': '/dev/' + partition, 'ptype': partition_type, 'type': 'data', 'uuid': partition_uuid, }] }] assert expect == main.list_devices()