Add db mixins for NSX extensions
This patches adds DB mixin classes for NSX extensions such as network-gateway and qos-queue. These extensions leverage the models defined in openstack/neutron. Import paths are adjusted accordingly throughout the repository, including those for the api client modules and the plugin's exception module. Closes-Bug: #1417627 Change-Id: I0dfe2ecc591df6cbc95fd64483c2f0df56fb335c
This commit is contained in:
parent
79275a9982
commit
ea75069fdc
@ -20,10 +20,10 @@ from neutron.extensions import providernet as pnet
|
||||
from neutron.i18n import _LW
|
||||
from neutron.openstack.common import log
|
||||
from neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from neutron.plugins.vmware.dbexts import networkgw_db
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import client
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils as vmw_utils
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import db as nsx_db
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import networkgw_db
|
||||
from vmware_nsx.neutron.plugins.vmware import nsx_cluster
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import l2gateway as l2gwlib
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import router as routerlib
|
||||
|
@ -21,7 +21,7 @@ from sqlalchemy.orm import exc
|
||||
import neutron.db.api as db
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.plugins.vmware.dbexts import models
|
||||
from neutron.plugins.vmware.dbexts import networkgw_db
|
||||
from neutron.plugins.vmware.dbexts import nsx_models
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
@ -173,13 +173,13 @@ def delete_neutron_nsx_router_mapping(session, neutron_id):
|
||||
|
||||
def unset_default_network_gateways(session):
|
||||
with session.begin(subtransactions=True):
|
||||
session.query(networkgw_db.NetworkGateway).update(
|
||||
{networkgw_db.NetworkGateway.default: False})
|
||||
session.query(nsx_models.NetworkGateway).update(
|
||||
{nsx_models.NetworkGateway.default: False})
|
||||
|
||||
|
||||
def set_default_network_gateway(session, gw_id):
|
||||
with session.begin(subtransactions=True):
|
||||
gw = (session.query(networkgw_db.NetworkGateway).
|
||||
gw = (session.query(nsx_models.NetworkGateway).
|
||||
filter_by(id=gw_id).one())
|
||||
gw['default'] = True
|
||||
|
||||
|
101
vmware_nsx/neutron/plugins/vmware/dbexts/lsn_db.py
Normal file
101
vmware_nsx/neutron/plugins/vmware/dbexts/lsn_db.py
Normal file
@ -0,0 +1,101 @@
|
||||
# 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.
|
||||
#
|
||||
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.plugins.vmware.dbexts import nsx_models
|
||||
from oslo.db import exception as d_exc
|
||||
from sqlalchemy import orm
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as p_exc
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def lsn_add(context, network_id, lsn_id):
|
||||
"""Add Logical Service Node information to persistent datastore."""
|
||||
with context.session.begin(subtransactions=True):
|
||||
lsn = nsx_models.Lsn(network_id, lsn_id)
|
||||
context.session.add(lsn)
|
||||
|
||||
|
||||
def lsn_remove(context, lsn_id):
|
||||
"""Remove Logical Service Node information from datastore given its id."""
|
||||
with context.session.begin(subtransactions=True):
|
||||
context.session.query(nsx_models.Lsn).filter_by(lsn_id=lsn_id).delete()
|
||||
|
||||
|
||||
def lsn_remove_for_network(context, network_id):
|
||||
"""Remove information about the Logical Service Node given its network."""
|
||||
with context.session.begin(subtransactions=True):
|
||||
context.session.query(nsx_models.Lsn).filter_by(
|
||||
net_id=network_id).delete()
|
||||
|
||||
|
||||
def lsn_get_for_network(context, network_id, raise_on_err=True):
|
||||
"""Retrieve LSN information given its network id."""
|
||||
query = context.session.query(nsx_models.Lsn)
|
||||
try:
|
||||
return query.filter_by(net_id=network_id).one()
|
||||
except (orm.exc.NoResultFound, d_exc.DBError):
|
||||
msg = _('Unable to find Logical Service Node for network %s')
|
||||
if raise_on_err:
|
||||
LOG.error(msg, network_id)
|
||||
raise p_exc.LsnNotFound(entity='network',
|
||||
entity_id=network_id)
|
||||
else:
|
||||
LOG.warn(msg, network_id)
|
||||
|
||||
|
||||
def lsn_port_add_for_lsn(context, lsn_port_id, subnet_id, mac, lsn_id):
|
||||
"""Add Logical Service Node Port information to persistent datastore."""
|
||||
with context.session.begin(subtransactions=True):
|
||||
lsn_port = nsx_models.LsnPort(lsn_port_id, subnet_id, mac, lsn_id)
|
||||
context.session.add(lsn_port)
|
||||
|
||||
|
||||
def lsn_port_get_for_subnet(context, subnet_id, raise_on_err=True):
|
||||
"""Return Logical Service Node Port information given its subnet id."""
|
||||
with context.session.begin(subtransactions=True):
|
||||
try:
|
||||
return (context.session.query(nsx_models.LsnPort).
|
||||
filter_by(sub_id=subnet_id).one())
|
||||
except (orm.exc.NoResultFound, d_exc.DBError):
|
||||
if raise_on_err:
|
||||
raise p_exc.LsnPortNotFound(lsn_id=None,
|
||||
entity='subnet',
|
||||
entity_id=subnet_id)
|
||||
|
||||
|
||||
def lsn_port_get_for_mac(context, mac_address, raise_on_err=True):
|
||||
"""Return Logical Service Node Port information given its mac address."""
|
||||
with context.session.begin(subtransactions=True):
|
||||
try:
|
||||
return (context.session.query(nsx_models.LsnPort).
|
||||
filter_by(mac_addr=mac_address).one())
|
||||
except (orm.exc.NoResultFound, d_exc.DBError):
|
||||
if raise_on_err:
|
||||
raise p_exc.LsnPortNotFound(lsn_id=None,
|
||||
entity='mac',
|
||||
entity_id=mac_address)
|
||||
|
||||
|
||||
def lsn_port_remove(context, lsn_port_id):
|
||||
"""Remove Logical Service Node port from the given Logical Service Node."""
|
||||
with context.session.begin(subtransactions=True):
|
||||
(context.session.query(nsx_models.LsnPort).
|
||||
filter_by(lsn_port_id=lsn_port_id).delete())
|
62
vmware_nsx/neutron/plugins/vmware/dbexts/maclearning.py
Normal file
62
vmware_nsx/neutron/plugins/vmware/dbexts/maclearning.py
Normal file
@ -0,0 +1,62 @@
|
||||
# Copyright 2013 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.
|
||||
#
|
||||
|
||||
from sqlalchemy.orm import exc
|
||||
|
||||
from neutron.api.v2 import attributes
|
||||
from neutron.db import db_base_plugin_v2
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.plugins.vmware.dbexts import nsx_models
|
||||
from neutron.plugins.vmware.extensions import maclearning as mac
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class MacLearningDbMixin(object):
|
||||
"""Mixin class for mac learning."""
|
||||
|
||||
def _make_mac_learning_state_dict(self, port, fields=None):
|
||||
res = {'port_id': port['port_id'],
|
||||
mac.MAC_LEARNING: port[mac.MAC_LEARNING]}
|
||||
return self._fields(res, fields)
|
||||
|
||||
def _extend_port_mac_learning_state(self, port_res, port_db):
|
||||
state = port_db.mac_learning_state
|
||||
if state and state.mac_learning_enabled:
|
||||
port_res[mac.MAC_LEARNING] = state.mac_learning_enabled
|
||||
|
||||
# Register dict extend functions for ports
|
||||
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
|
||||
attributes.PORTS, ['_extend_port_mac_learning_state'])
|
||||
|
||||
def _update_mac_learning_state(self, context, port_id, enabled):
|
||||
try:
|
||||
query = self._model_query(context, nsx_models.MacLearningState)
|
||||
state = query.filter(
|
||||
nsx_models.MacLearningState.port_id == port_id).one()
|
||||
state.update({mac.MAC_LEARNING: enabled})
|
||||
except exc.NoResultFound:
|
||||
self._create_mac_learning_state(context,
|
||||
{'id': port_id,
|
||||
mac.MAC_LEARNING: enabled})
|
||||
|
||||
def _create_mac_learning_state(self, context, port):
|
||||
with context.session.begin(subtransactions=True):
|
||||
enabled = port[mac.MAC_LEARNING]
|
||||
state = nsx_models.MacLearningState(
|
||||
port_id=port['id'],
|
||||
mac_learning_enabled=enabled)
|
||||
context.session.add(state)
|
||||
return self._make_mac_learning_state_dict(state)
|
461
vmware_nsx/neutron/plugins/vmware/dbexts/networkgw_db.py
Normal file
461
vmware_nsx/neutron/plugins/vmware/dbexts/networkgw_db.py
Normal file
@ -0,0 +1,461 @@
|
||||
# Copyright 2013 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.
|
||||
|
||||
from sqlalchemy.orm import exc as sa_orm_exc
|
||||
|
||||
from neutron.api.v2 import attributes
|
||||
from neutron.common import exceptions
|
||||
from neutron.common import utils
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.openstack.common import uuidutils
|
||||
from neutron.plugins.vmware.dbexts import nsx_models
|
||||
from neutron.plugins.vmware.extensions import networkgw
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
DEVICE_OWNER_NET_GW_INTF = 'network:gateway-interface'
|
||||
NETWORK_ID = 'network_id'
|
||||
SEGMENTATION_TYPE = 'segmentation_type'
|
||||
SEGMENTATION_ID = 'segmentation_id'
|
||||
ALLOWED_CONNECTION_ATTRIBUTES = set((NETWORK_ID,
|
||||
SEGMENTATION_TYPE,
|
||||
SEGMENTATION_ID))
|
||||
# Constants for gateway device operational status
|
||||
STATUS_UNKNOWN = "UNKNOWN"
|
||||
STATUS_ERROR = "ERROR"
|
||||
STATUS_ACTIVE = "ACTIVE"
|
||||
STATUS_DOWN = "DOWN"
|
||||
|
||||
|
||||
class GatewayInUse(exceptions.InUse):
|
||||
message = _("Network Gateway '%(gateway_id)s' still has active mappings "
|
||||
"with one or more neutron networks.")
|
||||
|
||||
|
||||
class GatewayNotFound(exceptions.NotFound):
|
||||
message = _("Network Gateway %(gateway_id)s could not be found")
|
||||
|
||||
|
||||
class GatewayDeviceInUse(exceptions.InUse):
|
||||
message = _("Network Gateway Device '%(device_id)s' is still used by "
|
||||
"one or more network gateways.")
|
||||
|
||||
|
||||
class GatewayDeviceNotFound(exceptions.NotFound):
|
||||
message = _("Network Gateway Device %(device_id)s could not be found.")
|
||||
|
||||
|
||||
class GatewayDevicesNotFound(exceptions.NotFound):
|
||||
message = _("One or more Network Gateway Devices could not be found: "
|
||||
"%(device_ids)s.")
|
||||
|
||||
|
||||
class NetworkGatewayPortInUse(exceptions.InUse):
|
||||
message = _("Port '%(port_id)s' is owned by '%(device_owner)s' and "
|
||||
"therefore cannot be deleted directly via the port API.")
|
||||
|
||||
|
||||
class GatewayConnectionInUse(exceptions.InUse):
|
||||
message = _("The specified mapping '%(mapping)s' is already in use on "
|
||||
"network gateway '%(gateway_id)s'.")
|
||||
|
||||
|
||||
class MultipleGatewayConnections(exceptions.Conflict):
|
||||
message = _("Multiple network connections found on '%(gateway_id)s' "
|
||||
"with provided criteria.")
|
||||
|
||||
|
||||
class GatewayConnectionNotFound(exceptions.NotFound):
|
||||
message = _("The connection %(network_mapping_info)s was not found on the "
|
||||
"network gateway '%(network_gateway_id)s'")
|
||||
|
||||
|
||||
class NetworkGatewayUnchangeable(exceptions.InUse):
|
||||
message = _("The network gateway %(gateway_id)s "
|
||||
"cannot be updated or deleted")
|
||||
|
||||
|
||||
class NetworkGatewayMixin(networkgw.NetworkGatewayPluginBase):
|
||||
|
||||
gateway_resource = networkgw.GATEWAY_RESOURCE_NAME
|
||||
device_resource = networkgw.DEVICE_RESOURCE_NAME
|
||||
|
||||
def _get_network_gateway(self, context, gw_id):
|
||||
try:
|
||||
gw = self._get_by_id(context, nsx_models.NetworkGateway, gw_id)
|
||||
except sa_orm_exc.NoResultFound:
|
||||
raise GatewayNotFound(gateway_id=gw_id)
|
||||
return gw
|
||||
|
||||
def _make_gw_connection_dict(self, gw_conn):
|
||||
return {'port_id': gw_conn['port_id'],
|
||||
'segmentation_type': gw_conn['segmentation_type'],
|
||||
'segmentation_id': gw_conn['segmentation_id']}
|
||||
|
||||
def _make_network_gateway_dict(self, network_gateway, fields=None):
|
||||
device_list = []
|
||||
for d in network_gateway['devices']:
|
||||
device_list.append({'id': d['id'],
|
||||
'interface_name': d['interface_name']})
|
||||
res = {'id': network_gateway['id'],
|
||||
'name': network_gateway['name'],
|
||||
'default': network_gateway['default'],
|
||||
'devices': device_list,
|
||||
'tenant_id': network_gateway['tenant_id']}
|
||||
# Query gateway connections only if needed
|
||||
if not fields or 'ports' in fields:
|
||||
res['ports'] = [self._make_gw_connection_dict(conn)
|
||||
for conn in network_gateway.network_connections]
|
||||
return self._fields(res, fields)
|
||||
|
||||
def _set_mapping_info_defaults(self, mapping_info):
|
||||
if not mapping_info.get('segmentation_type'):
|
||||
mapping_info['segmentation_type'] = 'flat'
|
||||
if not mapping_info.get('segmentation_id'):
|
||||
mapping_info['segmentation_id'] = 0
|
||||
|
||||
def _validate_network_mapping_info(self, network_mapping_info):
|
||||
self._set_mapping_info_defaults(network_mapping_info)
|
||||
network_id = network_mapping_info.get(NETWORK_ID)
|
||||
if not network_id:
|
||||
raise exceptions.InvalidInput(
|
||||
error_message=_("A network identifier must be specified "
|
||||
"when connecting a network to a network "
|
||||
"gateway. Unable to complete operation"))
|
||||
connection_attrs = set(network_mapping_info.keys())
|
||||
if not connection_attrs.issubset(ALLOWED_CONNECTION_ATTRIBUTES):
|
||||
raise exceptions.InvalidInput(
|
||||
error_message=(_("Invalid keys found among the ones provided "
|
||||
"in request body: %(connection_attrs)s."),
|
||||
connection_attrs))
|
||||
seg_type = network_mapping_info.get(SEGMENTATION_TYPE)
|
||||
seg_id = network_mapping_info.get(SEGMENTATION_ID)
|
||||
# The NSX plugin accepts 0 as a valid vlan tag
|
||||
seg_id_valid = seg_id == 0 or utils.is_valid_vlan_tag(seg_id)
|
||||
if seg_type.lower() == 'flat' and seg_id:
|
||||
msg = _("Cannot specify a segmentation id when "
|
||||
"the segmentation type is flat")
|
||||
raise exceptions.InvalidInput(error_message=msg)
|
||||
elif (seg_type.lower() == 'vlan' and not seg_id_valid):
|
||||
msg = _("Invalid segmentation id (%d) for "
|
||||
"vlan segmentation type") % seg_id
|
||||
raise exceptions.InvalidInput(error_message=msg)
|
||||
return network_id
|
||||
|
||||
def _retrieve_gateway_connections(self, context, gateway_id,
|
||||
mapping_info={}, only_one=False):
|
||||
filters = {'network_gateway_id': [gateway_id]}
|
||||
for k, v in mapping_info.iteritems():
|
||||
if v and k != NETWORK_ID:
|
||||
filters[k] = [v]
|
||||
query = self._get_collection_query(context,
|
||||
nsx_models.NetworkConnection,
|
||||
filters)
|
||||
return query.one() if only_one else query.all()
|
||||
|
||||
def _unset_default_network_gateways(self, context):
|
||||
with context.session.begin(subtransactions=True):
|
||||
context.session.query(nsx_models.NetworkGateway).update(
|
||||
{nsx_models.NetworkGateway.default: False})
|
||||
|
||||
def _set_default_network_gateway(self, context, gw_id):
|
||||
with context.session.begin(subtransactions=True):
|
||||
gw = (context.session.query(nsx_models.NetworkGateway).
|
||||
filter_by(id=gw_id).one())
|
||||
gw['default'] = True
|
||||
|
||||
def prevent_network_gateway_port_deletion(self, context, port):
|
||||
"""Pre-deletion check.
|
||||
|
||||
Ensures a port will not be deleted if is being used by a network
|
||||
gateway. In that case an exception will be raised.
|
||||
"""
|
||||
if port['device_owner'] == DEVICE_OWNER_NET_GW_INTF:
|
||||
raise NetworkGatewayPortInUse(port_id=port['id'],
|
||||
device_owner=port['device_owner'])
|
||||
|
||||
def _validate_device_list(self, context, tenant_id, gateway_data):
|
||||
device_query = self._query_gateway_devices(
|
||||
context, filters={'id': [device['id']
|
||||
for device in gateway_data['devices']]})
|
||||
retrieved_device_ids = set()
|
||||
for device in device_query:
|
||||
retrieved_device_ids.add(device['id'])
|
||||
if device['tenant_id'] != tenant_id:
|
||||
raise GatewayDeviceNotFound(device_id=device['id'])
|
||||
missing_device_ids = (
|
||||
set(device['id'] for device in gateway_data['devices']) -
|
||||
retrieved_device_ids)
|
||||
if missing_device_ids:
|
||||
raise GatewayDevicesNotFound(
|
||||
device_ids=",".join(missing_device_ids))
|
||||
|
||||
def create_network_gateway(self, context, network_gateway,
|
||||
validate_device_list=True):
|
||||
gw_data = network_gateway[self.gateway_resource]
|
||||
tenant_id = self._get_tenant_id_for_create(context, gw_data)
|
||||
with context.session.begin(subtransactions=True):
|
||||
gw_db = nsx_models.NetworkGateway(
|
||||
id=gw_data.get('id', uuidutils.generate_uuid()),
|
||||
tenant_id=tenant_id,
|
||||
name=gw_data.get('name'))
|
||||
# Device list is guaranteed to be a valid list, but some devices
|
||||
# might still either not exist or belong to a different tenant
|
||||
if validate_device_list:
|
||||
self._validate_device_list(context, tenant_id, gw_data)
|
||||
gw_db.devices.extend(
|
||||
[nsx_models.NetworkGatewayDeviceReference(**device)
|
||||
for device in gw_data['devices']])
|
||||
context.session.add(gw_db)
|
||||
LOG.debug("Created network gateway with id:%s", gw_db['id'])
|
||||
return self._make_network_gateway_dict(gw_db)
|
||||
|
||||
def update_network_gateway(self, context, id, network_gateway):
|
||||
gw_data = network_gateway[self.gateway_resource]
|
||||
with context.session.begin(subtransactions=True):
|
||||
gw_db = self._get_network_gateway(context, id)
|
||||
if gw_db.default:
|
||||
raise NetworkGatewayUnchangeable(gateway_id=id)
|
||||
# Ensure there is something to update before doing it
|
||||
if any([gw_db[k] != gw_data[k] for k in gw_data]):
|
||||
gw_db.update(gw_data)
|
||||
LOG.debug("Updated network gateway with id:%s", id)
|
||||
return self._make_network_gateway_dict(gw_db)
|
||||
|
||||
def get_network_gateway(self, context, id, fields=None):
|
||||
gw_db = self._get_network_gateway(context, id)
|
||||
return self._make_network_gateway_dict(gw_db, fields)
|
||||
|
||||
def delete_network_gateway(self, context, id):
|
||||
with context.session.begin(subtransactions=True):
|
||||
gw_db = self._get_network_gateway(context, id)
|
||||
if gw_db.network_connections:
|
||||
raise GatewayInUse(gateway_id=id)
|
||||
if gw_db.default:
|
||||
raise NetworkGatewayUnchangeable(gateway_id=id)
|
||||
context.session.delete(gw_db)
|
||||
LOG.debug("Network gateway '%s' was destroyed.", id)
|
||||
|
||||
def get_network_gateways(self, context, filters=None, fields=None,
|
||||
sorts=None, limit=None, marker=None,
|
||||
page_reverse=False):
|
||||
marker_obj = self._get_marker_obj(
|
||||
context, 'network_gateway', limit, marker)
|
||||
return self._get_collection(context, nsx_models.NetworkGateway,
|
||||
self._make_network_gateway_dict,
|
||||
filters=filters, fields=fields,
|
||||
sorts=sorts, limit=limit,
|
||||
marker_obj=marker_obj,
|
||||
page_reverse=page_reverse)
|
||||
|
||||
def connect_network(self, context, network_gateway_id,
|
||||
network_mapping_info):
|
||||
network_id = self._validate_network_mapping_info(network_mapping_info)
|
||||
LOG.debug("Connecting network '%(network_id)s' to gateway "
|
||||
"'%(network_gateway_id)s'",
|
||||
{'network_id': network_id,
|
||||
'network_gateway_id': network_gateway_id})
|
||||
with context.session.begin(subtransactions=True):
|
||||
gw_db = self._get_network_gateway(context, network_gateway_id)
|
||||
tenant_id = self._get_tenant_id_for_create(context, gw_db)
|
||||
# TODO(salvatore-orlando): Leverage unique constraint instead
|
||||
# of performing another query!
|
||||
if self._retrieve_gateway_connections(context,
|
||||
network_gateway_id,
|
||||
network_mapping_info):
|
||||
raise GatewayConnectionInUse(mapping=network_mapping_info,
|
||||
gateway_id=network_gateway_id)
|
||||
# TODO(salvatore-orlando): Creating a port will give it an IP,
|
||||
# but we actually do not need any. Instead of wasting an IP we
|
||||
# should have a way to say a port shall not be associated with
|
||||
# any subnet
|
||||
try:
|
||||
# We pass the segmentation type and id too - the plugin
|
||||
# might find them useful as the network connection object
|
||||
# does not exist yet.
|
||||
# NOTE: they're not extended attributes, rather extra data
|
||||
# passed in the port structure to the plugin
|
||||
# TODO(salvatore-orlando): Verify optimal solution for
|
||||
# ownership of the gateway port
|
||||
port = self.create_port(context, {
|
||||
'port':
|
||||
{'tenant_id': tenant_id,
|
||||
'network_id': network_id,
|
||||
'mac_address': attributes.ATTR_NOT_SPECIFIED,
|
||||
'admin_state_up': True,
|
||||
'fixed_ips': [],
|
||||
'device_id': network_gateway_id,
|
||||
'device_owner': DEVICE_OWNER_NET_GW_INTF,
|
||||
'name': '',
|
||||
'gw:segmentation_type':
|
||||
network_mapping_info.get('segmentation_type'),
|
||||
'gw:segmentation_id':
|
||||
network_mapping_info.get('segmentation_id')}})
|
||||
except exceptions.NetworkNotFound:
|
||||
err_msg = (_("Requested network '%(network_id)s' not found."
|
||||
"Unable to create network connection on "
|
||||
"gateway '%(network_gateway_id)s") %
|
||||
{'network_id': network_id,
|
||||
'network_gateway_id': network_gateway_id})
|
||||
LOG.error(err_msg)
|
||||
raise exceptions.InvalidInput(error_message=err_msg)
|
||||
port_id = port['id']
|
||||
LOG.debug("Gateway port for '%(network_gateway_id)s' "
|
||||
"created on network '%(network_id)s':%(port_id)s",
|
||||
{'network_gateway_id': network_gateway_id,
|
||||
'network_id': network_id,
|
||||
'port_id': port_id})
|
||||
# Create NetworkConnection record
|
||||
network_mapping_info['port_id'] = port_id
|
||||
network_mapping_info['tenant_id'] = tenant_id
|
||||
gw_db.network_connections.append(
|
||||
nsx_models.NetworkConnection(**network_mapping_info))
|
||||
port_id = port['id']
|
||||
# now deallocate and recycle ip from the port
|
||||
for fixed_ip in port.get('fixed_ips', []):
|
||||
self._delete_ip_allocation(context, network_id,
|
||||
fixed_ip['subnet_id'],
|
||||
fixed_ip['ip_address'])
|
||||
LOG.debug("Ensured no Ip addresses are configured on port %s",
|
||||
port_id)
|
||||
return {'connection_info':
|
||||
{'network_gateway_id': network_gateway_id,
|
||||
'network_id': network_id,
|
||||
'port_id': port_id}}
|
||||
|
||||
def disconnect_network(self, context, network_gateway_id,
|
||||
network_mapping_info):
|
||||
network_id = self._validate_network_mapping_info(network_mapping_info)
|
||||
LOG.debug("Disconnecting network '%(network_id)s' from gateway "
|
||||
"'%(network_gateway_id)s'",
|
||||
{'network_id': network_id,
|
||||
'network_gateway_id': network_gateway_id})
|
||||
with context.session.begin(subtransactions=True):
|
||||
# Uniquely identify connection, otherwise raise
|
||||
try:
|
||||
net_connection = self._retrieve_gateway_connections(
|
||||
context, network_gateway_id,
|
||||
network_mapping_info, only_one=True)
|
||||
except sa_orm_exc.NoResultFound:
|
||||
raise GatewayConnectionNotFound(
|
||||
network_mapping_info=network_mapping_info,
|
||||
network_gateway_id=network_gateway_id)
|
||||
except sa_orm_exc.MultipleResultsFound:
|
||||
raise MultipleGatewayConnections(
|
||||
gateway_id=network_gateway_id)
|
||||
# Remove gateway port from network
|
||||
# FIXME(salvatore-orlando): Ensure state of port in NSX is
|
||||
# consistent with outcome of transaction
|
||||
self.delete_port(context, net_connection['port_id'],
|
||||
nw_gw_port_check=False)
|
||||
# Remove NetworkConnection record
|
||||
context.session.delete(net_connection)
|
||||
|
||||
def _make_gateway_device_dict(self, gateway_device, fields=None,
|
||||
include_nsx_id=False):
|
||||
res = {'id': gateway_device['id'],
|
||||
'name': gateway_device['name'],
|
||||
'status': gateway_device['status'],
|
||||
'connector_type': gateway_device['connector_type'],
|
||||
'connector_ip': gateway_device['connector_ip'],
|
||||
'tenant_id': gateway_device['tenant_id']}
|
||||
if include_nsx_id:
|
||||
# Return the NSX mapping as well. This attribute will not be
|
||||
# returned in the API response anyway. Ensure it will not be
|
||||
# filtered out in field selection.
|
||||
if fields:
|
||||
fields.append('nsx_id')
|
||||
res['nsx_id'] = gateway_device['nsx_id']
|
||||
return self._fields(res, fields)
|
||||
|
||||
def _get_gateway_device(self, context, device_id):
|
||||
try:
|
||||
return self._get_by_id(context,
|
||||
nsx_models.NetworkGatewayDevice,
|
||||
device_id)
|
||||
except sa_orm_exc.NoResultFound:
|
||||
raise GatewayDeviceNotFound(device_id=device_id)
|
||||
|
||||
def _is_device_in_use(self, context, device_id):
|
||||
query = self._get_collection_query(
|
||||
context, nsx_models.NetworkGatewayDeviceReference,
|
||||
{'id': [device_id]})
|
||||
return query.first()
|
||||
|
||||
def get_gateway_device(self, context, device_id, fields=None,
|
||||
include_nsx_id=False):
|
||||
return self._make_gateway_device_dict(
|
||||
self._get_gateway_device(context, device_id),
|
||||
fields, include_nsx_id)
|
||||
|
||||
def _query_gateway_devices(self, context,
|
||||
filters=None, sorts=None,
|
||||
limit=None, marker=None,
|
||||
page_reverse=None):
|
||||
marker_obj = self._get_marker_obj(
|
||||
context, 'gateway_device', limit, marker)
|
||||
return self._get_collection_query(context,
|
||||
nsx_models.NetworkGatewayDevice,
|
||||
filters=filters,
|
||||
sorts=sorts,
|
||||
limit=limit,
|
||||
marker_obj=marker_obj,
|
||||
page_reverse=page_reverse)
|
||||
|
||||
def get_gateway_devices(self, context, filters=None, fields=None,
|
||||
sorts=None, limit=None, marker=None,
|
||||
page_reverse=False, include_nsx_id=False):
|
||||
query = self._query_gateway_devices(context, filters, sorts, limit,
|
||||
marker, page_reverse)
|
||||
return [self._make_gateway_device_dict(row, fields, include_nsx_id)
|
||||
for row in query]
|
||||
|
||||
def create_gateway_device(self, context, gateway_device,
|
||||
initial_status=STATUS_UNKNOWN):
|
||||
device_data = gateway_device[self.device_resource]
|
||||
tenant_id = self._get_tenant_id_for_create(context, device_data)
|
||||
with context.session.begin(subtransactions=True):
|
||||
device_db = nsx_models.NetworkGatewayDevice(
|
||||
id=device_data.get('id', uuidutils.generate_uuid()),
|
||||
tenant_id=tenant_id,
|
||||
name=device_data.get('name'),
|
||||
connector_type=device_data['connector_type'],
|
||||
connector_ip=device_data['connector_ip'],
|
||||
status=initial_status)
|
||||
context.session.add(device_db)
|
||||
LOG.debug("Created network gateway device: %s", device_db['id'])
|
||||
return self._make_gateway_device_dict(device_db)
|
||||
|
||||
def update_gateway_device(self, context, gateway_device_id,
|
||||
gateway_device, include_nsx_id=False):
|
||||
device_data = gateway_device[self.device_resource]
|
||||
with context.session.begin(subtransactions=True):
|
||||
device_db = self._get_gateway_device(context, gateway_device_id)
|
||||
# Ensure there is something to update before doing it
|
||||
if any([device_db[k] != device_data[k] for k in device_data]):
|
||||
device_db.update(device_data)
|
||||
LOG.debug("Updated network gateway device: %s",
|
||||
gateway_device_id)
|
||||
return self._make_gateway_device_dict(
|
||||
device_db, include_nsx_id=include_nsx_id)
|
||||
|
||||
def delete_gateway_device(self, context, device_id):
|
||||
with context.session.begin(subtransactions=True):
|
||||
# A gateway device should not be deleted
|
||||
# if it is used in any network gateway service
|
||||
if self._is_device_in_use(context, device_id):
|
||||
raise GatewayDeviceInUse(device_id=device_id)
|
||||
device_db = self._get_gateway_device(context, device_id)
|
||||
context.session.delete(device_db)
|
||||
LOG.debug("Deleted network gateway device: %s.", device_id)
|
260
vmware_nsx/neutron/plugins/vmware/dbexts/qos_db.py
Normal file
260
vmware_nsx/neutron/plugins/vmware/dbexts/qos_db.py
Normal file
@ -0,0 +1,260 @@
|
||||
# Copyright 2013 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.
|
||||
#
|
||||
|
||||
from sqlalchemy.orm import exc
|
||||
|
||||
from neutron.api.v2 import attributes as attr
|
||||
from neutron.db import db_base_plugin_v2
|
||||
from neutron.db import models_v2
|
||||
from neutron.i18n import _LI
|
||||
from neutron.openstack.common import log
|
||||
from neutron.openstack.common import uuidutils
|
||||
from neutron.plugins.vmware.dbexts import nsx_models
|
||||
from neutron.plugins.vmware.extensions import qos
|
||||
|
||||
|
||||
LOG = log.getLogger(__name__)
|
||||
|
||||
|
||||
class QoSDbMixin(qos.QueuePluginBase):
|
||||
"""Mixin class to add queues."""
|
||||
|
||||
def create_qos_queue(self, context, qos_queue):
|
||||
q = qos_queue['qos_queue']
|
||||
with context.session.begin(subtransactions=True):
|
||||
qos_queue = nsx_models.QoSQueue(
|
||||
id=q.get('id', uuidutils.generate_uuid()),
|
||||
name=q.get('name'),
|
||||
tenant_id=q['tenant_id'],
|
||||
default=q.get('default'),
|
||||
min=q.get('min'),
|
||||
max=q.get('max'),
|
||||
qos_marking=q.get('qos_marking'),
|
||||
dscp=q.get('dscp'))
|
||||
context.session.add(qos_queue)
|
||||
return self._make_qos_queue_dict(qos_queue)
|
||||
|
||||
def get_qos_queue(self, context, queue_id, fields=None):
|
||||
return self._make_qos_queue_dict(
|
||||
self._get_qos_queue(context, queue_id), fields)
|
||||
|
||||
def _get_qos_queue(self, context, queue_id):
|
||||
try:
|
||||
return self._get_by_id(context, nsx_models.QoSQueue, queue_id)
|
||||
except exc.NoResultFound:
|
||||
raise qos.QueueNotFound(id=queue_id)
|
||||
|
||||
def get_qos_queues(self, context, filters=None, fields=None, sorts=None,
|
||||
limit=None, marker=None, page_reverse=False):
|
||||
marker_obj = self._get_marker_obj(context, 'qos_queue', limit, marker)
|
||||
return self._get_collection(context, nsx_models.QoSQueue,
|
||||
self._make_qos_queue_dict,
|
||||
filters=filters, fields=fields,
|
||||
sorts=sorts, limit=limit,
|
||||
marker_obj=marker_obj,
|
||||
page_reverse=page_reverse)
|
||||
|
||||
def delete_qos_queue(self, context, queue_id):
|
||||
qos_queue = self._get_qos_queue(context, queue_id)
|
||||
with context.session.begin(subtransactions=True):
|
||||
context.session.delete(qos_queue)
|
||||
|
||||
def _process_port_queue_mapping(self, context, port_data, queue_id):
|
||||
port_data[qos.QUEUE] = queue_id
|
||||
if not queue_id:
|
||||
return
|
||||
with context.session.begin(subtransactions=True):
|
||||
context.session.add(nsx_models.PortQueueMapping(
|
||||
port_id=port_data['id'],
|
||||
queue_id=queue_id))
|
||||
|
||||
def _get_port_queue_bindings(self, context, filters=None, fields=None):
|
||||
return self._get_collection(context, nsx_models.PortQueueMapping,
|
||||
self._make_port_queue_binding_dict,
|
||||
filters=filters, fields=fields)
|
||||
|
||||
def _delete_port_queue_mapping(self, context, port_id):
|
||||
query = self._model_query(context, nsx_models.PortQueueMapping)
|
||||
try:
|
||||
binding = query.filter(
|
||||
nsx_models.PortQueueMapping.port_id == port_id).one()
|
||||
except exc.NoResultFound:
|
||||
# return since this can happen if we are updating a port that
|
||||
# did not already have a queue on it. There is no need to check
|
||||
# if there is one before deleting if we return here.
|
||||
return
|
||||
with context.session.begin(subtransactions=True):
|
||||
context.session.delete(binding)
|
||||
|
||||
def _process_network_queue_mapping(self, context, net_data, queue_id):
|
||||
net_data[qos.QUEUE] = queue_id
|
||||
if not queue_id:
|
||||
return
|
||||
with context.session.begin(subtransactions=True):
|
||||
context.session.add(
|
||||
nsx_models.NetworkQueueMapping(network_id=net_data['id'],
|
||||
queue_id=queue_id))
|
||||
|
||||
def _get_network_queue_bindings(self, context, filters=None, fields=None):
|
||||
return self._get_collection(context, nsx_models.NetworkQueueMapping,
|
||||
self._make_network_queue_binding_dict,
|
||||
filters=filters, fields=fields)
|
||||
|
||||
def _delete_network_queue_mapping(self, context, network_id):
|
||||
query = self._model_query(context, nsx_models.NetworkQueueMapping)
|
||||
with context.session.begin(subtransactions=True):
|
||||
binding = query.filter_by(network_id=network_id).first()
|
||||
if binding:
|
||||
context.session.delete(binding)
|
||||
|
||||
def _extend_dict_qos_queue(self, obj_res, obj_db):
|
||||
queue_mapping = obj_db['qos_queue']
|
||||
if queue_mapping:
|
||||
obj_res[qos.QUEUE] = queue_mapping.get('queue_id')
|
||||
return obj_res
|
||||
|
||||
def _extend_port_dict_qos_queue(self, port_res, port_db):
|
||||
self._extend_dict_qos_queue(port_res, port_db)
|
||||
|
||||
def _extend_network_dict_qos_queue(self, network_res, network_db):
|
||||
self._extend_dict_qos_queue(network_res, network_db)
|
||||
|
||||
# Register dict extend functions for networks and ports
|
||||
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
|
||||
attr.NETWORKS, ['_extend_network_dict_qos_queue'])
|
||||
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
|
||||
attr.PORTS, ['_extend_port_dict_qos_queue'])
|
||||
|
||||
def _make_qos_queue_dict(self, queue, fields=None):
|
||||
res = {'id': queue['id'],
|
||||
'name': queue.get('name'),
|
||||
'default': queue.get('default'),
|
||||
'tenant_id': queue['tenant_id'],
|
||||
'min': queue.get('min'),
|
||||
'max': queue.get('max'),
|
||||
'qos_marking': queue.get('qos_marking'),
|
||||
'dscp': queue.get('dscp')}
|
||||
return self._fields(res, fields)
|
||||
|
||||
def _make_port_queue_binding_dict(self, queue, fields=None):
|
||||
res = {'port_id': queue['port_id'],
|
||||
'queue_id': queue['queue_id']}
|
||||
return self._fields(res, fields)
|
||||
|
||||
def _make_network_queue_binding_dict(self, queue, fields=None):
|
||||
res = {'network_id': queue['network_id'],
|
||||
'queue_id': queue['queue_id']}
|
||||
return self._fields(res, fields)
|
||||
|
||||
def _check_for_queue_and_create(self, context, port):
|
||||
"""Check for queue and create.
|
||||
|
||||
This function determines if a port should be associated with a
|
||||
queue. It works by first querying NetworkQueueMapping to determine
|
||||
if the network is associated with a queue. If so, then it queries
|
||||
NetworkQueueMapping for all the networks that are associated with
|
||||
this queue. Next, it queries against all the ports on these networks
|
||||
with the port device_id. Finally it queries PortQueueMapping. If that
|
||||
query returns a queue_id that is returned. Otherwise a queue is
|
||||
created that is the size of the queue associated with the network and
|
||||
that queue_id is returned.
|
||||
|
||||
If the network is not associated with a queue we then query to see
|
||||
if there is a default queue in the system. If so, a copy of that is
|
||||
created and the queue_id is returned.
|
||||
|
||||
Otherwise None is returned. None is also returned if the port does not
|
||||
have a device_id or if the device_owner is network:
|
||||
"""
|
||||
|
||||
queue_to_create = None
|
||||
# If there is no device_id don't create a queue. The queue will be
|
||||
# created on update port when the device_id is present. Also don't
|
||||
# apply QoS to network ports.
|
||||
if (not port.get('device_id') or
|
||||
port['device_owner'].startswith('network:')):
|
||||
return
|
||||
|
||||
# Check if there is a queue associated with the network
|
||||
filters = {'network_id': [port['network_id']]}
|
||||
network_queue_id = self._get_network_queue_bindings(
|
||||
context, filters, ['queue_id'])
|
||||
if network_queue_id:
|
||||
# get networks that queue is associated with
|
||||
filters = {'queue_id': [network_queue_id[0]['queue_id']]}
|
||||
networks_with_same_queue = self._get_network_queue_bindings(
|
||||
context, filters)
|
||||
|
||||
# get the ports on these networks with the same_queue and device_id
|
||||
filters = {'device_id': [port.get('device_id')],
|
||||
'network_id': [network['network_id'] for
|
||||
network in networks_with_same_queue]}
|
||||
query = self._model_query(context, models_v2.Port.id)
|
||||
query = self._apply_filters_to_query(query, models_v2.Port,
|
||||
filters)
|
||||
ports_ids = [p[0] for p in query]
|
||||
if ports_ids:
|
||||
# shared queue already exists find the queue id
|
||||
queues = self._get_port_queue_bindings(context,
|
||||
{'port_id': ports_ids},
|
||||
['queue_id'])
|
||||
if queues:
|
||||
return queues[0]['queue_id']
|
||||
|
||||
# get the size of the queue we want to create
|
||||
queue_to_create = self._get_qos_queue(
|
||||
context, network_queue_id[0]['queue_id'])
|
||||
|
||||
else:
|
||||
# check for default queue
|
||||
filters = {'default': [True]}
|
||||
# context is elevated since default queue is owned by admin
|
||||
queue_to_create = self.get_qos_queues(context.elevated(), filters)
|
||||
if not queue_to_create:
|
||||
return
|
||||
queue_to_create = queue_to_create[0]
|
||||
|
||||
# create the queue
|
||||
tenant_id = self._get_tenant_id_for_create(context, port)
|
||||
if port.get(qos.RXTX_FACTOR) and queue_to_create.get('max'):
|
||||
queue_to_create['max'] *= int(port[qos.RXTX_FACTOR])
|
||||
queue = {'qos_queue': {'name': queue_to_create.get('name'),
|
||||
'min': queue_to_create.get('min'),
|
||||
'max': queue_to_create.get('max'),
|
||||
'dscp': queue_to_create.get('dscp'),
|
||||
'qos_marking':
|
||||
queue_to_create.get('qos_marking'),
|
||||
'tenant_id': tenant_id}}
|
||||
return self.create_qos_queue(context, queue, False)['id']
|
||||
|
||||
def _validate_qos_queue(self, context, qos_queue):
|
||||
if qos_queue.get('default'):
|
||||
if context.is_admin:
|
||||
if self.get_qos_queues(context, filters={'default': [True]}):
|
||||
raise qos.DefaultQueueAlreadyExists()
|
||||
else:
|
||||
raise qos.DefaultQueueCreateNotAdmin()
|
||||
if qos_queue.get('qos_marking') == 'trusted':
|
||||
dscp = qos_queue.pop('dscp')
|
||||
if dscp:
|
||||
# must raise because a non-zero dscp was provided
|
||||
raise qos.QueueInvalidMarking()
|
||||
LOG.info(_LI("DSCP value (%s) will be ignored with 'trusted' "
|
||||
"marking"), dscp)
|
||||
max = qos_queue.get('max')
|
||||
min = qos_queue.get('min')
|
||||
# Max can be None
|
||||
if max and min > max:
|
||||
raise qos.QueueMinGreaterMax()
|
@ -15,17 +15,17 @@
|
||||
# under the License.
|
||||
#
|
||||
|
||||
from neutron.common import exceptions as n_exc
|
||||
from neutron.i18n import _LE, _LW
|
||||
from neutron.openstack.common import log as logging
|
||||
from oslo.config import cfg
|
||||
from oslo.db import exception as db_exc
|
||||
from oslo.utils import excutils
|
||||
|
||||
from neutron.common import exceptions as n_exc
|
||||
from neutron.i18n import _LE, _LW
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from neutron.plugins.vmware.common import exceptions as p_exc
|
||||
from neutron.plugins.vmware.dbexts import lsn_db
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as p_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import nsx_utils
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import lsn_db
|
||||
from vmware_nsx.neutron.plugins.vmware.dhcp_meta import constants as const
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import lsn as lsn_api
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import switch as switch_api
|
||||
|
@ -20,7 +20,8 @@ from neutron.common import exceptions as n_exc
|
||||
from neutron.extensions import external_net
|
||||
from neutron.i18n import _LE
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.plugins.vmware.common import exceptions as p_exc
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as p_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.dhcp_meta import nsx
|
||||
from vmware_nsx.neutron.plugins.vmware.dhcp_meta import rpc
|
||||
|
||||
|
@ -15,9 +15,6 @@
|
||||
# under the License.
|
||||
#
|
||||
|
||||
from oslo.config import cfg
|
||||
from oslo.utils import excutils
|
||||
|
||||
from neutron.api.v2 import attributes as attr
|
||||
from neutron.common import constants as const
|
||||
from neutron.common import exceptions as n_exc
|
||||
@ -26,7 +23,10 @@ from neutron.db import l3_db
|
||||
from neutron.extensions import external_net
|
||||
from neutron.i18n import _LE, _LI
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.plugins.vmware.common import exceptions as p_exc
|
||||
from oslo.config import cfg
|
||||
from oslo.utils import excutils
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as p_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.dhcp_meta import constants as d_const
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import lsn as lsn_api
|
||||
|
||||
|
@ -16,8 +16,6 @@
|
||||
|
||||
from eventlet import greenthread
|
||||
import netaddr
|
||||
from oslo.config import cfg
|
||||
|
||||
from neutron.api.rpc.agentnotifiers import dhcp_rpc_agent_api
|
||||
from neutron.api.v2 import attributes
|
||||
from neutron.common import constants as const
|
||||
@ -27,9 +25,11 @@ from neutron.db import l3_db
|
||||
from neutron.db import models_v2
|
||||
from neutron.i18n import _LE, _LI, _LW
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from oslo.config import cfg
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import config
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
@ -27,9 +27,10 @@ from neutron.common import topics
|
||||
from neutron.db import agents_db
|
||||
from neutron.i18n import _LW
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from neutron.plugins.vmware.extensions import lsn
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.common import config
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.dhcp_meta import combined
|
||||
from vmware_nsx.neutron.plugins.vmware.dhcp_meta import lsnmanager
|
||||
from vmware_nsx.neutron.plugins.vmware.dhcp_meta import migration
|
||||
|
@ -13,11 +13,11 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from oslo.config import cfg
|
||||
|
||||
from neutron.i18n import _LI
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.plugins.vmware.common import exceptions
|
||||
from oslo.config import cfg
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
DEFAULT_PORT = 443
|
||||
|
@ -13,13 +13,13 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from oslo.serialization import jsonutils
|
||||
|
||||
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 import version
|
||||
from oslo.serialization import jsonutils
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
|
||||
HTTP_GET = "GET"
|
||||
HTTP_POST = "POST"
|
||||
|
@ -14,11 +14,11 @@
|
||||
# under the License.
|
||||
#
|
||||
|
||||
from neutron.openstack.common import log
|
||||
from oslo.serialization import jsonutils
|
||||
|
||||
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 vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import switch
|
||||
|
@ -13,12 +13,12 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from oslo.serialization import jsonutils
|
||||
|
||||
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 oslo.serialization import jsonutils
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
|
||||
|
@ -19,7 +19,8 @@ from oslo.utils import excutils
|
||||
from neutron.api.v2 import attributes as attr
|
||||
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 vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
|
||||
|
@ -20,8 +20,9 @@ from oslo.utils import excutils
|
||||
from neutron.common import exceptions as exception
|
||||
from neutron.i18n import _LE, _LI, _LW
|
||||
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 vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import switch
|
||||
|
@ -20,6 +20,7 @@ from neutron.common import constants
|
||||
from neutron.common import exceptions
|
||||
from neutron.i18n import _LW
|
||||
from neutron.openstack.common import log
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
|
||||
|
@ -21,8 +21,9 @@ from neutron.common import constants
|
||||
from neutron.common import exceptions as exception
|
||||
from neutron.i18n import _LE, _LI, _LW
|
||||
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 vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
import inspect
|
||||
|
||||
from neutron.plugins.vmware.api_client import exception
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception
|
||||
|
||||
DEFAULT_VERSION = -1
|
||||
|
||||
|
@ -55,21 +55,23 @@ from neutron.extensions import securitygroup as ext_sg
|
||||
from neutron.i18n import _LE, _LI, _LW
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.plugins.common import constants as plugin_const
|
||||
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.dbexts import maclearning as mac_db
|
||||
from neutron.plugins.vmware.dbexts import networkgw_db
|
||||
from neutron.plugins.vmware.dbexts import qos_db
|
||||
from neutron.plugins.vmware.dbexts import nsx_models
|
||||
from neutron.plugins.vmware.extensions import maclearning as mac_ext
|
||||
from neutron.plugins.vmware.extensions import networkgw
|
||||
from neutron.plugins.vmware.extensions import qos
|
||||
|
||||
from vmware_nsx.neutron.plugins import vmware
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import config # noqa
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import nsx_utils
|
||||
from vmware_nsx.neutron.plugins.vmware.common import securitygroups as sg_utils
|
||||
from vmware_nsx.neutron.plugins.vmware.common import sync
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils as c_utils
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import db as nsx_db
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import maclearning as mac_db
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import networkgw_db
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import qos_db
|
||||
from vmware_nsx.neutron.plugins.vmware import dhcpmeta_modes
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import l2gateway as l2gwlib
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import queue as queuelib
|
||||
@ -2087,8 +2089,8 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
|
||||
"because of an error in the NSX backend"), device_id)
|
||||
with context.session.begin(subtransactions=True):
|
||||
query = self._model_query(
|
||||
context, networkgw_db.NetworkGatewayDevice).filter(
|
||||
networkgw_db.NetworkGatewayDevice.id == device_id)
|
||||
context, nsx_models.NetworkGatewayDevice).filter(
|
||||
nsx_models.NetworkGatewayDevice.id == device_id)
|
||||
if is_create:
|
||||
query.delete(synchronize_session=False)
|
||||
else:
|
||||
@ -2123,8 +2125,8 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
|
||||
# set NSX GW device in neutron database and update status
|
||||
with context.session.begin(subtransactions=True):
|
||||
query = self._model_query(
|
||||
context, networkgw_db.NetworkGatewayDevice).filter(
|
||||
networkgw_db.NetworkGatewayDevice.id == neutron_id)
|
||||
context, nsx_models.NetworkGatewayDevice).filter(
|
||||
nsx_models.NetworkGatewayDevice.id == neutron_id)
|
||||
query.update({'status': device_status,
|
||||
'nsx_id': nsx_res['uuid']},
|
||||
synchronize_session=False)
|
||||
@ -2162,8 +2164,8 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
|
||||
# update status
|
||||
with context.session.begin(subtransactions=True):
|
||||
query = self._model_query(
|
||||
context, networkgw_db.NetworkGatewayDevice).filter(
|
||||
networkgw_db.NetworkGatewayDevice.id == neutron_id)
|
||||
context, nsx_models.NetworkGatewayDevice).filter(
|
||||
nsx_models.NetworkGatewayDevice.id == neutron_id)
|
||||
query.update({'status': device_status},
|
||||
synchronize_session=False)
|
||||
LOG.debug("Neutron gateway device: %(neutron_id)s; "
|
||||
@ -2197,8 +2199,8 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin,
|
||||
# Update status in database
|
||||
with context.session.begin(subtransactions=True):
|
||||
query = self._model_query(
|
||||
context, networkgw_db.NetworkGatewayDevice).filter(
|
||||
networkgw_db.NetworkGatewayDevice.id == device_id)
|
||||
context, nsx_models.NetworkGatewayDevice).filter(
|
||||
nsx_models.NetworkGatewayDevice.id == device_id)
|
||||
query.update({'status': device_status},
|
||||
synchronize_session=False)
|
||||
gw_device['status'] = device_status
|
||||
|
@ -49,17 +49,18 @@ from neutron.i18n import _LE, _LW
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.openstack.common import uuidutils
|
||||
from neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from neutron.plugins.vmware.dbexts import networkgw_db
|
||||
from neutron.plugins.vmware.extensions import (
|
||||
advancedserviceproviders as subnet_md)
|
||||
from neutron.plugins.vmware.extensions import (
|
||||
vnicindex as ext_vnic_idx)
|
||||
|
||||
from vmware_nsx.neutron.plugins import vmware
|
||||
from vmware_nsx.neutron.plugins.vmware.common import config # noqa
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils as c_utils
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import (
|
||||
distributedrouter as dist_rtr)
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import db as nsx_db
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import networkgw_db
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import nsxv_db
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import vnic_index_db
|
||||
from vmware_nsx.neutron.plugins.vmware.plugins import nsx_v_md_proxy
|
||||
|
@ -12,12 +12,12 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.openstack.common import uuidutils
|
||||
from oslo.serialization import jsonutils
|
||||
import six.moves.urllib.parse as urlparse
|
||||
|
||||
from neutron.openstack.common import log as logging
|
||||
from neutron.openstack.common import uuidutils
|
||||
from neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
@ -13,12 +13,13 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from neutron import context
|
||||
from neutron.plugins.vmware.dbexts import nsx_models
|
||||
from neutron.tests.unit import testlib_api
|
||||
from sqlalchemy import orm
|
||||
|
||||
from neutron import context
|
||||
from neutron.plugins.vmware.common import exceptions as p_exc
|
||||
from neutron.plugins.vmware.dbexts import lsn_db
|
||||
from neutron.tests.unit import testlib_api
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as p_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import lsn_db
|
||||
|
||||
|
||||
class LSNTestCase(testlib_api.SqlTestCase):
|
||||
@ -34,20 +35,22 @@ class LSNTestCase(testlib_api.SqlTestCase):
|
||||
|
||||
def test_lsn_add(self):
|
||||
lsn_db.lsn_add(self.ctx, self.net_id, self.lsn_id)
|
||||
lsn = (self.ctx.session.query(lsn_db.Lsn).
|
||||
lsn = (self.ctx.session.query(nsx_models.Lsn).
|
||||
filter_by(lsn_id=self.lsn_id).one())
|
||||
self.assertEqual(self.lsn_id, lsn.lsn_id)
|
||||
|
||||
def test_lsn_remove(self):
|
||||
lsn_db.lsn_add(self.ctx, self.net_id, self.lsn_id)
|
||||
lsn_db.lsn_remove(self.ctx, self.lsn_id)
|
||||
q = self.ctx.session.query(lsn_db.Lsn).filter_by(lsn_id=self.lsn_id)
|
||||
q = self.ctx.session.query(nsx_models.Lsn).filter_by(
|
||||
lsn_id=self.lsn_id)
|
||||
self.assertRaises(orm.exc.NoResultFound, q.one)
|
||||
|
||||
def test_lsn_remove_for_network(self):
|
||||
lsn_db.lsn_add(self.ctx, self.net_id, self.lsn_id)
|
||||
lsn_db.lsn_remove_for_network(self.ctx, self.net_id)
|
||||
q = self.ctx.session.query(lsn_db.Lsn).filter_by(lsn_id=self.lsn_id)
|
||||
q = self.ctx.session.query(nsx_models.Lsn).filter_by(
|
||||
lsn_id=self.lsn_id)
|
||||
self.assertRaises(orm.exc.NoResultFound, q.one)
|
||||
|
||||
def test_lsn_get_for_network(self):
|
||||
@ -64,7 +67,7 @@ class LSNTestCase(testlib_api.SqlTestCase):
|
||||
lsn_db.lsn_add(self.ctx, self.net_id, self.lsn_id)
|
||||
lsn_db.lsn_port_add_for_lsn(self.ctx, self.lsn_port_id,
|
||||
self.subnet_id, self.mac_addr, self.lsn_id)
|
||||
result = (self.ctx.session.query(lsn_db.LsnPort).
|
||||
result = (self.ctx.session.query(nsx_models.LsnPort).
|
||||
filter_by(lsn_port_id=self.lsn_port_id).one())
|
||||
self.assertEqual(self.lsn_port_id, result.lsn_port_id)
|
||||
|
||||
@ -95,6 +98,6 @@ class LSNTestCase(testlib_api.SqlTestCase):
|
||||
def test_lsn_port_remove(self):
|
||||
lsn_db.lsn_add(self.ctx, self.net_id, self.lsn_id)
|
||||
lsn_db.lsn_port_remove(self.ctx, self.lsn_port_id)
|
||||
q = (self.ctx.session.query(lsn_db.LsnPort).
|
||||
q = (self.ctx.session.query(nsx_models.LsnPort).
|
||||
filter_by(lsn_port_id=self.lsn_port_id))
|
||||
self.assertRaises(orm.exc.NoResultFound, q.one)
|
||||
|
@ -25,9 +25,7 @@ from neutron import context
|
||||
from neutron.db import api as db_api
|
||||
from neutron.db import db_base_plugin_v2
|
||||
from neutron import manager
|
||||
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.dbexts import networkgw_db
|
||||
from neutron.plugins.vmware.dbexts import nsx_models
|
||||
from neutron.plugins.vmware.extensions import networkgw
|
||||
from neutron import quota
|
||||
from neutron.tests import base
|
||||
@ -35,6 +33,10 @@ from neutron.tests.unit import test_api_v2
|
||||
from neutron.tests.unit import test_db_plugin
|
||||
from neutron.tests.unit import test_extensions
|
||||
from neutron.tests.unit import testlib_plugin
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import networkgw_db
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import l2gateway as l2gwlib
|
||||
from vmware_nsx.neutron.tests.unit import vmware
|
||||
@ -579,11 +581,11 @@ class NetworkGatewayDbTestCase(test_db_plugin.NeutronDbPluginV2TestCase):
|
||||
# Verify nothing left on db
|
||||
session = db_api.get_session()
|
||||
dev_query = session.query(
|
||||
networkgw_db.NetworkGatewayDevice).filter(
|
||||
networkgw_db.NetworkGatewayDevice.id == device_id)
|
||||
nsx_models.NetworkGatewayDevice).filter(
|
||||
nsx_models.NetworkGatewayDevice.id == device_id)
|
||||
self.assertIsNone(dev_query.first())
|
||||
gw_query = session.query(networkgw_db.NetworkGateway).filter(
|
||||
networkgw_db.NetworkGateway.id == gw_id)
|
||||
gw_query = session.query(nsx_models.NetworkGateway).filter(
|
||||
nsx_models.NetworkGateway.id == gw_id)
|
||||
self.assertIsNone(gw_query.first())
|
||||
|
||||
def test_update_network_gateway(self):
|
||||
@ -905,8 +907,8 @@ class NetworkGatewayDbTestCase(test_db_plugin.NeutronDbPluginV2TestCase):
|
||||
dev_id = dev[self.dev_resource]['id']
|
||||
# Verify nothing left on db
|
||||
session = db_api.get_session()
|
||||
dev_query = session.query(networkgw_db.NetworkGatewayDevice)
|
||||
dev_query.filter(networkgw_db.NetworkGatewayDevice.id == dev_id)
|
||||
dev_query = session.query(nsx_models.NetworkGatewayDevice)
|
||||
dev_query.filter(nsx_models.NetworkGatewayDevice.id == dev_id)
|
||||
self.assertIsNone(dev_query.first())
|
||||
|
||||
|
||||
|
@ -20,9 +20,10 @@ from oslo.config import cfg
|
||||
import webob.exc
|
||||
|
||||
from neutron import context
|
||||
from neutron.plugins.vmware.dbexts import qos_db
|
||||
from neutron.plugins.vmware.extensions import qos as ext_qos
|
||||
from neutron.tests.unit import test_extensions
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import qos_db
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
from vmware_nsx.neutron.tests.unit import vmware
|
||||
from vmware_nsx.neutron.tests.unit.vmware import test_nsx_plugin
|
||||
|
@ -15,11 +15,11 @@
|
||||
#
|
||||
|
||||
import mock
|
||||
|
||||
from neutron.plugins.vmware.api_client import exception
|
||||
from neutron.tests import base
|
||||
from neutron.tests.unit import test_api_v2
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import client
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import version
|
||||
from vmware_nsx.neutron.plugins.vmware.common import config # noqa
|
||||
from vmware_nsx.neutron.plugins.vmware import nsx_cluster as cluster
|
||||
|
@ -15,10 +15,10 @@
|
||||
#
|
||||
|
||||
import mock
|
||||
from neutron.tests.unit import test_api_v2
|
||||
from oslo.serialization import jsonutils
|
||||
|
||||
from neutron.plugins.vmware.api_client import exception
|
||||
from neutron.tests.unit import test_api_v2
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils as nsx_utils
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import l2gateway as l2gwlib
|
||||
|
@ -14,12 +14,12 @@
|
||||
# limitations under the License.
|
||||
|
||||
import mock
|
||||
from neutron.common import exceptions
|
||||
from neutron.tests import base
|
||||
from oslo.serialization import jsonutils
|
||||
|
||||
from neutron.common import exceptions
|
||||
from neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from neutron.tests import base
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import lsn as lsnlib
|
||||
|
||||
|
@ -15,9 +15,9 @@
|
||||
#
|
||||
|
||||
import mock
|
||||
|
||||
from neutron.common import exceptions
|
||||
from neutron.plugins.vmware.api_client import exception as api_exc
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import queue as queuelib
|
||||
from vmware_nsx.neutron.tests.unit.vmware.nsxlib import base
|
||||
|
@ -20,11 +20,11 @@ from oslo.config import cfg
|
||||
|
||||
from neutron.common import exceptions
|
||||
from neutron.openstack.common import uuidutils
|
||||
from neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from neutron.tests.unit import test_api_v2
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import (
|
||||
version as version_module)
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import version as ver_module
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import router as routerlib
|
||||
@ -39,7 +39,7 @@ class TestNatRules(base.NsxlibTestCase):
|
||||
def _test_create_lrouter_dnat_rule(self, version):
|
||||
with mock.patch.object(self.fake_cluster.api_client,
|
||||
'get_version',
|
||||
new=lambda: version_module.Version(version)):
|
||||
new=lambda: ver_module.Version(version)):
|
||||
tenant_id = 'pippo'
|
||||
lrouter = routerlib.create_lrouter(self.fake_cluster,
|
||||
uuidutils.generate_uuid(),
|
||||
@ -320,7 +320,7 @@ class TestLogicalRouters(base.NsxlibTestCase):
|
||||
def _create_lrouter(self, version, neutron_id=None, distributed=None):
|
||||
with mock.patch.object(
|
||||
self.fake_cluster.api_client, 'get_version',
|
||||
return_value=version_module.Version(version)):
|
||||
return_value=ver_module.Version(version)):
|
||||
if not neutron_id:
|
||||
neutron_id = uuidutils.generate_uuid()
|
||||
lrouter = routerlib.create_lrouter(
|
||||
@ -381,7 +381,7 @@ class TestLogicalRouters(base.NsxlibTestCase):
|
||||
|
||||
with mock.patch.object(self.fake_cluster.api_client,
|
||||
'get_version',
|
||||
return_value=version_module.Version(version)):
|
||||
return_value=ver_module.Version(version)):
|
||||
with mock.patch.dict(routerlib.ROUTER_FUNC_DICT,
|
||||
foo_func_dict, clear=True):
|
||||
return routerlib.update_lrouter(
|
||||
@ -770,7 +770,7 @@ class TestLogicalRouters(base.NsxlibTestCase):
|
||||
'10.0.0.1')
|
||||
with mock.patch.object(self.fake_cluster.api_client,
|
||||
'get_version',
|
||||
new=lambda: version_module.Version(version)):
|
||||
new=lambda: ver_module.Version(version)):
|
||||
routerlib.create_lrouter_snat_rule(
|
||||
self.fake_cluster, lrouter['uuid'],
|
||||
'10.0.0.2', '10.0.0.2', order=200,
|
||||
@ -793,7 +793,7 @@ class TestLogicalRouters(base.NsxlibTestCase):
|
||||
'10.0.0.1')
|
||||
with mock.patch.object(self.fake_cluster.api_client,
|
||||
'get_version',
|
||||
return_value=version_module.Version(version)):
|
||||
return_value=ver_module.Version(version)):
|
||||
routerlib.create_lrouter_dnat_rule(
|
||||
self.fake_cluster, lrouter['uuid'], '192.168.0.2', order=200,
|
||||
dest_port=dest_port,
|
||||
@ -839,7 +839,7 @@ class TestLogicalRouters(base.NsxlibTestCase):
|
||||
'10.0.0.1')
|
||||
with mock.patch.object(self.fake_cluster.api_client,
|
||||
'get_version',
|
||||
new=lambda: version_module.Version(version)):
|
||||
new=lambda: ver_module.Version(version)):
|
||||
routerlib.create_lrouter_nosnat_rule(
|
||||
self.fake_cluster, lrouter['uuid'],
|
||||
order=100,
|
||||
@ -864,7 +864,7 @@ class TestLogicalRouters(base.NsxlibTestCase):
|
||||
# v2 or v3 makes no difference for this test
|
||||
with mock.patch.object(self.fake_cluster.api_client,
|
||||
'get_version',
|
||||
new=lambda: version_module.Version('2.0')):
|
||||
new=lambda: ver_module.Version('2.0')):
|
||||
routerlib.create_lrouter_snat_rule(
|
||||
self.fake_cluster, lrouter['uuid'],
|
||||
'10.0.0.2', '10.0.0.2', order=220,
|
||||
@ -936,7 +936,7 @@ class TestLogicalRouters(base.NsxlibTestCase):
|
||||
# add an extra rule to emulate a duplicate one
|
||||
with mock.patch.object(self.fake_cluster.api_client,
|
||||
'get_version',
|
||||
new=lambda: version_module.Version('2.0')):
|
||||
new=lambda: ver_module.Version('2.0')):
|
||||
routerlib.create_lrouter_snat_rule(
|
||||
self.fake_cluster, lrouter['uuid'],
|
||||
'10.0.0.2', '10.0.0.2', order=220,
|
||||
|
@ -17,6 +17,7 @@
|
||||
from neutron.common import constants
|
||||
from neutron.common import exceptions
|
||||
from neutron.tests.unit import test_api_v2
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import secgroup as secgrouplib
|
||||
from vmware_nsx.neutron.tests.unit.vmware.nsxlib import base
|
||||
|
@ -20,6 +20,7 @@ import mock
|
||||
from neutron.common import constants
|
||||
from neutron.common import exceptions
|
||||
from neutron.tests.unit import test_api_v2
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import switch as switchlib
|
||||
from vmware_nsx.neutron.tests.unit.vmware.nsxlib import base
|
||||
|
@ -14,10 +14,11 @@
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
from neutron.plugins.vmware.api_client import exception
|
||||
from neutron.tests import base
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import (
|
||||
version as version_module)
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import router as routerlib
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import versioning
|
||||
|
||||
|
@ -14,17 +14,16 @@
|
||||
# limitations under the License.
|
||||
|
||||
import mock
|
||||
|
||||
from oslo.config import cfg
|
||||
|
||||
from neutron.common import constants as n_consts
|
||||
from neutron.common import exceptions as n_exc
|
||||
from neutron import context
|
||||
from neutron.plugins.vmware.api_client import exception
|
||||
from neutron.plugins.vmware.common import exceptions as p_exc
|
||||
from neutron.plugins.vmware.dbexts import lsn_db
|
||||
from neutron.tests import base
|
||||
from neutron.tests.unit import testlib_api
|
||||
from oslo.config import cfg
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as p_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import lsn_db
|
||||
from vmware_nsx.neutron.plugins.vmware.dhcp_meta import constants
|
||||
from vmware_nsx.neutron.plugins.vmware.dhcp_meta import lsnmanager as lsn_man
|
||||
from vmware_nsx.neutron.plugins.vmware.dhcp_meta import migration as mig_man
|
||||
|
@ -20,11 +20,12 @@ from oslo.config import cfg
|
||||
|
||||
from neutron import manager
|
||||
from neutron.openstack.common import uuidutils
|
||||
from neutron.plugins.vmware.common import exceptions
|
||||
from neutron.tests import base
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import client
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import version
|
||||
from vmware_nsx.neutron.plugins.vmware.common import config # noqa
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions
|
||||
from vmware_nsx.neutron.plugins.vmware.common import sync
|
||||
from vmware_nsx.neutron.plugins.vmware import nsx_cluster
|
||||
from vmware_nsx.neutron.plugins.vmware.nsxlib import lsn as lsnlib
|
||||
|
@ -38,16 +38,16 @@ from neutron.extensions import securitygroup as secgrp
|
||||
from neutron import manager
|
||||
from neutron.openstack.common import log
|
||||
from neutron.openstack.common import uuidutils
|
||||
from neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from neutron.tests.unit import _test_extension_portbindings as test_bindings
|
||||
import neutron.tests.unit.test_db_plugin as test_plugin
|
||||
import neutron.tests.unit.test_extension_ext_gw_mode as test_ext_gw_mode
|
||||
import neutron.tests.unit.test_extension_security_group as ext_sg
|
||||
import neutron.tests.unit.test_l3_plugin as test_l3_plugin
|
||||
from neutron.tests.unit import testlib_api
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import (
|
||||
version as version_module)
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import version as ver_module
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import sync
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import db as nsx_db
|
||||
@ -103,7 +103,7 @@ class NsxPluginV2TestCase(test_plugin.NeutronDbPluginV2TestCase):
|
||||
|
||||
# Emulate tests against NSX 2.x
|
||||
self.mock_instance.return_value.get_version.return_value = (
|
||||
version_module.Version("2.9"))
|
||||
ver_module.Version("2.9"))
|
||||
self.mock_instance.return_value.request.side_effect = (
|
||||
self.fc.fake_request)
|
||||
super(NsxPluginV2TestCase, self).setUp(plugin=plugin,
|
||||
@ -547,7 +547,7 @@ class TestL3NatTestCase(L3NatTest,
|
||||
def _test_router_create_with_distributed(self, dist_input, dist_expected,
|
||||
version='3.1', return_code=201):
|
||||
self.mock_instance.return_value.get_version.return_value = (
|
||||
version_module.Version(version))
|
||||
ver_module.Version(version))
|
||||
|
||||
data = {'tenant_id': 'whatever'}
|
||||
data['name'] = 'router1'
|
||||
|
@ -14,15 +14,15 @@
|
||||
# limitations under the License.
|
||||
|
||||
import mock
|
||||
|
||||
from neutron.db import api as db_api
|
||||
from neutron.extensions import multiprovidernet as mpnet
|
||||
from neutron.extensions import providernet as pnet
|
||||
from neutron.openstack.common import uuidutils
|
||||
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.dbexts import models
|
||||
from neutron.tests import base
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.api_client import exception as api_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import exceptions as nsx_exc
|
||||
from vmware_nsx.neutron.plugins.vmware.common import nsx_utils
|
||||
from vmware_nsx.neutron.plugins.vmware.common import utils
|
||||
from vmware_nsx.neutron.plugins.vmware import nsxlib
|
||||
|
Loading…
x
Reference in New Issue
Block a user