def test_resource_collection(self, mock_session): mock_session.get_json.return_value = { "foos": [{ "href": self.BASE + "/foo/ec1afeaa-8930-43b0-a60a-939f23a50724", "uuid": "ec1afeaa-8930-43b0-a60a-939f23a50724" }, { "href": self.BASE + "/foo/c2588045-d6fb-4f37-9f46-9451f653fb6a", "uuid": "c2588045-d6fb-4f37-9f46-9451f653fb6a" }] } collection = Collection('foo', fetch=True) self.assertTrue(collection.href.endswith('s')) self.assertEqual(collection.fq_name, FQName()) expected_collection = Collection('foo') expected_collection.data = [ Resource('foo', href=self.BASE + "/foo/ec1afeaa-8930-43b0-a60a-939f23a50724", uuid="ec1afeaa-8930-43b0-a60a-939f23a50724"), Resource('foo', href=self.BASE + "/foo/c2588045-d6fb-4f37-9f46-9451f653fb6a", uuid="c2588045-d6fb-4f37-9f46-9451f653fb6a") ] self.assertEqual(collection, expected_collection)
def test_collection_detail(self, mock_session): mock_session.configure_mock(base_url=BASE) c = Collection('foo', fields=['foo', 'bar'], detail=True, fetch=True) mock_session.get_json.assert_called_with(BASE + '/foos', detail=True) c.fetch(fields=['baz']) mock_session.get_json.assert_called_with(BASE + '/foos', detail=True) c.fetch() mock_session.get_json.assert_called_with(BASE + '/foos', detail=True) c = Collection('foo', detail=True, fetch=True) mock_session.get_json.assert_called_with(c.href, detail=True) c = Collection('foo', detail=False, fetch=True) mock_session.get_json.assert_called_with(c.href) c = Collection('foo', detail='other', fetch=True) mock_session.get_json.assert_called_with(c.href) mock_session.get_json.return_value = { 'foos': [{ 'foo': { 'uuid': 'dd2f4111-abda-405f-bce9-c6c24181dd14', } }, { 'foo': { 'uuid': '9fe7094d-f54e-4284-a813-9ca4df866019', } }] } c = Collection('foo', detail=True, fetch=True) self.assertEqual( c.data[0], Resource('foo', uuid='dd2f4111-abda-405f-bce9-c6c24181dd14')) self.assertEqual( c.data[1], Resource('foo', uuid='9fe7094d-f54e-4284-a813-9ca4df866019'))
def test_resource_fqname_validation(self, mock_session): # bind original method to mock_session mock_session.fqname_to_id = ContrailAPISession.fqname_to_id.__get__( mock_session) mock_session.post_json = ContrailAPISession.post_json.__get__( mock_session) mock_session.make_url = ContrailAPISession.make_url.__get__( mock_session) # called by fqname_to_id def post(url, data=None, headers=None): data = json.loads(data) result = mock.Mock() if data['type'] == "foo": result.json.return_value = { "uuid": "ec1afeaa-8930-43b0-a60a-939f23a50724" } return result if data['type'] == "bar": raise HttpError(http_status=404) mock_session.post.side_effect = post r = Resource('foo', fq_name='domain:foo:uuid', check=True) self.assertEqual(r.uuid, 'ec1afeaa-8930-43b0-a60a-939f23a50724') self.assertEqual(r.path, Path('/foo/ec1afeaa-8930-43b0-a60a-939f23a50724')) with self.assertRaises(ResourceNotFound) as e: r = Resource('bar', fq_name='domain:bar:nofound', check=True) self.assertEqual(str(e), "Resource domain:bar:nofound doesn't exists")
def test_resource_fetch(self, mock_session): mock_session.configure_mock(base_url=BASE) mock_session.fqname_to_id.side_effect = HttpError(http_status=404) r = Resource('foo', fq_name='domain:bar:foo') with self.assertRaises(ResourceNotFound): r.fetch() mock_session.fqname_to_id.side_effect = [ "07eeb3c0-42f5-427c-9409-6ae45b376aa2" ] mock_session.get_json.return_value = { 'foo': { 'uuid': '07eeb3c0-42f5-427c-9409-6ae45b376aa2', 'fq_name': ['domain', 'bar', 'foo'] } } r = Resource('foo', fq_name='domain:bar:foo') r.fetch() self.assertEqual(r.uuid, '07eeb3c0-42f5-427c-9409-6ae45b376aa2') mock_session.get_json.assert_called_with(r.href) r.fetch(exclude_children=True) mock_session.get_json.assert_called_with(r.href, exclude_children=True) r.fetch(exclude_back_refs=True) mock_session.get_json.assert_called_with(r.href, exclude_back_refs=True)
def test_resource_base(self, mock_session): mock_session.configure_mock(base_url=self.BASE) c = RootCollection() self.assertEqual(c.uuid, '') self.assertEqual(c.fq_name, FQName()) self.assertEqual(c.href, self.BASE + '/') c = Collection('foo') self.assertEqual(c.uuid, '') self.assertEqual(c.fq_name, FQName()) self.assertEqual(c.href, self.BASE + '/foos') r = Resource('foo', uuid='x') self.assertEqual(r.uuid, 'x') self.assertEqual(r.fq_name, FQName()) self.assertEqual(r.href, self.BASE + '/foo/x') r = Resource('foo', fq_name='foo:bar') self.assertEqual(r.uuid, '') self.assertEqual(r.fq_name, FQName('foo:bar')) self.assertEqual(r.href, self.BASE + '/foos') r = Resource('foo', to='foo:bar') self.assertEqual(r.uuid, '') self.assertEqual(r.fq_name, FQName('foo:bar')) self.assertEqual(r.href, self.BASE + '/foos') with self.assertRaises(AssertionError): r = Resource('bar')
def __call__(self, virtual_network_fqname=None, cidrs=None): vn = Resource('virtual-network', fq_name=virtual_network_fqname, fetch=True) cidrs = [netaddr.IPNetwork(cidr) for cidr in cidrs] ipam_subnets = self._get_network_ipam_subnets(vn) ipam_subnets_current = [{ 'subnet': { 'ip_prefix': s['subnet']['ip_prefix'], 'ip_prefix_len': s['subnet']['ip_prefix_len'] } } for s in ipam_subnets] ipam_subnets_wanted = [{ 'subnet': { 'ip_prefix': text_type(c.network), 'ip_prefix_len': c.prefixlen } } for c in cidrs] modified = False for idx, subnet in enumerate(ipam_subnets_current): if subnet not in ipam_subnets_wanted: del ipam_subnets[idx] modified = True for subnet in ipam_subnets_wanted: if subnet not in ipam_subnets_current: ipam_subnets.append(subnet) modified = True if modified: vn.save()
def test_attr_transformations(self, mock_session): lr = LinkedResources( LinkType.REF, Resource('virtual-machine-interface', fq_name='foo')) self.assertEqual(lr._type_to_attr('virtual-machine'), 'virtual_machine_refs') self.assertEqual(lr._type_to_attr('virtual_machine'), 'virtual_machine_refs') self.assertEqual(lr._attr_to_type('virtual_machine'), 'virtual-machine') self.assertEqual(lr._attr_to_type('virtual_machine_refs'), 'virtual-machine') self.assertEqual(lr._attr_to_type('virtual_machine_back_refs'), 'virtual-machine-back') lr = LinkedResources( LinkType.BACK_REF, Resource('virtual-machine-interface', fq_name='foo')) self.assertEqual(lr._type_to_attr('virtual-machine'), 'virtual_machine_back_refs') self.assertEqual(lr._attr_to_type('virtual_machine_back_refs'), 'virtual-machine') self.assertEqual(lr._attr_to_type('virtual_machine_refs'), 'virtual-machine-refs') lr = LinkedResources( LinkType.CHILDREN, Resource('virtual-machine-interface', fq_name='foo')) self.assertEqual(lr._type_to_attr('virtual-machine'), 'virtual_machines') self.assertEqual(lr._attr_to_type('virtual_machines'), 'virtual-machine') self.assertEqual(lr._attr_to_type('virtual_machine_refs'), 'virtual-machine-ref')
def test_resource_uuid_validation(self, mock_session): # bind original method to mock_session mock_session.id_to_fqname = ContrailAPISession.id_to_fqname.__get__( mock_session) mock_session.make_url = ContrailAPISession.make_url.__get__( mock_session) # called by id_to_fqname def post(url, json): if json['uuid'] == 'a5a1b67b-4246-4e2d-aa24-479d8d47435d': return {'type': 'foo', 'fq_name': ['domain', 'foo', 'uuid']} else: raise HttpError(http_status=404) mock_session.post_json.side_effect = post r = Resource('foo', uuid='a5a1b67b-4246-4e2d-aa24-479d8d47435d', check=True) self.assertEqual(str(r.fq_name), 'domain:foo:uuid') self.assertEqual(r.path, Path('/foo/a5a1b67b-4246-4e2d-aa24-479d8d47435d')) with self.assertRaises(ResourceNotFound) as e: r = Resource('bar', uuid='d6e9fae3-628c-448c-bfc5-849d82a9a016', check=True) self.assertEqual( str(e), "Resource d6e9fae3-628c-448c-bfc5-849d82a9a016 doesn't exists")
def test_resource_cat(self, mock_session, mock_colorize): # bind original method to mock_session mock_session.id_to_fqname = client.ContrailAPISession.id_to_fqname.__get__(mock_session) mock_session.make_url = client.ContrailAPISession.make_url.__get__(mock_session) # called by id_to_fqname def post(url, json=None): if json['uuid'] == "ec1afeaa-8930-43b0-a60a-939f23a50724": return { "type": "foo", "fq_name": [ "foo", "ec1afeaa-8930-43b0-a60a-939f23a50724" ] } if json['uuid'] == "15315402-8a21-4116-aeaa-b6a77dceb191": return { "type": "bar", "fq_name": [ "bar", "15315402-8a21-4116-aeaa-b6a77dceb191" ] } mock_session.post_json.side_effect = post mock_colorize.side_effect = lambda d: d mock_session.get_json.return_value = { 'foo': { 'href': BASE + '/foo/ec1afeaa-8930-43b0-a60a-939f23a50724', 'uuid': 'ec1afeaa-8930-43b0-a60a-939f23a50724', 'attr': None, 'fq_name': [ 'foo', 'ec1afeaa-8930-43b0-a60a-939f23a50724' ], 'bar_refs': [ { 'href': BASE + '/bar/15315402-8a21-4116-aeaa-b6a77dceb191', 'uuid': '15315402-8a21-4116-aeaa-b6a77dceb191', 'to': [ 'bar', '15315402-8a21-4116-aeaa-b6a77dceb191' ] } ] } } ShellContext.current_path = Path('/foo') expected_resource = Resource('foo', uuid='ec1afeaa-8930-43b0-a60a-939f23a50724', href=BASE + '/foo/ec1afeaa-8930-43b0-a60a-939f23a50724', attr=None, fq_name='foo:ec1afeaa-8930-43b0-a60a-939f23a50724') expected_resource['bar_refs'] = [ Resource('bar', uuid='15315402-8a21-4116-aeaa-b6a77dceb191', href=BASE + '/bar/15315402-8a21-4116-aeaa-b6a77dceb191', to=['bar', '15315402-8a21-4116-aeaa-b6a77dceb191']) ] result = self.mgr.get('cat')(paths=['ec1afeaa-8930-43b0-a60a-939f23a50724']) self.assertEqual(expected_resource.json(), result)
def __call__(self, appliance_set_name=None, driver=None): global_config = Resource('global-system-config', fq_name='default-global-system-config') sas = Resource('service-appliance-set', fq_name='default-global-system-config:%s' % appliance_set_name, parent=global_config, service_appliance_driver=driver) sas.save()
def __call__(self, analytics_name=None, analytics_ip=None): global_config = Resource('global-system-config', fq_name='default-global-system-config') analytics = Resource('analytics-node', fq_name='default-global-system-config:%s' % analytics_name, parent=global_config, analytics_node_ip_address=analytics_ip) analytics.save()
def __call__(self, config_name=None, config_ip=None): global_config = Resource('global-system-config', fq_name='default-global-system-config') config = Resource('config-node', fq_name='default-global-system-config:%s' % config_name, parent=global_config, config_node_ip_address=config_ip) config.save()
def __call__(self): try: global_config = Resource('global-system-config', fq_name='default-global-system-config', fetch=True) if global_config.get('autonomous_system'): return json.dumps( {"asn": global_config.get('autonomous_system')}) except ResourceNotFound: pass return json.dumps([])
def __call__(self, vrouter_ip=None, vrouter_name=None, vrouter_type=None): global_config = Resource('global-system-config', fq_name='default-global-system-config') vrouter = Resource('virtual-router', fq_name='default-global-system-config:%s' % vrouter_name, parent=global_config, virtual_router_ip_address=vrouter_ip) if vrouter_type: vrouter['virtual_router_type'] = [vrouter_type] vrouter.save()
class Linklocal(Command): service_name = Option(help='Linklocal service name', required=True) service_ip = Option(help='Linklocal service IP', type=ip_type, required=True) service_port = Option(help='Linklocal service port', type=int, required=True) fabric_dns_service_name = Option(help='DNS service name in the fabric') fabric_service_ip = Option(help='Service IP in the fabric', type=ip_type) fabric_service_port = Option(help='Service port in the fabric', type=int, required=True) def __call__(self, service_name=None, service_ip=None, service_port=None, fabric_dns_service_name=None, fabric_service_ip=None, fabric_service_port=None): if not fabric_dns_service_name and not fabric_service_ip: raise CommandError( '--fabric_dns_service_name or --fabric_service_ip required') self.linklocal_entry = { 'ip_fabric_DNS_service_name': fabric_dns_service_name, 'ip_fabric_service_ip': [], 'ip_fabric_service_port': fabric_service_port, 'linklocal_service_ip': service_ip, 'linklocal_service_port': service_port, 'linklocal_service_name': service_name } if fabric_service_ip: self.linklocal_entry['ip_fabric_service_ip'].append( fabric_service_ip) try: self.vrouter_config = Resource( 'global-vrouter-config', fq_name= 'default-global-system-config:default-global-vrouter-config', fetch=True) except ResourceNotFound: global_config = Resource('global-system-config', fq_name='default-global-system-config') self.vrouter_config = Resource( 'global-vrouter-config', fq_name= 'default-global-system-config:default-global-vrouter-config', parent=global_config) self.vrouter_config.save()
def test_resource_save(self, mock_session): mock_session.configure_mock(base_url=BASE) mock_session.post_json.return_value = { 'foo': { 'uuid': '8240f9c7-0f28-4ca7-b92e-2f6441a0a6dd' } } r = Resource('foo', fq_name='domain:bar:foo') r['foo'] = 'bar' r.save() mock_session.post_json.assert_called_with( BASE + '/foos', {'foo': { 'foo': 'bar', 'fq_name': ['domain', 'bar', 'foo'] }}, cls=ResourceEncoder) mock_session.put_json.return_value = { 'foo': { 'uuid': '8240f9c7-0f28-4ca7-b92e-2f6441a0a6dd' } } r = Resource('foo', uuid='4c7dc905-3322-49c8-be5d-d4adb5571d41') r['foo'] = 'bar' r.save() mock_session.put_json.assert_called_with( BASE + '/foo/4c7dc905-3322-49c8-be5d-d4adb5571d41', { 'foo': { 'foo': 'bar', 'uuid': '4c7dc905-3322-49c8-be5d-d4adb5571d41' } }, cls=ResourceEncoder)
def test_ln(self, mock_session): Context().schema = create_schema_from_version('2.21') r1 = Resource('virtual-network', uuid='9174e7d3-865b-4faf-ab0f-c083e43fee6d') r2 = Resource('route-table', uuid='9174e7d3-865b-4faf-ab0f-c083e43fee6d') r3 = Resource('project', uuid='9174e7d3-865b-4faf-ab0f-c083e43fee6d') r5 = Resource('logical-router', uuid='9174e7d3-865b-4faf-ab0f-c083e43fee6d') self.mgr.get('ln')(resources=[r1.path, r2.path]) self.mgr.get('ln')(resources=[r1.path, r2.path], remove=True) self.mgr.get('ln')(resources=[r1.path, r5.path]) self.mgr.get('ln')(resources=[r1.path, r5.path], remove=True) with self.assertRaises(CommandError): self.mgr.get('ln')(resources=[r1.path, r3.path]) with self.assertRaises(CommandError): self.mgr.get('ln')(resources=['foo/9174e7d3-865b-4faf-ab0f-c083e43fee6d', r1.path]) Context().schema = DummySchema()
def test_resource_parent(self, mock_session): mock_session.configure_mock(base_url=self.BASE) p = Resource('bar', uuid='57ef609c-6c9b-4b91-a542-26c61420c37b') r = Resource('foo', fq_name='domain:foo', parent=p) self.assertEqual(p, r.parent) mock_session.id_to_fqname.side_effect = HttpError(http_status=404) with self.assertRaises(ResourceNotFound): p = Resource('foobar', uuid='1fe29f52-28dc-44a5-90d0-43de1b02cbd8') Resource('foo', fq_name='domain:foo', parent=p) with self.assertRaises(ResourceMissing): r = Resource('foo', fq_name='domain:foo') r.parent
def __call__(self, **kwargs): super(MigrateRT22132, self).__call__(**kwargs) config = Resource('global-system-config', fq_name='default-global-system-config', fetch=True) asn = config.autonomous_system for rt in self.resources: if not text_type(asn) == rt.fq_name[1]: printo('Found custom RT %s to migrate' % rt.fq_name) if self.check: continue for ri in rt.fetch().back_refs.routing_instance: mode = ri['attr']['import_export'] try: vn = ri.fetch().parent.fetch() except ResourceNotFound: printo("Can't find VN for RI %s" % ri) continue if mode is None: prop = 'route_target_list' else: prop = mode + '_route_target_list' if prop not in vn: vn[prop] = {'route_target': []} if text_type(rt.fq_name) in vn[prop]['route_target']: continue printo('Adding %s to VN (%s) %s' % (rt.fq_name, vn.fq_name, prop)) if not self.dry_run: vn[prop]['route_target'].append(text_type(rt.fq_name)) vn.save()
def test_schema_back_refs(self, mock_session): mock_session.get_json.side_effect = [ { "virtual-network": { "href": BASE + "/virtual-network/ec1afeaa-8930-43b0-a60a-939f23a50724", "uuid": "ec1afeaa-8930-43b0-a60a-939f23a50724", "attr": None, "fq_name": [ "virtual-network", "ec1afeaa-8930-43b0-a60a-939f23a50724" ], "instance_ip_back_refs": [ { "href": BASE + "/instance-ip/15315402-8a21-4116-aeaa-b6a77dceb191", "uuid": "15315402-8a21-4116-aeaa-b6a77dceb191", "to": [ "instance-ip", "15315402-8a21-4116-aeaa-b6a77dceb191" ] } ] } }, { 'instance-ip': [] } ] vn = Resource('virtual-network', uuid='ec1afeaa-8930-43b0-a60a-939f23a50724', fetch=True) self.assertEqual(len(vn.back_refs.instance_ip), 1) self.assertEqual(type(vn.back_refs.instance_ip), Collection) self.assertTrue(vn.back_refs.instance_ip.type, 'instance-ip') self.assertTrue(vn.back_refs.instance_ip.back_refs_uuid, vn.uuid) vn.back_refs.instance_ip.fetch() mock_session.get_json.assert_called_with(vn.back_refs.instance_ip.href, back_ref_id=vn.uuid)
def test_schema_refs(self, mock_session): mock_session.get_json.return_value = { "virtual-machine-interface": { "href": BASE + "/virtual-machine-interface/ec1afeaa-8930-43b0-a60a-939f23a50724", "uuid": "ec1afeaa-8930-43b0-a60a-939f23a50724", "attr": None, "fq_name": [ "virtual-machine-interface", "ec1afeaa-8930-43b0-a60a-939f23a50724" ], "bar_refs": [1, 2, 3], "virtual_machine_refs": [ { "href": BASE + "/virtual-machine/15315402-8a21-4116-aeaa-b6a77dceb191", "uuid": "15315402-8a21-4116-aeaa-b6a77dceb191", "to": [ "bar", "15315402-8a21-4116-aeaa-b6a77dceb191" ] } ] } } vmi = Resource('virtual-machine-interface', uuid='ec1afeaa-8930-43b0-a60a-939f23a50724', fetch=True) self.assertEqual(len(vmi.refs.virtual_machine), 1) self.assertTrue(type(vmi.refs.virtual_machine[0]) == Resource) self.assertEqual(len(vmi.refs.bar), 0) self.assertEqual([r.uuid for r in vmi.refs], ['15315402-8a21-4116-aeaa-b6a77dceb191'])
def _get_current_resource(self, uuid, values): try: r_type = json.loads(values['type']).replace('_', '-') return Resource(r_type, uuid=uuid) except KeyError: printo("[%s] incomplete, no type" % uuid) return False
def test_schema_children(self, mock_session): mock_session.get_json.side_effect = [ { "project": { "href": BASE + "/project/ec1afeaa-8930-43b0-a60a-939f23a50724", "uuid": "ec1afeaa-8930-43b0-a60a-939f23a50724", "attr": None, "fq_name": [ "project", "ec1afeaa-8930-43b0-a60a-939f23a50724" ], "virtual_networks": [ { "href": BASE + "/virtual-network/15315402-8a21-4116-aeaa-b6a77dceb191", "uuid": "15315402-8a21-4116-aeaa-b6a77dceb191", "to": [ "virtual-network", "15315402-8a21-4116-aeaa-b6a77dceb191" ] } ] } }, { 'virtual-network': [] } ] vmi = Resource('project', uuid='ec1afeaa-8930-43b0-a60a-939f23a50724', fetch=True) self.assertEqual(len(vmi.children.virtual_network), 1) self.assertEqual(type(vmi.children.virtual_network), Collection) self.assertTrue(vmi.children.virtual_network.type, 'virtual-network') self.assertTrue(vmi.children.virtual_network.parent_uuid, vmi.uuid) vmi.children.virtual_network.fetch() mock_session.get_json.assert_called_with(vmi.children.virtual_network.href, parent_id=vmi.uuid)
def test_ln(self, mock_session): r1 = Resource('virtual-network', uuid='9174e7d3-865b-4faf-ab0f-c083e43fee6d') r2 = Resource('route-table', uuid='9174e7d3-865b-4faf-ab0f-c083e43fee6d') r3 = Resource('project', uuid='9174e7d3-865b-4faf-ab0f-c083e43fee6d') r4 = Resource('foo', uuid='9174e7d3-865b-4faf-ab0f-c083e43fee6d') r5 = Resource('logical-router', uuid='9174e7d3-865b-4faf-ab0f-c083e43fee6d') self.mgr.get('ln')(resources=[r1.path, r2.path], schema_version='2.21') self.mgr.get('ln')(resources=[r1.path, r2.path], schema_version='2.21', remove=True) self.mgr.get('ln')(resources=[r1.path, r5.path], schema_version='2.21') self.mgr.get('ln')(resources=[r1.path, r5.path], schema_version='2.21', remove=True) with self.assertRaises(CommandError): self.mgr.get('ln')(resources=[r1.path, r3.path], schema_version='2.21') with self.assertRaises(CommandError): self.mgr.get('ln')(resources=[r4.path, r1.path], schema_version='2.21') with self.assertRaises(CommandError): self.mgr.get('ln')(resources=[r1.path, r2.path], schema_version='xxxx')
def _migrate_vm(self, old_vm, old_vm_index, si): new_fq_name = '%s__%s__%s' % (str(si.parent.fq_name).replace( ':', '__'), si.fq_name[-1], old_vm_index) new_vm = Resource('virtual-machine', fq_name=[new_fq_name], display_name=new_fq_name + '__network-namespace', name=new_fq_name) try: self._create_res(new_vm) except Conflict: return old_vm for vr in old_vm.get('virtual_router_back_refs', []): self._remove_back_ref(old_vm, vr) self._add_back_ref(new_vm, vr) for old_vmi in old_vm.get('virtual_machine_interface_back_refs', []): old_vmi.fetch() self._remove_back_ref(old_vm, old_vmi) new_vmi = self._migrate_vmi(old_vmi, new_vm, si) self._add_back_ref(new_vm, new_vmi) self._delete_res(old_vm) return new_vm
def __call__(self): try: vrouter_config = Resource( 'global-vrouter-config', fq_name= 'default-global-system-config:default-global-vrouter-config', fetch=True) if 'linklocal_services' in vrouter_config: return json.dumps([{ 'service_name': service['linklocal_service_name'], 'service_ip': service['linklocal_service_ip'], 'service_port': service['linklocal_service_port'], 'fabric_dns_service_name': service.get('ip_fabric_DNS_service_name'), 'fabric_service_ip': service['ip_fabric_service_ip'], 'fabric_service_port': service['ip_fabric_service_port'] } for service in vrouter_config['linklocal_services'].get( 'linklocal_service_entry', [])], indent=2) except ResourceNotFound: pass return json.dumps([])
def __call__(self, project_fqname=None, virtual_network_name=None): vn_fqname = '%s:%s' % (project_fqname, virtual_network_name) vn = Resource('virtual-network', fq_name=vn_fqname, fetch=True) if vn.get('router_external', False): try: fip_pool = Resource('floating-ip-pool', fq_name='%s:%s' % (vn_fqname, 'floating-ip-pool'), check=True) fip_pool.delete() except ResourceNotFound: pass vn.delete()
def _check_ref(self, ref, uuid): _, ref_type, ref_uuid = ref.split(':') try: Resource(ref_type.replace('_', '-'), uuid=ref_uuid, check=True) return False except ResourceNotFound: printo("[%s] broken ref to missing %s" % (uuid, ref)) return True
def test_resource_ref_update(self, mock_session): mock_session.configure_mock(base_url=BASE) mock_session.make_url = ContrailAPISession.make_url.__get__(mock_session) mock_session.add_ref = ContrailAPISession.add_ref.__get__(mock_session) mock_session.remove_ref = ContrailAPISession.remove_ref.__get__(mock_session) mock_session._ref_update = ContrailAPISession._ref_update.__get__(mock_session) r1 = Resource('foo', uuid='2caf30aa-d197-40be-82dc-3bac4ca91adb', fq_name='domain:foo') r2 = Resource('bar', uuid='5d085b74-2dcc-4180-8284-10a56f9ed318', fq_name='domain:bar') mock_session.get_json.return_value = { 'foo': { 'uuid': '2caf30aa-d197-40be-82dc-3bac4ca91adb', 'fq_name': ['domain', 'foo'], 'bar_refs': [ { 'attr': { 'prop': 'value' }, 'to': ['domain', 'bar'], 'uuid': '5d085b74-2dcc-4180-8284-10a56f9ed318' } ] } } r1.add_ref(r2, attr={'prop': 'value'}) data = { 'type': r1.type, 'uuid': r1.uuid, 'ref-type': r2.type, 'ref-fq-name': list(r2.fq_name), 'ref-uuid': r2.uuid, 'operation': 'ADD', 'attr': { 'prop': 'value' } } mock_session.post_json.assert_called_with(BASE + '/ref-update', data) self.assertTrue(r1['bar_refs'][0].uuid, r2.uuid) mock_session.get_json.return_value = { 'foo': { 'uuid': '2caf30aa-d197-40be-82dc-3bac4ca91adb', 'fq_name': ['domain', 'foo'] } } r1.remove_ref(r2) data = { 'type': r1.type, 'uuid': r1.uuid, 'ref-type': r2.type, 'ref-fq-name': list(r2.fq_name), 'ref-uuid': r2.uuid, 'operation': 'DELETE', 'attr': None } mock_session.post_json.assert_called_with(BASE + '/ref-update', data) self.assertTrue('bar_refs' not in r1)
def test_add_same_resource(self, mock_session): mock_document = Document(text='cat bar') comp = ShellCompleter() r1 = Resource('bar', uuid='4c6d3711-61f1-4505-b8df-189d32b52872') r2 = Resource('bar', uuid='4c6d3711-61f1-4505-b8df-189d32b52872') completions = comp.get_completions(mock_document, None) self.assertEqual(len(list(completions)), 1) r1.delete() completions = comp.get_completions(mock_document, None) self.assertEqual(len(list(completions)), 0) r2.delete()
def test_resource_check(self, mock_session): mock_session.configure_mock(base_url=BASE) mock_session.id_to_fqname.side_effect = HttpError() r = Resource('bar', uuid='57ef609c-6c9b-4b91-a542-26c61420c37b') self.assertFalse(r.exists) mock_session.id_to_fqname.side_effect = [FQName('domain:bar')] r = Resource('bar', uuid='57ef609c-6c9b-4b91-a542-26c61420c37b') self.assertTrue(r.exists) mock_session.fqname_to_id.side_effect = HttpError() r = Resource('bar', fq_name='domain:foo') self.assertFalse(r.exists) mock_session.fqname_to_id.side_effect = [ '588e1a17-ae50-4b67-8078-95f061d833ca' ] self.assertTrue(r.exists)
def test_resource_save(self, mock_session): mock_session.configure_mock(base_url=BASE) mock_session.fqname_to_id.return_value = '8240f9c7-0f28-4ca7-b92e-2f6441a0a6dd' mock_session.get_json.side_effect = [ { 'foo': { 'uuid': '8240f9c7-0f28-4ca7-b92e-2f6441a0a6dd', 'attr': 'bar', 'fq_name': ['domain', 'bar', 'foo'] } }, { 'foo': { 'uuid': '8240f9c7-0f28-4ca7-b92e-2f6441a0a6dd', 'attr': 'foo', 'fq_name': ['domain', 'bar', 'foo'] } } ] r1 = Resource('foo', fq_name='domain:bar:foo') r1['attr'] = 'bar' r1.save() mock_session.post_json.assert_called_with(BASE + '/foos', {'foo': { 'attr': 'bar', 'fq_name': ['domain', 'bar', 'foo'] }}, cls=ResourceEncoder) self.assertEqual(r1['attr'], 'bar') r1['attr'] = 'foo' r1.save() mock_session.put_json.assert_called_with(BASE + '/foo/8240f9c7-0f28-4ca7-b92e-2f6441a0a6dd', {'foo': { 'attr': 'foo', 'fq_name': ['domain', 'bar', 'foo'], 'uuid': '8240f9c7-0f28-4ca7-b92e-2f6441a0a6dd' }}, cls=ResourceEncoder) self.assertEqual(r1['attr'], 'foo')
def test_resource_save(self, mock_session): mock_session.configure_mock(base_url=BASE) mock_session.post_json.return_value = { 'foo': { 'uuid': '8240f9c7-0f28-4ca7-b92e-2f6441a0a6dd' } } r = Resource('foo', fq_name='domain:bar:foo') r['foo'] = 'bar' r.save() mock_session.post_json.assert_called_with(BASE + '/foos', {'foo': {'foo': 'bar', 'fq_name': ['domain', 'bar', 'foo']}}, cls=ResourceEncoder) mock_session.put_json.return_value = { 'foo': { 'uuid': '8240f9c7-0f28-4ca7-b92e-2f6441a0a6dd' } } r = Resource('foo', uuid='4c7dc905-3322-49c8-be5d-d4adb5571d41') r['foo'] = 'bar' r.save() mock_session.put_json.assert_called_with(BASE + '/foo/4c7dc905-3322-49c8-be5d-d4adb5571d41', {'foo': { 'foo': 'bar', 'uuid': '4c7dc905-3322-49c8-be5d-d4adb5571d41' }}, cls=ResourceEncoder)
def test_add_same_resource(self, mock_session): ShellContext.current_path = Path('/') mock_document = mock.Mock() mock_document.get_word_before_cursor.return_value = 'bar' comp = ResourceCompleter() r1 = Resource('bar', uuid='4c6d3711-61f1-4505-b8df-189d32b52872') r2 = Resource('bar', uuid='4c6d3711-61f1-4505-b8df-189d32b52872') completions = comp.get_completions(mock_document, None) self.assertEqual(len(list(completions)), 1) r1.delete() completions = comp.get_completions(mock_document, None) self.assertEqual(len(list(completions)), 0) r2.delete()
def test_add_del_resource(self, mock_session): mock_document = Document(text='cat bar') comp = ShellCompleter() r1 = Resource('foo', uuid='d8eb36b4-9c57-49c5-9eac-95bedc90eb9a') r2 = Resource('bar', uuid='4c6d3711-61f1-4505-b8df-189d32b52872') completions = comp.get_completions(mock_document, None) self.assertTrue(str(r2.path.relative_to(Context().shell.current_path)) in [c.text for c in completions]) r1.delete() r2.delete() completions = comp.get_completions(mock_document, None) self.assertTrue(str(r2.path.relative_to(Context().shell.current_path)) not in [c.text for c in completions])
def test_fq_name_completion(self, mock_session): mock_document = Document(text='cat bar/default-dom') comp = ShellCompleter() r1 = Resource('bar', fq_name='default-domain:project:resource') r2 = Resource('bar', fq_name='foo:foo:foo') completions = list(comp.get_completions(mock_document, None)) self.assertEqual(len(completions), 1) self.assertTrue(str(r1.path.relative_to(Context().shell.current_path)) in [c.text for c in completions]) r1.delete() r2.delete() completions = comp.get_completions(mock_document, None) self.assertEqual(len(list(completions)), 0)
def test_add_del_resource(self, mock_session): ShellContext.current_path = Path('/') mock_document = mock.Mock() mock_document.get_word_before_cursor.return_value = 'bar' comp = ResourceCompleter() r1 = Resource('foo', uuid='d8eb36b4-9c57-49c5-9eac-95bedc90eb9a') r2 = Resource('bar', uuid='4c6d3711-61f1-4505-b8df-189d32b52872') completions = comp.get_completions(mock_document, None) self.assertTrue(str(r2.path.relative_to(ShellContext.current_path)) in [c.text for c in completions]) r1.delete() r2.delete() completions = comp.get_completions(mock_document, None) self.assertTrue(str(r2.path.relative_to(ShellContext.current_path)) not in [c.text for c in completions])
def test_fq_name_completion(self, mock_session): ShellContext.current_path = Path('/') mock_document = mock.Mock() mock_document.get_word_before_cursor.return_value = 'default-dom' comp = ResourceCompleter() r1 = Resource('bar', fq_name='default-domain:project:resource') r2 = Resource('foo', fq_name='foo:foo:foo') completions = list(comp.get_completions(mock_document, None)) self.assertEqual(len(completions), 1) self.assertTrue(str(r1.path.relative_to(ShellContext.current_path)) in [c.text for c in completions]) r1.delete() r2.delete() completions = comp.get_completions(mock_document, None) self.assertEqual(len(list(completions)), 0)