示例#1
0
    def setUp(self):
        self.fc = fake.FakeClient(STUBS_PATH)
        self.mock_nsxapi = mock.patch(NSXAPI_NAME, autospec=True)
        instance = self.mock_nsxapi.start()
        instance.return_value.login.return_value = "the_cookie"
        # Choose 3.0, but the version is irrelevant for the aim of
        # these tests as calls are throwing up errors anyway
        fake_version = getattr(self, 'fake_version', "3.0")
        instance.return_value.get_nvp_version.return_value = (
            api_client.NVPVersion(fake_version))

        def _faulty_request(*args, **kwargs):
            raise api_client.NvpApiException

        instance.return_value.request.side_effect = _faulty_request
        self.fake_cluster = cluster.NSXCluster(name='fake-cluster',
                                               nsx_controllers=['1.1.1.1:999'],
                                               default_tz_uuid=_uuid(),
                                               nsx_user='******',
                                               nsx_password='******')
        self.fake_cluster.api_client = api_client.NVPApiHelper(
            ('1.1.1.1', '999', True), self.fake_cluster.nsx_user,
            self.fake_cluster.nsx_password, self.fake_cluster.req_timeout,
            self.fake_cluster.http_timeout, self.fake_cluster.retries,
            self.fake_cluster.redirects)

        super(NsxlibNegativeBaseTestCase, self).setUp()
        self.addCleanup(self.fc.reset_all)
        self.addCleanup(self.mock_nsxapi.stop)
示例#2
0
    def setUp(self):
        # mock nvp api client
        self.fc = fake_nvpapiclient.FakeClient(STUBS_PATH)
        mock_nvpapi = mock.patch(NVPAPI_NAME, autospec=True)
        # Avoid runs of the synchronizer looping call
        # These unit tests will excplicitly invoke synchronization
        patch_sync = mock.patch.object(sync, '_start_loopingcall')
        self.mock_nvpapi = mock_nvpapi.start()
        patch_sync.start()
        self.mock_nvpapi.return_value.login.return_value = "the_cookie"
        # Emulate tests against NVP 3.x
        self.mock_nvpapi.return_value.get_nvp_version.return_value = (
            NvpApiClient.NVPVersion("3.1"))

        def _fake_request(*args, **kwargs):
            return self.fc.fake_request(*args, **kwargs)

        self.mock_nvpapi.return_value.request.side_effect = _fake_request
        self.fake_cluster = nsx_cluster.NSXCluster(
            name='fake-cluster',
            nsx_controllers=['1.1.1.1:999'],
            default_tz_uuid=_uuid(),
            nsx_user='******',
            nsx_password='******')
        self.fake_cluster.api_client = NvpApiClient.NVPApiHelper(
            ('1.1.1.1', '999', True), self.fake_cluster.nsx_user,
            self.fake_cluster.nsx_password, self.fake_cluster.req_timeout,
            self.fake_cluster.http_timeout, self.fake_cluster.retries,
            self.fake_cluster.redirects)
        # Instantiate Neutron plugin
        # and setup needed config variables
        args = [
            '--config-file',
            get_fake_conf('neutron.conf.test'), '--config-file',
            get_fake_conf('nsx.ini.test')
        ]
        config.parse(args=args)
        cfg.CONF.set_override('allow_overlapping_ips', True)
        self._plugin = NeutronPlugin.NvpPluginV2()
        # Mock neutron manager plugin load functions to speed up tests
        mock_nm_get_plugin = mock.patch('neutron.manager.NeutronManager.'
                                        'get_plugin')
        mock_nm_get_service_plugins = mock.patch(
            'neutron.manager.NeutronManager.get_service_plugins')
        self.mock_nm_get_plugin = mock_nm_get_plugin.start()
        self.mock_nm_get_plugin.return_value = self._plugin
        mock_nm_get_service_plugins.start()
        super(NvpSyncTestCase, self).setUp()
        self.addCleanup(self.fc.reset_all)
        self.addCleanup(patch_sync.stop)
        self.addCleanup(mock_nvpapi.stop)
        self.addCleanup(mock_nm_get_plugin.stop)
        self.addCleanup(mock_nm_get_service_plugins.stop)
