From: Salvatore Orlando Date: Wed, 10 Aug 2011 12:09:48 +0000 (+0100) Subject: Merge Trunk X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=a0d562044d6940acae8f7df23471fcbb7456b837;p=openstack-build%2Fneutron-build.git Merge Trunk Resolve conflicts Remove constraint on duplicate names for tenant's networks and NetworkNameExists exception Remove PortIsDown exception and related constraint on interface plug --- a0d562044d6940acae8f7df23471fcbb7456b837 diff --cc quantum/api/attachments.py index acb5bcab3,000000000..14f4d9405 mode 100644,000000..100644 --- a/quantum/api/attachments.py +++ b/quantum/api/attachments.py @@@ -1,88 -1,0 +1,86 @@@ +# Copyright 2011 Citrix Systems. +# 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 logging + +from webob import exc + +from quantum.api import api_common as common +from quantum.api import faults +from quantum.api.views import attachments as attachments_view +from quantum.common import exceptions as exception + +LOG = logging.getLogger('quantum.api.ports') + + +class Controller(common.QuantumController): + """ Port API controller for Quantum API """ + + _attachment_ops_param_list = [{ + 'param-name': 'id', + 'required': True}, ] + + _serialization_metadata = { + "application/xml": { + "attributes": { + "attachment": ["id"], } + }, + } + + def __init__(self, plugin): + self._resource_name = 'attachment' + super(Controller, self).__init__(plugin) + + def get_resource(self, request, tenant_id, network_id, id): + try: + att_data = self._plugin.get_port_details( + tenant_id, network_id, id) + builder = attachments_view.get_view_builder(request) + result = builder.build(att_data)['attachment'] + return dict(attachment=result) + except exception.NetworkNotFound as e: + return faults.Fault(faults.NetworkNotFound(e)) + except exception.PortNotFound as e: + return faults.Fault(faults.PortNotFound(e)) + + def attach_resource(self, request, tenant_id, network_id, id): + try: + request_params = \ + self._parse_request_params(request, + self._attachment_ops_param_list) + except exc.HTTPError as e: + return faults.Fault(e) + try: + self._plugin.plug_interface(tenant_id, network_id, id, + request_params['id']) + return exc.HTTPNoContent() + except exception.NetworkNotFound as e: + return faults.Fault(faults.NetworkNotFound(e)) + except exception.PortNotFound as e: + return faults.Fault(faults.PortNotFound(e)) + except exception.PortInUse as e: + return faults.Fault(faults.PortInUse(e)) - except exception.PortIsDown as e: - return faults.Fault(faults.PortIsDown(e)) + except exception.AlreadyAttached as e: + return faults.Fault(faults.AlreadyAttached(e)) + + def detach_resource(self, request, tenant_id, network_id, id): + try: + self._plugin.unplug_interface(tenant_id, + network_id, id) + return exc.HTTPNoContent() + except exception.NetworkNotFound as e: + return faults.Fault(faults.NetworkNotFound(e)) + except exception.PortNotFound as e: + return faults.Fault(faults.PortNotFound(e)) diff --cc quantum/api/networks.py index 58d105155,27709eb59..3f733b8f9 --- a/quantum/api/networks.py +++ b/quantum/api/networks.py @@@ -37,10 -37,8 +37,9 @@@ class Controller(common.QuantumControll "attributes": { "network": ["id", "name"], "port": ["id", "state"], - "attachment": ["id"] -- }, - "plurals": {"networks": "network"} ++ "attachment": ["id"]}, + "plurals": {"networks": "network", + "ports": "port"} }, } @@@ -104,13 -107,15 +103,13 @@@ self._network_ops_param_list) except exc.HTTPError as e: return faults.Fault(e) - try: - network = self._plugin.\ - create_network(tenant_id, - request_params['net-name']) - builder = networks_view.get_view_builder(request) - result = builder.build(network) - return dict(networks=result) - except exception.NetworkNameExists as e: - return faults.Fault(faults.NetworkNameExists(e)) + network = self._plugin.\ - create_network(tenant_id, - request_params['name']) ++ create_network(tenant_id, ++ request_params['name']) + builder = networks_view.get_view_builder(request) + result = builder.build(network)['network'] + #MUST RETURN 202??? + return dict(network=result) def update(self, request, tenant_id, id): """ Updates the name for the network with the given id """ diff --cc quantum/api/ports.py index 0568e1575,042ea673c..f9a44ea53 --- a/quantum/api/ports.py +++ b/quantum/api/ports.py @@@ -36,9 -36,11 +36,8 @@@ class Controller(common.QuantumControll _serialization_metadata = { "application/xml": { "attributes": { - "port": ["id", "state"], }, + "port": ["id", "state"], - "attachment": ["id"] - }, ++ "attachment": ["id"]}, "plurals": {"ports": "port"} }, } diff --cc quantum/db/api.py index ebdc3cb1a,436df8415..0c7e9d218 --- a/quantum/db/api.py +++ b/quantum/db/api.py @@@ -78,21 -76,29 +79,33 @@@ def unregister_models() BASE.metadata.drop_all(_ENGINE) - def network_create(tenant_id, name): + def _check_duplicate_net_name(tenant_id, net_name): ++ """Checks whether a network with the same name ++ already exists for the tenant. ++ """ ++ ++ #TODO(salvatore-orlando): Not used anymore - candidate for removal session = get_session() - net = None try: net = session.query(models.Network).\ - filter_by(tenant_id=tenant_id, name=name).\ + filter_by(tenant_id=tenant_id, name=net_name).\ one() - raise Exception("Network with name %(name)s already " \ - "exists for tenant %(tenant_id)s" % locals()) + raise q_exc.NetworkNameExists(tenant_id=tenant_id, + net_name=net_name, net_id=net.uuid) except exc.NoResultFound: - with session.begin(): - net = models.Network(tenant_id, name) - session.add(net) - session.flush() - return net + # this is the "normal" path, as API spec specifies + # that net-names are unique within a tenant + pass + + + def network_create(tenant_id, name): + session = get_session() + - _check_duplicate_net_name(tenant_id, name) + with session.begin(): + net = models.Network(tenant_id, name) + session.add(net) + session.flush() + return net def network_list(tenant_id): diff --cc quantum/plugins/SamplePlugin.py index 62feffebc,9b155a2c1..73b8f256a --- a/quantum/plugins/SamplePlugin.py +++ b/quantum/plugins/SamplePlugin.py @@@ -405,10 -402,6 +402,7 @@@ class FakePlugin(object) specified Virtual Network. """ LOG.debug("FakePlugin.plug_interface() called") + port = self._get_port(tenant_id, net_id, port_id) - # Verify port state - if port['state'] == 'DOWN': - raise exc.PortIsDown(net_id=net_id, port_id=port_id) # Validate attachment self._validate_attachment(tenant_id, net_id, port_id, remote_interface_id) diff --cc tests/unit/test_api.py index dc778b0e7,dfda244c6..e46032e28 --- a/tests/unit/test_api.py +++ b/tests/unit/test_api.py @@@ -527,6 -440,23 +527,23 @@@ class APITest(unittest.TestCase) show_port_res.body, content_type) self.assertEqual({'id': port_id, 'state': new_port_state}, port_data['port']) + + # now set it back to the original value + update_port_req = testlib.update_port_request(self.tenant_id, + network_id, port_id, + port_state, + format) + update_port_res = update_port_req.get_response(self.api) - self.assertEqual(update_port_res.status_int, 200) ++ self.assertEqual(update_port_res.status_int, 204) + show_port_req = testlib.show_port_request(self.tenant_id, + network_id, port_id, + format) + show_port_res = show_port_req.get_response(self.api) + self.assertEqual(show_port_res.status_int, 200) + port_data = self._port_serializer.deserialize( + show_port_res.body, content_type) + self.assertEqual({'id': port_id, 'state': port_state}, + port_data['port']) LOG.debug("_test_set_port_state - format:%s - END", format) def _test_set_port_state_networknotfound(self, format):