def deferred_update_resource_provider_traits(self): rp_traits = [] physnet_trait_mappings = {} for physnet, devices in self._device_mappings.items(): for device in devices: physnet_trait_mappings[device] = place_utils.physnet_trait( physnet) vnic_type_traits = [ place_utils.vnic_type_trait(vnic_type) for vnic_type in self._supported_vnic_types ] for device in self._rp_bandwidths: rp_uuid = place_utils.device_resource_provider_uuid( self._driver_uuid_namespace, self._hypervisor_rps[device]['name'], device) traits = [] traits.append(physnet_trait_mappings[device]) traits.extend(vnic_type_traits) rp_traits.append( DeferredCall(self._client.update_resource_provider_traits, resource_provider_uuid=rp_uuid, traits=traits)) return rp_traits
def _deferred_update_vnic_type_traits(self): traits = [] for vnic_type in self._supported_vnic_types: traits.append( DeferredCall(self._client.update_trait, name=place_utils.vnic_type_trait(vnic_type))) return traits
def _extend_port_resource_request(port_res, port_db): """Add resource request to a port.""" port_res['resource_request'] = None qos_policy = policy_object.QosPolicy.get_port_policy( context.get_admin_context(), port_res['id']) # Note(lajoskatona): QosPolicyPortBinding is not ready for some # reasons, so let's try and fetch the QoS policy directly if there is a # qos_policy_id in port_res. if (not qos_policy and 'qos_policy_id' in port_res and port_res['qos_policy_id']): qos_policy = policy_object.QosPolicy.get_policy_obj( context.get_admin_context(), port_res['qos_policy_id'] ) # Note(lajoskatona): handle the case when the port inherits qos-policy # from the network. if not qos_policy: net = network_object.Network.get_object( context.get_admin_context(), id=port_res['network_id']) if net and net.qos_policy_id: qos_policy = policy_object.QosPolicy.get_network_policy( context.get_admin_context(), net.id) if not qos_policy: return port_res resources = {} rule_direction_class = { nl_constants.INGRESS_DIRECTION: pl_constants.CLASS_NET_BW_INGRESS_KBPS, nl_constants.EGRESS_DIRECTION: pl_constants.CLASS_NET_BW_EGRESS_KBPS } for rule in qos_policy.rules: if rule.rule_type == qos_consts.RULE_TYPE_MINIMUM_BANDWIDTH: resources[rule_direction_class[rule.direction]] = rule.min_kbps if not resources: return port_res vnic_trait = pl_utils.vnic_type_trait( port_res[portbindings.VNIC_TYPE]) # TODO(lajoskatona): Change to handle all segments when any traits # support will be available. See Placement spec: # https://review.openstack.org/565730 first_segment = network_object.NetworkSegment.get_objects( context.get_admin_context(), network_id=port_res['network_id'])[0] if not first_segment or not first_segment.physical_network: return port_res physnet_trait = pl_utils.physnet_trait( first_segment.physical_network) resource_request = { 'required': [physnet_trait, vnic_trait], 'resources': resources } port_res['resource_request'] = resource_request return port_res
def deferred_update_resource_provider_traits(self): rp_traits = [] physnet_trait_mappings = {} for physnet, devices in self._device_mappings.items(): for device in devices: physnet_trait_mappings[device] = place_utils.physnet_trait( physnet) vnic_type_traits = [place_utils.vnic_type_trait(vnic_type) for vnic_type in self._supported_vnic_types] for device in self._rp_bandwidths: rp_uuid = place_utils.device_resource_provider_uuid( self._driver_uuid_namespace, self._agent_host, device) traits = [] traits.append(physnet_trait_mappings[device]) traits.extend(vnic_type_traits) rp_traits.append( DeferredCall( self._client.update_resource_provider_traits, resource_provider_uuid=rp_uuid, traits=traits)) return rp_traits
def _extend_port_resource_request(port_res, port_db): """Add resource request to a port.""" port_res['resource_request'] = None qos_policy = policy_object.QosPolicy.get_port_policy( context.get_admin_context(), port_res['id']) # Note(lajoskatona): QosPolicyPortBinding is not ready for some # reasons, so let's try and fetch the QoS policy directly if there is a # qos_policy_id in port_res. if (not qos_policy and 'qos_policy_id' in port_res and port_res['qos_policy_id']): qos_policy = policy_object.QosPolicy.get_policy_obj( context.get_admin_context(), port_res['qos_policy_id'] ) # Note(lajoskatona): handle the case when the port inherits qos-policy # from the network. if not qos_policy: net = network_object.Network.get_object( context.get_admin_context(), id=port_res['network_id']) if net and net.qos_policy_id: qos_policy = policy_object.QosPolicy.get_network_policy( context.get_admin_context(), net.id) if not qos_policy: return port_res resources = {} rule_direction_class = { nl_constants.INGRESS_DIRECTION: pl_constants.CLASS_NET_BW_INGRESS_KBPS, nl_constants.EGRESS_DIRECTION: pl_constants.CLASS_NET_BW_EGRESS_KBPS } for rule in qos_policy.rules: if rule.rule_type == qos_consts.RULE_TYPE_MINIMUM_BANDWIDTH: resources[rule_direction_class[rule.direction]] = rule.min_kbps if not resources: return port_res vnic_trait = pl_utils.vnic_type_trait( port_res[portbindings.VNIC_TYPE]) # TODO(lajoskatona): Change to handle all segments when any traits # support will be available. See Placement spec: # https://review.openstack.org/565730 first_segment = network_object.NetworkSegment.get_objects( context.get_admin_context(), network_id=port_res['network_id'])[0] if not first_segment or not first_segment.physical_network: return port_res physnet_trait = pl_utils.physnet_trait( first_segment.physical_network) resource_request = { 'required': [physnet_trait, vnic_trait], 'resources': resources } port_res['resource_request'] = resource_request return port_res
def _deferred_update_vnic_type_traits(self): traits = [] for vnic_type in self._supported_vnic_types: traits.append( DeferredCall( self._client.update_trait, name=place_utils.vnic_type_trait(vnic_type))) return traits
def _extend_port_resource_request(port_res, port_db): """Add resource request to a port.""" if isinstance(port_db, ports_object.Port): qos_id = port_db.qos_policy_id or port_db.qos_network_policy_id else: qos_id = None if port_db.get('qos_policy_binding'): qos_id = port_db.qos_policy_binding.policy_id elif port_db.get('qos_network_policy_binding'): qos_id = port_db.qos_network_policy_binding.policy_id port_res['resource_request'] = None if not qos_id: return port_res qos_policy = policy_object.QosPolicy.get_object( context.get_admin_context(), id=qos_id) resources = {} # NOTE(ralonsoh): we should move this translation dict to n-lib. rule_direction_class = { nl_constants.INGRESS_DIRECTION: pl_constants.CLASS_NET_BW_INGRESS_KBPS, nl_constants.EGRESS_DIRECTION: pl_constants.CLASS_NET_BW_EGRESS_KBPS } for rule in qos_policy.rules: if rule.rule_type == qos_consts.RULE_TYPE_MINIMUM_BANDWIDTH: resources[rule_direction_class[rule.direction]] = rule.min_kbps if not resources: return port_res # NOTE(ralonsoh): we should not rely on the current execution order of # the port extending functions. Although here we have # port_res[VNIC_TYPE], we should retrieve this value from the port DB # object instead. vnic_trait = pl_utils.vnic_type_trait( port_res[portbindings.VNIC_TYPE]) # TODO(lajoskatona): Change to handle all segments when any traits # support will be available. See Placement spec: # https://review.opendev.org/565730 first_segment = network_object.NetworkSegment.get_objects( context.get_admin_context(), network_id=port_db.network_id)[0] if not first_segment or not first_segment.physical_network: return port_res physnet_trait = pl_utils.physnet_trait( first_segment.physical_network) port_res['resource_request'] = { 'required': [physnet_trait, vnic_trait], 'resources': resources} return port_res
def _get_traits(vnic_type, segments): # TODO(lajoskatona): Change to handle all segments when any traits # support will be available. See Placement spec: # https://review.opendev.org/565730 first_segment = segments[0] if not first_segment or not first_segment.physical_network: return [] physnet_trait = pl_utils.physnet_trait(first_segment.physical_network) # NOTE(ralonsoh): we should not rely on the current execution order of # the port extending functions. Although here we have # port_res[VNIC_TYPE], we should retrieve this value from the port DB # object instead. vnic_trait = pl_utils.vnic_type_trait(vnic_type) return [physnet_trait, vnic_trait]
def test_vnic_type_trait(self): self.assertEqual( 'CUSTOM_VNIC_TYPE_SOMEVNICTYPE', place_utils.vnic_type_trait('somevnictype'))