]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Adding support for expressing format through Content-Type header
authorSalvatore Orlando <salvatore.orlando@eu.citrix.com>
Sun, 7 Aug 2011 23:31:31 +0000 (00:31 +0100)
committerSalvatore Orlando <salvatore.orlando@eu.citrix.com>
Sun, 7 Aug 2011 23:31:31 +0000 (00:31 +0100)
Adding action detail for port resource (Member & Collection)

quantum/api/__init__.py
quantum/api/ports.py
quantum/api/views/ports.py
quantum/common/wsgi.py

index 6abb6bed7805b7a8abf8fc9c749c94a1d37e0cfb..bee703a4cff1fc04d6cd4294a6ccbea62f2ae892 100644 (file)
@@ -58,6 +58,8 @@ class APIRouterV01(wsgi.Router):
                         path_prefix=uri_prefix)
         mapper.resource('port', 'ports',
                         controller=ports.Controller(plugin),
+                        collection={'detail': 'GET'},
+                        member={'detail': 'GET'},
                         parent_resource=dict(member_name='network',
                                              collection_name=uri_prefix +\
                                                  'networks'))
index 9255a26e3993acffaa28de54b89ebbfcd759b3bf..3b95e2d93cc2902da2d4f334343124ab455a646a 100644 (file)
@@ -36,7 +36,9 @@ class Controller(common.QuantumController):
     _serialization_metadata = {
         "application/xml": {
             "attributes": {
-                "port": ["id", "state"], },
+                "port": ["id", "state"],
+                "attachment": ["id"]
+                },
             "plurals": {"ports": "port"}
         },
     }
@@ -45,35 +47,54 @@ class Controller(common.QuantumController):
         self._resource_name = 'port'
         super(Controller, self).__init__(plugin)
 
-    def index(self, request, tenant_id, network_id):
-        """ Returns a list of port ids for a given network """
-        return self._items(request, tenant_id, network_id, is_detail=False)
-
-    def _items(self, request, tenant_id, network_id, is_detail):
-        """ Returns a list of networks. """
+    def _items(self, request, tenant_id, network_id,
+               port_details=False):
+        """ Returns a list of ports. """
         try:
             ports = self._plugin.get_all_ports(tenant_id, network_id)
             builder = ports_view.get_view_builder(request)
-            result = [builder.build(port, is_detail)['port']
+            result = [builder.build(port, port_details)['port']
                       for port in ports]
             return dict(ports=result)
         except exception.NetworkNotFound as e:
             return faults.Fault(faults.NetworkNotFound(e))
+        
+    def _item(self, request, tenant_id, network_id, port_id,
+              att_details=False):
+        """ Returns a specific port. """
+        port = self._plugin.get_port_details(
+                        tenant_id, network_id, port_id)
+        builder = ports_view.get_view_builder(request)
+        result = builder.build(port, port_details=True,
+                               att_details=att_details)['port']
+        return dict(port=result)
+
+    def index(self, request, tenant_id, network_id):
+        """ Returns a list of port ids for a given network """
+        return self._items(request, tenant_id, network_id, port_details=False)
 
     def show(self, request, tenant_id, network_id, id):
         """ Returns port details for given port and network """
         try:
-            port = self._plugin.get_port_details(
-                            tenant_id, network_id, id)
-            builder = ports_view.get_view_builder(request)
-            #build response with details
-            result = builder.build(port, True)['port']
-            return dict(port=result)
+            return self._item(request, tenant_id, network_id, id)
         except exception.NetworkNotFound as e:
             return faults.Fault(faults.NetworkNotFound(e))
         except exception.PortNotFound as e:
             return faults.Fault(faults.PortNotFound(e))
 
+    def detail(self, request, **kwargs):
+        tenant_id = kwargs.get('tenant_id')
+        network_id = kwargs.get('network_id')
+        port_id = kwargs.get('id')
+        if port_id:
+            # show details for a given network
+            return self._item(request, tenant_id, 
+                              network_id, port_id, att_details=True)
+        else:
+            # show details for all port
+            return self._items(request, tenant_id, 
+                               network_id, port_details=True)
+
     def create(self, request, tenant_id, network_id):
         """ Creates a new port for a given network """
         #look for port state in request
index b743888ce35804f1716a76e67a99f0e1b63479ca..747ce1442e4ea1fcfd0919dcbe98a52eef9695ce 100644 (file)
@@ -29,19 +29,11 @@ class ViewBuilder(object):
         """
         self.base_url = base_url
 
-    def build(self, port_data, is_detail=False):
+    def build(self, port_data, port_details=False, att_details=False):
         """Generic method used to generate a port entity."""
-        if is_detail:
-            port = self._build_detail(port_data)
-        else:
-            port = self._build_simple(port_data)
+        port = dict(port=dict(id=port_data['port-id']))
+        if port_details: 
+            port['port']['state'] = port_data['port-state']
+        if att_details and port_data['attachment-id']:
+            port['attachment'] = dict(id=port_data['attachment-id'])
         return port
-
-    def _build_simple(self, port_data):
-        """Return a simple model of a port."""
-        return dict(port=dict(id=port_data['port-id']))
-
-    def _build_detail(self, port_data):
-        """Return a simple model of a port (with its state)."""
-        return dict(port=dict(id=port_data['port-id'],
-                              state=port_data['port-state']))
index ca9734e878e8f4d4cce85065429bd2c3a7c67b09..c6d66fa71da71518fe32822686a32690b9c78c49 100644 (file)
@@ -122,14 +122,21 @@ class Request(webob.Request):
         Based on the query extension then the Accept header.
 
         """
+        # First lookup http request
         parts = self.path.rsplit('.', 1)
         LOG.debug("Request parts:%s", parts)
         if len(parts) > 1:
             format = parts[1]
             if format in ['json', 'xml']:
                 return 'application/{0}'.format(parts[1])
-
+        
+        #Then look up content header
+        type_from_header = self.get_content_type()
+        if type_from_header:
+            return type_from_header
         ctypes = ['application/json', 'application/xml']
+        
+        #Finally search in Accept-* headers
         bm = self.accept.best_match(ctypes)
         return bm or 'application/json'
 
@@ -143,7 +150,7 @@ class Request(webob.Request):
         if type in allowed_types:
             return type
         LOG.debug(_("Wrong Content-Type: %s") % type)
-        raise webob.exc.HTTPBadRequest("Invalid content type")
+        return None
 
 
 class Application(object):