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)
Пример #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_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")
Пример #4
0
    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')
Пример #6
0
    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()
Пример #7
0
    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")
Пример #9
0
    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()
Пример #11
0
    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()
Пример #12
0
    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()
Пример #13
0
 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([])
Пример #14
0
    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()
Пример #15
0
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()
Пример #16
0
    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)
Пример #17
0
 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()
Пример #18
0
    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
Пример #19
0
    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'])
Пример #22
0
 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)
Пример #24
0
 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')
Пример #25
0
    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
Пример #26
0
 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([])
Пример #27
0
 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()
Пример #28
0
 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
Пример #29
0
    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()
Пример #31
0
    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)
Пример #32
0
    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')
Пример #33
0
    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)
Пример #34
0
    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()
Пример #35
0
 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()
Пример #36
0
    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])
Пример #37
0
    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)
Пример #38
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])
Пример #39
0
    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)