Remove nvplib and move utility methods into nsxlib

This patch completes the process of moving code from nvplib
to nsxlib. Utility methods such as do_request and get_all_query_pages
are transferred into nsxlib, so that nvplib can be safely removed.

Partially implements blueprint nicira-plugin-renaming

Change-Id: I43be18c89ac908ebae32b39a8508a7006b5fe328
This commit is contained in:
Salvatore Orlando
2014-02-13 16:55:13 -08:00
parent 4d4520d860
commit 95809f59c5
16 changed files with 227 additions and 225 deletions

View File

@@ -24,7 +24,7 @@ from oslo.config import cfg
from neutron.common import config from neutron.common import config
from neutron.plugins.vmware.common import config as nsx_config # noqa from neutron.plugins.vmware.common import config as nsx_config # noqa
from neutron.plugins.vmware.common import nsx_utils from neutron.plugins.vmware.common import nsx_utils
from neutron.plugins.vmware import nvplib from neutron.plugins.vmware import nsxlib
config.setup_logging(cfg.CONF) config.setup_logging(cfg.CONF)
@@ -40,7 +40,7 @@ def get_nsx_controllers(cluster):
def config_helper(config_entity, cluster): def config_helper(config_entity, cluster):
try: try:
return nvplib.do_request('GET', return nsxlib.do_request('GET',
"/ws.v1/%s?fields=uuid" % config_entity, "/ws.v1/%s?fields=uuid" % config_entity,
cluster=cluster).get('results', []) cluster=cluster).get('results', [])
except Exception as e: except Exception as e:
@@ -75,7 +75,7 @@ def get_transport_nodes(cluster):
def is_transport_node_connected(cluster, node_uuid): def is_transport_node_connected(cluster, node_uuid):
try: try:
return nvplib.do_request('GET', return nsxlib.do_request('GET',
"/ws.v1/transport-node/%s/status" % node_uuid, "/ws.v1/transport-node/%s/status" % node_uuid,
cluster=cluster)['connection']['connected'] cluster=cluster)['connection']['connected']
except Exception as e: except Exception as e:

View File

@@ -28,9 +28,9 @@ from neutron.openstack.common import timeutils
from neutron.plugins.vmware.api_client import exception as api_exc from neutron.plugins.vmware.api_client import exception as api_exc
from neutron.plugins.vmware.common import exceptions as nsx_exc from neutron.plugins.vmware.common import exceptions as nsx_exc
from neutron.plugins.vmware.common import nsx_utils from neutron.plugins.vmware.common import nsx_utils
from neutron.plugins.vmware import nsxlib
from neutron.plugins.vmware.nsxlib import router as routerlib from neutron.plugins.vmware.nsxlib import router as routerlib
from neutron.plugins.vmware.nsxlib import switch as switchlib from neutron.plugins.vmware.nsxlib import switch as switchlib
from neutron.plugins.vmware import nvplib
# Maximum page size for a single request # Maximum page size for a single request
# NOTE(salv-orlando): This might become a version-dependent map should the # NOTE(salv-orlando): This might become a version-dependent map should the
@@ -194,14 +194,14 @@ def _start_loopingcall(min_chunk_size, state_sync_interval, func):
class NvpSynchronizer(): class NvpSynchronizer():
LS_URI = nvplib._build_uri_path( LS_URI = nsxlib._build_uri_path(
nvplib.LSWITCH_RESOURCE, fields='uuid,tags,fabric_status', switchlib.LSWITCH_RESOURCE, fields='uuid,tags,fabric_status',
relations='LogicalSwitchStatus') relations='LogicalSwitchStatus')
LR_URI = nvplib._build_uri_path( LR_URI = nsxlib._build_uri_path(
routerlib.LROUTER_RESOURCE, fields='uuid,tags,fabric_status', routerlib.LROUTER_RESOURCE, fields='uuid,tags,fabric_status',
relations='LogicalRouterStatus') relations='LogicalRouterStatus')
LP_URI = nvplib._build_uri_path( LP_URI = nsxlib._build_uri_path(
nvplib.LSWITCHPORT_RESOURCE, switchlib.LSWITCHPORT_RESOURCE,
parent_resource_id='*', parent_resource_id='*',
fields='uuid,tags,fabric_status_up', fields='uuid,tags,fabric_status_up',
relations='LogicalPortStatus') relations='LogicalPortStatus')
@@ -494,7 +494,7 @@ class NvpSynchronizer():
'max_page_size': MAX_PAGE_SIZE}) 'max_page_size': MAX_PAGE_SIZE})
# Only the first request might return the total size, # Only the first request might return the total size,
# subsequent requests will definetely not # subsequent requests will definetely not
results, cursor, total_size = nvplib.get_single_query_page( results, cursor, total_size = nsxlib.get_single_query_page(
uri, self._cluster, cursor, uri, self._cluster, cursor,
min(page_size, MAX_PAGE_SIZE)) min(page_size, MAX_PAGE_SIZE))
for _req in range(num_requests - 1): for _req in range(num_requests - 1):
@@ -505,7 +505,7 @@ class NvpSynchronizer():
# resource type is below this threshold # resource type is below this threshold
if not cursor: if not cursor:
break break
req_results, cursor = nvplib.get_single_query_page( req_results, cursor = nsxlib.get_single_query_page(
uri, self._cluster, cursor, uri, self._cluster, cursor,
min(page_size, MAX_PAGE_SIZE))[:2] min(page_size, MAX_PAGE_SIZE))[:2]
results.extend(req_results) results.extend(req_results)

