def filter(cls, config, msg, tc): dax_devices, _ = ctx.get_requirement(tc, 'devdax', ()) if not dax_devices: return ctx.NO_CONTEXT elif sys.platform == 'win32' and tc.enabled: raise futils.Fail('dax device functionality required by "{}" is ' 'not available on Windows. Please disable the ' 'test for this platform'.format(tc)) if not config.device_dax_path: raise futils.Skip('No dax devices defined in testconfig') if len(dax_devices) > len(config.device_dax_path): raise futils.Skip('Not enough dax devices defined in testconfig ' '({} needed)'.format(len(dax_devices))) ndctl = tools.Ndctl() for c in config.device_dax_path: if not ndctl.is_devdax(c): raise futils.Fail('{} is not a dax device'.format(c)) assigned = _try_assign_by_requirements(config.device_dax_path, dax_devices) if not assigned: raise futils.Skip('Dax devices in test configuration do not ' 'meet test requirements') return [ DevDaxes(*assigned), ]
def filter(cls, config, msg, tc): dax_devices, _ = ctx.get_requirement(tc, 'devdax', ()) if not dax_devices: return ctx.NO_CONTEXT elif sys.platform == 'win32' and tc.enabled: raise futils.Fail('dax device functionality required by "{}" is ' 'not available on Windows. Please disable the ' 'test for this platform'.format(tc)) if not config.device_dax_path: raise futils.Skip('No dax devices defined in testconfig') if len(dax_devices) > len(config.device_dax_path): raise futils.Skip('Not enough dax devices defined in testconfig ' '({} needed)'.format(len(dax_devices))) ndctl = tools.Ndctl() for dd, cddp in zip(dax_devices, config.device_dax_path): dd.path = cddp if not ndctl.is_devdax(cddp): raise futils.Fail('{} is not a dax device'.format(cddp)) dd.size = ndctl.get_dev_size(cddp) dd.alignment = ndctl.get_dev_alignment(cddp) return [ DevDaxes(*dax_devices), ]
def filter(cls, config, msg, tc): """ Initialize DevDaxes class for the test to be run based on configuration and test requirements. Args: config: configuration as returned by Configurator class msg (Message): level based logger class instance tc (BaseTest): test case, from which the dax device run requirements are obtained Returns: Initialized DevDaxes class as single element list for type compliance """ dax_devices, _ = ctx.get_requirement(tc, 'devdax', ()) cls.check_fs_exec, _ = ctx.get_requirement(tc, 'require_fs_exec', None) req_real_pmem, _ = ctx.get_requirement(tc, 'require_real_pmem', False) if not dax_devices: return ctx.NO_CONTEXT elif sys.platform == 'win32' and tc.enabled: raise futils.Fail('dax device functionality required by "{}" is ' 'not available on Windows. Please disable the ' 'test for this platform'.format(tc)) if not config.device_dax_path: raise futils.Skip('No dax devices defined in testconfig') if len(dax_devices) > len(config.device_dax_path): raise futils.Skip('Not enough dax devices defined in testconfig ' '({} needed)'.format(len(dax_devices))) ndctl = tools.Ndctl() for c in config.device_dax_path: if not ndctl.is_devdax(c): raise futils.Fail('{} is not a dax device'.format(c)) assigned = _try_assign_by_requirements(config.device_dax_path, dax_devices) # filter out the emulated devdaxes from the assigned ones if req_real_pmem: assigned_filtered = [] for dd in assigned: if not ndctl.is_emulated(dd.path): assigned_filtered.append(dd) assigned = tuple(assigned_filtered) if not assigned: raise futils.Skip('Dax devices in test configuration do not ' 'meet test requirements') return [DevDaxes(*assigned)]
def try_assign(self, path): """ Try assigning to real dax device, identified by its path, provided it meets defined requirements. In case of success, set DevDax object attributes (like size and/or alignment) to the real dax device values and return True. Return False otherwise. """ ndctl = tools.Ndctl() p_size = ndctl.get_dev_size(path) p_align = ndctl.get_dev_alignment(path) if self._req_min_size and p_size < self._req_min_size: return False if self._req_max_size and p_size > self._req_max_size: return False if self._req_alignment and p_align != self._req_alignment: return False self.path = path self.size = p_size self.alignment = p_align self.assigned = True return True