示例#3
0
 def _prepare_nat_rules_for_delete_tests(self):
     lrouter = routerlib.create_lrouter(self.fake_cluster,
                                        uuidutils.generate_uuid(), 'pippo',
                                        'fake-lrouter', '10.0.0.1')
     # v2 or v3 makes no difference for this test
     with mock.patch.object(self.fake_cluster.api_client,
                            'get_nvp_version',
                            new=lambda: NvpApiClient.NVPVersion('2.0')):
         routerlib.create_lrouter_snat_rule(
             self.fake_cluster,
             lrouter['uuid'],
             '10.0.0.2',
             '10.0.0.2',
             order=220,
             match_criteria={'source_ip_addresses': '192.168.0.0/24'})
         routerlib.create_lrouter_snat_rule(
             self.fake_cluster,
             lrouter['uuid'],
             '10.0.0.3',
             '10.0.0.3',
             order=200,
             match_criteria={'source_ip_addresses': '192.168.0.2/32'})
         routerlib.create_lrouter_dnat_rule(
             self.fake_cluster,
             lrouter['uuid'],
             '192.168.0.2',
             order=200,
             match_criteria={'destination_ip_addresses': '10.0.0.3'})
     return lrouter
示例#4
0
    def _show(self, resource_type, response_file,
              uuid1, uuid2=None, relations=None):
        target_uuid = uuid2 or uuid1
        if resource_type.endswith('attachment'):
            resource_type = resource_type[:resource_type.index('attachment')]
        with open("%s/%s" % (self.fake_files_path, response_file)) as f:
            response_template = f.read()
            res_dict = getattr(self, '_fake_%s_dict' % resource_type)
            for item in res_dict.itervalues():
                if 'tags' in item:
                    item['tags_json'] = json.dumps(item['tags'])

                # replace sec prof rules with their json dump
                def jsonify_rules(rule_key):
                    if rule_key in item:
                        rules_json = json.dumps(item[rule_key])
                        item['%s_json' % rule_key] = rules_json
                jsonify_rules('logical_port_egress_rules')
                jsonify_rules('logical_port_ingress_rules')

            items = [json.loads(response_template % res_dict[res_uuid])
                     for res_uuid in res_dict if res_uuid == target_uuid]
            if items:
                return json.dumps(items[0])
            raise NvpApiClient.ResourceNotFound()
示例#5
0
    def _test_version_dependent_update_lrouter(self, version):
        def foo(*args, **kwargs):
            return version

        foo_func_dict = {
            'update_lrouter': {
                2: {
                    -1: foo
                },
                3: {
                    -1: foo,
                    2: foo
                }
            }
        }

        with mock.patch.object(self.fake_cluster.api_client,
                               'get_nvp_version',
                               return_value=NvpApiClient.NVPVersion(version)):
            with mock.patch.dict(routerlib.ROUTER_FUNC_DICT,
                                 foo_func_dict,
                                 clear=True):
                return routerlib.update_lrouter(
                    self.fake_cluster,
                    'foo_router_id',
                    'foo_router_name',
                    'foo_nexthop',
                    routes={'foo_destination': 'foo_address'})
示例#6
0
 def handle_get(self, url):
     #TODO(salvatore-orlando): handle field selection
     parsedurl = urlparse.urlparse(url)
     (res_type, uuids) = self._get_resource_type(parsedurl.path)
     relations = urlparse.parse_qs(parsedurl.query).get('relations')
     response_file = self.FAKE_GET_RESPONSES.get(res_type)
     if not response_file:
         raise NvpApiClient.NvpApiException()
     if 'lport' in res_type or 'nat' in res_type:
         if len(uuids) > 1:
             return self._show(res_type, response_file, uuids[0],
                               uuids[1], relations=relations)
         else:
             return self._list(res_type, response_file, uuids[0],
                               query=parsedurl.query, relations=relations)
     elif ('lswitch' in res_type or
           'lrouter' in res_type or
           self.SECPROF_RESOURCE in res_type or
           self.LQUEUE_RESOURCE in res_type or
           'gatewayservice' in res_type):
         LOG.debug("UUIDS:%s", uuids)
         if uuids:
             return self._show(res_type, response_file, uuids[0],
                               relations=relations)
         else:
             return self._list(res_type, response_file,
                               query=parsedurl.query,
                               relations=relations)
     else:
         raise Exception("unknown resource:%s" % res_type)