View File

@@ -0,0 +1,144 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2014 VMware, Inc.
# All Rights Reserved
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import json
from neutron.common import exceptions as exception
from neutron.openstack.common import log
from neutron.plugins.vmware.api_client import exception as api_exc
from neutron.plugins.vmware.common import exceptions as nsx_exc
from neutron.version import version_info
HTTP_GET = "GET"
HTTP_POST = "POST"
HTTP_DELETE = "DELETE"
HTTP_PUT = "PUT"
# Prefix to be used for all NVP API calls
URI_PREFIX = "/ws.v1"
NEUTRON_VERSION = version_info.release_string()
LOG = log.getLogger(__name__)
def _build_uri_path(resource,
resource_id=None,
parent_resource_id=None,
fields=None,
relations=None,
filters=None,
types=None,
is_attachment=False,
extra_action=None):
resources = resource.split('/')
res_path = resources[0] + (resource_id and "/%s" % resource_id or '')
if len(resources) > 1:
# There is also a parent resource to account for in the uri
res_path = "%s/%s/%s" % (resources[1],
parent_resource_id,
res_path)
if is_attachment:
res_path = "%s/attachment" % res_path
elif extra_action:
res_path = "%s/%s" % (res_path, extra_action)
params = []
params.append(fields and "fields=%s" % fields)
params.append(relations and "relations=%s" % relations)
params.append(types and "types=%s" % types)
if filters:
params.extend(['%s=%s' % (k, v) for (k, v) in filters.iteritems()])
uri_path = "%s/%s" % (URI_PREFIX, res_path)
non_empty_params = [x for x in params if x is not None]
if non_empty_params:
query_string = '&'.join(non_empty_params)
if query_string:
uri_path += "?%s" % query_string
return uri_path
def format_exception(etype, e, exception_locals):
"""Consistent formatting for exceptions.
:param etype: a string describing the exception type.
:param e: the exception.
:param execption_locals: calling context local variable dict.
:returns: a formatted string.
"""
msg = [_("Error. %(type)s exception: %(exc)s.") %
{'type': etype, 'exc': e}]
l = dict((k, v) for k, v in exception_locals.iteritems()
if k != 'request')
msg.append(_("locals=[%s]") % str(l))
return ' '.join(msg)
def do_request(*args, **kwargs):
"""Issue a request to the cluster specified in kwargs.
:param args: a list of positional arguments.
:param kwargs: a list of keyworkds arguments.
:returns: the result of the operation loaded into a python
object or None.
"""
cluster = kwargs["cluster"]
try:
res = cluster.api_client.request(*args)
if res:
return json.loads(res)
except api_exc.ResourceNotFound:
raise exception.NotFound()
except api_exc.ReadOnlyMode:
raise nsx_exc.MaintenanceInProgress()
def get_single_query_page(path, cluster, page_cursor=None,
page_length=1000, neutron_only=True):
params = []
if page_cursor:
params.append("_page_cursor=%s" % page_cursor)
params.append("_page_length=%s" % page_length)
# NOTE(salv-orlando): On the NSX backend the 'Quantum' tag is still
# used for marking Neutron entities in order to preserve compatibility
if neutron_only:
params.append("tag_scope=quantum")
query_params = "&".join(params)
path = "%s%s%s" % (path, "&" if (path.find("?") != -1) else "?",
query_params)
body = do_request(HTTP_GET, path, cluster=cluster)
# Result_count won't be returned if _page_cursor is supplied
return body['results'], body.get('page_cursor'), body.get('result_count')
def get_all_query_pages(path, cluster):
need_more_results = True
result_list = []
page_cursor = None
while need_more_results:
results, page_cursor = get_single_query_page(
path, cluster, page_cursor)[:2]
if not page_cursor:
need_more_results = False
result_list.extend(results)
return result_list
def mk_body(**kwargs):
"""Convenience function creates and dumps dictionary to string.
:param kwargs: the key/value pirs to be dumped into a json string.
:returns: a json string.
"""
return json.dumps(kwargs, ensure_ascii=False)

View File

@@ -18,10 +18,10 @@ import json
from neutron.openstack.common import log from neutron.openstack.common import log
from neutron.plugins.vmware.common import utils from neutron.plugins.vmware.common import utils
from neutron.plugins.vmware.nsxlib import _build_uri_path
from neutron.plugins.vmware.nsxlib import do_request
from neutron.plugins.vmware.nsxlib import get_all_query_pages
from neutron.plugins.vmware.nsxlib import switch from neutron.plugins.vmware.nsxlib import switch
from neutron.plugins.vmware.nvplib import _build_uri_path
from neutron.plugins.vmware.nvplib import do_request
from neutron.plugins.vmware.nvplib import get_all_query_pages
HTTP_GET = "GET" HTTP_GET = "GET"
HTTP_POST = "POST" HTTP_POST = "POST"

View File

