def test_delete_synchronous_on_dup(self): logger.info('Creating project in "keystone" and syncing') proj_id1 = str(uuid.uuid4()) proj_name = self.id() test_case.get_keystone_client().tenants.add_tenant(proj_id1, proj_name) proj_obj = self._vnc_lib.project_read(id=proj_id1) self.assertThat(proj_obj.name, Equals(proj_name)) logger.info('Deleting project in keystone and immediately re-creating') def stub(*args, **kwargs): return with test_common.patch(self.openstack_driver, '_del_project_from_vnc', stub): test_case.get_keystone_client().tenants.delete_tenant(proj_id1) proj_id2 = str(uuid.uuid4()) test_case.get_keystone_client().tenants.add_tenant( proj_id2, proj_name) proj_obj = self._vnc_lib.project_read(id=proj_id2) self.assertThat(proj_obj.uuid, Equals(proj_id2)) with ExpectedException(vnc_api.NoIdError): self._vnc_lib.project_read(id=proj_id1) self._vnc_lib.project_delete(id=proj_id2)
def test_delete_synchronous_on_dup(self): openstack_driver = FakeExtensionManager.get_extension_objects( 'vnc_cfg_api.resync')[0] logger.info('Creating project in "keystone" and syncing') proj_id1 = str(uuid.uuid4()) proj_name = self.id() test_case.get_keystone_client().tenants.add_tenant(proj_id1, proj_name) proj_obj = self._vnc_lib.project_read(id=proj_id1) self.assertThat(proj_obj.name, Equals(proj_name)) logger.info('Deleting project in keystone and immediately re-creating') def stub(*args, **kwargs): return with test_common.patch(openstack_driver, '_del_project_from_vnc', stub): test_case.get_keystone_client().tenants.delete_tenant(proj_id1) proj_id2 = str(uuid.uuid4()) test_case.get_keystone_client().tenants.add_tenant( proj_id2, proj_name) proj_obj = self._vnc_lib.project_read(id=proj_id2) self.assertThat(proj_obj.uuid, Equals(proj_id2)) with ExpectedException(vnc_api.NoIdError): self._vnc_lib.project_read(id=proj_id1) self._vnc_lib.project_delete(id=proj_id2)
def test_doc_auth(self): alice = self.alice # delete api-access-list for alice project # disallow access to all API except globally allowed rg_name = list(alice.project_obj.get_fq_name()) rg_name.append('default-api-access-list') self.admin.vnc_lib.api_access_list_delete(fq_name = rg_name) def fake_static_file(*args, **kwargs): return with test_common.patch(bottle, 'static_file', fake_static_file): status_code, result = alice.vnc_lib._http_get('/documentation/index.html') self.assertThat(status_code, Equals(200)) status_code, result = alice.vnc_lib._http_get('/') self.assertThat(status_code, Equals(200)) status_code, result = alice.vnc_lib._http_get('/virtual-networks') self.assertThat(status_code, Equals(401))
def test_notify_doesnt_persist(self): # net/ip notify context shouldn't persist to db, should only # update in-memory book-keeping def_ipam = NetworkIpam() ipam_obj = self._vnc_lib.network_ipam_read( fq_name=def_ipam.get_fq_name()) vn_obj = VirtualNetwork('vn-%s' % (self.id())) ipam_sn_v4 = IpamSubnetType(subnet=SubnetType('11.1.1.0', 24)) vn_obj.add_network_ipam(ipam_obj, VnSubnetsType([ipam_sn_v4])) self._vnc_lib.virtual_network_create(vn_obj) iip_obj = InstanceIp('iip-%s' % (self.id())) iip_obj.add_virtual_network(vn_obj) class SpyCreateNode(object): def __init__(self, orig_object, method_name): self._orig_method = getattr(orig_object, method_name) self._invoked = 0 # end __init__ def __call__(self, *args, **kwargs): if self._invoked >= 1: raise Exception("Instance IP was persisted more than once") if args[1].startswith('/api-server/subnets'): self._invoked += 1 return self._orig_method(args, kwargs) # end SpyCreateNode orig_object = self._api_server._db_conn._zk_db._zk_client method_name = 'create_node' with test_common.patch(orig_object, method_name, SpyCreateNode(orig_object, method_name)): self._vnc_lib.instance_ip_create(iip_obj) self.assertTill(self.ifmap_has_ident, obj=iip_obj)
def test_notify_doesnt_persist(self): # net/ip notify context shouldn't persist to db, should only # update in-memory book-keeping def_ipam = NetworkIpam() ipam_obj = self._vnc_lib.network_ipam_read( fq_name=def_ipam.get_fq_name()) vn_obj = VirtualNetwork('vn-%s' %(self.id())) ipam_sn_v4 = IpamSubnetType(subnet=SubnetType('11.1.1.0', 24)) vn_obj.add_network_ipam(ipam_obj, VnSubnetsType([ipam_sn_v4])) self._vnc_lib.virtual_network_create(vn_obj) iip_obj = InstanceIp('iip-%s' %(self.id())) iip_obj.add_virtual_network(vn_obj) class SpyCreateNode(object): def __init__(self, orig_object, method_name): self._orig_method = getattr(orig_object, method_name) self._invoked = 0 # end __init__ def __call__(self, *args, **kwargs): if self._invoked >= 1: raise Exception( "Instance IP was persisted more than once") if args[1].startswith('/api-server/subnets'): self._invoked += 1 return self._orig_method(args, kwargs) # end SpyCreateNode orig_object = self._api_server._db_conn._zk_db._zk_client method_name = 'create_node' with test_common.patch(orig_object, method_name, SpyCreateNode(orig_object, method_name)): self._vnc_lib.instance_ip_create(iip_obj) self.assertTill(self.ifmap_has_ident, obj=iip_obj)
def test_list_with_inconsistent_members(self): # 1. create collection # 2. list, verify full collection # 3. mess with one in vnc_to_neutron, verify collection-1 # 4. restore, list, verify full collection proj_obj = self._vnc_lib.project_read( fq_name=['default-domain', 'default-project']) objects = {} for (obj_type, obj_class, create_method_name) in \ [('virtual_network', vnc_api.VirtualNetwork, 'virtual_network_create'), ('network_ipam', vnc_api.NetworkIpam, 'network_ipam_create'), ('network_policy', vnc_api.NetworkPolicy, 'network_policy_create'), ('logical_router', vnc_api.LogicalRouter, 'logical_router_create'), ('security_group', vnc_api.SecurityGroup, 'security_group_create'), ('route_table', vnc_api.RouteTable, 'route_table_create'), ('service_instance', vnc_api.ServiceInstance, 'service_instance_create')]: objects[obj_type] = [ obj_class('%s-%s' % (self.id(), i)) for i in range(3) ] for obj in objects[obj_type]: create_method = getattr(self._vnc_lib, create_method_name) create_method(obj) objects['virtual_machine_interface'] = \ [vnc_api.VirtualMachineInterface('%s-%s' %(self.id(), i), proj_obj) for i in range(3)] for obj in objects['virtual_machine_interface']: obj.add_virtual_network(vnc_api.VirtualNetwork()) self._vnc_lib.virtual_machine_interface_create(obj) vn_obj = vnc_api.VirtualNetwork(self.id()) sn0_id = str(uuid.uuid4()) sn1_id = str(uuid.uuid4()) sn2_id = str(uuid.uuid4()) vn_obj.add_network_ipam( vnc_api.NetworkIpam(), vnc_api.VnSubnetsType([ vnc_api.IpamSubnetType(vnc_api.SubnetType('1.1.1.0', 28), subnet_uuid=sn0_id), vnc_api.IpamSubnetType(vnc_api.SubnetType('2.2.2.0', 28), subnet_uuid=sn1_id), vnc_api.IpamSubnetType(vnc_api.SubnetType('3.3.3.0', 28), subnet_uuid=sn2_id) ])) self._vnc_lib.virtual_network_create(vn_obj) fip_pool_obj = vnc_api.FloatingIpPool(self.id(), vn_obj) self._vnc_lib.floating_ip_pool_create(fip_pool_obj) objects['floating_ip'] = [ vnc_api.FloatingIp('%s-%s' % (self.id(), i), fip_pool_obj) for i in range(3) ] for obj in objects['floating_ip']: obj.add_project(proj_obj) self._vnc_lib.floating_ip_create(obj) collection_types = [ (objects['virtual_network'], 'network', '_network_vnc_to_neutron'), (objects['virtual_machine_interface'], 'port', '_port_vnc_to_neutron'), (objects['network_ipam'], 'ipam', '_ipam_vnc_to_neutron'), (objects['network_policy'], 'policy', '_policy_vnc_to_neutron'), (objects['logical_router'], 'router', '_router_vnc_to_neutron'), (objects['floating_ip'], 'floatingip', '_floatingip_vnc_to_neutron'), (objects['security_group'], 'security_group', '_security_group_vnc_to_neutron'), (objects['route_table'], 'route_table', '_route_table_vnc_to_neutron'), (objects['service_instance'], 'nat_instance', '_svc_instance_vnc_to_neutron'), ] def list_resource(url_pfx): context = { 'operation': 'READALL', 'user_id': '', 'tenant_id': proj_obj.uuid, 'roles': '', 'is_admin': 'False' } data = {'fields': None, 'filters': {}} body = {'context': context, 'data': data} resp = self._api_svr_app.post_json('/neutron/%s' % (url_pfx), body) return json.loads(resp.text) # for collections that are objects in contrail model for (objects, res_url_pfx, res_xlate_name) in collection_types: res_dicts = list_resource(res_url_pfx) present_ids = [r['id'] for r in res_dicts] for obj in objects: self.assertIn(obj.uuid, present_ids) neutron_api_obj = FakeExtensionManager.get_extension_objects( 'vnc_cfg_api.neutronApi')[0] neutron_db_obj = neutron_api_obj._npi._cfgdb def err_on_object_2(orig_method, res_obj, *args, **kwargs): if res_obj.uuid == objects[2].uuid: raise Exception('faking inconsistent element') return orig_method(res_obj, *args, **kwargs) with test_common.patch(neutron_db_obj, res_xlate_name, err_on_object_2): res_dicts = list_resource(res_url_pfx) present_ids = [r['id'] for r in res_dicts] self.assertNotIn(objects[2].uuid, present_ids) res_dicts = list_resource(res_url_pfx) present_ids = [r['id'] for r in res_dicts] for obj in objects: self.assertIn(obj.uuid, present_ids) # end for collections that are objects in contrail model # subnets, sg-rules etc. res_dicts = list_resource('subnet') present_ids = [r['id'] for r in res_dicts] for sn_id in [sn0_id, sn1_id, sn2_id]: self.assertIn(sn_id, present_ids) def err_on_sn2(orig_method, subnet_vnc, *args, **kwargs): if subnet_vnc.subnet_uuid == sn2_id: raise Exception('faking inconsistent element') return orig_method(subnet_vnc, *args, **kwargs) with test_common.patch(neutron_db_obj, '_subnet_vnc_to_neutron', err_on_sn2): res_dicts = list_resource('subnet') present_ids = [r['id'] for r in res_dicts] self.assertNotIn(sn2_id, present_ids)
def test_subnet_uuid_heal(self): # 1. create 2 subnets thru vnc_api # 2. mess with useragent-kv index for one # 3. neutron subnet list should report fine # 4. neutron subnet list with uuids where # one is a fake uuid shouldnt cause error in list ipam_obj = vnc_api.NetworkIpam('ipam-%s' % (self.id())) self._vnc_lib.network_ipam_create(ipam_obj) vn1_obj = vnc_api.VirtualNetwork('vn1-%s' % (self.id())) sn1_uuid = str(uuid.uuid4()) vn1_obj.add_network_ipam( ipam_obj, vnc_api.VnSubnetsType([ vnc_api.IpamSubnetType(vnc_api.SubnetType('1.1.1.0', 28), subnet_uuid=sn1_uuid) ])) self._vnc_lib.virtual_network_create(vn1_obj) vn2_obj = vnc_api.VirtualNetwork('vn2-%s' % (self.id())) sn2_uuid = str(uuid.uuid4()) vn2_obj.add_network_ipam( ipam_obj, vnc_api.VnSubnetsType([ vnc_api.IpamSubnetType(vnc_api.SubnetType('2.2.2.0', 28), subnet_uuid=sn2_uuid) ])) self._vnc_lib.virtual_network_create(vn2_obj) # the list primes cfgdb handle(conn to api server) self.list_resource('subnet') neutron_api_obj = FakeExtensionManager.get_extension_objects( 'vnc_cfg_api.neutronApi')[0] neutron_db_obj = neutron_api_obj._npi._cfgdb heal_invoked = [False] def verify_heal_invoked(orig_method, *args, **kwargs): heal_invoked[0] = True return orig_method(*args, **kwargs) with test_common.patch(neutron_db_obj, 'subnet_id_heal', verify_heal_invoked): with CassandraCFs.get_cf('useragent_keyval_table').patch_row( sn2_uuid, None): # verify heal rsp = self.list_resource( 'subnet', req_filters={'id': [sn1_uuid, sn2_uuid]}) self.assertEqual(heal_invoked[0], True) self.assertEqual(len(rsp), 2) self.assertEqual(set([r['id'] for r in rsp]), set([sn1_uuid, sn2_uuid])) # verify wrong/non-existent id doesn't cause # list to have error heal_invoked[0] = False fake_uuid = str(uuid.uuid4()) rsp = self.list_resource( 'subnet', req_filters={'id': [sn1_uuid, sn2_uuid, fake_uuid]}) self.assertEqual(heal_invoked[0], True) self.assertEqual(len(rsp), 2) self.assertEqual(set([r['id'] for r in rsp]), set([sn1_uuid, sn2_uuid])) # verify read of non-existent id throws exception # and valid one doesn't with ExpectedException(webtest.app.AppError): self.read_resource('subnet', fake_uuid) self.read_resource('subnet', sn1_uuid)
def test_list_with_inconsistent_members(self): # 1. create collection # 2. list, verify full collection # 3. mess with one in vnc_to_neutron, verify collection-1 # 4. restore, list, verify full collection proj_obj = self._vnc_lib.project_read( fq_name=['default-domain', 'default-project']) objects = {} for (obj_type, obj_class, create_method_name) in \ [('virtual_network', vnc_api.VirtualNetwork, 'virtual_network_create'), ('network_ipam', vnc_api.NetworkIpam, 'network_ipam_create'), ('network_policy', vnc_api.NetworkPolicy, 'network_policy_create'), ('logical_router', vnc_api.LogicalRouter, 'logical_router_create'), ('security_group', vnc_api.SecurityGroup, 'security_group_create'), ('route_table', vnc_api.RouteTable, 'route_table_create'), ('service_instance', vnc_api.ServiceInstance, 'service_instance_create')]: objects[obj_type] = [obj_class('%s-%s' %(self.id(), i)) for i in range(3)] for obj in objects[obj_type]: create_method = getattr(self._vnc_lib, create_method_name) create_method(obj) objects['virtual_machine_interface'] = \ [vnc_api.VirtualMachineInterface('%s-%s' %(self.id(), i), proj_obj) for i in range(3)] for obj in objects['virtual_machine_interface']: obj.add_virtual_network(vnc_api.VirtualNetwork()) self._vnc_lib.virtual_machine_interface_create(obj) vn_obj = vnc_api.VirtualNetwork(self.id()) sn0_id = str(uuid.uuid4()) sn1_id = str(uuid.uuid4()) sn2_id = str(uuid.uuid4()) vn_obj.add_network_ipam(vnc_api.NetworkIpam(), vnc_api.VnSubnetsType( [vnc_api.IpamSubnetType(vnc_api.SubnetType('1.1.1.0', 28), subnet_uuid=sn0_id), vnc_api.IpamSubnetType(vnc_api.SubnetType('2.2.2.0', 28), subnet_uuid=sn1_id), vnc_api.IpamSubnetType(vnc_api.SubnetType('3.3.3.0', 28), subnet_uuid=sn2_id)])) self._vnc_lib.virtual_network_create(vn_obj) fip_pool_obj = vnc_api.FloatingIpPool(self.id(), vn_obj) self._vnc_lib.floating_ip_pool_create(fip_pool_obj) objects['floating_ip'] = [vnc_api.FloatingIp('%s-%s' %(self.id(), i), fip_pool_obj) for i in range(3)] for obj in objects['floating_ip']: obj.add_project(proj_obj) self._vnc_lib.floating_ip_create(obj) collection_types = [ (objects['virtual_network'], 'network', '_network_vnc_to_neutron'), (objects['virtual_machine_interface'], 'port', '_port_vnc_to_neutron'), (objects['network_ipam'], 'ipam', '_ipam_vnc_to_neutron'), (objects['network_policy'], 'policy', '_policy_vnc_to_neutron'), (objects['logical_router'], 'router', '_router_vnc_to_neutron'), (objects['floating_ip'], 'floatingip', '_floatingip_vnc_to_neutron'), (objects['security_group'], 'security_group', '_security_group_vnc_to_neutron'), (objects['route_table'], 'route_table', '_route_table_vnc_to_neutron'), (objects['service_instance'], 'nat_instance', '_svc_instance_vnc_to_neutron'), ] def list_resource(url_pfx): context = {'operation': 'READALL', 'user_id': '', 'tenant_id': proj_obj.uuid, 'roles': '', 'is_admin': 'False'} data = {'fields': None, 'filters': {}} body = {'context': context, 'data': data} resp = self._api_svr_app.post_json( '/neutron/%s' %(url_pfx), body) return json.loads(resp.text) # for collections that are objects in contrail model for (objects, res_url_pfx, res_xlate_name) in collection_types: res_dicts = list_resource(res_url_pfx) present_ids = [r['id'] for r in res_dicts] for obj in objects: self.assertIn(obj.uuid, present_ids) neutron_api_obj = FakeExtensionManager.get_extension_objects( 'vnc_cfg_api.neutronApi')[0] neutron_db_obj = neutron_api_obj._npi._cfgdb def err_on_object_2(orig_method, res_obj, *args, **kwargs): if res_obj.uuid == objects[2].uuid: raise Exception('faking inconsistent element') return orig_method(res_obj, *args, **kwargs) with test_common.patch( neutron_db_obj, res_xlate_name, err_on_object_2): res_dicts = list_resource(res_url_pfx) present_ids = [r['id'] for r in res_dicts] self.assertNotIn(objects[2].uuid, present_ids) res_dicts = list_resource(res_url_pfx) present_ids = [r['id'] for r in res_dicts] for obj in objects: self.assertIn(obj.uuid, present_ids) # end for collections that are objects in contrail model # subnets, sg-rules etc. res_dicts = list_resource('subnet') present_ids = [r['id'] for r in res_dicts] for sn_id in [sn0_id, sn1_id, sn2_id]: self.assertIn(sn_id, present_ids) def err_on_sn2(orig_method, subnet_vnc, *args, **kwargs): if subnet_vnc.subnet_uuid == sn2_id: raise Exception('faking inconsistent element') return orig_method(subnet_vnc, *args, **kwargs) with test_common.patch( neutron_db_obj, '_subnet_vnc_to_neutron', err_on_sn2): res_dicts = list_resource('subnet') present_ids = [r['id'] for r in res_dicts] self.assertNotIn(sn2_id, present_ids)
def test_filters_with_id(self): neutron_api_obj = FakeExtensionManager.get_extension_objects( 'vnc_cfg_api.neutronApi')[0] neutron_api_obj._npi._connect_to_db() neutron_db_obj = neutron_api_obj._npi._cfgdb # sg setup proj_obj = self._vnc_lib.project_read( fq_name=['default-domain', 'default-project']) sg_obj = vnc_api.SecurityGroup('sg-%s' %(self.id()), proj_obj) self._vnc_lib.security_group_create(sg_obj) # fip setup vn_obj = vnc_api.VirtualNetwork('vn1-%s' %(self.id()), proj_obj) vn_obj.add_network_ipam(vnc_api.NetworkIpam(), vnc_api.VnSubnetsType( [vnc_api.IpamSubnetType(vnc_api.SubnetType('1.1.1.0', 28))])) self._vnc_lib.virtual_network_create(vn_obj) fip_pool_obj = vnc_api.FloatingIpPool('fip-pool-%s' %(self.id()), vn_obj) self._vnc_lib.floating_ip_pool_create(fip_pool_obj) fip1_obj = vnc_api.FloatingIp('fip1-%s' %(self.id()), fip_pool_obj) fip1_obj.add_project(proj_obj) self._vnc_lib.floating_ip_create(fip1_obj) proj2_obj = vnc_api.Project('proj2-%s' %(self.id()), vnc_api.Domain()) self._vnc_lib.project_create(proj2_obj) fip2_obj = vnc_api.FloatingIp('fip2-%s' %(self.id()), fip_pool_obj) fip2_obj.add_project(proj2_obj) self._vnc_lib.floating_ip_create(fip2_obj) vmi_obj = vnc_api.VirtualMachineInterface( 'vmi-%s' %(self.id()), proj_obj) vmi_obj.add_virtual_network(vn_obj) self._vnc_lib.virtual_machine_interface_create(vmi_obj) fip3_obj = vnc_api.FloatingIp('fip3-%s' %(self.id()), fip_pool_obj) fip3_obj.add_virtual_machine_interface(vmi_obj) fip3_obj.add_project(proj_obj) self._vnc_lib.floating_ip_create(fip3_obj) def spy_list(orig_method, *args, **kwargs): self.assertIn(sg_obj.uuid, kwargs['obj_uuids']) return orig_method(*args, **kwargs) with test_common.patch( neutron_db_obj._vnc_lib, 'security_groups_list', spy_list): context = {'operation': 'READALL', 'user_id': '', 'tenant_id': proj_obj.uuid, 'roles': '', 'is_admin': 'False'} data = {'filters': {'id':[sg_obj.uuid]}} body = {'context': context, 'data': data} resp = self._api_svr_app.post_json( '/neutron/security_group', body) sg_neutron_list = json.loads(resp.text) self.assertEqual(len(sg_neutron_list), 1) self.assertEqual(sg_neutron_list[0]['id'], sg_obj.uuid) def spy_list(orig_method, *args, **kwargs): self.assertIn(fip1_obj.uuid, kwargs['obj_uuids']) return orig_method(*args, **kwargs) with test_common.patch( neutron_db_obj._vnc_lib, 'floating_ips_list', spy_list): context = {'operation': 'READALL', 'user_id': '', 'tenant_id': '', 'roles': '', 'is_admin': 'False'} # ask for one explicit id data = {'filters': {'id':[fip1_obj.uuid]}} body = {'context': context, 'data': data} resp = self._api_svr_app.post_json( '/neutron/floatingip', body) fip_neutron_list = json.loads(resp.text) self.assertEqual(len(fip_neutron_list), 1) self.assertEqual(fip_neutron_list[0]['id'], fip1_obj.uuid) # ask for list of ids AND in a project, should return 1 data = {'filters': {'id':[fip1_obj.uuid, fip2_obj.uuid], 'tenant_id': [proj2_obj.uuid.replace('-', '')]}} body = {'context': context, 'data': data} resp = self._api_svr_app.post_json( '/neutron/floatingip', body) fip_neutron_list = json.loads(resp.text) self.assertEqual(len(fip_neutron_list), 1) self.assertEqual(fip_neutron_list[0]['id'], fip2_obj.uuid) # ask for list of ids AND on a VMI, should return 1 data = {'filters': {'id':[fip1_obj.uuid, fip2_obj.uuid, fip3_obj.uuid], 'tenant_id': [proj2_obj.uuid.replace('-', '')]}} body = {'context': context, 'data': data} resp = self._api_svr_app.post_json( '/neutron/floatingip', body) fip_neutron_list = json.loads(resp.text) self.assertEqual(len(fip_neutron_list), 1) self.assertEqual(fip_neutron_list[0]['id'], fip2_obj.uuid) self._vnc_lib.security_group_delete(id=sg_obj.uuid) self._vnc_lib.floating_ip_delete(id=fip1_obj.uuid) self._vnc_lib.floating_ip_delete(id=fip2_obj.uuid) self._vnc_lib.floating_ip_delete(id=fip3_obj.uuid) self._vnc_lib.floating_ip_pool_delete(id=fip_pool_obj.uuid) self._vnc_lib.virtual_machine_interface_delete(id=vmi_obj.uuid) self._vnc_lib.virtual_network_delete(id=vn_obj.uuid) self._vnc_lib.project_delete(id=proj2_obj.uuid)
def test_ip_addr_not_released_on_delete_error(self): ipam_obj = NetworkIpam('ipam-%s' % (self.id())) self._vnc_lib.network_ipam_create(ipam_obj) vn_obj = VirtualNetwork('vn-%s' % (self.id())) vn_obj.add_network_ipam( ipam_obj, VnSubnetsType([IpamSubnetType(SubnetType('1.1.1.0', 28))])) self._vnc_lib.virtual_network_create(vn_obj) # instance-ip test iip_obj = InstanceIp('iip-%s' % (self.id())) iip_obj.add_virtual_network(vn_obj) self._vnc_lib.instance_ip_create(iip_obj) # read back to get allocated ip iip_obj = self._vnc_lib.instance_ip_read(id=iip_obj.uuid) def err_on_delete(orig_method, *args, **kwargs): if args[0] == 'instance_ip': raise Exception("Faking db delete for instance ip") return orig_method(*args, **kwargs) with test_common.patch(self._api_server._db_conn, 'dbe_delete', err_on_delete): try: self._vnc_lib.instance_ip_delete(id=iip_obj.uuid) self.assertTrue(False, 'Instance IP delete worked unexpectedly') except Exception as e: self.assertThat(str(e), Contains('"Faking db delete for instance ip"')) # floating-ip test fip_pool_obj = FloatingIpPool('fip-pool-%s' % (self.id()), parent_obj=vn_obj) self._vnc_lib.floating_ip_pool_create(fip_pool_obj) fip_obj = FloatingIp('fip-%s' % (self.id()), parent_obj=fip_pool_obj) fip_obj.add_project(Project()) self._vnc_lib.floating_ip_create(fip_obj) # read back to get allocated floating-ip fip_obj = self._vnc_lib.floating_ip_read(id=fip_obj.uuid) def err_on_delete(orig_method, *args, **kwargs): if args[0] == 'floating_ip': raise Exception("Faking db delete for floating ip") if args[0] == 'alias_ip': raise Exception("Faking db delete for alias ip") return orig_method(*args, **kwargs) with test_common.patch(self._api_server._db_conn, 'dbe_delete', err_on_delete): try: self._vnc_lib.floating_ip_delete(id=fip_obj.uuid) self.assertTrue(False, 'Floating IP delete worked unexpectedly') except Exception as e: self.assertThat(str(e), Contains('"Faking db delete for floating ip"')) # alias-ip test aip_pool_obj = AliasIpPool('aip-pool-%s' % (self.id()), parent_obj=vn_obj) self._vnc_lib.alias_ip_pool_create(aip_pool_obj) aip_obj = AliasIp('aip-%s' % (self.id()), parent_obj=aip_pool_obj) aip_obj.add_project(Project()) self._vnc_lib.alias_ip_create(aip_obj) # read back to get allocated alias-ip aip_obj = self._vnc_lib.alias_ip_read(id=aip_obj.uuid) with test_common.patch(self._api_server._db_conn, 'dbe_delete', err_on_delete): try: self._vnc_lib.alias_ip_delete(id=aip_obj.uuid) self.assertTrue(False, 'Alias IP delete worked unexpectedly') except Exception as e: self.assertThat(str(e), Contains('"Faking db delete for alias ip"'))
def test_list_with_inconsistent_members(self): self.skipTest("Skipping this flakky test, till finding the" " root cause for the first run failure") # 1. create collection # 2. list, verify full collection # 3. mess with one in vnc_to_neutron, verify collection-1 # 4. restore, list, verify full collection proj_obj = self._vnc_lib.project_read(fq_name=["default-domain", "default-project"]) objects = {} for (obj_type, obj_class, create_method_name) in [ ("virtual_network", vnc_api.VirtualNetwork, "virtual_network_create"), ("network_ipam", vnc_api.NetworkIpam, "network_ipam_create"), ("network_policy", vnc_api.NetworkPolicy, "network_policy_create"), ("logical_router", vnc_api.LogicalRouter, "logical_router_create"), ("security_group", vnc_api.SecurityGroup, "security_group_create"), ("route_table", vnc_api.RouteTable, "route_table_create"), ("service_instance", vnc_api.ServiceInstance, "service_instance_create"), ]: objects[obj_type] = [obj_class("%s-%s" % (self.id(), i)) for i in range(3)] for obj in objects[obj_type]: create_method = getattr(self._vnc_lib, create_method_name) create_method(obj) objects["virtual_machine_interface"] = [ vnc_api.VirtualMachineInterface("%s-%s" % (self.id(), i), proj_obj) for i in range(3) ] for obj in objects["virtual_machine_interface"]: obj.add_virtual_network(vnc_api.VirtualNetwork()) self._vnc_lib.virtual_machine_interface_create(obj) vn_obj = vnc_api.VirtualNetwork(self.id()) sn0_id = str(uuid.uuid4()) sn1_id = str(uuid.uuid4()) sn2_id = str(uuid.uuid4()) vn_obj.add_network_ipam( vnc_api.NetworkIpam(), vnc_api.VnSubnetsType( [ vnc_api.IpamSubnetType(vnc_api.SubnetType("1.1.1.0", 28), subnet_uuid=sn0_id), vnc_api.IpamSubnetType(vnc_api.SubnetType("2.2.2.0", 28), subnet_uuid=sn1_id), vnc_api.IpamSubnetType(vnc_api.SubnetType("3.3.3.0", 28), subnet_uuid=sn2_id), ] ), ) self._vnc_lib.virtual_network_create(vn_obj) fip_pool_obj = vnc_api.FloatingIpPool(self.id(), vn_obj) self._vnc_lib.floating_ip_pool_create(fip_pool_obj) objects["floating_ip"] = [vnc_api.FloatingIp("%s-%s" % (self.id(), i), fip_pool_obj) for i in range(3)] for obj in objects["floating_ip"]: obj.add_project(proj_obj) self._vnc_lib.floating_ip_create(obj) collection_types = [ (objects["virtual_network"], "network", "_network_vnc_to_neutron"), (objects["virtual_machine_interface"], "port", "_port_vnc_to_neutron"), (objects["network_ipam"], "ipam", "_ipam_vnc_to_neutron"), (objects["network_policy"], "policy", "_policy_vnc_to_neutron"), (objects["logical_router"], "router", "_router_vnc_to_neutron"), (objects["floating_ip"], "floatingip", "_floatingip_vnc_to_neutron"), (objects["security_group"], "security_group", "_security_group_vnc_to_neutron"), (objects["route_table"], "route_table", "_route_table_vnc_to_neutron"), (objects["service_instance"], "nat_instance", "_svc_instance_vnc_to_neutron"), ] def list_resource(url_pfx): context = { "operation": "READALL", "user_id": "", "tenant_id": proj_obj.uuid, "roles": "", "is_admin": "False", } data = {"fields": None, "filters": {}} body = {"context": context, "data": data} resp = self._api_svr_app.post_json("/neutron/%s" % (url_pfx), body) return json.loads(resp.text) # for collections that are objects in contrail model for (objects, res_url_pfx, res_xlate_name) in collection_types: res_dicts = list_resource(res_url_pfx) present_ids = [r["id"] for r in res_dicts] for obj in objects: self.assertIn(obj.uuid, present_ids) neutron_api_obj = FakeExtensionManager.get_extension_objects("vnc_cfg_api.neutronApi")[0] neutron_db_obj = neutron_api_obj._npi._cfgdb def err_on_object_2(orig_method, res_obj, *args, **kwargs): if res_obj.uuid == objects[2].uuid: raise Exception("faking inconsistent element") return orig_method(res_obj, *args, **kwargs) with test_common.patch(neutron_db_obj, res_xlate_name, err_on_object_2): res_dicts = list_resource(res_url_pfx) present_ids = [r["id"] for r in res_dicts] self.assertNotIn(objects[2].uuid, present_ids) res_dicts = list_resource(res_url_pfx) present_ids = [r["id"] for r in res_dicts] for obj in objects: self.assertIn(obj.uuid, present_ids) # end for collections that are objects in contrail model # subnets, sg-rules etc. res_dicts = list_resource("subnet") present_ids = [r["id"] for r in res_dicts] for sn_id in [sn0_id, sn1_id, sn2_id]: self.assertIn(sn_id, present_ids) def err_on_sn2(orig_method, subnet_vnc, *args, **kwargs): if subnet_vnc.subnet_uuid == sn2_id: raise Exception("faking inconsistent element") return orig_method(subnet_vnc, *args, **kwargs) with test_common.patch(neutron_db_obj, "_subnet_vnc_to_neutron", err_on_sn2): res_dicts = list_resource("subnet") present_ids = [r["id"] for r in res_dicts] self.assertNotIn(sn2_id, present_ids)
def test_ip_addr_not_released_on_delete_error(self): ipam_obj = NetworkIpam('ipam-%s' %(self.id())) self._vnc_lib.network_ipam_create(ipam_obj) vn_obj = VirtualNetwork('vn-%s' %(self.id())) vn_obj.add_network_ipam(ipam_obj, VnSubnetsType( [IpamSubnetType(SubnetType('1.1.1.0', 28))])) self._vnc_lib.virtual_network_create(vn_obj) # instance-ip test iip_obj = InstanceIp('iip-%s' %(self.id())) iip_obj.add_virtual_network(vn_obj) self._vnc_lib.instance_ip_create(iip_obj) # read back to get allocated ip iip_obj = self._vnc_lib.instance_ip_read(id=iip_obj.uuid) def err_on_delete(orig_method, *args, **kwargs): if args[0] == 'instance_ip': raise Exception("Faking db delete for instance ip") return orig_method(*args, **kwargs) with test_common.patch( self._api_server._db_conn, 'dbe_delete', err_on_delete): try: self._vnc_lib.instance_ip_delete(id=iip_obj.uuid) self.assertTrue( False, 'Instance IP delete worked unexpectedly') except Exception as e: self.assertThat(str(e), Contains('"Faking db delete for instance ip"')) # floating-ip test fip_pool_obj = FloatingIpPool( 'fip-pool-%s' %(self.id()), parent_obj=vn_obj) self._vnc_lib.floating_ip_pool_create(fip_pool_obj) fip_obj = FloatingIp('fip-%s' %(self.id()), parent_obj=fip_pool_obj) fip_obj.add_project(Project()) self._vnc_lib.floating_ip_create(fip_obj) # read back to get allocated floating-ip fip_obj = self._vnc_lib.floating_ip_read(id=fip_obj.uuid) def err_on_delete(orig_method, *args, **kwargs): if args[0] == 'floating_ip': raise Exception("Faking db delete for floating ip") if args[0] == 'alias_ip': raise Exception("Faking db delete for alias ip") return orig_method(*args, **kwargs) with test_common.patch( self._api_server._db_conn, 'dbe_delete', err_on_delete): try: self._vnc_lib.floating_ip_delete(id=fip_obj.uuid) self.assertTrue( False, 'Floating IP delete worked unexpectedly') except Exception as e: self.assertThat(str(e), Contains('"Faking db delete for floating ip"')) # alias-ip test aip_pool_obj = AliasIpPool( 'aip-pool-%s' %(self.id()), parent_obj=vn_obj) self._vnc_lib.alias_ip_pool_create(aip_pool_obj) aip_obj = AliasIp('aip-%s' %(self.id()), parent_obj=aip_pool_obj) aip_obj.add_project(Project()) self._vnc_lib.alias_ip_create(aip_obj) # read back to get allocated alias-ip aip_obj = self._vnc_lib.alias_ip_read(id=aip_obj.uuid) with test_common.patch( self._api_server._db_conn, 'dbe_delete', err_on_delete): try: self._vnc_lib.alias_ip_delete(id=aip_obj.uuid) self.assertTrue( False, 'Alias IP delete worked unexpectedly') except Exception as e: self.assertThat(str(e), Contains('"Faking db delete for alias ip"'))
def test_subnet_uuid_heal(self): # 1. create 2 subnets thru vnc_api # 2. mess with useragent-kv index for one # 3. neutron subnet list should report fine # 4. neutron subnet list with uuids where # one is a fake uuid shouldnt cause error in list ipam_obj = vnc_api.NetworkIpam('ipam-%s' %(self.id())) self._vnc_lib.network_ipam_create(ipam_obj) vn1_obj = vnc_api.VirtualNetwork('vn1-%s' %(self.id())) sn1_uuid = str(uuid.uuid4()) vn1_obj.add_network_ipam(ipam_obj, vnc_api.VnSubnetsType( [vnc_api.IpamSubnetType(vnc_api.SubnetType('1.1.1.0', 28), subnet_uuid=sn1_uuid)])) self._vnc_lib.virtual_network_create(vn1_obj) vn2_obj = vnc_api.VirtualNetwork('vn2-%s' %(self.id())) sn2_uuid = str(uuid.uuid4()) vn2_obj.add_network_ipam(ipam_obj, vnc_api.VnSubnetsType( [vnc_api.IpamSubnetType(vnc_api.SubnetType('2.2.2.0', 28), subnet_uuid=sn2_uuid)])) self._vnc_lib.virtual_network_create(vn2_obj) # the list primes cfgdb handle(conn to api server) self.list_resource('subnet') neutron_api_obj = FakeExtensionManager.get_extension_objects( 'vnc_cfg_api.neutronApi')[0] neutron_db_obj = neutron_api_obj._npi._cfgdb heal_invoked = [False] def verify_heal_invoked(orig_method, *args, **kwargs): heal_invoked[0] = True return orig_method(*args, **kwargs) with test_common.patch( neutron_db_obj, 'subnet_id_heal', verify_heal_invoked): with CassandraCFs.get_cf("useragent", 'useragent_keyval_table').patch_row(sn2_uuid, None): # verify heal rsp = self.list_resource('subnet', req_filters={'id': [sn1_uuid, sn2_uuid]}) self.assertEqual(heal_invoked[0], True) self.assertEqual(len(rsp), 2) self.assertEqual(set([r['id'] for r in rsp]), set([sn1_uuid, sn2_uuid])) # verify wrong/non-existent id doesn't cause # list to have error heal_invoked[0] = False fake_uuid = str(uuid.uuid4()) rsp = self.list_resource('subnet', req_filters={'id': [sn1_uuid, sn2_uuid, fake_uuid]}) self.assertEqual(heal_invoked[0], True) self.assertEqual(len(rsp), 2) self.assertEqual(set([r['id'] for r in rsp]), set([sn1_uuid, sn2_uuid])) # verify read of non-existent id throws exception # and valid one doesn't with ExpectedException(webtest.app.AppError): self.read_resource('subnet', fake_uuid) self.read_resource('subnet', sn1_uuid)