示例#7
0
 def test_agentless_extensions_version_fail(self):
     q_config.parse(['--config-file', NVP_BASE_CONF_PATH,
                     '--config-file', NVP_INI_AGENTLESS_PATH])
     cfg.CONF.set_override('core_plugin', PLUGIN_NAME)
     self.assertEqual(config.AgentModes.AGENTLESS,
                      cfg.CONF.NVP.agent_mode)
     with mock.patch.object(nvp_client.NVPApiHelper,
                            'get_nvp_version',
                            return_value=nvp_client.NVPVersion("3.2")):
         self.assertRaises(exceptions.NvpPluginException, NeutronManager)
示例#8
0
 def _create_lrouter(self, version, neutron_id=None, distributed=None):
     with mock.patch.object(
         self.fake_cluster.api_client, 'get_nvp_version',
         return_value=api_client.NVPVersion(version)):
         if not neutron_id:
             neutron_id = uuidutils.generate_uuid()
         lrouter = routerlib.create_lrouter(
             self.fake_cluster, neutron_id, 'pippo',
             'fake-lrouter', '10.0.0.1', distributed=distributed)
         return routerlib.get_lrouter(self.fake_cluster,
                                      lrouter['uuid'])
示例#9
0
 def handle_delete(self, url):
     parsedurl = urlparse.urlparse(url)
     (res_type, uuids) = self._get_resource_type(parsedurl.path)
     response_file = self.FAKE_PUT_RESPONSES.get(res_type)
     if not response_file:
         raise Exception("resource not found")
     res_dict = getattr(self, '_fake_%s_dict' % res_type)
     try:
         del res_dict[uuids[-1]]
     except KeyError:
         raise NvpApiClient.ResourceNotFound()
     return ""
示例#10
0
 def test_agentless_extensions_unmet_deps_fail(self):
     q_config.parse([
         '--config-file', BASE_CONF_PATH, '--config-file',
         NSX_INI_AGENTLESS_PATH
     ])
     cfg.CONF.set_override('core_plugin', PLUGIN_NAME)
     self.assertEqual(config.AgentModes.AGENTLESS, cfg.CONF.NSX.agent_mode)
     with mock.patch.object(api_client.NVPApiHelper,
                            'get_nvp_version',
                            return_value=api_client.NVPVersion("3.2")):
         with mock.patch.object(lsnlib,
                                'service_cluster_exists',
                                return_value=False):
             self.assertRaises(exceptions.NvpPluginException,
                               NeutronManager)
示例#11
0
    def setUp(self):
        self.fc = fake.FakeClient(STUBS_PATH)
        self.mock_nsxapi = mock.patch(NSXAPI_NAME, autospec=True)
        instance = self.mock_nsxapi.start()
        instance.return_value.login.return_value = "the_cookie"
        fake_version = getattr(self, 'fake_version', "3.0")
        instance.return_value.get_nvp_version.return_value = (
            api_client.NVPVersion(fake_version))

        instance.return_value.request.side_effect = self.fc.fake_request
        self.fake_cluster = cluster.NSXCluster(name='fake-cluster',
                                               nsx_controllers=['1.1.1.1:999'],
                                               default_tz_uuid=_uuid(),
                                               nsx_user='******',
                                               nsx_password='******')
        self.fake_cluster.api_client = api_client.NVPApiHelper(
            ('1.1.1.1', '999', True), self.fake_cluster.nsx_user,
            self.fake_cluster.nsx_password, self.fake_cluster.req_timeout,
            self.fake_cluster.http_timeout, self.fake_cluster.retries,
            self.fake_cluster.redirects)

        super(NsxlibTestCase, self).setUp()
        self.addCleanup(self.fc.reset_all)
        self.addCleanup(self.mock_nsxapi.stop)
