--- /dev/null
- except exception.PortIsDown as e:
- return faults.Fault(faults.PortIsDown(e))
+# 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.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))
"attributes": {
"network": ["id", "name"],
"port": ["id", "state"],
- "attachment": ["id"]
-- },
- "plurals": {"networks": "network"}
++ "attachment": ["id"]},
+ "plurals": {"networks": "network",
+ "ports": "port"}
},
}
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 """
_serialization_metadata = {
"application/xml": {
"attributes": {
- "port": ["id", "state"], },
+ "port": ["id", "state"],
- "attachment": ["id"]
- },
++ "attachment": ["id"]},
"plurals": {"ports": "port"}
},
}
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):
specified Virtual Network.
"""
LOG.debug("FakePlugin.plug_interface() called")
- # Verify port state
- if port['state'] == 'DOWN':
- raise exc.PortIsDown(net_id=net_id, port_id=port_id)
+ port = self._get_port(tenant_id, net_id, port_id)
# Validate attachment
self._validate_attachment(tenant_id, net_id, port_id,
remote_interface_id)
show_port_res.body, content_type)
self.assertEqual({'id': port_id, 'state': new_port_state},
port_data['port'])
- self.assertEqual(update_port_res.status_int, 200)
+
+ # 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, 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):