@@ -22,8 +22,8 @@ from neutron.openstack.common import log
from neutron.plugins.vmware.api_client import exception as api_exc from neutron.plugins.vmware.api_client import exception as api_exc
from neutron.plugins.vmware.common import exceptions as nsx_exc from neutron.plugins.vmware.common import exceptions as nsx_exc
from neutron.plugins.vmware.common import utils from neutron.plugins.vmware.common import utils
from neutron.plugins.vmware.nvplib import _build_uri_path from neutron.plugins.vmware.nsxlib import _build_uri_path
from neutron.plugins.vmware.nvplib import do_request from neutron.plugins.vmware.nsxlib import do_request
HTTP_GET = "GET" HTTP_GET = "GET"
HTTP_POST = "POST" HTTP_POST = "POST"

View File

@@ -20,8 +20,8 @@ from neutron.openstack.common import jsonutils
from neutron.openstack.common import log from neutron.openstack.common import log
from neutron.plugins.vmware.api_client import exception as api_exc from neutron.plugins.vmware.api_client import exception as api_exc
from neutron.plugins.vmware.common import utils from neutron.plugins.vmware.common import utils
from neutron.plugins.vmware.nvplib import _build_uri_path from neutron.plugins.vmware.nsxlib import _build_uri_path
from neutron.plugins.vmware.nvplib import do_request from neutron.plugins.vmware.nsxlib import do_request
HTTP_POST = "POST" HTTP_POST = "POST"
HTTP_DELETE = "DELETE" HTTP_DELETE = "DELETE"

View File

@@ -20,12 +20,12 @@ from neutron.openstack.common import log
from neutron.plugins.vmware.api_client import exception as api_exc from neutron.plugins.vmware.api_client import exception as api_exc
from neutron.plugins.vmware.common import exceptions as nsx_exc from neutron.plugins.vmware.common import exceptions as nsx_exc
from neutron.plugins.vmware.common import utils from neutron.plugins.vmware.common import utils
from neutron.plugins.vmware.nsxlib import _build_uri_path
from neutron.plugins.vmware.nsxlib import do_request
from neutron.plugins.vmware.nsxlib import get_all_query_pages
from neutron.plugins.vmware.nsxlib.switch import get_port from neutron.plugins.vmware.nsxlib.switch import get_port
from neutron.plugins.vmware.nsxlib.versioning import DEFAULT_VERSION from neutron.plugins.vmware.nsxlib.versioning import DEFAULT_VERSION
from neutron.plugins.vmware.nsxlib.versioning import versioned from neutron.plugins.vmware.nsxlib.versioning import versioned
from neutron.plugins.vmware.nvplib import _build_uri_path
from neutron.plugins.vmware.nvplib import do_request
from neutron.plugins.vmware.nvplib import get_all_query_pages
HTTP_GET = "GET" HTTP_GET = "GET"
HTTP_POST = "POST" HTTP_POST = "POST"

View File

@@ -19,10 +19,10 @@ from neutron.common import constants
from neutron.common import exceptions from neutron.common import exceptions
from neutron.openstack.common import log from neutron.openstack.common import log
from neutron.plugins.vmware.common import utils from neutron.plugins.vmware.common import utils
from neutron.plugins.vmware.nvplib import _build_uri_path from neutron.plugins.vmware.nsxlib import _build_uri_path
from neutron.plugins.vmware.nvplib import do_request from neutron.plugins.vmware.nsxlib import do_request
from neutron.plugins.vmware.nvplib import format_exception from neutron.plugins.vmware.nsxlib import format_exception
from neutron.plugins.vmware.nvplib import get_all_query_pages from neutron.plugins.vmware.nsxlib import get_all_query_pages
HTTP_GET = "GET" HTTP_GET = "GET"
HTTP_POST = "POST" HTTP_POST = "POST"

View File

@@ -22,9 +22,9 @@ from neutron.openstack.common import log
from neutron.plugins.vmware.api_client import exception as api_exc from neutron.plugins.vmware.api_client import exception as api_exc
from neutron.plugins.vmware.common import exceptions as nsx_exc from neutron.plugins.vmware.common import exceptions as nsx_exc
from neutron.plugins.vmware.common import utils from neutron.plugins.vmware.common import utils
from neutron.plugins.vmware.nvplib import _build_uri_path from neutron.plugins.vmware.nsxlib import _build_uri_path
from neutron.plugins.vmware.nvplib import do_request from neutron.plugins.vmware.nsxlib import do_request
from neutron.plugins.vmware.nvplib import get_all_query_pages from neutron.plugins.vmware.nsxlib import get_all_query_pages
HTTP_GET = "GET" HTTP_GET = "GET"
HTTP_POST = "POST" HTTP_POST = "POST"

View File

