def _get_alias_from_config(): """Parse and validate PCI aliases from the nova config.""" jaliases = CONF.pci.alias aliases = {} # map alias name to alias spec list try: for jsonspecs in jaliases: spec = jsonutils.loads(jsonspecs) jsonschema.validate(spec, _ALIAS_SCHEMA) name = spec.pop("name") dev_type = spec.pop('device_type', None) if dev_type: spec['dev_type'] = dev_type if name not in aliases: aliases[name] = [spec] else: if aliases[name][0]["dev_type"] == spec["dev_type"]: aliases[name].append(spec) else: reason = _("Device type mismatch for alias '%s'") % name raise exception.PciInvalidAlias(reason=reason) except exception.PciInvalidAlias: raise except Exception as e: raise exception.PciInvalidAlias(reason=six.text_type(e)) return aliases
def _get_alias_from_config(): """Parse and validate PCI aliases from the nova config. :returns: A dictionary where the keys are device names and the values are tuples of form ``(specs, numa_policy)``. ``specs`` is a list of PCI device specs, while ``numa_policy`` describes the required NUMA affinity of the device(s). :raises: exception.PciInvalidAlias if two aliases with the same name have different device types or different NUMA policies. """ jaliases = CONF.pci.alias aliases = {} # map alias name to alias spec list try: for jsonspecs in jaliases: spec = jsonutils.loads(jsonspecs) jsonschema.validate(spec, _ALIAS_SCHEMA) name = spec.pop('name').strip() numa_policy = spec.pop('numa_policy', None) if not numa_policy: numa_policy = obj_fields.PCINUMAAffinityPolicy.LEGACY dev_type = spec.pop('device_type', None) if dev_type: spec['dev_type'] = dev_type if name not in aliases: aliases[name] = (numa_policy, [spec]) continue if aliases[name][0] != numa_policy: reason = _("NUMA policy mismatch for alias '%s'") % name raise exception.PciInvalidAlias(reason=reason) if aliases[name][1][0]['dev_type'] != spec['dev_type']: reason = _("Device type mismatch for alias '%s'") % name raise exception.PciInvalidAlias(reason=reason) aliases[name][1].append(spec) except exception.PciInvalidAlias: raise except jsonschema.exceptions.ValidationError as exc: raise exception.PciInvalidAlias(reason=exc.message) except Exception as exc: raise exception.PciInvalidAlias(reason=str(exc)) return aliases
def _get_alias_from_config(): """Parse and validate PCI aliases from the nova config.""" jaliases = CONF.pci.alias aliases = {} # map alias name to alias spec list try: for jsonspecs in jaliases: # WRS: Align with packstack and pci_passthrough_whitelist. Support # list of pci_alias. try: spec = jsonutils.loads(jsonspecs) except ValueError: raise exception.PciInvalidAlias( reason=_("Invalid entry: '%s'") % jsonspecs) if isinstance(spec, dict): spec = [spec] elif not isinstance(spec, list): raise exception.PciInvalidAlias( reason=_("Invalid entry: '%s'; " "Expecting list or dict") % jsonspecs) for s in spec: jsonschema.validate(s, _ALIAS_SCHEMA) # It should keep consistent behaviour in configuration # and extra specs to call strip() function. name = s.pop("name").strip() dev_type = s.pop('device_type', None) if dev_type: s['dev_type'] = dev_type if name not in aliases: aliases[name] = [s] else: if aliases[name][0]["dev_type"] == s["dev_type"]: aliases[name].append(s) else: reason = (_("Device type mismatch for alias '%s'") % name) raise exception.PciInvalidAlias(reason=reason) except exception.PciInvalidAlias: raise except Exception as e: raise exception.PciInvalidAlias(reason=six.text_type(e)) return aliases