def __update_smart_nic_labels_and_capacities( self, *, available_component: ComponentSliver, requested_component: ComponentSliver) -> ComponentSliver: """ Update the IFS for the Smart NIC with VLAN, MAC and IP Address information This is to enable AM handler to configure network interfaces at VM creation. This is only done for Layer 2 services :param available_component: Available Component :param requested_component: Requested Component :return updated requested component with VLAN, MAC and IP information """ # Find the VLAN from the BQM Component if available_component.network_service_info is None or \ len(available_component.network_service_info.network_services) != 1: message = "Smart NIC Card must have at one Network Service" self.logger.error(message) raise BrokerException(error_code=ExceptionErrorCode.FAILURE, msg=f"{message}") ns_name = next( iter(available_component.network_service_info.network_services)) ns = available_component.network_service_info.network_services[ns_name] if ns.interface_info is None or len(ns.interface_info.interfaces) < 0: message = "Smart NIC Card must have at least one Connection Point" self.logger.error(message) raise BrokerException(error_code=ExceptionErrorCode.FAILURE, msg=f"{message}") for ifs in ns.interface_info.interfaces.values(): delegation_id, ifs_delegated_labels = self._get_delegations( lab_cap_delegations=ifs.get_label_delegations()) for requested_ns in requested_component.network_service_info.network_services.values( ): if requested_ns.interface_info is not None and requested_ns.interface_info.interfaces is not None: for requested_ifs in requested_ns.interface_info.interfaces.values( ): if requested_ifs.labels.local_name == ifs_delegated_labels.local_name: lab = Labels() lab.mac = ifs_delegated_labels.mac lab.local_name = ifs_delegated_labels.local_name # Update the VLAN and IP address to be used for configuration at AM only for L2 services # Information for L3 services is updated later after NetworkService has been ticketed if requested_ns.layer == NSLayer.L2: if requested_ifs.labels is not None and requested_ifs.labels.vlan is not None: lab.vlan = requested_ifs.labels.vlan if requested_ifs.labels.ipv4 is not None: lab.ipv4 = requested_ifs.labels.ipv4 if requested_ifs.labels.ipv6 is not None: lab.ipv6 = requested_ifs.labels.ipv6 requested_ifs.set_label_allocations(lab=lab) self.logger.info( f"Assigned Interface Sliver: {requested_ifs}") return requested_component
def create_unit(include_pci: bool = True, include_image: bool = True, include_name: bool = True, include_instance_name: bool = False, include_ns: bool = False) -> Unit: """ Create a unit :param include_pci: :param include_image: :param include_name: :param include_instance_name: :param include_ns: :return: """ u = Unit(rid=ID(uid="rid-1")) sliver = NodeSliver() cap = Capacities() cap.set_fields(core=4, ram=64, disk=500) catalog = InstanceCatalog() instance_type = catalog.map_capacities_to_instance(cap=cap) cap_hints = CapacityHints().set_fields(instance_type=instance_type) sliver.set_properties( type=NodeType.VM, site="RENC", capacity_hints=cap_hints, capacity_allocations=catalog.get_instance_capacities( instance_type=instance_type)) sliver.label_allocations = Labels().set_fields( instance_parent="renc-w1.fabric-testbed.net") if include_name: sliver.set_properties(name="n1") if include_image: sliver.set_properties(image_type='qcow2', image_ref='default_centos_8') if include_pci: component = ComponentSliver() labels = Labels() labels.set_fields(bdf=["0000:41:00.0", "0000:41:00.1"]) component.set_properties(type=ComponentType.SmartNIC, model='ConnectX-6', name='nic1', label_allocations=labels) sliver.attached_components_info = AttachedComponentsInfo() sliver.attached_components_info.add_device(device_info=component) if include_instance_name: sliver.label_allocations.set_fields(instance="instance-001") if include_ns: sliver.network_service_info = NetworkServiceInfo() ns = NetworkServiceSliver() ns.interface_info = InterfaceInfo() ifs1 = InterfaceSliver() c = Capacities() c.bw = 100 c.unit = 1 l1 = Labels() l1.ipv4 = '192.168.11.3' l1.vlan = '200' l1.local_name = 'p1' la_1 = Labels() la_1.mac = '0C:42:A1:EA:C7:51' la_1.vlan = '200' ifs1.capacities = c ifs1.labels = l1 ifs1.label_allocations = la_1 ifs2 = InterfaceSliver() ifs2.capacities = c l2 = Labels() l2.ipv4 = '192.168.11.2' l2.local_name = 'p2' la_2 = Labels() la_2.mac = '0C:42:A1:EA:C7:52' ifs2.labels = l2 ifs2.label_allocations = la_1 ns.interface_info.interfaces = {'ifs1': ifs1, 'ifs2': ifs2} sliver.network_service_info.network_services = {'ns1': ns} u.set_sliver(sliver=sliver) return u