@@ -1,141 +0,0 @@
# Copyright 2012 VMware, Inc.
# All Rights Reserved
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import json
from neutron.common import exceptions as exception
from neutron.openstack.common import log
from neutron.plugins.vmware.api_client import exception as api_exc
from neutron.plugins.vmware.common import exceptions as nsx_exc
LOG = log.getLogger(__name__)
# HTTP METHODS CONSTANTS
HTTP_GET = "GET"
HTTP_POST = "POST"
HTTP_DELETE = "DELETE"
HTTP_PUT = "PUT"
# Prefix to be used for all NSX API calls
URI_PREFIX = "/ws.v1"
LSWITCH_RESOURCE = "lswitch"
LSWITCHPORT_RESOURCE = "lport/%s" % LSWITCH_RESOURCE
# Maximum page size for a single request
# NOTE(salv-orlando): This might become a version-dependent map should the
# limit be raised in future versions
MAX_PAGE_SIZE = 5000
def _build_uri_path(resource,
resource_id=None,
parent_resource_id=None,
fields=None,
relations=None,
filters=None,
types=None,
is_attachment=False,
extra_action=None):
resources = resource.split('/')
res_path = resources[0] + (resource_id and "/%s" % resource_id or '')
if len(resources) > 1:
# There is also a parent resource to account for in the uri
res_path = "%s/%s/%s" % (resources[1],
parent_resource_id,
res_path)
if is_attachment:
res_path = "%s/attachment" % res_path
elif extra_action:
res_path = "%s/%s" % (res_path, extra_action)
params = []
params.append(fields and "fields=%s" % fields)
params.append(relations and "relations=%s" % relations)
params.append(types and "types=%s" % types)
if filters:
params.extend(['%s=%s' % (k, v) for (k, v) in filters.iteritems()])
uri_path = "%s/%s" % (URI_PREFIX, res_path)
non_empty_params = [x for x in params if x is not None]
if non_empty_params:
query_string = '&'.join(non_empty_params)
if query_string:
uri_path += "?%s" % query_string
return uri_path
def get_single_query_page(path, cluster, page_cursor=None,
page_length=1000, neutron_only=True):
params = []
if page_cursor:
params.append("_page_cursor=%s" % page_cursor)
params.append("_page_length=%s" % page_length)
# NOTE(salv-orlando): On the NSX backend the 'Quantum' tag is still
# used for marking Neutron entities in order to preserve compatibility
if neutron_only:
params.append("tag_scope=quantum")
query_params = "&".join(params)
path = "%s%s%s" % (path, "&" if (path.find("?") != -1) else "?",
query_params)
body = do_request(HTTP_GET, path, cluster=cluster)
# Result_count won't be returned if _page_cursor is supplied
return body['results'], body.get('page_cursor'), body.get('result_count')
def get_all_query_pages(path, c):
need_more_results = True
result_list = []
page_cursor = None
while need_more_results:
results, page_cursor = get_single_query_page(
path, c, page_cursor)[:2]
if not page_cursor:
need_more_results = False
result_list.extend(results)
return result_list
def format_exception(etype, e, exception_locals):
"""Consistent formatting for exceptions.
:param etype: a string describing the exception type.
:param e: the exception.
:param execption_locals: calling context local variable dict.
:returns: a formatted string.
"""
msg = [_("Error. %(type)s exception: %(exc)s.") %
{'type': etype, 'exc': e}]
l = dict((k, v) for k, v in exception_locals.iteritems()
if k != 'request')
msg.append(_("locals=[%s]") % str(l))
return ' '.join(msg)
def do_request(*args, **kwargs):
"""Issue a request to the cluster specified in kwargs.
:param args: a list of positional arguments.
:param kwargs: a list of keyworkds arguments.
:returns: the result of the operation loaded into a python
object or None.
"""
cluster = kwargs["cluster"]
try:
res = cluster.api_client.request(*args)
if res:
return json.loads(res)
except api_exc.ResourceNotFound:
raise exception.NotFound()
except api_exc.ReadOnlyMode:
raise nsx_exc.MaintenanceInProgress()

View File

@@ -19,7 +19,6 @@ import os
from neutron.plugins.vmware.api_client import client as nsx_client from neutron.plugins.vmware.api_client import client as nsx_client
from neutron.plugins.vmware.api_client import eventlet_client from neutron.plugins.vmware.api_client import eventlet_client
from neutron.plugins.vmware import extensions from neutron.plugins.vmware import extensions
from neutron.plugins.vmware import nvplib
import neutron.plugins.vmware.plugin as neutron_plugin import neutron.plugins.vmware.plugin as neutron_plugin
from neutron.plugins.vmware.vshield.common import VcnsApiClient as vcnsapi from neutron.plugins.vmware.vshield.common import VcnsApiClient as vcnsapi
from neutron.plugins.vmware.vshield import vcns from neutron.plugins.vmware.vshield import vcns
@@ -37,7 +36,6 @@ vcns_api_helper = vcnsapi.VcnsApiHelper
STUBS_PATH = os.path.join(os.path.dirname(__file__), 'etc') STUBS_PATH = os.path.join(os.path.dirname(__file__), 'etc')
NSXEXT_PATH = os.path.dirname(extensions.__file__) NSXEXT_PATH = os.path.dirname(extensions.__file__)
NSXAPI_NAME = '%s.%s' % (api_client.__module__, api_client.__name__) NSXAPI_NAME = '%s.%s' % (api_client.__module__, api_client.__name__)
NSXLIB_NAME = nvplib.__name__
PLUGIN_NAME = '%s.%s' % (plugin.__module__, plugin.__name__) PLUGIN_NAME = '%s.%s' % (plugin.__module__, plugin.__name__)
SERVICE_PLUGIN_NAME = '%s.%s' % (service_plugin.__module__, SERVICE_PLUGIN_NAME = '%s.%s' % (service_plugin.__module__,
service_plugin.__name__) service_plugin.__name__)
@@ -51,5 +49,5 @@ def get_fake_conf(filename):
return os.path.join(STUBS_PATH, filename) return os.path.join(STUBS_PATH, filename)
def nsx_method(method_name, module_name='nvplib'): def nsx_method(method_name, module_name='nsxlib'):
return '%s.%s.%s' % ('neutron.plugins.vmware', module_name, method_name) return '%s.%s.%s' % ('neutron.plugins.vmware', module_name, method_name)

