def _create_vmi(self, pod_name, pod_namespace, pod_id, vm_obj, vn_obj, parent_vmi, idx, network=None): proj_fq_name = vnc_kube_config.cluster_project_fq_name(pod_namespace) proj_obj = self._vnc_lib.project_read(fq_name=proj_fq_name) if network and 'namespace' in network: network.pop('namespace') vmi_prop = None if self._is_pod_nested() and parent_vmi: # Pod is nested. # Allocate a vlan-id for this pod from the vlan space managed # in the VMI of the underlay VM. parent_vmi = VirtualMachineInterfaceKM.get(parent_vmi.uuid) vlan_id = parent_vmi.alloc_vlan() vmi_prop = VirtualMachineInterfacePropertiesType( sub_interface_vlan_tag=vlan_id) obj_uuid = str(uuid.uuid1()) name = VncCommon.make_name(pod_name, obj_uuid) vmi_obj = VirtualMachineInterface( name=name, parent_obj=proj_obj, virtual_machine_interface_properties=vmi_prop, display_name=name) vmi_obj.uuid = obj_uuid vmi_obj.set_virtual_network(vn_obj) vmi_obj.set_virtual_machine(vm_obj) self._associate_security_groups(vmi_obj, proj_obj, pod_namespace) vmi_obj.port_security_enabled = True VirtualMachineInterfaceKM.add_annotations(self, vmi_obj, pod_namespace, pod_name, index=idx, **network) try: vmi_uuid = self._vnc_lib.virtual_machine_interface_create(vmi_obj) except RefsExistError: vmi_uuid = self._vnc_lib.virtual_machine_interface_update(vmi_obj) VirtualMachineInterfaceKM.locate(vmi_uuid) return vmi_uuid
def _update_network_status(self, pod_name, pod_namespace, network_status): net_status_dict_list = [] for nw_name, vmi_uuid in list(network_status.items()): vmi_obj = self._vnc_lib.virtual_machine_interface_read(id=vmi_uuid) vmi = VirtualMachineInterfaceKM.locate(vmi_uuid) pod_iips = [] for iip_uuid in list(vmi.instance_ips): iip_obj = self._vnc_lib.instance_ip_read(id=iip_uuid) if not iip_obj.get_instance_ip_secondary(): ip = iip_obj.get_instance_ip_address() pod_iips.append(ip) ns_dict = {} ns_dict['name'] = nw_name ns_dict['ips'] = ''.join(pod_iips) ns_dict['mac'] = \ ''.join(vmi_obj.get_virtual_machine_interface_mac_addresses().get_mac_address()) net_status_dict_list.append(ns_dict) patch = { 'metadata': { 'annotations': { 'k8s.v1.cni.cncf.io/network-status': json.dumps(net_status_dict_list, sort_keys=True, indent=4, separators=(',', ': ')) } } } if self._kube is not None: self._kube.patch_resource("pod", pod_name, patch, pod_namespace)
def _update_network_status(self, pod_name, pod_namespace, network_status): net_status_dict_list = [] for nw_name,vmi_uuid in network_status.items(): vmi_obj = self._vnc_lib.virtual_machine_interface_read(id=vmi_uuid) vmi = VirtualMachineInterfaceKM.locate(vmi_uuid) pod_iips = [] for iip_uuid in list(vmi.instance_ips): iip_obj = self._vnc_lib.instance_ip_read(id=iip_uuid) if not iip_obj.get_instance_ip_secondary(): ip = iip_obj.get_instance_ip_address() pod_iips.append(ip) ns_dict = {} ns_dict['name'] = nw_name ns_dict['ips'] = ''.join(pod_iips) ns_dict['mac'] = \ ''.join(vmi_obj.get_virtual_machine_interface_mac_addresses(\ ).get_mac_address()) net_status_dict_list.append(ns_dict) patch = {'metadata': {'annotations': {\ 'k8s.v1.cni.cncf.io/network-status':\ json.dumps(net_status_dict_list)}}} if self._kube is not None: self._kube.patch_resource("pods", pod_name, patch, \ pod_namespace, beta=False)
def _get_iip(self, vmi_uuid): vmi = self._vnc_lib.virtual_machine_interface_read(id=vmi_uuid) vmi = VirtualMachineInterfaceKM.locate(vmi_uuid) iip_uuid = list(vmi.instance_ips)[0] iip_obj = self._vnc_lib.instance_ip_read(id=iip_uuid) iip_ip = iip_obj.get_instance_ip_address() return iip_ip
def _get_iip(self, vmi_uuid): vmi = self._vnc_lib.virtual_machine_interface_read(id=vmi_uuid) vmi = VirtualMachineInterfaceKM.locate(vmi_uuid) iip_uuid = list(vmi.instance_ips)[0] iip_obj = self._vnc_lib.instance_ip_read(id=iip_uuid) iip_ip = iip_obj.get_instance_ip_address() return iip_ip
def create_virtual_machine(self, name, vn, ipaddress): vm = VirtualMachine(name) self._vnc_lib.virtual_machine_create(vm) VirtualMachineKM.locate(vm.uuid) vmi = VirtualMachineInterface( parent_type='virtual-machine', fq_name=[name, '0']) vmi.set_virtual_machine(vm) vmi.set_virtual_network(vn) self._vnc_lib.virtual_machine_interface_create(vmi) VirtualMachineInterfaceKM.locate(vmi.uuid) ip = InstanceIp(vm.name + '.0') ip.set_virtual_machine_interface(vmi) ip.set_virtual_network(vn) ip.set_instance_ip_address(ipaddress) self._vnc_lib.instance_ip_create(ip) InstanceIpKM.locate(ip.uuid) return vm, vmi, ip
def create_virtual_machine(self, name, vn, ipaddress): vm = VirtualMachine(name) self._vnc_lib.virtual_machine_create(vm) VirtualMachineKM.locate(vm.uuid) vmi = VirtualMachineInterface( parent_type='virtual-machine', fq_name=[name, '0']) vmi.set_virtual_machine(vm) vmi.set_virtual_network(vn) self._vnc_lib.virtual_machine_interface_create(vmi) VirtualMachineInterfaceKM.locate(vmi.uuid) ip = InstanceIp(vm.name + '.0') ip.set_virtual_machine_interface(vmi) ip.set_virtual_network(vn) ip.set_instance_ip_address(ipaddress) self._vnc_lib.instance_ip_create(ip) InstanceIpKM.locate(ip.uuid) return vm, vmi, ip
def create_virtual_machine(self, name, vn, ipaddress): vm = VirtualMachine(name) self._vnc_lib.virtual_machine_create(vm) VirtualMachineKM.locate(vm.uuid) vmi = VirtualMachineInterface( parent_type='virtual-machine', fq_name=[name, '0']) vmi.set_virtual_machine(vm) vmi.set_virtual_network(vn) if DBBaseKM.is_nested(): vmi.set_virtual_machine_interface_bindings( KeyValuePairs([KeyValuePair('host_id', 'WHATEVER')])) self._vnc_lib.virtual_machine_interface_create(vmi) VirtualMachineInterfaceKM.locate(vmi.uuid) ip = InstanceIp(vm.name + '.0') ip.set_virtual_machine_interface(vmi) ip.set_virtual_network(vn) ip.set_instance_ip_address(ipaddress) self._vnc_lib.instance_ip_create(ip) InstanceIpKM.locate(ip.uuid) return vm, vmi, ip
def create_virtual_machine(self, name, vn, ipaddress): vm = VirtualMachine(name) self._vnc_lib.virtual_machine_create(vm) VirtualMachineKM.locate(vm.uuid) vmi = VirtualMachineInterface(parent_type='virtual-machine', fq_name=[name, '0']) vmi.set_virtual_machine(vm) vmi.set_virtual_network(vn) if DBBaseKM.is_nested(): vmi.set_virtual_machine_interface_bindings( KeyValuePairs([KeyValuePair('host_id', 'WHATEVER')])) self._vnc_lib.virtual_machine_interface_create(vmi) VirtualMachineInterfaceKM.locate(vmi.uuid) ip = InstanceIp(vm.name + '.0') ip.set_virtual_machine_interface(vmi) ip.set_virtual_network(vn) ip.set_instance_ip_address(ipaddress) self._vnc_lib.instance_ip_create(ip) InstanceIpKM.locate(ip.uuid) return vm, vmi, ip
def _create_vmi(self, pod_name, pod_namespace, pod_id, vm_obj, vn_obj, parent_vmi, idx, nw_name=''): proj_fq_name = vnc_kube_config.cluster_project_fq_name(pod_namespace) proj_obj = self._vnc_lib.project_read(fq_name=proj_fq_name) vmi_prop = None if self._is_pod_nested() and parent_vmi: # Pod is nested. # Allocate a vlan-id for this pod from the vlan space managed # in the VMI of the underlay VM. parent_vmi = VirtualMachineInterfaceKM.get(parent_vmi.uuid) vlan_id = parent_vmi.alloc_vlan() vmi_prop = VirtualMachineInterfacePropertiesType( sub_interface_vlan_tag=vlan_id) obj_uuid = str(uuid.uuid1()) name = VncCommon.make_name(pod_name, obj_uuid) vmi_obj = VirtualMachineInterface( name=name, parent_obj=proj_obj, virtual_machine_interface_properties=vmi_prop, display_name=name) vmi_obj.uuid = obj_uuid vmi_obj.set_virtual_network(vn_obj) vmi_obj.set_virtual_machine(vm_obj) self._associate_security_groups(vmi_obj, proj_obj, pod_namespace) vmi_obj.port_security_enabled = True VirtualMachineInterfaceKM.add_annotations(self, vmi_obj, pod_namespace, pod_name, index=idx, network=nw_name) try: vmi_uuid = self._vnc_lib.virtual_machine_interface_create(vmi_obj) except RefsExistError: vmi_uuid = self._vnc_lib.virtual_machine_interface_update(vmi_obj) VirtualMachineInterfaceKM.locate(vmi_uuid) return vmi_uuid
def _assert_virtual_machine(self, pod_uuid, cluster_project, proj_obj, vn_obj_uuid): vm = self._vnc_lib.virtual_machine_read(id=pod_uuid) self.assertIsNotNone(vm) vm = VirtualMachineKM.locate(vm.uuid) self.assertIsNotNone(vm) self.assertTrue(len(vm.virtual_machine_interfaces) > 0) for vmi_id in list(vm.virtual_machine_interfaces): vmi = self._vnc_lib.virtual_machine_interface_read(id=vmi_id) self.assertIsNotNone(vmi) self.assertEqual(vmi.parent_name, cluster_project) self.assertEqual(vmi.parent_uuid, proj_obj.uuid) vmi = VirtualMachineInterfaceKM.locate(vmi_id) self.assertTrue(len(vmi.security_groups) > 1) for sg_uuid in list(vmi.security_groups): sg = self._vnc_lib.security_group_read(id=sg_uuid) self.assertIsNotNone(sg) self.assertTrue(len(vmi.instance_ips) == 1) iip_uuid = list(vmi.instance_ips)[0] iip = self._vnc_lib.instance_ip_read(id=iip_uuid) self.assertIsNotNone(iip) self._assert_pod_ip_is_from_vn_ipam(iip, vn_obj_uuid)
def _assert_virtual_machine(self, pod_uuid, cluster_project, proj_obj, vn_obj_uuid): vm = self._vnc_lib.virtual_machine_read(id=pod_uuid) self.assertIsNotNone(vm) vm = VirtualMachineKM.locate(vm.uuid) self.assertIsNotNone(vm) self.assertTrue(len(vm.virtual_machine_interfaces) > 0) for vmi_id in list(vm.virtual_machine_interfaces): vmi = self._vnc_lib.virtual_machine_interface_read(id=vmi_id) self.assertIsNotNone(vmi) self.assertEqual(vmi.parent_name, cluster_project) self.assertEqual(vmi.parent_uuid, proj_obj.uuid) vmi = VirtualMachineInterfaceKM.locate(vmi_id) # self.assertTrue(len(vmi.security_groups) > 1) # for sg_uuid in list(vmi.security_groups): # sg = self._vnc_lib.security_group_read(id=sg_uuid) # self.assertIsNotNone(sg) self.assertTrue(len(vmi.instance_ips) == 1) iip_uuid = list(vmi.instance_ips)[0] iip = self._vnc_lib.instance_ip_read(id=iip_uuid) self.assertIsNotNone(iip) self._assert_pod_ip_is_from_vn_ipam(iip, vn_obj_uuid)
def _create_virtual_interface(self, proj_obj, vn_obj, service_ns, service_name, service_id, k8s_event_type, vip_address=None, subnet_uuid=None, tags=None): vmi_uuid = str(uuid.uuid4()) cluster_name = vnc_kube_config.cluster_name() vmi_name = VncCommon.make_name(cluster_name, k8s_event_type, service_name, service_id) vmi_display_name = VncCommon.make_display_name(service_ns, service_name) # Check if VMI exists, if yes, delete it. vmi_obj = VirtualMachineInterface(name=vmi_name, parent_obj=proj_obj, display_name=vmi_display_name) try: vmi_id = self._vnc_lib.fq_name_to_id('virtual-machine-interface', vmi_obj.get_fq_name()) if vmi_id: self.logger.error("Duplicate LB Interface %s, delete it" % vmi_obj.get_fq_name()) vmi = VirtualMachineInterfaceKM.get(vmi_id) iip_ids = vmi.instance_ips for iip_id in list(iip_ids): iip_obj = self._vnc_lib.instance_ip_read(id=iip_id) fip_refs = iip_obj.get_floating_ips() for fip_ref in fip_refs or []: fip = self._vnc_lib.floating_ip_read( id=fip_ref['uuid']) fip.set_virtual_machine_interface_list([]) self._vnc_lib.floating_ip_update(fip) self._vnc_lib.floating_ip_delete(id=fip_ref['uuid']) self._vnc_lib.instance_ip_delete(id=iip_obj.uuid) self._vnc_lib.virtual_machine_interface_delete(id=vmi_id) except NoIdError: pass # Create LB VMI vmi_obj.name = vmi_name vmi_obj.uuid = vmi_uuid vmi_obj.set_virtual_network(vn_obj) vmi_obj.set_virtual_machine_interface_device_owner("K8S:LOADBALANCER") sg_name = "-".join( [vnc_kube_config.cluster_name(), service_ns, 'default-sg']) sg_obj = SecurityGroup(sg_name, proj_obj) vmi_obj.add_security_group(sg_obj) vmi_obj.port_security_enabled = True try: self.logger.debug("Create LB Interface %s " % vmi_obj.get_fq_name()) self._vnc_lib.virtual_machine_interface_create(vmi_obj) VirtualMachineInterfaceKM.locate(vmi_obj.uuid) except BadRequest as e: self.logger.warning("LB (%s) Interface create failed %s " % (service_name, str(e))) return None, None try: vmi_obj = self._vnc_lib.virtual_machine_interface_read( id=vmi_obj.uuid) except NoIdError: self.logger.warning("Read Service VMI failed for" " service (" + service_name + ")" + " with NoIdError for vmi(" + vmi_id + ")") return None, None # Attach tags on this VMI. if tags: self._vnc_lib.set_tags(vmi_obj, tags) # Create InstanceIP <--- LB VMI iip_uuid = str(uuid.uuid4()) iip_name = VncCommon.make_name(service_name, iip_uuid) iip_display_name = VncCommon.make_display_name(service_ns, service_name) perms2 = PermType2() perms2.owner = proj_obj.uuid perms2.owner_access = cfgm_common.PERMS_RWX iip_obj = InstanceIp(name=iip_name, perms2=perms2, display_name=iip_display_name) iip_obj.uuid = iip_uuid iip_obj.set_virtual_network(vn_obj) if subnet_uuid: iip_obj.set_subnet_uuid(subnet_uuid) iip_obj.set_virtual_machine_interface(vmi_obj) iip_obj.set_display_name(service_name) if vip_address: iip_obj.set_instance_ip_address(vip_address) try: self.logger.debug("Create LB VMI InstanceIp %s " % iip_obj.get_fq_name()) self._vnc_lib.instance_ip_create(iip_obj) except RefsExistError: self._vnc_lib.instance_ip_update(iip_obj) InstanceIpKM.locate(iip_obj.uuid) iip_obj = self._vnc_lib.instance_ip_read(id=iip_obj.uuid) vip_address = iip_obj.get_instance_ip_address() self.logger.debug("Created LB VMI InstanceIp %s with VIP %s" % (iip_obj.get_fq_name(), vip_address)) return vmi_obj, vip_address