Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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