View File

@@ -15,6 +15,7 @@
# #
from neutron.plugins.vmware.api_client import exception from neutron.plugins.vmware.api_client import exception
from neutron.plugins.vmware import nsxlib
from neutron.plugins.vmware.nsxlib import l2gateway as l2gwlib from neutron.plugins.vmware.nsxlib import l2gateway as l2gwlib
from neutron.plugins.vmware.nsxlib import switch as switchlib from neutron.plugins.vmware.nsxlib import switch as switchlib
from neutron.tests.unit import test_api_v2 from neutron.tests.unit import test_api_v2
@@ -135,12 +136,12 @@ class L2GatewayTestCase(base.NsxlibTestCase):
l2gwlib.plug_l2_gw_service( l2gwlib.plug_l2_gw_service(
self.fake_cluster, lswitch['uuid'], self.fake_cluster, lswitch['uuid'],
lport['uuid'], gw_id) lport['uuid'], gw_id)
uri = l2gwlib._build_uri_path(switchlib.LSWITCHPORT_RESOURCE, uri = nsxlib._build_uri_path(switchlib.LSWITCHPORT_RESOURCE,
lport['uuid'], lport['uuid'],
lswitch['uuid'], lswitch['uuid'],
is_attachment=True) is_attachment=True)
resp_obj = l2gwlib.do_request("GET", uri, resp_obj = nsxlib.do_request("GET", uri,
cluster=self.fake_cluster) cluster=self.fake_cluster)
self.assertIn('LogicalPortAttachment', resp_obj) self.assertIn('LogicalPortAttachment', resp_obj)
self.assertEqual(resp_obj['LogicalPortAttachment']['type'], self.assertEqual(resp_obj['LogicalPortAttachment']['type'],
'L2GatewayAttachment') 'L2GatewayAttachment')

View File

@@ -22,6 +22,7 @@ from neutron.plugins.vmware.api_client import exception as api_exc
from neutron.plugins.vmware.api_client.version import Version from neutron.plugins.vmware.api_client.version import Version
from neutron.plugins.vmware.common import exceptions as nsx_exc from neutron.plugins.vmware.common import exceptions as nsx_exc
from neutron.plugins.vmware.common import utils from neutron.plugins.vmware.common import utils
from neutron.plugins.vmware import nsxlib
from neutron.plugins.vmware.nsxlib import router as routerlib from neutron.plugins.vmware.nsxlib import router as routerlib
from neutron.plugins.vmware.nsxlib import switch as switchlib from neutron.plugins.vmware.nsxlib import switch as switchlib
from neutron.tests.unit import test_api_v2 from neutron.tests.unit import test_api_v2
@@ -46,11 +47,10 @@ class TestNatRules(base.NsxlibTestCase):
self.fake_cluster, lrouter['uuid'], '10.0.0.99', self.fake_cluster, lrouter['uuid'], '10.0.0.99',
match_criteria={'destination_ip_addresses': match_criteria={'destination_ip_addresses':
'192.168.0.5'}) '192.168.0.5'})
uri = routerlib._build_uri_path(routerlib.LROUTERNAT_RESOURCE, uri = nsxlib._build_uri_path(routerlib.LROUTERNAT_RESOURCE,
nat_rule['uuid'], nat_rule['uuid'],
lrouter['uuid']) lrouter['uuid'])
resp_obj = routerlib.do_request( resp_obj = nsxlib.do_request("GET", uri, cluster=self.fake_cluster)
"GET", uri, cluster=self.fake_cluster)
self.assertEqual('DestinationNatRule', resp_obj['type']) self.assertEqual('DestinationNatRule', resp_obj['type'])
self.assertEqual('192.168.0.5', self.assertEqual('192.168.0.5',
resp_obj['match']['destination_ip_addresses']) resp_obj['match']['destination_ip_addresses'])

View File

