def test_multipath_false(self): uspec = { 'DEVLINKS': ['/dev/disk/by-id/fakeid1', '/dev/disk/by-id/dm-name-fakeid1'], 'DEVNAME': '/dev/dm-0', 'DEVPATH': '/devices/fakepath', 'DEVTYPE': 'disk', 'MAJOR': '11', 'MINOR': '0', 'ID_BUS': 'fakebus', 'ID_MODEL': 'fakemodel', 'ID_SERIAL_SHORT': 'fakeserial', 'ID_WWN': 'fakewwn', 'ID_CDROM': '1' } self.assertEqual(False, hu.is_multipath_device('/dev/sda', uspec))
def test_multipath_no_uspec(self, mock_udev): mock_udev.return_value = { 'DEVLINKS': ['/dev/disk/by-id/fakeid1', '/dev/disk/by-id/dm-uuid-mpath-231'], 'DEVNAME': '/dev/dm-0', 'DEVPATH': '/devices/fakepath', 'DEVTYPE': 'disk', 'MAJOR': '11', 'MINOR': '0', 'ID_BUS': 'fakebus', 'ID_MODEL': 'fakemodel', 'ID_SERIAL_SHORT': 'fakeserial', 'ID_WWN': 'fakewwn', 'ID_CDROM': '1', 'DM_UUID': 'mpath-3600144f0534f392c000056e972830002' } self.assertEqual(True, hu.is_multipath_device('/dev/mapper/231'))
def _override_lvm_config(self, chroot): # NOTE(sslypushenko) Due to possible races between LVM and multipath, # we need to adjust LVM devices filter. # This code is required only for Ubuntu 14.04, because in trusty, # LVM filters, does not recognize partions on multipath devices # out of the box. It is fixed in latest LVM versions multipath_devs = [parted.name for parted in self.driver.partition_scheme.parteds if hw.is_multipath_device(parted.name)] # If there are no multipath devices on the node, we should not do # anything to prevent regression. if multipath_devs: # We need to explicitly whitelist each non-mutlipath device lvm_filter = [] for parted in self.driver.partition_scheme.parteds: device = parted.name if device in multipath_devs: continue # We use devlinks from /dev/disk/by-id instead of /dev/sd*, # because the first one are persistent. devlinks_by_id = [ link for link in hw.udevreport(device).get('DEVLINKS', []) if link.startswith('/dev/disk/by-id/')] for link in devlinks_by_id: lvm_filter.append( 'a|^{}(p)?(-part)?[0-9]*|'.format(link)) # Multipath devices should be whitelisted. All other devlinks # should be blacklisted, to prevent LVM from grubbing underlying # multipath devices. lvm_filter.extend(CONF.lvm_filter_for_mpath) # Setting devices/preferred_names also helps LVM to find devices by # the proper devlinks bu.override_lvm_config( chroot, {'devices': { 'scan': CONF.mpath_lvm_scan_dirs, 'global_filter': lvm_filter, 'preferred_names': CONF.mpath_lvm_preferred_names}}, lvm_conf_path=CONF.lvm_conf_path, update_initramfs=True)
def _do_partitioning(self): LOG.debug('--- Partitioning disks (do_partitioning) ---') # If disks are not wiped out at all, it is likely they contain lvm # and md metadata which will prevent re-creating a partition table # with 'device is busy' error. mu.mdclean_all(skip_containers=CONF.skip_md_containers) lu.lvremove_all() lu.vgremove_all() lu.pvremove_all() for parted in self.driver.partition_scheme.parteds: for prt in parted.partitions: # We wipe out the beginning of every new partition # right after creating it. It allows us to avoid possible # interactive dialog if some data (metadata or file system) # present on this new partition and it also allows udev not # hanging trying to parse this data. utils.execute('dd', 'if=/dev/zero', 'bs=1M', 'seek=%s' % max(prt.begin - 3, 0), 'count=5', 'of=%s' % prt.device, check_exit_code=[0]) # Also wipe out the ending of every new partition. # Different versions of md stores metadata in different places. # Adding exit code 1 to be accepted as for handling situation # when 'no space left on device' occurs. utils.execute('dd', 'if=/dev/zero', 'bs=1M', 'seek=%s' % max(prt.end - 3, 0), 'count=5', 'of=%s' % prt.device, check_exit_code=[0, 1]) parteds = [] parteds_with_rules = [] for parted in self.driver.partition_scheme.parteds: if hu.is_multipath_device(parted.name): parteds_with_rules.append(parted) else: parteds.append(parted) utils.blacklist_udev_rules(udev_rules_dir=CONF.udev_rules_dir, udev_rules_lib_dir=CONF.udev_rules_lib_dir, udev_rename_substr=CONF.udev_rename_substr, udev_empty_rule=CONF.udev_empty_rule) self._make_partitions(parteds) utils.unblacklist_udev_rules( udev_rules_dir=CONF.udev_rules_dir, udev_rename_substr=CONF.udev_rename_substr) self._make_partitions(parteds_with_rules) # If one creates partitions with the same boundaries as last time, # there might be md and lvm metadata on those partitions. To prevent # failing of creating md and lvm devices we need to make sure # unused metadata are wiped out. mu.mdclean_all(skip_containers=CONF.skip_md_containers) lu.lvremove_all() lu.vgremove_all() lu.pvremove_all() if parteds_with_rules: utils.refresh_multipath() # creating meta disks for md in self.driver.partition_scheme.mds: mu.mdcreate(md.name, md.level, md.devices, md.metadata) # creating physical volumes for pv in self.driver.partition_scheme.pvs: lu.pvcreate(pv.name, metadatasize=pv.metadatasize, metadatacopies=pv.metadatacopies) # creating volume groups for vg in self.driver.partition_scheme.vgs: lu.vgcreate(vg.name, *vg.pvnames) # creating logical volumes for lv in self.driver.partition_scheme.lvs: lu.lvcreate(lv.vgname, lv.name, lv.size) # making file systems for fs in self.driver.partition_scheme.fss: found_images = [img for img in self.driver.image_scheme.images if img.target_device == fs.device] if not found_images: fu.make_fs(fs.type, fs.options, fs.label, fs.device)