示例#12
0
 def _add_lrouter_lport(self, body, lr_uuid):
     new_uuid = uuidutils.generate_uuid()
     fake_lport = self._build_lrouter_lport(body, new_uuid, lr_uuid)
     self._fake_lrouter_lport_dict[fake_lport['uuid']] = fake_lport
     try:
         fake_lrouter = self._fake_lrouter_dict[lr_uuid]
     except KeyError:
         raise NvpApiClient.ResourceNotFound()
     fake_lrouter['lport_count'] += 1
     fake_lport_status = fake_lport.copy()
     fake_lport_status['lr_tenant_id'] = fake_lrouter['tenant_id']
     fake_lport_status['lr_uuid'] = fake_lrouter['uuid']
     fake_lport_status['lr_name'] = fake_lrouter['display_name']
     self._fake_lrouter_lportstatus_dict[new_uuid] = fake_lport_status
     return fake_lport
示例#13
0
 def _test_create_router_nosnat_rule(self, version, expected=1):
     lrouter = routerlib.create_lrouter(self.fake_cluster,
                                        uuidutils.generate_uuid(), 'pippo',
                                        'fake-lrouter', '10.0.0.1')
     with mock.patch.object(self.fake_cluster.api_client,
                            'get_nvp_version',
                            new=lambda: NvpApiClient.NVPVersion(version)):
         routerlib.create_lrouter_nosnat_rule(
             self.fake_cluster,
             lrouter['uuid'],
             order=100,
             match_criteria={'destination_ip_addresses': '192.168.0.0/24'})
         rules = routerlib.query_nat_rules(self.fake_cluster,
                                           lrouter['uuid'])
         # NoSNAT rules do not exist in V2
         self.assertEqual(len(rules), expected)
示例#14
0
 def _test_create_router_snat_rule(self, version):
     lrouter = routerlib.create_lrouter(self.fake_cluster,
                                        uuidutils.generate_uuid(),
                                        'pippo',
                                        'fake-lrouter',
                                        '10.0.0.1')
     with mock.patch.object(self.fake_cluster.api_client,
                            'get_nvp_version',
                            new=lambda: api_client.NVPVersion(version)):
         routerlib.create_lrouter_snat_rule(
             self.fake_cluster, lrouter['uuid'],
             '10.0.0.2', '10.0.0.2', order=200,
             match_criteria={'source_ip_addresses': '192.168.0.24'})
         rules = routerlib.query_nat_rules(
             self.fake_cluster, lrouter['uuid'])
         self.assertEqual(len(rules), 1)
示例#15
0
 def _test_create_router_dnat_rule(self, version, dest_port=None):
     lrouter = routerlib.create_lrouter(self.fake_cluster,
                                        uuidutils.generate_uuid(),
                                        'pippo',
                                        'fake-lrouter',
                                        '10.0.0.1')
     with mock.patch.object(self.fake_cluster.api_client,
                            'get_nvp_version',
                            return_value=api_client.NVPVersion(version)):
         routerlib.create_lrouter_dnat_rule(
             self.fake_cluster, lrouter['uuid'], '192.168.0.2', order=200,
             dest_port=dest_port,
             match_criteria={'destination_ip_addresses': '10.0.0.3'})
         rules = routerlib.query_nat_rules(
             self.fake_cluster, lrouter['uuid'])
         self.assertEqual(len(rules), 1)
示例#16
0
def get_function_by_version(func_table, func_name, ver):
    if ver:
        if ver.major not in func_table[func_name]:
            major = max(func_table[func_name].keys())
            minor = max(func_table[func_name][major].keys())
            if major > ver.major:
                raise NotImplementedError(_("Operation may not be supported"))
        else:
            major = ver.major
            minor = ver.minor
            if ver.minor not in func_table[func_name][major]:
                minor = DEFAULT_VERSION
        return func_table[func_name][major][minor]
    else:
        msg = _('NSX version is not set. Unable to complete request '
                'correctly. Check log for NSX communication errors.')
        raise NvpApiClient.ServiceUnavailable(message=msg)