@@ -15,8 +15,8 @@
# #
from neutron.common import exceptions from neutron.common import exceptions
from neutron.plugins.vmware import nsxlib
from neutron.plugins.vmware.nsxlib import secgroup as secgrouplib from neutron.plugins.vmware.nsxlib import secgroup as secgrouplib
from neutron.plugins.vmware import nvplib as nsx_utils
from neutron.tests.unit import test_api_v2 from neutron.tests.unit import test_api_v2
from neutron.tests.unit.vmware.nsxlib import base from neutron.tests.unit.vmware.nsxlib import base
@@ -28,10 +28,10 @@ class SecurityProfileTestCase(base.NsxlibTestCase):
def test_create_and_get_security_profile(self): def test_create_and_get_security_profile(self):
sec_prof = secgrouplib.create_security_profile( sec_prof = secgrouplib.create_security_profile(
self.fake_cluster, _uuid(), 'pippo', {'name': 'test'}) self.fake_cluster, _uuid(), 'pippo', {'name': 'test'})
sec_prof_res = secgrouplib.do_request( sec_prof_res = nsxlib.do_request(
secgrouplib.HTTP_GET, secgrouplib.HTTP_GET,
nsx_utils._build_uri_path('security-profile', nsxlib._build_uri_path('security-profile',
resource_id=sec_prof['uuid']), resource_id=sec_prof['uuid']),
cluster=self.fake_cluster) cluster=self.fake_cluster)
self.assertEqual(sec_prof['uuid'], sec_prof_res['uuid']) self.assertEqual(sec_prof['uuid'], sec_prof_res['uuid'])
# Check for builtin rules # Check for builtin rules
@@ -41,10 +41,10 @@ class SecurityProfileTestCase(base.NsxlibTestCase):
def test_create_and_get_default_security_profile(self): def test_create_and_get_default_security_profile(self):
sec_prof = secgrouplib.create_security_profile( sec_prof = secgrouplib.create_security_profile(
self.fake_cluster, _uuid(), 'pippo', {'name': 'default'}) self.fake_cluster, _uuid(), 'pippo', {'name': 'default'})
sec_prof_res = nsx_utils.do_request( sec_prof_res = nsxlib.do_request(
secgrouplib.HTTP_GET, secgrouplib.HTTP_GET,
nsx_utils._build_uri_path('security-profile', nsxlib._build_uri_path('security-profile',
resource_id=sec_prof['uuid']), resource_id=sec_prof['uuid']),
cluster=self.fake_cluster) cluster=self.fake_cluster)
self.assertEqual(sec_prof['uuid'], sec_prof_res['uuid']) self.assertEqual(sec_prof['uuid'], sec_prof_res['uuid'])
# Check for builtin rules # Check for builtin rules
@@ -60,10 +60,10 @@ class SecurityProfileTestCase(base.NsxlibTestCase):
'logical_port_ingress_rules': [ingress_rule]} 'logical_port_ingress_rules': [ingress_rule]}
secgrouplib.update_security_group_rules( secgrouplib.update_security_group_rules(
self.fake_cluster, sec_prof['uuid'], new_rules) self.fake_cluster, sec_prof['uuid'], new_rules)
sec_prof_res = nsx_utils.do_request( sec_prof_res = nsxlib.do_request(
secgrouplib.HTTP_GET, nsxlib.HTTP_GET,
nsx_utils._build_uri_path('security-profile', nsxlib._build_uri_path('security-profile',
resource_id=sec_prof['uuid']), resource_id=sec_prof['uuid']),
cluster=self.fake_cluster) cluster=self.fake_cluster)
self.assertEqual(sec_prof['uuid'], sec_prof_res['uuid']) self.assertEqual(sec_prof['uuid'], sec_prof_res['uuid'])
# Check for builtin rules # Check for builtin rules
@@ -84,10 +84,10 @@ class SecurityProfileTestCase(base.NsxlibTestCase):
'logical_port_ingress_rules': []} 'logical_port_ingress_rules': []}
secgrouplib.update_security_group_rules( secgrouplib.update_security_group_rules(
self.fake_cluster, sec_prof['uuid'], new_rules) self.fake_cluster, sec_prof['uuid'], new_rules)
sec_prof_res = nsx_utils.do_request( sec_prof_res = nsxlib.do_request(
nsx_utils.HTTP_GET, nsxlib.HTTP_GET,
nsx_utils._build_uri_path('security-profile', nsxlib._build_uri_path('security-profile',
resource_id=sec_prof['uuid']), resource_id=sec_prof['uuid']),
cluster=self.fake_cluster) cluster=self.fake_cluster)
self.assertEqual(sec_prof['uuid'], sec_prof_res['uuid']) self.assertEqual(sec_prof['uuid'], sec_prof_res['uuid'])
# Check for builtin rules # Check for builtin rules
@@ -111,9 +111,9 @@ class SecurityProfileTestCase(base.NsxlibTestCase):
secgrouplib.delete_security_profile( secgrouplib.delete_security_profile(
self.fake_cluster, sec_prof['uuid']) self.fake_cluster, sec_prof['uuid'])
self.assertRaises(exceptions.NotFound, self.assertRaises(exceptions.NotFound,
secgrouplib.do_request, nsxlib.do_request,
secgrouplib.HTTP_GET, nsxlib.HTTP_GET,
nsx_utils._build_uri_path( nsxlib._build_uri_path(
'security-profile', 'security-profile',
resource_id=sec_prof['uuid']), resource_id=sec_prof['uuid']),
cluster=self.fake_cluster) cluster=self.fake_cluster)

View File

