Merge "Fill in trunk_details on port resource"
This commit is contained in:
@@ -32,6 +32,8 @@ class Trunk(model_base.HasStandardAttributes, model_base.BASEV2,
|
|||||||
backref=sa.orm.backref('trunk_port', lazy='joined', uselist=False,
|
backref=sa.orm.backref('trunk_port', lazy='joined', uselist=False,
|
||||||
cascade='delete'))
|
cascade='delete'))
|
||||||
|
|
||||||
|
sub_ports = sa.orm.relationship('SubPort', lazy='joined', uselist=True)
|
||||||
|
|
||||||
|
|
||||||
class SubPort(model_base.BASEV2):
|
class SubPort(model_base.BASEV2):
|
||||||
|
|
||||||
|
|||||||
@@ -15,11 +15,13 @@
|
|||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
from oslo_utils import uuidutils
|
from oslo_utils import uuidutils
|
||||||
|
|
||||||
|
from neutron.api.v2 import attributes
|
||||||
from neutron.callbacks import events
|
from neutron.callbacks import events
|
||||||
from neutron.callbacks import registry
|
from neutron.callbacks import registry
|
||||||
from neutron.db import api as db_api
|
from neutron.db import api as db_api
|
||||||
from neutron.db import common_db_mixin
|
from neutron.db import common_db_mixin
|
||||||
from neutron.db import db_base_plugin_common
|
from neutron.db import db_base_plugin_common
|
||||||
|
from neutron.db import db_base_plugin_v2
|
||||||
from neutron.objects import base as objects_base
|
from neutron.objects import base as objects_base
|
||||||
from neutron.objects import trunk as trunk_objects
|
from neutron.objects import trunk as trunk_objects
|
||||||
from neutron.services import service_base
|
from neutron.services import service_base
|
||||||
@@ -30,12 +32,28 @@ from neutron.services.trunk import rules
|
|||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def _extend_port_trunk_details(core_plugin, port_res, port_db):
|
||||||
|
"""Add trunk details to a port."""
|
||||||
|
if port_db.trunk_port:
|
||||||
|
subports = [{'segmentation_id': x.segmentation_id,
|
||||||
|
'segmentation_type': x.segmentation_type,
|
||||||
|
'port_id': x.port_id}
|
||||||
|
for x in port_db.trunk_port.sub_ports]
|
||||||
|
trunk_details = {'trunk_id': port_db.trunk_port.id,
|
||||||
|
'sub_ports': subports}
|
||||||
|
port_res['trunk_details'] = trunk_details
|
||||||
|
|
||||||
|
return port_res
|
||||||
|
|
||||||
|
|
||||||
class TrunkPlugin(service_base.ServicePluginBase,
|
class TrunkPlugin(service_base.ServicePluginBase,
|
||||||
common_db_mixin.CommonDbMixin):
|
common_db_mixin.CommonDbMixin):
|
||||||
|
|
||||||
supported_extension_aliases = ["trunk", "trunk-details"]
|
supported_extension_aliases = ["trunk", "trunk-details"]
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs(
|
||||||
|
attributes.PORTS, [_extend_port_trunk_details])
|
||||||
self._segmentation_types = {}
|
self._segmentation_types = {}
|
||||||
registry.notify(constants.TRUNK_PLUGIN, events.AFTER_INIT, self)
|
registry.notify(constants.TRUNK_PLUGIN, events.AFTER_INIT, self)
|
||||||
LOG.debug('Trunk plugin loaded')
|
LOG.debug('Trunk plugin loaded')
|
||||||
|
|||||||
57
neutron/tests/tempest/api/test_trunk_details.py
Normal file
57
neutron/tests/tempest/api/test_trunk_details.py
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
# Copyright 2016 Hewlett Packard Enterprise Development Company LP
|
||||||
|
#
|
||||||
|
# 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 tempest import test
|
||||||
|
|
||||||
|
from neutron.tests.tempest.api import test_trunk
|
||||||
|
|
||||||
|
|
||||||
|
class TestTrunkDetailsJSON(test_trunk.TrunkTestJSONBase):
|
||||||
|
|
||||||
|
extension = 'trunk-details'
|
||||||
|
|
||||||
|
@test.idempotent_id('f0bed24f-d36a-498b-b4e7-0d66e3fb7308')
|
||||||
|
def test_port_resource_trunk_details_no_subports(self):
|
||||||
|
trunk = self._create_trunk_with_network_and_parent([])
|
||||||
|
port = self.client.show_port(trunk['trunk']['port_id'])
|
||||||
|
expected_trunk_details = {'sub_ports': [],
|
||||||
|
'trunk_id': trunk['trunk']['id']}
|
||||||
|
observed_trunk_details = port['port'].get('trunk_details')
|
||||||
|
self.assertIsNotNone(observed_trunk_details)
|
||||||
|
self.assertEqual(expected_trunk_details,
|
||||||
|
observed_trunk_details)
|
||||||
|
|
||||||
|
@test.idempotent_id('544bcaf2-86fb-4930-93ab-ece1c3cc33df')
|
||||||
|
def test_port_resource_trunk_details_with_subport(self):
|
||||||
|
subport_network = self.create_network()
|
||||||
|
parent_port = self.create_port(subport_network)
|
||||||
|
subport_data = {'port_id': parent_port['id'],
|
||||||
|
'segmentation_type': 'vlan',
|
||||||
|
'segmentation_id': 2}
|
||||||
|
trunk = self._create_trunk_with_network_and_parent([subport_data])
|
||||||
|
port = self.client.show_port(trunk['trunk']['port_id'])
|
||||||
|
expected_trunk_details = {'sub_ports': [subport_data],
|
||||||
|
'trunk_id': trunk['trunk']['id']}
|
||||||
|
observed_trunk_details = port['port'].get('trunk_details')
|
||||||
|
self.assertIsNotNone(observed_trunk_details)
|
||||||
|
self.assertEqual(expected_trunk_details,
|
||||||
|
observed_trunk_details)
|
||||||
|
|
||||||
|
@test.idempotent_id('fe6d865f-1d5c-432e-b65d-904157172f24')
|
||||||
|
def test_port_resource_empty_trunk_details(self):
|
||||||
|
network = self.create_network()
|
||||||
|
port = self.create_port(network)
|
||||||
|
port = self.client.show_port(port['id'])
|
||||||
|
observed_trunk_details = port['port'].get('trunk_details')
|
||||||
|
self.assertIsNone(observed_trunk_details)
|
||||||
Reference in New Issue
Block a user