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)
Exemplo n.º 2
0
    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')
Exemplo n.º 5
0
    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')
Exemplo n.º 6
0
    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)
Exemplo n.º 7
0
    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)
Exemplo n.º 9
0
 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)
Exemplo n.º 10
0
    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)
Exemplo n.º 11
0
    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)
Exemplo n.º 12
0
 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)
Exemplo n.º 13
0
 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')
Exemplo n.º 14
0
 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)
Exemplo n.º 15
0
 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)
Exemplo n.º 16
0
 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')
Exemplo n.º 17
0
    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)
Exemplo n.º 18
0
    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))
Exemplo n.º 19
0
    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
Exemplo n.º 20
0
 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)
Exemplo n.º 21
0
 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)
Exemplo n.º 22
0
 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)
Exemplo n.º 23
0
 def test_collection_contrail_name(self, mock_session):
     c = Collection('')
     self.assertEqual(c._contrail_name, '')
     c = Collection('foo')
     self.assertEqual(c._contrail_name, 'foos')
Exemplo n.º 24
0
 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')
Exemplo n.º 25
0
    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()
Exemplo n.º 26
0
 def __call__(self):
     self.kclient = kclient.Client(session=Context().session)
     parallel_map(self._check,
                  Collection('project', fetch=True),
                  workers=50)