@@ -31,7 +31,7 @@ from neutron.plugins.vmware.api_client import exception as api_exc
from neutron.plugins.vmware.api_client import version from neutron.plugins.vmware.api_client import version
from neutron.plugins.vmware.common import sync from neutron.plugins.vmware.common import sync
from neutron.plugins.vmware import nsx_cluster as cluster from neutron.plugins.vmware import nsx_cluster as cluster
from neutron.plugins.vmware import nvplib as nsx_utils from neutron.plugins.vmware import nsxlib
from neutron.plugins.vmware import plugin from neutron.plugins.vmware import plugin
from neutron.tests import base from neutron.tests import base
from neutron.tests.unit import test_api_v2 from neutron.tests.unit import test_api_v2
@@ -461,7 +461,7 @@ class SyncTestCase(base.BaseTestCase):
def _test_sync_with_chunk_larger_maxpagesize( def _test_sync_with_chunk_larger_maxpagesize(
self, net_size, port_size, router_size, chunk_size, exp_calls): self, net_size, port_size, router_size, chunk_size, exp_calls):
ctx = context.get_admin_context() ctx = context.get_admin_context()
real_func = nsx_utils.get_single_query_page real_func = nsxlib.get_single_query_page
sp = sync.SyncParameters(chunk_size) sp = sync.SyncParameters(chunk_size)
with self._populate_data(ctx, net_size=net_size, with self._populate_data(ctx, net_size=net_size,
port_size=port_size, port_size=port_size,
@@ -470,7 +470,7 @@ class SyncTestCase(base.BaseTestCase):
# The following mock is just for counting calls, # The following mock is just for counting calls,
# but we will still run the actual function # but we will still run the actual function
with mock.patch.object( with mock.patch.object(
nsx_utils, 'get_single_query_page', nsxlib, 'get_single_query_page',
side_effect=real_func) as mock_get_page: side_effect=real_func) as mock_get_page:
self._test_sync( self._test_sync(
constants.NET_STATUS_ACTIVE, constants.NET_STATUS_ACTIVE,

View File

@@ -21,7 +21,7 @@ from neutron.plugins.vmware.api_client import exception as api_exc
from neutron.plugins.vmware.common import exceptions as nsx_exc from neutron.plugins.vmware.common import exceptions as nsx_exc
from neutron.plugins.vmware.common import nsx_utils from neutron.plugins.vmware.common import nsx_utils
from neutron.plugins.vmware.common import utils from neutron.plugins.vmware.common import utils
from neutron.plugins.vmware import nvplib from neutron.plugins.vmware import nsxlib
from neutron.tests import base from neutron.tests import base
from neutron.tests.unit.vmware import nsx_method from neutron.tests.unit.vmware import nsx_method
from neutron.tests.unit.vmware.nsxlib import base as nsx_base from neutron.tests.unit.vmware.nsxlib import base as nsx_base
@@ -66,7 +66,7 @@ class NsxUtilsTestCase(base.BaseTestCase):
module_name='dbexts.db')).start() module_name='dbexts.db')).start()
def _verify_get_nsx_switch_and_port_id(self, exp_ls_uuid, exp_lp_uuid): def _verify_get_nsx_switch_and_port_id(self, exp_ls_uuid, exp_lp_uuid):
# The nvplib and db calls are mocked, therefore the cluster # The nsxlib and db calls are mocked, therefore the cluster
# and the neutron_port_id parameters can be set to None # and the neutron_port_id parameters can be set to None
ls_uuid, lp_uuid = nsx_utils.get_nsx_switch_and_port_id( ls_uuid, lp_uuid = nsx_utils.get_nsx_switch_and_port_id(
db_api.get_session(), None, None) db_api.get_session(), None, None)
@@ -74,7 +74,7 @@ class NsxUtilsTestCase(base.BaseTestCase):
self.assertEqual(exp_lp_uuid, lp_uuid) self.assertEqual(exp_lp_uuid, lp_uuid)
def _verify_get_nsx_switch_ids(self, exp_ls_uuids): def _verify_get_nsx_switch_ids(self, exp_ls_uuids):
# The nvplib and db calls are mocked, therefore the cluster # The nsxlib and db calls are mocked, therefore the cluster
# and the neutron_router_id parameters can be set to None # and the neutron_router_id parameters can be set to None
ls_uuids = nsx_utils.get_nsx_switch_ids( ls_uuids = nsx_utils.get_nsx_switch_ids(
db_api.get_session(), None, None) db_api.get_session(), None, None)
@@ -209,27 +209,27 @@ class NsxUtilsTestCase(base.BaseTestCase):
self.assertEqual(len(result), utils.MAX_DISPLAY_NAME_LEN) self.assertEqual(len(result), utils.MAX_DISPLAY_NAME_LEN)
def test_build_uri_path_plain(self): def test_build_uri_path_plain(self):
result = nvplib._build_uri_path('RESOURCE') result = nsxlib._build_uri_path('RESOURCE')
self.assertEqual("%s/%s" % (nvplib.URI_PREFIX, 'RESOURCE'), result) self.assertEqual("%s/%s" % (nsxlib.URI_PREFIX, 'RESOURCE'), result)
def test_build_uri_path_with_field(self): def test_build_uri_path_with_field(self):
result = nvplib._build_uri_path('RESOURCE', fields='uuid') result = nsxlib._build_uri_path('RESOURCE', fields='uuid')
expected = "%s/%s?fields=uuid" % (nvplib.URI_PREFIX, 'RESOURCE') expected = "%s/%s?fields=uuid" % (nsxlib.URI_PREFIX, 'RESOURCE')
self.assertEqual(expected, result) self.assertEqual(expected, result)
def test_build_uri_path_with_filters(self): def test_build_uri_path_with_filters(self):
filters = {"tag": 'foo', "tag_scope": "scope_foo"} filters = {"tag": 'foo', "tag_scope": "scope_foo"}
result = nvplib._build_uri_path('RESOURCE', filters=filters) result = nsxlib._build_uri_path('RESOURCE', filters=filters)
expected = ( expected = (
"%s/%s?tag_scope=scope_foo&tag=foo" % "%s/%s?tag_scope=scope_foo&tag=foo" %
(nvplib.URI_PREFIX, 'RESOURCE')) (nsxlib.URI_PREFIX, 'RESOURCE'))
self.assertEqual(expected, result) self.assertEqual(expected, result)
def test_build_uri_path_with_resource_id(self): def test_build_uri_path_with_resource_id(self):
res = 'RESOURCE' res = 'RESOURCE'
res_id = 'resource_id' res_id = 'resource_id'
result = nvplib._build_uri_path(res, resource_id=res_id) result = nsxlib._build_uri_path(res, resource_id=res_id)
expected = "%s/%s/%s" % (nvplib.URI_PREFIX, res, res_id) expected = "%s/%s/%s" % (nsxlib.URI_PREFIX, res, res_id)
self.assertEqual(expected, result) self.assertEqual(expected, result)
def test_build_uri_path_with_parent_and_resource_id(self): def test_build_uri_path_with_parent_and_resource_id(self):
@@ -238,10 +238,10 @@ class NsxUtilsTestCase(base.BaseTestCase):
res = '%s/%s' % (child_res, parent_res) res = '%s/%s' % (child_res, parent_res)
par_id = 'parent_resource_id' par_id = 'parent_resource_id'
res_id = 'resource_id' res_id = 'resource_id'
result = nvplib._build_uri_path( result = nsxlib._build_uri_path(
res, parent_resource_id=par_id, resource_id=res_id) res, parent_resource_id=par_id, resource_id=res_id)
expected = ("%s/%s/%s/%s/%s" % expected = ("%s/%s/%s/%s/%s" %
(nvplib.URI_PREFIX, parent_res, par_id, child_res, res_id)) (nsxlib.URI_PREFIX, parent_res, par_id, child_res, res_id))
self.assertEqual(expected, result) self.assertEqual(expected, result)
def test_build_uri_path_with_attachment(self): def test_build_uri_path_with_attachment(self):
@@ -250,10 +250,10 @@ class NsxUtilsTestCase(base.BaseTestCase):
res = '%s/%s' % (child_res, parent_res) res = '%s/%s' % (child_res, parent_res)
par_id = 'parent_resource_id' par_id = 'parent_resource_id'
res_id = 'resource_id' res_id = 'resource_id'
result = nvplib._build_uri_path(res, parent_resource_id=par_id, result = nsxlib._build_uri_path(res, parent_resource_id=par_id,
resource_id=res_id, is_attachment=True) resource_id=res_id, is_attachment=True)
expected = ("%s/%s/%s/%s/%s/%s" % expected = ("%s/%s/%s/%s/%s/%s" %
(nvplib.URI_PREFIX, parent_res, (nsxlib.URI_PREFIX, parent_res,
par_id, child_res, res_id, 'attachment')) par_id, child_res, res_id, 'attachment'))
self.assertEqual(expected, result) self.assertEqual(expected, result)
@@ -263,10 +263,10 @@ class NsxUtilsTestCase(base.BaseTestCase):
res = '%s/%s' % (child_res, parent_res) res = '%s/%s' % (child_res, parent_res)
par_id = 'parent_resource_id' par_id = 'parent_resource_id'
res_id = 'resource_id' res_id = 'resource_id'
result = nvplib._build_uri_path(res, parent_resource_id=par_id, result = nsxlib._build_uri_path(res, parent_resource_id=par_id,
resource_id=res_id, extra_action='doh') resource_id=res_id, extra_action='doh')
expected = ("%s/%s/%s/%s/%s/%s" % expected = ("%s/%s/%s/%s/%s/%s" %
(nvplib.URI_PREFIX, parent_res, (nsxlib.URI_PREFIX, parent_res,
par_id, child_res, res_id, 'doh')) par_id, child_res, res_id, 'doh'))
self.assertEqual(expected, result) self.assertEqual(expected, result)
@@ -319,12 +319,12 @@ class ClusterManagementTestCase(nsx_base.NsxlibTestCase):
'request', 'request',
side_effect=api_exc.ReadOnlyMode): side_effect=api_exc.ReadOnlyMode):
self.assertRaises(nsx_exc.MaintenanceInProgress, self.assertRaises(nsx_exc.MaintenanceInProgress,
nvplib.do_request, cluster=self.fake_cluster) nsxlib.do_request, cluster=self.fake_cluster)
def test_cluster_method_not_implemented(self): def test_cluster_method_not_implemented(self):
self.assertRaises(api_exc.NsxApiException, self.assertRaises(api_exc.NsxApiException,
nvplib.do_request, nsxlib.do_request,
nvplib.HTTP_GET, nsxlib.HTTP_GET,
nvplib._build_uri_path('MY_FAKE_RESOURCE', nsxlib._build_uri_path('MY_FAKE_RESOURCE',
resource_id='foo'), resource_id='foo'),
cluster=self.fake_cluster) cluster=self.fake_cluster)