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 __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)
Beispiel #4
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)
Beispiel #5
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)
Beispiel #6
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))
Beispiel #7
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
 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 __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 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')