def test_out_of_order_rabbit_publish(self): """ Test to make sure api-server preserves the state of the object even if the CREATE msg is queued after UPDATE in rabbit """ self.wait_till_api_server_idle() api_server = self._server_info['api_server'] orig_dbe_create_publish = api_server._db_conn._msgbus.dbe_create_publish self.block_untill_update_publish = True def out_of_order_dbe_create_publish(obj_type, obj_ids, *args, **kwargs): if obj_type == 'virtual_network': while self.block_untill_update_publish: gevent.sleep(1) return orig_dbe_create_publish(obj_type, obj_ids, *args, **kwargs) api_server._db_conn._msgbus.dbe_create_publish = \ out_of_order_dbe_create_publish logger.info("Creating VN object, without publishing it to IFMAP.") vn_obj = VirtualNetwork('vn1') vn_obj.set_uuid(str(uuid.uuid4())) ipam_obj = NetworkIpam('ipam1') vn_obj.add_network_ipam(ipam_obj, VnSubnetsType()) self._vnc_lib.network_ipam_create(ipam_obj) vn_create_greenlet = gevent.spawn(self._vnc_lib.virtual_network_create, vn_obj) gevent.sleep(0) logger.info("Update VN object, Expected to update the object in", "Cassandra DB and skip publishing to IFMAP.") vn_obj = self._vnc_lib.virtual_network_read(id=vn_obj.uuid) vn_obj.display_name = 'test_update_1' self._vnc_lib.virtual_network_update(vn_obj) gevent.sleep(2) with testtools.ExpectedException(KeyError): api_server._db_conn._ifmap_db._id_to_metas[\ 'contrail:virtual-network:default-domain:default-project:vn1'] logger.info( "Unblock create notify to amqp, Create expected to read from DB", "and publish to IFMAP with the updated object info.") self.block_untill_update_publish = False vn_uuid = vn_create_greenlet.get(timeout=3) gevent.sleep(2) self.assertEqual(api_server._db_conn._ifmap_db._id_to_metas[\ 'contrail:virtual-network:default-domain:default-project:vn1'][\ 'display-name']['']._Metadata__value, 'test_update_1') logger.info( "update after publishing to IFAMAP, Expected to publish to IFMAP") vn_obj.display_name = 'test_update_2' self._vnc_lib.virtual_network_update(vn_obj) gevent.sleep(2) self.assertEqual(api_server._db_conn._ifmap_db._id_to_metas[\ 'contrail:virtual-network:default-domain:default-project:vn1'][\ 'display-name']['']._Metadata__value, 'test_update_2')
def test_routing_instance_create(self): project = self._project_fetch_or_create(self.id()) vn = VirtualNetwork(name='vn-{}'.format(self.id()), parent_obj=project) try: uuid = self.api.virtual_network_create(vn) except RefsExistError: uuid = self.api.fq_name_to_id('virtual_network', vn.fq_name) vn.set_uuid(uuid) ri_name = 'default-routing-instance' ri_fq_name = ':'.join(vn.fq_name + [ri_name]) sci = ServiceChainInfo( service_chain_id=ri_fq_name, prefix=['20.0.0.0/24'], routing_instance=ri_name, service_chain_address='0.255.255.250', service_instance='default-domain:default-project:test_service', sc_head=True) sciv6 = ServiceChainInfo( service_chain_id=ri_fq_name, prefix=['1000::/16'], routing_instance=ri_name, service_chain_address='::0.255.255.252', service_instance='default-domain:default-project:test_service_v6', sc_head=False) static_route_entries = StaticRouteEntriesType(route=[ StaticRouteType(prefix='test', next_hop='10.100.100.100', route_target=['test-route-target'], community='') ]) default_ce_protocol = DefaultProtocolType( bgp=ProtocolBgpType(autonomous_system=42), ospf=ProtocolOspfType(area=1)) prop_map = { 'name': ri_name, 'annotations': {}, 'parent_obj': vn, 'parent_type': 'virtual-network', 'default_ce_protocol': default_ce_protocol, 'display_name': 'some_string', 'evpn_ipv6_service_chain_information': sciv6, 'evpn_service_chain_information': sci, 'ipv6_service_chain_information': sciv6, 'routing_instance_fabric_snat': False, 'routing_instance_has_pnf': False, 'routing_instance_is_default': False, 'service_chain_information': sci, 'static_route_entries': static_route_entries } obj = self.set_properties(RoutingInstance(), prop_map) self.assertSchemaObjCreateOrUpdate(obj)
def test_out_of_order_rabbit_publish(self): """ Test to make sure api-server preserves the state of the object even if the CREATE msg is queued after UPDATE in rabbit """ self.wait_till_api_server_idle() api_server = self._server_info['api_server'] orig_dbe_create_publish = api_server._db_conn._msgbus.dbe_create_publish self.block_untill_update_publish = True def out_of_order_dbe_create_publish(obj_type, obj_ids, *args, **kwargs): if obj_type == 'virtual_network': while self.block_untill_update_publish: gevent.sleep(1) return orig_dbe_create_publish(obj_type, obj_ids, *args, **kwargs) api_server._db_conn._msgbus.dbe_create_publish = \ out_of_order_dbe_create_publish logger.info("Creating VN object, without publishing it to IFMAP.") vn_obj = VirtualNetwork('vn1') vn_obj.set_uuid(str(uuid.uuid4())) ipam_obj = NetworkIpam('ipam1') vn_obj.add_network_ipam(ipam_obj, VnSubnetsType()) self._vnc_lib.network_ipam_create(ipam_obj) vn_create_greenlet = gevent.spawn(self._vnc_lib.virtual_network_create, vn_obj) gevent.sleep(0) logger.info("Update VN object, Expected to update the object in", "Cassandra DB and skip publishing to IFMAP.") vn_obj = self._vnc_lib.virtual_network_read(id=vn_obj.uuid) vn_obj.display_name = 'test_update_1' self._vnc_lib.virtual_network_update(vn_obj) gevent.sleep(2) self.assertTill(self.ifmap_doesnt_have_ident, obj=vn_obj) logger.info( "Unblock create notify to amqp, Create expected to read from DB", "and publish to IFMAP with the updated object info.") self.block_untill_update_publish = False vn_uuid = vn_create_greenlet.get(timeout=3) self.assertTill(self.ifmap_ident_has_link, obj=vn_obj, link_name='display-name') self.assertTrue('test_update_1' in self.ifmap_ident_has_link( obj=vn_obj, link_name='display-name')['meta']) logger.info( "update after publishing to IFAMAP, Expected to publish to IFMAP") vn_obj.display_name = 'test_update_2' self._vnc_lib.virtual_network_update(vn_obj) self.assertTill(lambda: 'test_update_2' in self.ifmap_ident_has_link( obj=vn_obj, link_name='display-name')['meta'])
def test_out_of_order_rabbit_publish(self): """ Test to make sure api-server preserves the state of the object even if the CREATE msg is queued after UPDATE in rabbit """ self.wait_till_api_server_idle() api_server = test_common.vnc_cfg_api_server.server orig_dbe_create_publish = api_server._db_conn._msgbus.dbe_create_publish self.block_untill_update_publish = True def out_of_order_dbe_create_publish(obj_type, obj_ids, *args, **kwargs): if obj_type == 'virtual_network': while self.block_untill_update_publish: gevent.sleep(1) return orig_dbe_create_publish(obj_type,obj_ids, *args, **kwargs) api_server._db_conn._msgbus.dbe_create_publish = \ out_of_order_dbe_create_publish logger.info("Creating VN object, without publishing it to IFMAP.") vn_obj = VirtualNetwork('vn1') vn_obj.set_uuid(str(uuid.uuid4())) ipam_obj = NetworkIpam('ipam1') vn_obj.add_network_ipam(ipam_obj, VnSubnetsType()) self._vnc_lib.network_ipam_create(ipam_obj) vn_create_greenlet = gevent.spawn(self._vnc_lib.virtual_network_create, vn_obj) gevent.sleep(0) logger.info("Update VN object, Expected to update the object in", "Cassandra DB and skip publishing to IFMAP.") vn_obj = self._vnc_lib.virtual_network_read(id=vn_obj.uuid) vn_obj.display_name = 'test_update_1' self._vnc_lib.virtual_network_update(vn_obj) gevent.sleep(2) with testtools.ExpectedException(KeyError): api_server._db_conn._ifmap_db._id_to_metas[\ 'contrail:virtual-network:default-domain:default-project:vn1'] logger.info("Unblock create notify to amqp, Create expected to read from DB", "and publish to IFMAP with the updated object info.") self.block_untill_update_publish = False vn_uuid = vn_create_greenlet.get(timeout=3) gevent.sleep(2) self.assertEqual(api_server._db_conn._ifmap_db._id_to_metas[\ 'contrail:virtual-network:default-domain:default-project:vn1'][\ 'display-name']['']._Metadata__value, 'test_update_1') logger.info("update after publishing to IFAMAP, Expected to publish to IFMAP") vn_obj.display_name = 'test_update_2' self._vnc_lib.virtual_network_update(vn_obj) gevent.sleep(2) self.assertEqual(api_server._db_conn._ifmap_db._id_to_metas[\ 'contrail:virtual-network:default-domain:default-project:vn1'][\ 'display-name']['']._Metadata__value, 'test_update_2')
def test_out_of_order_rabbit_publish(self): """ Test to make sure api-server preserves the state of the object even if the CREATE msg is queued after UPDATE in rabbit """ self.wait_till_api_server_idle() api_server = self._server_info['api_server'] orig_dbe_create_publish = api_server._db_conn._msgbus.dbe_create_publish self.block_untill_update_publish = True def out_of_order_dbe_create_publish(obj_type, obj_ids, *args, **kwargs): if obj_type == 'virtual_network': while self.block_untill_update_publish: gevent.sleep(1) return orig_dbe_create_publish(obj_type,obj_ids, *args, **kwargs) api_server._db_conn._msgbus.dbe_create_publish = \ out_of_order_dbe_create_publish logger.info("Creating VN object, without publishing it to IFMAP.") vn_obj = VirtualNetwork('vn1') vn_obj.set_uuid(str(uuid.uuid4())) ipam_obj = NetworkIpam('ipam1') vn_obj.add_network_ipam(ipam_obj, VnSubnetsType()) self._vnc_lib.network_ipam_create(ipam_obj) vn_create_greenlet = gevent.spawn(self._vnc_lib.virtual_network_create, vn_obj) gevent.sleep(0) logger.info("Update VN object, Expected to update the object in", "Cassandra DB and skip publishing to IFMAP.") vn_obj = self._vnc_lib.virtual_network_read(id=vn_obj.uuid) vn_obj.display_name = 'test_update_1' self._vnc_lib.virtual_network_update(vn_obj) gevent.sleep(2) self.assertTill(self.ifmap_doesnt_have_ident, obj=vn_obj) logger.info("Unblock create notify to amqp, Create expected to read from DB", "and publish to IFMAP with the updated object info.") self.block_untill_update_publish = False vn_uuid = vn_create_greenlet.get(timeout=3) self.assertTill(self.ifmap_ident_has_link, obj=vn_obj, link_name='display-name') self.assertTrue('test_update_1' in self.ifmap_ident_has_link( obj=vn_obj, link_name='display-name')['meta']) logger.info("update after publishing to IFAMAP, Expected to publish to IFMAP") vn_obj.display_name = 'test_update_2' self._vnc_lib.virtual_network_update(vn_obj) self.assertTill(lambda: 'test_update_2' in self.ifmap_ident_has_link( obj=vn_obj, link_name='display-name')['meta'])
def test_mac_address_always_allocated(self): project = Project(name='p-{}'.format(self.id())) p_uuid = self.api.project_create(project) project.set_uuid(p_uuid) vn = VirtualNetwork(name='vn-{}'.format(self.id()), parent_obj=project) vn_uuid = self.api.virtual_network_create(vn) vn.set_uuid(vn_uuid) mac_addr_test_cases = [ ['02:ce:1b:d7:a6:e7'], ['02-ce-1b-d7-a6-e8'], ['02:ce:1b:d7:a6:e9', '02-ce-1b-d7-a6-f1', '02:ce:1b:d7:a6:f2'], [], None, ] for i, macs_test_case in enumerate(mac_addr_test_cases): vmi = VirtualMachineInterface(name='vmi{}-{}'.format(i, self.id()), parent_obj=project) vmi.set_virtual_network(vn) vmi.set_virtual_machine_interface_mac_addresses( MacAddressesType(macs_test_case)) vmi_uuid = self.api.virtual_machine_interface_create(vmi) vmi = self.api.virtual_machine_interface_read(id=vmi_uuid) vmi_macs = vmi.get_virtual_machine_interface_mac_addresses() \ .get_mac_address() if macs_test_case: # check if vmi_macs len is the same as input len self.assertItemsEqual( vmi_macs, [mac.replace('-', ':') for mac in macs_test_case]) else: # if input was empty or None, check if vmi_macs has been alloc self.assertEqual(len(vmi_macs), 1) for m in vmi_macs: # check if any of mac is not zero self.assertNotEqual(m, '00:00:00:00:00:00')
def test_get_floating_ip_project_ref(self): # create project project = Project(name='project-{}'.format(self.id())) p_uuid = self._vnc_lib.project_create(project) project.set_uuid(p_uuid) # create virtual network vn = VirtualNetwork(name='vn-{}'.format(self.id()), parent_obj=project) vn.add_network_ipam(NetworkIpam(), VnSubnetsType([ IpamSubnetType(SubnetType('1.1.1.0', 28)), ])) vn_uuid = self._vnc_lib.virtual_network_create(vn) vn.set_uuid(vn_uuid) # create floating IP pool fip_pool = FloatingIpPool(name='fip_p-{}'.format(self.id()), parent_obj=vn) fip_p_uuid = self._vnc_lib.floating_ip_pool_create(fip_pool) fip_pool.set_uuid(fip_p_uuid) # finally, create floating IP fip = FloatingIp(name='fip-{}'.format(self.id()), parent_obj=fip_pool) fip_uuid = self._vnc_lib.floating_ip_create(fip) # get floating IPs fip_list = self._vnc_lib.floating_ips_list(obj_uuids=[fip_uuid], fields=['project_refs'], detail=True) self.assertEqual(len(fip_list), 1) project_refs = fip_list[0].get_project_refs() self.assertEqual(len(project_refs), 1) self.assertEqual(project_refs[0]['uuid'], p_uuid) self.assertEqual(project_refs[0]['to'], project.fq_name)