def _numa_get_mem_map_list(flavor, image_meta): flavor_mem_list = _numa_get_flavor_mem_map_list(flavor) image_mem_list = image_meta.properties.get("hw_numa_mem", None) if flavor_mem_list is None: return image_mem_list else: if image_mem_list is not None: raise exception.ImageNUMATopologyForbidden(name='hw_numa_mem') return flavor_mem_list
def numa_get_constraints(flavor, image_meta): """Return topology related to input request :param flavor: Flavor object to read extra specs from :param image_meta: nova.objects.ImageMeta object instance May raise exception.ImageNUMATopologyIncomplete() if the image properties are not correctly specified, or exception.ImageNUMATopologyForbidden if an attempt is made to override flavor settings with image properties. :returns: InstanceNUMATopology or None """ nodes = flavor.get('extra_specs', {}).get("hw:numa_nodes") props = image_meta.properties if nodes is not None: if props.obj_attr_is_set("hw_numa_nodes"): raise exception.ImageNUMATopologyForbidden( name='hw_numa_nodes') nodes = int(nodes) else: nodes = props.get("hw_numa_nodes") pagesize = _numa_get_pagesize_constraints( flavor, image_meta) numa_topology = None if nodes or pagesize: nodes = nodes or 1 cpu_list = _numa_get_cpu_map_list(flavor, image_meta) mem_list = _numa_get_mem_map_list(flavor, image_meta) # If one property list is specified both must be if ((cpu_list is None and mem_list is not None) or (cpu_list is not None and mem_list is None)): raise exception.ImageNUMATopologyIncomplete() # If any node has data set, all nodes must have data set if ((cpu_list is not None and len(cpu_list) != nodes) or (mem_list is not None and len(mem_list) != nodes)): raise exception.ImageNUMATopologyIncomplete() if cpu_list is None: numa_topology = _numa_get_constraints_auto( nodes, flavor) else: numa_topology = _numa_get_constraints_manual( nodes, flavor, cpu_list, mem_list) # We currently support same pagesize for all cells. [setattr(c, 'pagesize', pagesize) for c in numa_topology.cells] return _add_cpu_pinning_constraint(flavor, image_meta, numa_topology)
def _numa_get_flavor_or_image_prop(flavor, image_meta, propname): flavor_val = flavor.get('extra_specs', {}).get("hw:" + propname) image_val = image_meta.get("hw_" + propname) if flavor_val is not None: if image_val is not None: raise exception.ImageNUMATopologyForbidden(name='hw_' + propname) return flavor_val else: return image_val
def _numa_get_flavor_or_image_prop(flavor, image_meta, propname): """Return the value of propname from flavor or image :param flavor: a Flavor object or dict of instance type information :param image_meta: a dict of image information :returns: a value or None """ flavor_val = flavor.get('extra_specs', {}).get("hw:" + propname) image_val = (image_meta or {}).get("properties", {}).get("hw_" + propname) if flavor_val is not None: if image_val is not None: raise exception.ImageNUMATopologyForbidden(name='hw_' + propname) return flavor_val else: return image_val