示例#17
0
 def test_agentless_extensions(self):
     q_config.parse(['--config-file', NVP_BASE_CONF_PATH,
                     '--config-file', NVP_INI_AGENTLESS_PATH])
     cfg.CONF.set_override('core_plugin', PLUGIN_NAME)
     self.assertEqual(config.AgentModes.AGENTLESS,
                      cfg.CONF.NVP.agent_mode)
     # The version returned from NVP does not really matter here
     with mock.patch.object(nvp_client.NVPApiHelper,
                            'get_nvp_version',
                            return_value=nvp_client.NVPVersion("9.9")):
         with mock.patch.object(lsnlib,
                                'service_cluster_exists',
                                return_value=True):
             plugin = NeutronManager().get_plugin()
             self.assertNotIn('agent',
                              plugin.supported_extension_aliases)
             self.assertNotIn('dhcp_agent_scheduler',
                              plugin.supported_extension_aliases)
示例#18
0
 def _test_create_lrouter_dnat_rule(self, version):
     with mock.patch.object(self.fake_cluster.api_client,
                            'get_nvp_version',
                            new=lambda: NvpApiClient.NVPVersion(version)):
         tenant_id = 'pippo'
         lrouter = routerlib.create_lrouter(self.fake_cluster,
                                            uuidutils.generate_uuid(),
                                            tenant_id, 'fake_router',
                                            '192.168.0.1')
         nat_rule = routerlib.create_lrouter_dnat_rule(
             self.fake_cluster,
             lrouter['uuid'],
             '10.0.0.99',
             match_criteria={'destination_ip_addresses': '192.168.0.5'})
         uri = nvplib._build_uri_path(routerlib.LROUTERNAT_RESOURCE,
                                      nat_rule['uuid'], lrouter['uuid'])
         resp_obj = nvplib.do_request("GET", uri, cluster=self.fake_cluster)
         self.assertEqual('DestinationNatRule', resp_obj['type'])
         self.assertEqual('192.168.0.5',
                          resp_obj['match']['destination_ip_addresses'])
示例#19
0
def create_nsx_cluster(cluster_opts, concurrent_connections, nsx_gen_timeout):
    cluster = nsx_cluster.NSXCluster(**cluster_opts)

    def _ctrl_split(x, y):
        return (x, int(y), True)

    api_providers = [
        _ctrl_split(*ctrl.split(':')) for ctrl in cluster.nsx_controllers
    ]
    cluster.api_client = NvpApiClient.NVPApiHelper(
        api_providers,
        cluster.nsx_user,
        cluster.nsx_password,
        request_timeout=cluster.req_timeout,
        http_timeout=cluster.http_timeout,
        retries=cluster.retries,
        redirects=cluster.redirects,
        concurrent_connections=concurrent_connections,
        nvp_gen_timeout=nsx_gen_timeout)
    return cluster
