def _create_virtual_interface(self, project, lb_id, subnet_id, ip_address): network_id = utils.get_subnet_network_id(self._api, subnet_id) try: vnet = self._api.virtual_network_read(id=network_id) except NoIdError: raise NetworkNotFound(net_id=network_id) vmi = VirtualMachineInterface(lb_id, project) vmi.set_virtual_network(vnet) vmi.set_virtual_machine_interface_device_owner( DEVICE_OWNER_LOADBALANCER) sg_obj = SecurityGroup("default", project) vmi.add_security_group(sg_obj) self._api.virtual_machine_interface_create(vmi) iip_obj = InstanceIp(name=lb_id) iip_obj.set_virtual_network(vnet) iip_obj.set_subnet_uuid(subnet_id) iip_obj.set_virtual_machine_interface(vmi) if ip_address and ip_address != ATTR_NOT_SPECIFIED: iip_obj.set_instance_ip_address(ip_address) self._api.instance_ip_create(iip_obj) iip = self._api.instance_ip_read(id=iip_obj.uuid) vip_address = iip.get_instance_ip_address() return vmi, vip_address
def construct_instance_ip(self): if not self._should_construct_instance_ip(): return logger.info('Constructing Instance IP for Interface %s', self.display_name) instance_ip_name = 'ip-' + self.vn_model.name + '-' + self.vm_model.name instance_ip_uuid = self.construct_instance_ip_uuid(instance_ip_name) instance_ip = InstanceIp( name=instance_ip_uuid, display_name=instance_ip_name, id_perms=ID_PERMS, ) instance_ip.set_uuid(instance_ip_uuid) instance_ip.set_virtual_network(self.vn_model.vnc_vn) instance_ip.set_virtual_machine_interface(self.vnc_vmi) if self.vn_model.vnc_vn.get_external_ipam(): logger.info('VN %s uses external IPAM - setting IP address to: %s', self.vn_model.name, self._ip_address) instance_ip.set_instance_ip_address(self._ip_address) self.vnc_instance_ip = instance_ip
def _create_virtual_interface(self, project, lb_id, subnet_id, network_id, ip_address): iip_obj = InstanceIp(name=lb_id) if subnet_id and subnet_id != ATTR_NOT_SPECIFIED: network_id = utils.get_subnet_network_id(self._api, subnet_id) vnet = utils.get_vnet_obj(self._api, network_id) iip_obj.set_subnet_uuid(subnet_id) elif network_id and network_id != ATTR_NOT_SPECIFIED: vnet = utils.get_vnet_obj(self._api, network_id) else: msg = 'vip-network-id or vip-subnet-id should be specified' raise BadRequest(resource='loadbalancer', msg=msg) vmi = VirtualMachineInterface(lb_id, project) vmi.set_virtual_network(vnet) vmi.set_virtual_machine_interface_device_owner( DEVICE_OWNER_LOADBALANCER) sg_obj = SecurityGroup("default", project) vmi.add_security_group(sg_obj) self._api.virtual_machine_interface_create(vmi) iip_obj.set_virtual_network(vnet) iip_obj.set_virtual_machine_interface(vmi) if ip_address and ip_address != ATTR_NOT_SPECIFIED: iip_obj.set_instance_ip_address(ip_address) self._api.instance_ip_create(iip_obj) iip = self._api.instance_ip_read(id=iip_obj.uuid) vip_address = iip.get_instance_ip_address() vip_subnet_id = iip.get_subnet_uuid() return vmi, vip_address, vip_subnet_id
def test_create_pool(self): tenant_id = _uuid() pool_id = _uuid() vip_id = _uuid() subnet_id = _uuid() api = self.api_server project = Project(name='test') project.uuid = tenant_id template = ServiceTemplate('lb-test', project) template.uuid = _uuid() pool_attrs = LoadbalancerPoolType() pool_attrs.subnet_id = subnet_id pool = LoadbalancerPool( pool_id, project, loadbalancer_pool_properties=pool_attrs) pool.uuid = pool_id vip_attrs = VirtualIpType() vip_attrs.subnet_id = subnet_id vip_attrs.address = '127.0.0.1' vip = VirtualIp(vip_id, project, virtual_ip_properties=vip_attrs) vip.uuid = vip_id vip.set_loadbalancer_pool(pool) vnet = VirtualNetwork('test', project) vnet.uuid = _uuid() vmi = VirtualMachineInterface(vip_id, project) vmi.uuid = _uuid() vmi.set_virtual_network(vnet) iip = InstanceIp(vip_id, instance_ip_address='127.0.0.1') iip.uuid = _uuid() iip.set_virtual_machine_interface(vmi) iip_refs = [ {'to': iip.get_fq_name(), 'uuid': iip.uuid} ] vmi.get_instance_ip_back_refs = mock.Mock() vmi.get_instance_ip_back_refs.return_value = iip_refs vip.set_virtual_machine_interface(vmi) api.virtual_service_template_read = template api.loadbalancer_pool_read.return_value = pool api.virtual_ip_read.return_value = vip api.kv_retrieve.return_value = '%s %s' % (vnet.uuid, subnet_id) api.virtual_machine_interface_read.return_value = vmi api.instance_ip_read.return_value = iip api.service_instance_read.side_effect = NoIdError('404') context = {} pool_data = { 'id': pool_id, 'vip_id': vip_id } self.driver.create_pool(context, pool_data) api.service_instance_create.assert_called_with(mock.ANY)
def _create_virtual_interface(self, project, vip_id, subnet_id, ip_address): network_id = utils.get_subnet_network_id(self._api, subnet_id) try: vnet = self._api.virtual_network_read(id=network_id) except NoIdError: raise n_exc.NetworkNotFound(net_id=network_id) vmi = VirtualMachineInterface(vip_id, project) vmi.set_virtual_network(vnet) try: vmi.set_virtual_machine_interface_device_owner(n_constants.DEVICE_OWNER_LOADBALANCER) except AttributeError: # DEVICE_OWNER_LOADBALANCER is only supported from JUNO onwards pass sg_obj = SecurityGroup("default", project) vmi.add_security_group(sg_obj) self._api.virtual_machine_interface_create(vmi) iip_obj = InstanceIp(name=vip_id) iip_obj.set_virtual_network(vnet) iip_obj.set_virtual_machine_interface(vmi) if ip_address and ip_address != attributes.ATTR_NOT_SPECIFIED: iip_obj.set_instance_ip_address(ip_address) self._api.instance_ip_create(iip_obj) iip = self._api.instance_ip_read(id=iip_obj.uuid) vip_address = iip.get_instance_ip_address() return vmi, vip_address
def _create_virtual_interface(self, project, vip_id, subnet_id, ip_address): network_id = utils.get_subnet_network_id(self._api, subnet_id) try: vnet = self._api.virtual_network_read(id=network_id) except NoIdError: raise n_exc.NetworkNotFound(net_id=network_id) vmi = VirtualMachineInterface(vip_id, project) vmi.set_virtual_network(vnet) sg_obj = SecurityGroup("default", project) vmi.add_security_group(sg_obj) self._api.virtual_machine_interface_create(vmi) fq_name = list(project.get_fq_name()) fq_name.append(vip_id) iip_obj = InstanceIp(fq_name=fq_name) iip_obj.set_virtual_network(vnet) iip_obj.set_virtual_machine_interface(vmi) if ip_address and ip_address != attributes.ATTR_NOT_SPECIFIED: iip_obj.set_instance_ip_address(ip_address) self._api.instance_ip_create(fq_name) return vmi
def _create_instance_ip(self, name, inst_ip, vmi_obj, vn_obj): instance_ip_obj = InstanceIp(name=name) instance_ip_obj.set_instance_ip_address(inst_ip) instance_ip_obj.set_virtual_machine_interface(vmi_obj) instance_ip_obj.set_virtual_network(vn_obj) uuid = self._vnc_lib.instance_ip_create(instance_ip_obj) instance_ip_obj_rd = self._vnc_lib.instance_ip_read(id=uuid) return instance_ip_obj, instance_ip_obj_rd
def _create_iip(self, pod_task_id, vn_obj, vmi, custom_ipam=None): vn = VirtualNetworkMM.find_by_name_or_uuid(vn_obj.get_uuid()) if not vn: # It is possible our cache may not have the VN yet. Locate it. vn = VirtualNetworkMM.locate(vn_obj.get_uuid()) if custom_ipam is None: ipam_fq_name = vnc_mesos_config.pod_task_ipam_fq_name() else: ipam_fq_name = custom_ipam.split(':') pod_ipam_subnet_uuid = vn.get_ipam_subnet_uuid(ipam_fq_name) # Create instance-ip. iip_uuid = str(uuid.uuid1()) iip_obj = InstanceIp(name=pod_task_id, subnet_uuid=pod_ipam_subnet_uuid) iip_obj.uuid = iip_uuid iip_obj.add_virtual_network(vn_obj) # Creation of iip requires the vmi vnc object. vmi_obj = self._vnc_lib.virtual_machine_interface_read( fq_name=vmi.fq_name) iip_obj.add_virtual_machine_interface(vmi_obj) InstanceIpMM.add_annotations(self, iip_obj, pod_task_id) self._logger.debug("%s: Create IIP from ipam_fq_name [%s]" " pod_ipam_subnet_uuid [%s]" " vn [%s] vmi_fq_name [%s]" %\ (self._name, ipam_fq_name, pod_ipam_subnet_uuid, vn.name, vmi.fq_name)) try: self._vnc_lib.instance_ip_create(iip_obj) except RefsExistError: self._vnc_lib.instance_ip_update(iip_obj) InstanceIpMM.locate(iip_obj.uuid) return iip_obj
def _create_iip(self, pod_name, pod_namespace, vn_obj, vmi): # Instance-ip for pods are ALWAYS allocated from pod ipam on this # VN. Get the subnet uuid of the pod ipam on this VN, so we can request # an IP from it. vn = VirtualNetworkKM.find_by_name_or_uuid(vn_obj.get_uuid()) if not vn: # It is possible our cache may not have the VN yet. Locate it. vn = VirtualNetworkKM.locate(vn_obj.get_uuid()) pod_ipam_subnet_uuid = vn.get_ipam_subnet_uuid( vnc_kube_config.pod_ipam_fq_name()) # Create instance-ip. display_name = VncCommon.make_display_name(pod_namespace, pod_name) iip_uuid = str(uuid.uuid1()) iip_name = VncCommon.make_name(pod_name, iip_uuid) iip_obj = InstanceIp(name=iip_name, subnet_uuid=pod_ipam_subnet_uuid, display_name=display_name) iip_obj.uuid = iip_uuid iip_obj.add_virtual_network(vn_obj) # Creation of iip requires the vmi vnc object. vmi_obj = self._vnc_lib.virtual_machine_interface_read( fq_name=vmi.fq_name) iip_obj.add_virtual_machine_interface(vmi_obj) InstanceIpKM.add_annotations(self, iip_obj, pod_namespace, pod_name) try: self._vnc_lib.instance_ip_create(iip_obj) except RefsExistError: self._vnc_lib.instance_ip_update(iip_obj) InstanceIpKM.locate(iip_obj.uuid) return iip_obj
def _create_virtual_interface(self, project, lb_id, subnet_id, ip_address): network_id = utils.get_subnet_network_id(self._api, subnet_id) try: vnet = self._api.virtual_network_read(id=network_id) except NoIdError: raise n_exc.NetworkNotFound(net_id=network_id) vmi = VirtualMachineInterface(lb_id, project) vmi.set_virtual_network(vnet) vmi.set_virtual_machine_interface_device_owner(n_constants.DEVICE_OWNER_LOADBALANCER) sg_obj = SecurityGroup("default", project) vmi.add_security_group(sg_obj) self._api.virtual_machine_interface_create(vmi) iip_obj = InstanceIp(name=lb_id) iip_obj.set_virtual_network(vnet) iip_obj.set_virtual_machine_interface(vmi) if ip_address and ip_address != attributes.ATTR_NOT_SPECIFIED: iip_obj.set_instance_ip_address(ip_address) self._api.instance_ip_create(iip_obj) iip = self._api.instance_ip_read(id=iip_obj.uuid) vip_address = iip.get_instance_ip_address() return vmi, vip_address
def create_virtual_machine(self, name, vn, ipaddress): vm_instance = VirtualMachine(name) self._vnc_lib.virtual_machine_create(vm_instance) fq_name = [name, '0'] vmi = VirtualMachineInterface(parent_type='virtual-machine', fq_name=fq_name) vmi.set_virtual_network(vn) self._vnc_lib.virtual_machine_interface_create(vmi) ip = InstanceIp(vm_instance.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) return vm_instance
def _create_iip(self, pod_name, pod_namespace, proj_uuid, vn_obj, vmi): # Instance-ip for pods are ALWAYS allocated from pod ipam on this # VN. Get the subnet uuid of the pod ipam on this VN, so we can request # an IP from it. vn = VirtualNetworkKM.find_by_name_or_uuid(vn_obj.get_uuid()) if not vn: # It is possible our cache may not have the VN yet. Locate it. vn = VirtualNetworkKM.locate(vn_obj.get_uuid()) if self._is_pod_network_isolated(pod_namespace): vn_namespace = pod_namespace else: vn_namespace = 'default' if self._is_ip_fabric_forwarding_enabled(vn_namespace): ipam_fq_name = vnc_kube_config.ip_fabric_ipam_fq_name() else: ipam_fq_name = vnc_kube_config.pod_ipam_fq_name() pod_ipam_subnet_uuid = vn.get_ipam_subnet_uuid(ipam_fq_name) # Create instance-ip. iip_uuid = str(uuid.uuid1()) iip_name = VncCommon.make_name(pod_name, iip_uuid) perms2 = PermType2() perms2.owner = proj_uuid perms2.owner_access = PERMS_RWX iip_obj = InstanceIp(name=iip_name, subnet_uuid=pod_ipam_subnet_uuid, display_name=iip_name, perms2=perms2) iip_obj.uuid = iip_uuid iip_obj.add_virtual_network(vn_obj) # Creation of iip requires the vmi vnc object. vmi_obj = self._vnc_lib.virtual_machine_interface_read( fq_name=vmi.fq_name) iip_obj.add_virtual_machine_interface(vmi_obj) InstanceIpKM.add_annotations(self, iip_obj, pod_namespace, pod_name) self._logger.debug("%s: Create IIP from ipam_fq_name [%s]" " pod_ipam_subnet_uuid [%s]" " vn [%s] vmi_fq_name [%s]" %\ (self._name, ipam_fq_name, pod_ipam_subnet_uuid, vn.name, vmi.fq_name)) try: self._vnc_lib.instance_ip_create(iip_obj) except RefsExistError: self._vnc_lib.instance_ip_update(iip_obj) InstanceIpKM.locate(iip_obj.uuid) return iip_obj
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_iip(self, pod_name, pod_namespace, vn_obj, vmi): # Instance-ip for pods are ALWAYS allocated from pod ipam on this # VN. Get the subnet uuid of the pod ipam on this VN, so we can request # an IP from it. vn = VirtualNetworkKM.find_by_name_or_uuid(vn_obj.get_uuid()) if not vn: # It is possible our cache may not have the VN yet. Locate it. vn = VirtualNetworkKM.locate(vn_obj.get_uuid()) if self._is_pod_network_isolated(pod_namespace): vn_namespace = pod_namespace else: vn_namespace = 'default' if self._is_ip_fabric_forwarding_enabled(vn_namespace): ipam_fq_name = vnc_kube_config.ip_fabric_ipam_fq_name() else: ipam_fq_name = vnc_kube_config.pod_ipam_fq_name() pod_ipam_subnet_uuid = vn.get_ipam_subnet_uuid(ipam_fq_name) # Create instance-ip. iip_uuid = str(uuid.uuid1()) iip_name = VncCommon.make_name(pod_name, iip_uuid) iip_obj = InstanceIp(name=iip_name, subnet_uuid=pod_ipam_subnet_uuid, display_name=iip_name) iip_obj.uuid = iip_uuid iip_obj.add_virtual_network(vn_obj) # Creation of iip requires the vmi vnc object. vmi_obj = self._vnc_lib.virtual_machine_interface_read( fq_name=vmi.fq_name) iip_obj.add_virtual_machine_interface(vmi_obj) InstanceIpKM.add_annotations(self, iip_obj, pod_namespace, pod_name) self._logger.debug("%s: Create IIP from ipam_fq_name [%s]" " pod_ipam_subnet_uuid [%s]" " vn [%s] vmi_fq_name [%s]" %\ (self._name, ipam_fq_name, pod_ipam_subnet_uuid, vn.name, vmi.fq_name)) try: self._vnc_lib.instance_ip_create(iip_obj) except RefsExistError: self._vnc_lib.instance_ip_update(iip_obj) InstanceIpKM.locate(iip_obj.uuid) return iip_obj
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 test_bgpaas(self): # create vn1 vn1_name = self.id() + 'vn1' vn1_obj = self.create_virtual_network(vn1_name, ['10.0.0.0/24', '1000::/16']) project_name = ['default-domain', 'default-project'] project_obj = self._vnc_lib.project_read(fq_name=project_name) port_name = self.id() + 'p1' port_obj = VirtualMachineInterface(port_name, parent_obj=project_obj) port_obj.add_virtual_network(vn1_obj) self._vnc_lib.virtual_machine_interface_create(port_obj) v6_obj = InstanceIp(name=port_name+'-v6') v6_obj.set_virtual_machine_interface(port_obj) v6_obj.set_virtual_network(vn1_obj) v6_obj.set_instance_ip_family('v6') self._vnc_lib.instance_ip_create(v6_obj) v4_obj = InstanceIp(name=port_name+'-v4') v4_obj.set_virtual_machine_interface(port_obj) v4_obj.set_virtual_network(vn1_obj) v4_obj.set_instance_ip_family('v4') self._vnc_lib.instance_ip_create(v4_obj) bgpaas_name = self.id() + 'bgp1' bgpaas = BgpAsAService(bgpaas_name, parent_obj=project_obj, autonomous_system=64512) bgpaas.add_virtual_machine_interface(port_obj) self._vnc_lib.bgp_as_a_service_create(bgpaas) router1_name = vn1_obj.get_fq_name_str() + ':' + vn1_name + ':' + port_name self.wait_to_get_object(config_db.BgpAsAServiceST, bgpaas.get_fq_name_str()) self.wait_to_get_object(config_db.BgpRouterST, router1_name) server_fq_name = ':'.join(self.get_ri_name(vn1_obj)) + ':bgpaas-server' self.wait_to_get_object(config_db.BgpRouterST, server_fq_name) server_router_obj = self._vnc_lib.bgp_router_read(fq_name_str=server_fq_name) router1_name = vn1_obj.get_fq_name_str() + ':' + vn1_name + ':' + port_name mx_bgp_router = self.create_bgp_router("mx-bgp-router", "contrail") mx_bgp_router_name = mx_bgp_router.get_fq_name_str() self.wait_to_get_object(config_db.BgpRouterST, mx_bgp_router_name) mx_bgp_router = self._vnc_lib.bgp_router_read(fq_name_str=mx_bgp_router_name) self.check_bgp_no_peering(server_router_obj, mx_bgp_router) for i in range(5): router1_obj = self._vnc_lib.bgp_router_read(fq_name_str=router1_name) params = router1_obj.get_bgp_router_parameters() if not params: gevent.sleep(1) continue self.assertEqual(router1_obj.get_bgp_router_parameters().address, '10.0.0.252') self.assertEqual(router1_obj.get_bgp_router_parameters().identifier, '10.0.0.252') self.assertNotEqual(params, None) # verify ref from vmi to bgp-router is created port_obj_updated = self._vnc_lib.virtual_machine_interface_read(id=port_obj.uuid) self.assertEqual(port_obj_updated.bgp_router_refs[0]['to'], router1_obj.fq_name) # remove bgp-router ref from vmi self._vnc_lib.ref_update(obj_uuid=port_obj_updated.uuid, obj_type='virtual_machine_interface', ref_uuid=router1_obj.uuid, ref_fq_name=router1_obj.fq_name, ref_type='bgp-router', operation='DELETE') port_obj_updated = self._vnc_lib.virtual_machine_interface_read(id=port_obj.uuid) self.assertIsNone(port_obj_updated.get_bgp_router_refs()) # check bgp-router ref in vmi is restored during reinit config_db.VirtualMachineST._dict = {} config_db.BgpRouterST._dict = {} config_db.BgpAsAServiceST._dict = {} to_bgp.transformer.reinit() gevent.sleep(1) port_obj_updated = self._vnc_lib.virtual_machine_interface_read(id=port_obj.uuid) refs = port_obj_updated.get_bgp_router_refs() self.assertNotEqual(refs, None) self.assertEqual(refs[0]['to'], router1_obj.fq_name) # remove VMI from bgpaas and ensure bgpaas = self._vnc_lib.bgp_as_a_service_read(fq_name=bgpaas.fq_name) port_obj_updated = self._vnc_lib.virtual_machine_interface_read(id=port_obj.uuid) bgpaas.del_virtual_machine_interface(port_obj_updated) self._vnc_lib.bgp_as_a_service_update(bgpaas) gevent.sleep(1) bgpaas = self._vnc_lib.bgp_as_a_service_read(fq_name=bgpaas.fq_name) port_obj_updated = self._vnc_lib.virtual_machine_interface_read(id=port_obj.uuid) # ensure vmi is not attached to bpgaas self.assertEqual(bgpaas.get_virtual_machine_interface_refs(), None) # vmi loses vmi->bgp-router ref self.assertEqual(port_obj_updated.get_bgp_router_refs(), None) # ensure VMI has no bgpaas ref self.assertEqual(port_obj_updated.get_bgp_as_a_service_back_refs(), None) # add VMI back to bgpaas bgpaas = self._vnc_lib.bgp_as_a_service_read(fq_name=bgpaas.fq_name) port_obj_updated = self._vnc_lib.virtual_machine_interface_read(id=port_obj.uuid) bgpaas.add_virtual_machine_interface(port_obj_updated) self._vnc_lib.bgp_as_a_service_update(bgpaas) bgpaas = self._vnc_lib.bgp_as_a_service_read(fq_name=bgpaas.fq_name) port_obj_updated = self._vnc_lib.virtual_machine_interface_read(id=port_obj.uuid) # ensure vmi is attached to bgpaas self.assertNotEqual(bgpaas.get_virtual_machine_interface_refs(), None) # VMI has bgpaas ref self.assertNotEqual(port_obj_updated.get_bgp_as_a_service_back_refs(), None) # vmi got vmi->bgp-router ref for i in range(10): port_obj_updated = self._vnc_lib.virtual_machine_interface_read(id=port_obj.uuid) if not port_obj_updated.get_bgp_router_refs(): gevent.sleep(1) print 'retrying...' self.assertNotEqual(port_obj_updated.get_bgp_router_refs(), None, msg="vmi did not get ref to bgp-router") self.check_bgp_peering(server_router_obj, router1_obj, 1) self.check_v4_bgp_gateway(router1_name, '10.0.0.254') self.check_v6_bgp_gateway(router1_name, '1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe') # Set suppress_route_advertisement; and expect the gateways # to be reset to None in bgpaas-client router bgpaas.set_bgpaas_suppress_route_advertisement(True) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v4_bgp_gateway(router1_name, None) self.check_v6_bgp_gateway(router1_name, None) # Unset suppress_route_advertisement; and expect the gateways # to be set to gateway addresses in bgpaas-client router bgpaas.set_bgpaas_suppress_route_advertisement(False) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v4_bgp_gateway(router1_name, '10.0.0.254') self.check_v6_bgp_gateway(router1_name, '1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe') # Set bgpaas_ipv4_mapped_ipv6_nexthop and expect the # ipv4-mapped ipv6 address is set as gateway bgpaas.set_bgpaas_ipv4_mapped_ipv6_nexthop(True) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v6_bgp_gateway(router1_name, '::ffff:10.0.0.254') # unset bgpaas_ipv4_mapped_ipv6_nexthop and expect the # subnets ipv6 gateway address is set as gateway bgpaas.set_bgpaas_ipv4_mapped_ipv6_nexthop(False) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v6_bgp_gateway(router1_name, '1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe') self._vnc_lib.instance_ip_delete(id=v4_obj.uuid) v4_obj = InstanceIp(name=port_name+'-v4') v4_obj.set_virtual_machine_interface(port_obj) v4_obj.set_virtual_network(vn1_obj) v4_obj.set_instance_ip_family('v4') v4_obj.set_instance_ip_address('10.0.0.60') self._vnc_lib.instance_ip_create(v4_obj) self.check_bgp_router_ip(router1_name, '10.0.0.60') self.check_bgp_router_identifier(router1_name, '10.0.0.60') bgpaas.set_bgpaas_ip_address('10.0.0.70') self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_bgp_router_ip(router1_name, '10.0.0.70') v4_obj.del_virtual_machine_interface(port_obj) v4_obj.del_virtual_network(vn1_obj) self._vnc_lib.instance_ip_delete(id=v4_obj.uuid) self.check_bgp_router_ip(router1_name, '10.0.0.70') self.check_bgp_router_identifier(router1_name, '10.0.0.70') port2_name = self.id() + 'p2' port2_obj = VirtualMachineInterface(port2_name, parent_obj=project_obj) port2_obj.add_virtual_network(vn1_obj) self._vnc_lib.virtual_machine_interface_create(port2_obj) bgpaas.add_virtual_machine_interface(port2_obj) self._vnc_lib.bgp_as_a_service_update(bgpaas) router2_name = vn1_obj.get_fq_name_str() + ':' + vn1_name + ':' + port2_name self.wait_to_get_object(config_db.BgpRouterST, router2_name) router2_obj = self._vnc_lib.bgp_router_read(fq_name_str=router2_name) self.check_bgp_peering(server_router_obj, router2_obj, 2) self.check_bgp_peering(server_router_obj, router1_obj, 2) bgpaas.del_virtual_machine_interface(port_obj) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.wait_to_delete_object(config_db.BgpRouterST, router1_name) self._vnc_lib.bgp_as_a_service_delete(id=bgpaas.uuid) self.wait_to_delete_object(config_db.BgpRouterST, router2_name) self._vnc_lib.instance_ip_delete(id=v6_obj.uuid) self._vnc_lib.virtual_machine_interface_delete(id=port_obj.uuid) self._vnc_lib.virtual_machine_interface_delete(id=port2_obj.uuid) self._vnc_lib.virtual_network_delete(fq_name=vn1_obj.get_fq_name()) self.check_ri_is_deleted(vn1_obj.fq_name+[vn1_obj.name]) self._vnc_lib.bgp_router_delete(id=mx_bgp_router.uuid)
def test_bgpaas(self): # create vn1 vn1_name = self.id() + 'vn1' vn1_obj = self.create_virtual_network(vn1_name, ['10.0.0.0/24', '1000::/16']) project_name = ['default-domain', 'default-project'] project_obj = self._vnc_lib.project_read(fq_name=project_name) port_name = self.id() + 'p1' port_obj = VirtualMachineInterface(port_name, parent_obj=project_obj) port_obj.add_virtual_network(vn1_obj) self._vnc_lib.virtual_machine_interface_create(port_obj) v6_obj = InstanceIp(name=port_name + '-v6') v6_obj.set_virtual_machine_interface(port_obj) v6_obj.set_virtual_network(vn1_obj) v6_obj.set_instance_ip_family('v6') self._vnc_lib.instance_ip_create(v6_obj) v4_obj = InstanceIp(name=port_name + '-v4') v4_obj.set_virtual_machine_interface(port_obj) v4_obj.set_virtual_network(vn1_obj) v4_obj.set_instance_ip_family('v4') self._vnc_lib.instance_ip_create(v4_obj) bgpaas_name = self.id() + 'bgp1' bgpaas = BgpAsAService(bgpaas_name, parent_obj=project_obj, autonomous_system=64512) bgpaas.add_virtual_machine_interface(port_obj) self._vnc_lib.bgp_as_a_service_create(bgpaas) router1_name = vn1_obj.get_fq_name_str( ) + ':' + vn1_name + ':' + port_name self.wait_to_get_object(config_db.BgpAsAServiceST, bgpaas.get_fq_name_str()) self.wait_to_get_object(config_db.BgpRouterST, router1_name) server_fq_name = ':'.join(self.get_ri_name(vn1_obj)) + ':bgpaas-server' self.wait_to_get_object(config_db.BgpRouterST, server_fq_name) server_router_obj = self._vnc_lib.bgp_router_read( fq_name_str=server_fq_name) router1_name = vn1_obj.get_fq_name_str( ) + ':' + vn1_name + ':' + port_name mx_bgp_router = self.create_bgp_router("mx-bgp-router", "contrail") mx_bgp_router_name = mx_bgp_router.get_fq_name_str() self.wait_to_get_object(config_db.BgpRouterST, mx_bgp_router_name) mx_bgp_router = self._vnc_lib.bgp_router_read( fq_name_str=mx_bgp_router_name) self.check_bgp_no_peering(server_router_obj, mx_bgp_router) for i in range(5): router1_obj = self._vnc_lib.bgp_router_read( fq_name_str=router1_name) params = router1_obj.get_bgp_router_parameters() if not params: gevent.sleep(1) continue self.assertEqual(router1_obj.get_bgp_router_parameters().address, '10.0.0.252') self.assertEqual( router1_obj.get_bgp_router_parameters().identifier, '10.0.0.252') self.assertNotEqual(params, None) # verify ref from vmi to bgp-router is created port_obj_updated = self._vnc_lib.virtual_machine_interface_read( id=port_obj.uuid) self.assertEqual(port_obj_updated.bgp_router_refs[0]['to'], router1_obj.fq_name) # remove bgp-router ref from vmi self._vnc_lib.ref_update(obj_uuid=port_obj_updated.uuid, obj_type='virtual_machine_interface', ref_uuid=router1_obj.uuid, ref_fq_name=router1_obj.fq_name, ref_type='bgp-router', operation='DELETE') port_obj_updated = self._vnc_lib.virtual_machine_interface_read( id=port_obj.uuid) self.assertIsNone(port_obj_updated.get_bgp_router_refs()) # check bgp-router ref in vmi is restored during reinit config_db.VirtualMachineST._dict = {} config_db.BgpRouterST._dict = {} config_db.BgpAsAServiceST._dict = {} to_bgp.transformer.reinit() port_obj_updated = self._vnc_lib.virtual_machine_interface_read( id=port_obj.uuid) refs = port_obj_updated.get_bgp_router_refs() self.assertNotEqual(refs, None) self.assertEqual(refs[0]['to'], router1_obj.fq_name) # remove VMI from bgpaas and ensure bgpaas = self._vnc_lib.bgp_as_a_service_read(fq_name=bgpaas.fq_name) port_obj_updated = self._vnc_lib.virtual_machine_interface_read( id=port_obj.uuid) bgpaas.del_virtual_machine_interface(port_obj_updated) self._vnc_lib.bgp_as_a_service_update(bgpaas) bgpaas = self._vnc_lib.bgp_as_a_service_read(fq_name=bgpaas.fq_name) port_obj_updated = self._vnc_lib.virtual_machine_interface_read( id=port_obj.uuid) # ensure vmi is not attached to bpgaas self.assertEqual(bgpaas.get_virtual_machine_interface_refs(), None) # vmi loses vmi->bgp-router ref self.assertEqual(port_obj_updated.get_bgp_router_refs(), None) # ensure VMI has no bgpaas ref self.assertEqual(port_obj_updated.get_bgp_as_a_service_back_refs(), None) # add VMI back to bgpaas bgpaas = self._vnc_lib.bgp_as_a_service_read(fq_name=bgpaas.fq_name) port_obj_updated = self._vnc_lib.virtual_machine_interface_read( id=port_obj.uuid) bgpaas.add_virtual_machine_interface(port_obj_updated) self._vnc_lib.bgp_as_a_service_update(bgpaas) bgpaas = self._vnc_lib.bgp_as_a_service_read(fq_name=bgpaas.fq_name) port_obj_updated = self._vnc_lib.virtual_machine_interface_read( id=port_obj.uuid) # ensure vmi is attached to bgpaas self.assertNotEqual(bgpaas.get_virtual_machine_interface_refs(), None) # VMI has bgpaas ref self.assertNotEqual(port_obj_updated.get_bgp_as_a_service_back_refs(), None) # vmi got vmi->bgp-router ref for i in range(10): port_obj_updated = self._vnc_lib.virtual_machine_interface_read( id=port_obj.uuid) if not port_obj_updated.get_bgp_router_refs(): gevent.sleep(1) print 'retrying...' self.assertNotEqual(port_obj_updated.get_bgp_router_refs(), None, msg="vmi did not get ref to bgp-router") self.check_bgp_peering(server_router_obj, router1_obj, 1) self.check_v4_bgp_gateway(router1_name, '10.0.0.254') self.check_v6_bgp_gateway(router1_name, '1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe') # Set suppress_route_advertisement; and expect the gateways # to be reset to None in bgpaas-client router bgpaas.set_bgpaas_suppress_route_advertisement(True) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v4_bgp_gateway(router1_name, None) self.check_v6_bgp_gateway(router1_name, None) # Unset suppress_route_advertisement; and expect the gateways # to be set to gateway addresses in bgpaas-client router bgpaas.set_bgpaas_suppress_route_advertisement(False) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v4_bgp_gateway(router1_name, '10.0.0.254') self.check_v6_bgp_gateway(router1_name, '1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe') # Set bgpaas_ipv4_mapped_ipv6_nexthop and expect the # ipv4-mapped ipv6 address is set as gateway bgpaas.set_bgpaas_ipv4_mapped_ipv6_nexthop(True) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v6_bgp_gateway(router1_name, '::ffff:10.0.0.254') # unset bgpaas_ipv4_mapped_ipv6_nexthop and expect the # subnets ipv6 gateway address is set as gateway bgpaas.set_bgpaas_ipv4_mapped_ipv6_nexthop(False) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v6_bgp_gateway(router1_name, '1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe') self._vnc_lib.instance_ip_delete(id=v4_obj.uuid) v4_obj = InstanceIp(name=port_name + '-v4') v4_obj.set_virtual_machine_interface(port_obj) v4_obj.set_virtual_network(vn1_obj) v4_obj.set_instance_ip_family('v4') v4_obj.set_instance_ip_address('10.0.0.60') self._vnc_lib.instance_ip_create(v4_obj) self.check_bgp_router_ip(router1_name, '10.0.0.60') self.check_bgp_router_identifier(router1_name, '10.0.0.60') bgpaas.set_bgpaas_ip_address('10.0.0.70') self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_bgp_router_ip(router1_name, '10.0.0.70') v4_obj.del_virtual_machine_interface(port_obj) v4_obj.del_virtual_network(vn1_obj) self._vnc_lib.instance_ip_delete(id=v4_obj.uuid) self.check_bgp_router_ip(router1_name, '10.0.0.70') self.check_bgp_router_identifier(router1_name, '10.0.0.70') port2_name = self.id() + 'p2' port2_obj = VirtualMachineInterface(port2_name, parent_obj=project_obj) port2_obj.add_virtual_network(vn1_obj) self._vnc_lib.virtual_machine_interface_create(port2_obj) bgpaas.add_virtual_machine_interface(port2_obj) self._vnc_lib.bgp_as_a_service_update(bgpaas) router2_name = vn1_obj.get_fq_name_str( ) + ':' + vn1_name + ':' + port2_name self.wait_to_get_object(config_db.BgpRouterST, router2_name) router2_obj = self._vnc_lib.bgp_router_read(fq_name_str=router2_name) self.check_bgp_peering(server_router_obj, router2_obj, 2) self.check_bgp_peering(server_router_obj, router1_obj, 2) bgpaas.del_virtual_machine_interface(port_obj) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.wait_to_delete_object(config_db.BgpRouterST, router1_name) self._vnc_lib.bgp_as_a_service_delete(id=bgpaas.uuid) self.wait_to_delete_object(config_db.BgpRouterST, router2_name) self._vnc_lib.instance_ip_delete(id=v6_obj.uuid) self._vnc_lib.virtual_machine_interface_delete(id=port_obj.uuid) self._vnc_lib.virtual_machine_interface_delete(id=port2_obj.uuid) self._vnc_lib.virtual_network_delete(fq_name=vn1_obj.get_fq_name()) self.check_ri_is_deleted(vn1_obj.fq_name + [vn1_obj.name]) self._vnc_lib.bgp_router_delete(id=mx_bgp_router.uuid)
def test_rbac_on_back_ref(self): admin_iip_count = 10 iip_uuids = set() user_api = self._get_api_client( 'user-%s' % self.id(), 'password', 'project-%s' % self.id(), 'member') user_project = self.admin_api.project_read(id=user_api.project_id) user_vn = VirtualNetwork( 'user-vn-%s' % self.id(), parent_obj=user_project) user_ni = NetworkIpam('ni-%s' % self.id(), parent_obj=user_project) user_api.network_ipam_create(user_ni) user_vn.add_network_ipam( user_ni, VnSubnetsType( [IpamSubnetType(SubnetType('1.1.1.0', 28))])) user_api.virtual_network_create(user_vn) user_vmi_view = VirtualMachineInterface( 'user-vmi-%s' % self.id(), parent_obj=user_project) user_vmi_view.add_virtual_network(user_vn) user_api.virtual_machine_interface_create(user_vmi_view) user_iip = InstanceIp('user-iip-%s' % self.id()) user_iip.add_virtual_network(user_vn) user_iip.add_virtual_machine_interface(user_vmi_view) user_api.instance_ip_create(user_iip) iip_uuids.add(user_iip.uuid) for i in range(admin_iip_count): admin_iip = InstanceIp('admin-iip-%d-%s' % (i, self.id())) admin_iip.add_virtual_network(user_vn) admin_iip.add_virtual_machine_interface(user_vmi_view) self.admin_api.instance_ip_create(admin_iip) iip_uuids.add(admin_iip.uuid) user_iips = user_vmi_view.get_instance_ip_back_refs() self.assertEqual(len(user_iips), 1) self.assertEqual(user_iips[0]['uuid'], user_iip.uuid) admin_vmi_view = self.admin_api.virtual_machine_interface_read( id=user_vmi_view.uuid) admin_iips = admin_vmi_view.get_instance_ip_back_refs() self.assertEqual(len(admin_iips), admin_iip_count + 1) self.assertEqual({iip['uuid'] for iip in admin_iips}, iip_uuids)
def test_bgpaas(self): # create vn1 vn1_name = self.id() + 'vn1' vn1_obj = self.create_virtual_network(vn1_name, ['10.0.0.0/24', '1000::/16']) project_name = ['default-domain', 'default-project'] project_obj = self._vnc_lib.project_read(fq_name=project_name) port_name = self.id() + 'p1' port_obj = VirtualMachineInterface(port_name, parent_obj=project_obj) port_obj.add_virtual_network(vn1_obj) self._vnc_lib.virtual_machine_interface_create(port_obj) v6_obj = InstanceIp(name=port_name+'-v6') v6_obj.set_virtual_machine_interface(port_obj) v6_obj.set_virtual_network(vn1_obj) v6_obj.set_instance_ip_family('v6') self._vnc_lib.instance_ip_create(v6_obj) v4_obj = InstanceIp(name=port_name+'-v4') v4_obj.set_virtual_machine_interface(port_obj) v4_obj.set_virtual_network(vn1_obj) v4_obj.set_instance_ip_family('v4') self._vnc_lib.instance_ip_create(v4_obj) bgpaas_name = self.id() + 'bgp1' bgpaas = BgpAsAService(bgpaas_name, parent_obj=project_obj, autonomous_system=64512) bgpaas.add_virtual_machine_interface(port_obj) self._vnc_lib.bgp_as_a_service_create(bgpaas) router1_name = vn1_obj.get_fq_name_str() + ':' + vn1_name + ':' + port_name self.wait_to_get_object(config_db.BgpAsAServiceST, bgpaas.get_fq_name_str()) self.wait_to_get_object(config_db.BgpRouterST, router1_name) server_fq_name = ':'.join(self.get_ri_name(vn1_obj)) + ':bgpaas-server' self.wait_to_get_object(config_db.BgpRouterST, server_fq_name) server_router_obj = self._vnc_lib.bgp_router_read(fq_name_str=server_fq_name) mx_bgp_router = self.create_bgp_router("mx-bgp-router", "contrail") mx_bgp_router_name = mx_bgp_router.get_fq_name_str() self.wait_to_get_object(config_db.BgpRouterST, mx_bgp_router_name) mx_bgp_router = self._vnc_lib.bgp_router_read(fq_name_str=mx_bgp_router_name) self.check_bgp_no_peering(server_router_obj, mx_bgp_router) router1_obj = self._vnc_lib.bgp_router_read(fq_name_str=router1_name) self.assertEqual(router1_obj.get_bgp_router_parameters().address, '10.0.0.252') self.assertEqual(router1_obj.get_bgp_router_parameters().identifier, '10.0.0.252') self.check_bgp_peering(server_router_obj, router1_obj, 1) self.check_v4_bgp_gateway(router1_name, '10.0.0.254') self.check_v6_bgp_gateway(router1_name, '1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe') # Set suppress_route_advertisement; and expect the gateways # to be reset to None in bgpaas-client router bgpaas.set_bgpaas_suppress_route_advertisement(True) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v4_bgp_gateway(router1_name, None) self.check_v6_bgp_gateway(router1_name, None) # Unset suppress_route_advertisement; and expect the gateways # to be set to gateway addresses in bgpaas-client router bgpaas.set_bgpaas_suppress_route_advertisement(False) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v4_bgp_gateway(router1_name, '10.0.0.254') self.check_v6_bgp_gateway(router1_name, '1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe') # Set bgpaas_ipv4_mapped_ipv6_nexthop and expect the # ipv4-mapped ipv6 address is set as gateway bgpaas.set_bgpaas_ipv4_mapped_ipv6_nexthop(True) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v6_bgp_gateway(router1_name, '::ffff:10.0.0.254') # unset bgpaas_ipv4_mapped_ipv6_nexthop and expect the # subnets ipv6 gateway address is set as gateway bgpaas.set_bgpaas_ipv4_mapped_ipv6_nexthop(False) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v6_bgp_gateway(router1_name, '1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe') v4_obj.set_instance_ip_address('10.0.0.60') self._vnc_lib.instance_ip_update(v4_obj) self.check_bgp_router_ip(router1_name, '10.0.0.60') self.check_bgp_router_identifier(router1_name, '10.0.0.60') bgpaas.set_bgpaas_ip_address('10.0.0.70') self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_bgp_router_ip(router1_name, '10.0.0.70') v4_obj.del_virtual_machine_interface(port_obj) v4_obj.del_virtual_network(vn1_obj) self._vnc_lib.instance_ip_delete(id=v4_obj.uuid) self.check_bgp_router_ip(router1_name, '10.0.0.70') self.check_bgp_router_identifier(router1_name, '10.0.0.70') port2_name = self.id() + 'p2' port2_obj = VirtualMachineInterface(port2_name, parent_obj=project_obj) port2_obj.add_virtual_network(vn1_obj) self._vnc_lib.virtual_machine_interface_create(port2_obj) bgpaas.add_virtual_machine_interface(port2_obj) self._vnc_lib.bgp_as_a_service_update(bgpaas) router2_name = vn1_obj.get_fq_name_str() + ':' + vn1_name + ':' + port2_name self.wait_to_get_object(config_db.BgpRouterST, router2_name) router2_obj = self._vnc_lib.bgp_router_read(fq_name_str=router2_name) self.check_bgp_peering(server_router_obj, router2_obj, 2) self.check_bgp_peering(server_router_obj, router1_obj, 2) bgpaas.del_virtual_machine_interface(port_obj) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.wait_to_delete_object(config_db.BgpRouterST, router1_name) self._vnc_lib.bgp_as_a_service_delete(id=bgpaas.uuid) self.wait_to_delete_object(config_db.BgpRouterST, router2_name) self._vnc_lib.instance_ip_delete(id=v6_obj.uuid) self._vnc_lib.virtual_machine_interface_delete(id=port_obj.uuid) self._vnc_lib.virtual_machine_interface_delete(id=port2_obj.uuid) self._vnc_lib.virtual_network_delete(fq_name=vn1_obj.get_fq_name()) self.check_ri_is_deleted(vn1_obj.fq_name+[vn1_obj.name]) self._vnc_lib.bgp_router_delete(id=mx_bgp_router.uuid)
def test_bgpaas(self): # create vn1 vn1_name = self.id() + 'vn1' vn1_obj = self.create_virtual_network(vn1_name, ['10.0.0.0/24', '1000::/16']) project_name = ['default-domain', 'default-project'] project_obj = self._vnc_lib.project_read(fq_name=project_name) port_name = self.id() + 'p1' port_obj = VirtualMachineInterface(port_name, parent_obj=project_obj) port_obj.add_virtual_network(vn1_obj) self._vnc_lib.virtual_machine_interface_create(port_obj) v6_obj = InstanceIp(name=port_name + '-v6') v6_obj.set_virtual_machine_interface(port_obj) v6_obj.set_virtual_network(vn1_obj) v6_obj.set_instance_ip_family('v6') self._vnc_lib.instance_ip_create(v6_obj) v4_obj = InstanceIp(name=port_name + '-v4') v4_obj.set_virtual_machine_interface(port_obj) v4_obj.set_virtual_network(vn1_obj) v4_obj.set_instance_ip_family('v4') self._vnc_lib.instance_ip_create(v4_obj) bgpaas_name = self.id() + 'bgp1' bgpaas = BgpAsAService(bgpaas_name, parent_obj=project_obj, autonomous_system=64512) bgpaas.add_virtual_machine_interface(port_obj) self._vnc_lib.bgp_as_a_service_create(bgpaas) router1_name = vn1_obj.get_fq_name_str( ) + ':' + vn1_name + ':' + port_name self.wait_to_get_object(config_db.BgpAsAServiceST, bgpaas.get_fq_name_str()) self.wait_to_get_object(config_db.BgpRouterST, router1_name) server_fq_name = ':'.join(self.get_ri_name(vn1_obj)) + ':bgpaas-server' self.wait_to_get_object(config_db.BgpRouterST, server_fq_name) server_router_obj = self._vnc_lib.bgp_router_read( fq_name_str=server_fq_name) mx_bgp_router = self.create_bgp_router("mx-bgp-router", "contrail") mx_bgp_router_name = mx_bgp_router.get_fq_name_str() self.wait_to_get_object(config_db.BgpRouterST, mx_bgp_router_name) mx_bgp_router = self._vnc_lib.bgp_router_read( fq_name_str=mx_bgp_router_name) self.check_bgp_no_peering(server_router_obj, mx_bgp_router) router1_obj = self._vnc_lib.bgp_router_read(fq_name_str=router1_name) self.assertEqual(router1_obj.get_bgp_router_parameters().address, '10.0.0.252') self.assertEqual(router1_obj.get_bgp_router_parameters().identifier, '10.0.0.252') self.check_bgp_peering(server_router_obj, router1_obj, 1) v4_obj.set_instance_ip_address('10.0.0.60') self._vnc_lib.instance_ip_update(v4_obj) self.check_bgp_router_ip(router1_name, '10.0.0.60') self.check_bgp_router_identifier(router1_name, '10.0.0.60') bgpaas.set_bgpaas_ip_address('10.0.0.70') self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_bgp_router_ip(router1_name, '10.0.0.70') v4_obj.del_virtual_machine_interface(port_obj) v4_obj.del_virtual_network(vn1_obj) self._vnc_lib.instance_ip_delete(id=v4_obj.uuid) self.check_bgp_router_ip(router1_name, '10.0.0.70') self.check_bgp_router_identifier(router1_name, '10.0.0.70') port2_name = self.id() + 'p2' port2_obj = VirtualMachineInterface(port2_name, parent_obj=project_obj) port2_obj.add_virtual_network(vn1_obj) self._vnc_lib.virtual_machine_interface_create(port2_obj) bgpaas.add_virtual_machine_interface(port2_obj) self._vnc_lib.bgp_as_a_service_update(bgpaas) router2_name = vn1_obj.get_fq_name_str( ) + ':' + vn1_name + ':' + port2_name self.wait_to_get_object(config_db.BgpRouterST, router2_name) router2_obj = self._vnc_lib.bgp_router_read(fq_name_str=router2_name) self.check_bgp_peering(server_router_obj, router2_obj, 2) self.check_bgp_peering(server_router_obj, router1_obj, 2) bgpaas.del_virtual_machine_interface(port_obj) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.wait_to_delete_object(config_db.BgpRouterST, router1_name) self._vnc_lib.bgp_as_a_service_delete(id=bgpaas.uuid) self.wait_to_delete_object(config_db.BgpRouterST, router2_name) self._vnc_lib.instance_ip_delete(id=v6_obj.uuid) self._vnc_lib.virtual_machine_interface_delete(id=port_obj.uuid) self._vnc_lib.virtual_machine_interface_delete(id=port2_obj.uuid) self._vnc_lib.virtual_network_delete(fq_name=vn1_obj.get_fq_name()) self.check_ri_is_deleted(vn1_obj.fq_name + [vn1_obj.name]) self._vnc_lib.bgp_router_delete(id=mx_bgp_router.uuid)
except RefsExistError as ref: print >> sys.stderr, "Not creating VMI, already exists: ", str(ref) vmi_obj = api.virtual_machine_interface_read(fq_name=proj_fq_name + [vmi_name]) vmi_uuid = vmi_obj.uuid ## LINK VM TO VROUTER vrouter_obj = api.virtual_router_read(id=vr_uuid) ref_response = api.ref_update('virtual-router', vrouter_obj.uuid, 'virtual-machine', vm_obj.uuid, None, 'ADD') print >> sys.stderr, "Linked VM to vRouter:", ref_response ## CREATE INTERFACE IP iip_uuid = str(uuid.uuid1()) perms2 = PermType2() perms2.owner = proj_uuid perms2.owner_access = PERMS_RWX iip_obj = InstanceIp(name=iip_name, subnet_uuid=subnet_uuid, display_name=iip_name, perms2=perms2) iip_obj.uuid = iip_uuid iip_obj.add_virtual_network(vn_obj) iip_obj.add_virtual_machine_interface(vmi_obj) try: api.instance_ip_create(iip_obj) except RefsExistError as ref: print >> sys.stderr, "Not creating VMI IP, already exists: ", str(ref) print json.dumps({"vmiUuid": vmi_uuid, "vmUuid": vm_uuid, "vnUuid": vn_uuid})
def test_bgpaas(self): # create vn1 vn1_name = self.id() + 'vn1' vn1_obj = self.create_virtual_network(vn1_name, ['10.0.0.0/24', '1000::/16']) project_name = ['default-domain', 'default-project'] project_obj = self._vnc_lib.project_read(fq_name=project_name) port_name = self.id() + 'p1' port_obj = VirtualMachineInterface(port_name, parent_obj=project_obj) port_obj.add_virtual_network(vn1_obj) self._vnc_lib.virtual_machine_interface_create(port_obj) v6_obj = InstanceIp(name=port_name + '-v6') v6_obj.set_virtual_machine_interface(port_obj) v6_obj.set_virtual_network(vn1_obj) v6_obj.set_instance_ip_family('v6') self._vnc_lib.instance_ip_create(v6_obj) v4_obj = InstanceIp(name=port_name + '-v4') v4_obj.set_virtual_machine_interface(port_obj) v4_obj.set_virtual_network(vn1_obj) v4_obj.set_instance_ip_family('v4') self._vnc_lib.instance_ip_create(v4_obj) bgpaas_name = self.id() + 'bgp1' bgpaas = BgpAsAService(bgpaas_name, parent_obj=project_obj, autonomous_system=64512) bgpaas.add_virtual_machine_interface(port_obj) self._vnc_lib.bgp_as_a_service_create(bgpaas) router1_name = vn1_obj.get_fq_name_str( ) + ':' + vn1_name + ':' + port_name self.wait_to_get_object(config_db.BgpAsAServiceST, bgpaas.get_fq_name_str()) self.wait_to_get_object(config_db.BgpRouterST, router1_name) server_fq_name = ':'.join(self.get_ri_name(vn1_obj)) + ':bgpaas-server' self.wait_to_get_object(config_db.BgpRouterST, server_fq_name) server_router_obj = self._vnc_lib.bgp_router_read( fq_name_str=server_fq_name) mx_bgp_router = self.create_bgp_router("mx-bgp-router", "contrail") mx_bgp_router_name = mx_bgp_router.get_fq_name_str() self.wait_to_get_object(config_db.BgpRouterST, mx_bgp_router_name) mx_bgp_router = self._vnc_lib.bgp_router_read( fq_name_str=mx_bgp_router_name) self.check_bgp_no_peering(server_router_obj, mx_bgp_router) router1_obj = self._vnc_lib.bgp_router_read(fq_name_str=router1_name) self.assertEqual(router1_obj.get_bgp_router_parameters().address, '10.0.0.252') self.assertEqual(router1_obj.get_bgp_router_parameters().identifier, '10.0.0.252') self.check_bgp_peering(server_router_obj, router1_obj, 1) self.check_v4_bgp_gateway(router1_name, '10.0.0.254') self.check_v6_bgp_gateway(router1_name, '1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe') # Set suppress_route_advertisement; and expect the gateways # to be reset to None in bgpaas-client router bgpaas.set_bgpaas_suppress_route_advertisement(True) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v4_bgp_gateway(router1_name, None) self.check_v6_bgp_gateway(router1_name, None) # Unset suppress_route_advertisement; and expect the gateways # to be set to gateway addresses in bgpaas-client router bgpaas.set_bgpaas_suppress_route_advertisement(False) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v4_bgp_gateway(router1_name, '10.0.0.254') self.check_v6_bgp_gateway(router1_name, '1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe') # Set bgpaas_ipv4_mapped_ipv6_nexthop and expect the # ipv4-mapped ipv6 address is set as gateway bgpaas.set_bgpaas_ipv4_mapped_ipv6_nexthop(True) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v6_bgp_gateway(router1_name, '::ffff:10.0.0.254') # unset bgpaas_ipv4_mapped_ipv6_nexthop and expect the # subnets ipv6 gateway address is set as gateway bgpaas.set_bgpaas_ipv4_mapped_ipv6_nexthop(False) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_v6_bgp_gateway(router1_name, '1000:ffff:ffff:ffff:ffff:ffff:ffff:fffe') self._vnc_lib.instance_ip_delete(id=v4_obj.uuid) v4_obj = InstanceIp(name=port_name + '-v4') v4_obj.set_virtual_machine_interface(port_obj) v4_obj.set_virtual_network(vn1_obj) v4_obj.set_instance_ip_family('v4') v4_obj.set_instance_ip_address('10.0.0.60') self._vnc_lib.instance_ip_create(v4_obj) self.check_bgp_router_ip(router1_name, '10.0.0.60') self.check_bgp_router_identifier(router1_name, '10.0.0.60') bgpaas.set_bgpaas_ip_address('10.0.0.70') self._vnc_lib.bgp_as_a_service_update(bgpaas) self.check_bgp_router_ip(router1_name, '10.0.0.70') v4_obj.del_virtual_machine_interface(port_obj) v4_obj.del_virtual_network(vn1_obj) self._vnc_lib.instance_ip_delete(id=v4_obj.uuid) self.check_bgp_router_ip(router1_name, '10.0.0.70') self.check_bgp_router_identifier(router1_name, '10.0.0.70') port2_name = self.id() + 'p2' port2_obj = VirtualMachineInterface(port2_name, parent_obj=project_obj) port2_obj.add_virtual_network(vn1_obj) self._vnc_lib.virtual_machine_interface_create(port2_obj) bgpaas.add_virtual_machine_interface(port2_obj) self._vnc_lib.bgp_as_a_service_update(bgpaas) router2_name = vn1_obj.get_fq_name_str( ) + ':' + vn1_name + ':' + port2_name self.wait_to_get_object(config_db.BgpRouterST, router2_name) router2_obj = self._vnc_lib.bgp_router_read(fq_name_str=router2_name) self.check_bgp_peering(server_router_obj, router2_obj, 2) self.check_bgp_peering(server_router_obj, router1_obj, 2) bgpaas.del_virtual_machine_interface(port_obj) self._vnc_lib.bgp_as_a_service_update(bgpaas) self.wait_to_delete_object(config_db.BgpRouterST, router1_name) self._vnc_lib.bgp_as_a_service_delete(id=bgpaas.uuid) self.wait_to_delete_object(config_db.BgpRouterST, router2_name) self._vnc_lib.instance_ip_delete(id=v6_obj.uuid) self._vnc_lib.virtual_machine_interface_delete(id=port_obj.uuid) self._vnc_lib.virtual_machine_interface_delete(id=port2_obj.uuid) self._vnc_lib.virtual_network_delete(fq_name=vn1_obj.get_fq_name()) self.check_ri_is_deleted(vn1_obj.fq_name + [vn1_obj.name]) self._vnc_lib.bgp_router_delete(id=mx_bgp_router.uuid)