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_collection_parent_uuid(self, mock_session): mock_session.configure_mock(base_url=self.BASE) c = Collection('foo', parent_uuid='aa') self.assertEqual(c.parent_uuid, []) c = Collection('foo', parent_uuid='0d7d4197-891b-4767-b599-54667370cab1') self.assertEqual(c.parent_uuid, ['0d7d4197-891b-4767-b599-54667370cab1']) c = Collection('foo', parent_uuid=[ '0d7d4197-891b-4767-b599-54667370cab1', '3a0e179e-fbe6-4390-8e5d-00a630de0b68' ]) self.assertEqual(c.parent_uuid, [ '0d7d4197-891b-4767-b599-54667370cab1', '3a0e179e-fbe6-4390-8e5d-00a630de0b68' ]) c.fetch() expected_parent_id = '0d7d4197-891b-4767-b599-54667370cab1,3a0e179e-fbe6-4390-8e5d-00a630de0b68' mock_session.get_json.assert_called_with(self.BASE + '/foos', parent_id=expected_parent_id) c.fetch(parent_uuid='a9420bd1-59dc-4576-a548-b28cedbf3e5c') expected_parent_id = '0d7d4197-891b-4767-b599-54667370cab1,3a0e179e-fbe6-4390-8e5d-00a630de0b68,a9420bd1-59dc-4576-a548-b28cedbf3e5c' mock_session.get_json.assert_called_with(self.BASE + '/foos', parent_id=expected_parent_id)
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, paths=None, **kwargs): super(MigrateSI110221, self).__call__(**kwargs) if not paths: resources = Collection('service-instance', fetch=True) else: resources = expand_paths( paths, predicate=lambda r: r.type == 'service-instance') for si in resources: si.fetch() try: si['service_template_refs'][0] except (KeyError, IndexError): printo('SI %s has no template, skipping.' % si.uuid) continue vms = si.get('virtual_machine_back_refs', []) if not vms: printo('SI %s has no VM, skipping.' % si.uuid) if all([si.fq_name[-1] in str(vm.fq_name) for vm in vms]): continue printo('Found lbaas SI to migrate %s (%s)' % (si.path, si.fq_name)) if not self.check: self._migrate_si(si) printo('Done')
def test_root_collection(self, mock_session): mock_session.configure_mock(base_url=BASE) mock_session.get_json.return_value = { "href": BASE, "links": [{ "link": { "href": BASE + "/instance-ips", "path": Path("/instance-ips"), "name": "instance-ip", "rel": "collection" } }, { "link": { "href": BASE + "/instance-ip", "path": Path("/instance-ip"), "name": "instance-ip", "rel": "resource-base" } }] } root_collection = RootCollection(fetch=True) self.assertFalse(root_collection.href.endswith('s')) expected_root_resources = RootCollection(path=Path("/")) expected_root_resources.data = [ Collection("instance-ip", href=BASE + "/instance-ips", path=Path("/instance-ip"), name="instance-ip", rel="collection") ] self.assertEqual(root_collection, expected_root_resources)
def __call__(self, filename): self.graph = nx.DiGraph() cols = [ Collection(r, fetch=True, detail=True) for r in [ "virtual-machine-interface", "virtual-network", "instance-ip", "loadbalancer-pool", "virtual-ip", "instance-ip", "logical-router", "floating-ip", "service-template", "service-instance" ] ] def add_node(g, r): self.graph.add_node(r.uuid, type=r.type, fq_name=":".join(r.fq_name), name=r.fq_name[-1]) for e in chain(*cols): add_node(self.graph, e) for r in e.refs: add_node(self.graph, r) self.graph.add_edge(e.uuid, r.uuid) self._to_graphml(filename)
def __call__(self): sass = Collection('service-appliance-set', fetch=True, recursive=2) return json.dumps([{ 'appliance_set_name': sas.fq_name[-1], 'driver': sas['service_appliance_driver'] } for sas in sass if 'service_appliance_driver' in sas], indent=2)
def __call__(self, paths=None, **kwargs): if not paths: self.resources = Collection(self.resource_type, fetch=True) else: self.resources = expand_paths( paths, predicate=lambda r: r.type == self.resource_type) super(PathCommand, self).__call__(**kwargs)
def test_root_collection(self, mock_session): mock_session.configure_mock(base_url=self.BASE) mock_session.get_json.return_value = { "href": self.BASE, "links": [{ "link": { "href": self.BASE + "/instance-ips", "name": "instance-ip", "rel": "collection" } }, { "link": { "href": self.BASE + "/instance-ip", "name": "instance-ip", "rel": "resource-base" } }] } root_collection = RootCollection(fetch=True) self.assertFalse(root_collection.href.endswith('s')) expected_root_resources = RootCollection( data=[Collection('instance-ip')]) self.assertEqual(root_collection, expected_root_resources)
def test_collection_count(self, mock_session): mock_session.configure_mock(base_url=self.BASE) mock_session.get_json.return_value = {"foos": {"count": 2}} c = Collection('foo') self.assertEqual(len(c), 2) expected_calls = [ mock.call(self.BASE + '/foos', count=True), ] self.assertEqual(mock_session.get_json.mock_calls, expected_calls) 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" }] } c.fetch() self.assertEqual(len(c), 2) expected_calls.append(mock.call(self.BASE + '/foos')) self.assertEqual(mock_session.get_json.mock_calls, expected_calls)
def __call__(self): configs = Collection('config-node', fetch=True, recursive=2) return json.dumps([{ 'config_name': config.fq_name[-1], 'config_ip': config['config_node_ip_address'] } for config in configs], indent=2)
def test_collection_fields(self, mock_session): mock_session.configure_mock(base_url=BASE) c = Collection('foo', fields=['foo', 'bar'], fetch=True) mock_session.get_json.assert_called_with(BASE + '/foos', fields='foo,bar') c.fetch(fields=['baz']) mock_session.get_json.assert_called_with(BASE + '/foos', fields='foo,bar,baz') c.fetch() mock_session.get_json.assert_called_with(BASE + '/foos', fields='foo,bar')
def __call__(self): analytics = Collection('analytics-node', fetch=True, recursive=2) return json.dumps( [{ 'analytics_name': analytic.fq_name[-1], 'analytics_ip': analytic['analytics_node_ip_address'] } for analytic in analytics], indent=2)
def __call__(self): vrouters = Collection('virtual-router', fetch=True, recursive=2) return json.dumps( [{ 'vrouter_name': vrouter.fq_name[-1], 'vrouter_ip': vrouter['virtual_router_ip_address'], 'vrouter_type': vrouter.get('virtual_router_type', []) } for vrouter in vrouters], indent=2)
def test_collection_filters(self, mock_session): mock_session.configure_mock(base_url=BASE) c = Collection('foo', filters=[('foo', 'bar')], fetch=True) mock_session.get_json.assert_called_with(BASE + '/foos', filters='foo=="bar"') c.fetch(filters=[('bar', False)]) mock_session.get_json.assert_called_with(BASE + '/foos', filters='foo=="bar",bar==false') c.fetch() mock_session.get_json.assert_called_with(BASE + '/foos', filters='foo=="bar"') c.filter('bar', 42) c.fetch() mock_session.get_json.assert_called_with(BASE + '/foos', filters='foo=="bar",bar==42')
def __call__(self, project_fqname=None): project = Resource('project', fq_name=project_fqname, check=True) vns = Collection('virtual-network', parent_uuid=project.uuid, fetch=True, recursive=2) return json.dumps([{ "virtual_network_name": vn.fq_name[-1], "project_fqname": str(FQName(vn.fq_name[0:-1])), "shared": vn.get('is_shared', False), "external": vn.get('router_external', False), } for vn in vns], indent=2)
def __call__(self, force=False, parent_type=None, cassandra_servers=None): valid_acl = [] parents = Collection(parent_type, fetch=True, recursive=2) for parent in parents: if 'access_control_lists' in parent.keys(): valid_acl += [ acl['uuid'] for acl in parent['access_control_lists'] ] valid_acl = list(set(valid_acl)) orphaned_acls = set([]) # Due to a bug in contrail API, we cannot list more than 10000 elements # on a resource and there is no way to list ACL by tenant. # So that ugly hack directly fetch all ACL UUIDs from the cassandra database :( pool = ConnectionPool('config_db_uuid', server_list=cassandra_servers) fqname_cf = ColumnFamily(pool, 'obj_fq_name_table') for key, value in fqname_cf.xget('access_control_list'): acl_uuid = decode_string(key).split(':')[-1] if acl_uuid in valid_acl: continue acl = Resource('access-control-list', uuid=acl_uuid, fetch=True) if ('parent_uuid' in acl.keys() and 'parent_type' in acl.keys() and acl['parent_type'] == parent_type and acl.uuid not in valid_acl): try: parent_acl = acl.parent except ResourceNotFound: msg = ("The %s parent ACL %s was not found." % (parent_type.replace('-', ' '), acl['parent_uuid'])) if force: msg = msg + " Delete orphan ACL %s." % acl.uuid acl.delete() logger.debug(msg) orphaned_acls.add(acl['uuid']) else: logger.debug( "The ACL %(acl)s have a %(parent_type)s %(parent_acl)s which exists but \ was not found in the precedent %(parent_type)s list. Not delete it." % { 'acl': acl, 'parent_type': parent_type.replace('-', ' '), 'parent_acl': parent_acl }) if force: logger.debug("%d orphaned ACL were deleted" % len(orphaned_acls)) else: logger.debug("Found %d orphaned ACL to delete" % len(orphaned_acls))
def generate(self, vn_paths): result = [] if vn_paths == []: vns = Collection("virtual-network", fetch=True, detail=True) else: vns = expand_paths(vn_paths) for vn in vns: vn.fetch() for r in vns: nid = r["virtual_network_network_id"] try: zk_data, _ = self.zk_client.get(ZK_BASEPATH + "/" + to_zk_index(nid)) except kazoo.exceptions.NoNodeError: result.append({"reason": "nolock", "nid": nid, "path": r.path, "api-fqname": text_type(r.fq_name), "resource": r}) continue if "%s" % zk_data.decode('utf-8') != "%s" % r.fq_name: result.append({"reason": "badlock", "nid": nid, "path": r.path, "api-fqname": text_type(r.fq_name), "zk-fqname": zk_data, "resource": r}) return result
def __call__(self): routers = Collection('bgp-router', fetch=True, recursive=2) return json.dumps([{ 'router_name': router.fq_name[-1], 'router_ip': router['bgp_router_parameters']['address'], 'router_port': router['bgp_router_parameters']['port'], 'router_asn': router['bgp_router_parameters']['autonomous_system'], 'router_type': router['bgp_router_parameters']['vendor'], 'router_address_families': router['bgp_router_parameters']['address_families']['family'], 'router_md5': router['bgp_router_parameters']['auth_data']['key_items'][0]['key'] if 'auth_data' in router['bgp_router_parameters'] and router['bgp_router_parameters']['auth_data'] else [] } for router in routers], indent=2)
def test_rm_recursive(self, mock_continue_prompt, mock_session): Context().shell.current_path = Path('/') Collection('bar') Collection('foobar') t = ['foo/6b6a7f47-807e-4c39-8ac6-3adcf2f5498f'] mock_continue_prompt.return_value = True mock_session.configure_mock(base_url=self.BASE) mock_session.get_json.side_effect = [{ 'foo': { 'href': self.BASE + '/foo/6b6a7f47-807e-4c39-8ac6-3adcf2f5498f', 'uuid': '6b6a7f47-807e-4c39-8ac6-3adcf2f5498f', 'bar_back_refs': [{ 'href': self.BASE + '/bar/22916187-5b6f-40f1-b7b6-fc6fe9f23bce', 'uuid': '22916187-5b6f-40f1-b7b6-fc6fe9f23bce', 'to': ['bar', '22916187-5b6f-40f1-b7b6-fc6fe9f23bce'] }, { 'href': self.BASE + '/bar/776bdf88-6283-4c4b-9392-93a857807307', 'uuid': '776bdf88-6283-4c4b-9392-93a857807307', 'to': ['bar', '776bdf88-6283-4c4b-9392-93a857807307'] }] } }, { 'bar': { 'href': self.BASE + '/bar/22916187-5b6f-40f1-b7b6-fc6fe9f23bce', 'uuid': '22916187-5b6f-40f1-b7b6-fc6fe9f23bce', 'foobar_back_refs': [{ 'href': self.BASE + '/foobar/1050223f-a230-4ed6-96f1-c332700c5e01', 'to': ['foobar', '1050223f-a230-4ed6-96f1-c332700c5e01'], 'uuid': '1050223f-a230-4ed6-96f1-c332700c5e01' }] } }, { 'foobar': { 'href': self.BASE + '/foobar/1050223f-a230-4ed6-96f1-c332700c5e01', 'uuid': '1050223f-a230-4ed6-96f1-c332700c5e01' } }, { 'bar': { 'href': self.BASE + '/bar/776bdf88-6283-4c4b-9392-93a857807307', 'uuid': '776bdf88-6283-4c4b-9392-93a857807307' } }] mock_session.delete.return_value = True self.mgr.get('rm')(paths=t, recursive=True) expected_calls = [ mock.call.delete(self.BASE + '/bar/776bdf88-6283-4c4b-9392-93a857807307'), mock.call.delete(self.BASE + '/foobar/1050223f-a230-4ed6-96f1-c332700c5e01'), mock.call.delete(self.BASE + '/bar/22916187-5b6f-40f1-b7b6-fc6fe9f23bce'), mock.call.delete(self.BASE + '/foo/6b6a7f47-807e-4c39-8ac6-3adcf2f5498f') ] mock_session.delete.assert_has_calls(expected_calls)
def test_collection_not_found(self, mock_session): mock_session.get_json.side_effect = HttpError(http_status=404) with self.assertRaises(CollectionNotFound): Collection('foo', fetch=True)
def test_collection_contrail_name(self, mock_session): c = Collection('') self.assertEqual(c._contrail_name, '') c = Collection('foo') self.assertEqual(c._contrail_name, 'foos')
def test_collection_with_defined_session(self): mock_session = mock.MagicMock(base_url=self.BASE) Collection('foo', session=mock_session, fetch=True) mock_session.get_json.assert_called_with(self.BASE + '/foos')
def __call__(self, router_name=None, router_ip=None, router_port=None, router_asn=None, router_address_families=[], router_type=None, router_md5=None): default_ri = Resource('routing-instance', fq_name=DEFAULT_RI_FQ_NAME, check=True) router_fq_name = DEFAULT_RI_FQ_NAME + [router_name] bgp_router = Resource('bgp-router', fq_name=router_fq_name) if bgp_router.exists: raise CommandError("The BGP router %s already exists" % FQName(router_fq_name)) if router_type != 'contrail' and 'erm-vpn' in router_address_families: router_address_families.remove('erm-vpn') auth_data = None if router_md5: auth_data = { 'key_items': [{ 'key': router_md5, 'key_id': 0, }], 'key_type': 'md5', } router_parameters = { 'address': router_ip, 'address_families': { 'family': router_address_families, }, 'autonomous_system': router_asn, 'identifier': router_ip, 'port': router_port, 'vendor': router_type, 'auth_data': auth_data, } # full-mesh with existing BGP routers bgp_router_refs = [] for bgp_router_neighbor in Collection('bgp-router', parent_uuid=default_ri.uuid, fetch=True): bgp_router_refs.append({ 'to': bgp_router_neighbor.fq_name, 'attr': { 'session': [{ 'attributes': [{ 'address_families': { 'family': router_address_families, }, 'auth_data': auth_data, }], }], }, }) bgp_router = Resource('bgp-router', fq_name=router_fq_name, parent=default_ri, bgp_router_parameters=router_parameters, bgp_router_refs=bgp_router_refs) bgp_router.save()
def __call__(self): self.kclient = kclient.Client(session=Context().session) parallel_map(self._check, Collection('project', fetch=True), workers=50)