示例#20
0
    def handle_put(self, url, body):
        parsedurl = urlparse.urlparse(url)
        (res_type, uuids) = self._get_resource_type(parsedurl.path)
        response_file = self.FAKE_PUT_RESPONSES.get(res_type)
        if not response_file:
            raise Exception("resource not found")
        with open("%s/%s" % (self.fake_files_path, response_file)) as f:
            response_template = f.read()
            # Manage attachment operations
            is_attachment = False
            if res_type.endswith('attachment'):
                is_attachment = True
                res_type = res_type[:res_type.index('attachment')]
            res_dict = getattr(self, '_fake_%s_dict' % res_type)
            body_json = json.loads(body)
            val_func = self._validators.get(res_type)
            if val_func:
                val_func(body_json)
            try:
                resource = res_dict[uuids[-1]]
            except KeyError:
                raise NvpApiClient.ResourceNotFound()
            if not is_attachment:
                edit_resource = getattr(self, '_build_%s' % res_type, None)
                if edit_resource:
                    body_json = edit_resource(body)
                resource.update(body_json)
            else:
                relations = resource.get("_relations", {})
                body_2 = json.loads(body)
                resource['att_type'] = body_2['type']
                relations['LogicalPortAttachment'] = body_2
                resource['_relations'] = relations
                if body_2['type'] == "PatchAttachment":
                    # We need to do a trick here
                    if self.LROUTER_RESOURCE in res_type:
                        res_type_2 = res_type.replace(self.LROUTER_RESOURCE,
                                                      self.LSWITCH_RESOURCE)
                    elif self.LSWITCH_RESOURCE in res_type:
                        res_type_2 = res_type.replace(self.LSWITCH_RESOURCE,
                                                      self.LROUTER_RESOURCE)
                    res_dict_2 = getattr(self, '_fake_%s_dict' % res_type_2)
                    body_2['peer_port_uuid'] = uuids[-1]
                    resource_2 = res_dict_2[json.loads(body)['peer_port_uuid']]
                    relations_2 = resource_2.get("_relations")
                    if not relations_2:
                        relations_2 = {}
                    relations_2['LogicalPortAttachment'] = body_2
                    resource_2['_relations'] = relations_2
                    resource['peer_port_uuid'] = body_2['peer_port_uuid']
                    resource['att_info_json'] = (
                        "\"peer_port_uuid\": \"%s\"," %
                        resource_2['uuid'])
                    resource_2['att_info_json'] = (
                        "\"peer_port_uuid\": \"%s\"," %
                        body_2['peer_port_uuid'])
                elif body_2['type'] == "L3GatewayAttachment":
                    resource['attachment_gwsvc_uuid'] = (
                        body_2['l3_gateway_service_uuid'])
                    resource['vlan_id'] = body_2.get('vlan_id')
                elif body_2['type'] == "L2GatewayAttachment":
                    resource['attachment_gwsvc_uuid'] = (
                        body_2['l2_gateway_service_uuid'])
                elif body_2['type'] == "VifAttachment":
                    resource['vif_uuid'] = body_2['vif_uuid']
                    resource['att_info_json'] = (
                        "\"vif_uuid\": \"%s\"," % body_2['vif_uuid'])

            if not is_attachment:
                response = response_template % resource
            else:
                if res_type == self.LROUTER_LPORT_RESOURCE:
                    lr_uuid = uuids[0]
                    ls_uuid = None
                elif res_type == self.LSWITCH_LPORT_RESOURCE:
                    ls_uuid = uuids[0]
                    lr_uuid = None
                lp_uuid = uuids[1]
                response = response_template % self._fill_attachment(
                    json.loads(body), ls_uuid, lr_uuid, lp_uuid)
            return response
示例#21
0
 def test_function_handling_with_obsolete_major(self):
     version = api_client.NVPVersion('1.2')
     self.assertRaises(NotImplementedError,
                       versioning.get_function_by_version,
                       routerlib.ROUTER_FUNC_DICT,
                       'create_lrouter', version)
示例#22
0
 def test_function_handling_with_newer_major(self):
     version = api_client.NVPVersion('5.2')
     function = versioning.get_function_by_version(
         routerlib.ROUTER_FUNC_DICT, 'create_lrouter', version)
     self.assertEqual(routerlib.create_explicit_routing_lrouter,
                      function)
示例#23
0
 def test_function_handling_missing_minor(self):
     version = api_client.NVPVersion('2.0')
     function = versioning.get_function_by_version(
         routerlib.ROUTER_FUNC_DICT, 'create_lrouter', version)
     self.assertEqual(routerlib.create_implicit_routing_lrouter,
                      function)
示例#24
0
 def raise_nsx_exc(*args, **kwargs):
     raise NvpApiClient.NvpApiException()
示例#25
0
 def test_function_handling_with_both_major_and_minor(self):
     version = NvpApiClient.NVPVersion('3.2')
     function = versioning.get_function_by_version(
         routerlib.ROUTER_FUNC_DICT, 'create_lrouter', version)
     self.assertEqual(routerlib.create_explicit_routing_lrouter,
                      function)