Merge lp:~salvatore-orlando/neutron/bug804237 into lp:neutron/diablo

Proposed by Salvatore Orlando
Status: Merged
Approved by: Somik Behera
Approved revision: 24
Merged at revision: 22
Proposed branch: lp:~salvatore-orlando/neutron/bug804237
Merge into: lp:neutron/diablo
Diff against target: 261 lines (+29/-34)
5 files modified
quantum/api/__init__.py (+8/-7)
quantum/api/api_common.py (+2/-6)
quantum/api/networks.py (+7/-7)
quantum/api/ports.py (+10/-10)
quantum/manager.py (+2/-4)
To merge this branch: bzr merge lp:~salvatore-orlando/neutron/bug804237
Reviewer Review Type Date Requested Status
Brad Hall (community) Approve
Somik Behera netstack-core Approve
dan wendlandt Pending
Review via email: mp+66767@code.launchpad.net

Description of the change

The proposed bug fix will avoid loading the plugin multiple times by loading it once when API routes are set up.
The same plugin instance will be passed to all controllers.

To post a comment you must log in.
Revision history for this message
Salvatore Orlando (salvatore-orlando) wrote :

Moving back to WIP until we merge the unit-tests branch

Revision history for this message
Somik Behera (somikbehera) wrote :

Changes look good and uptil they pass the existing unit test, I dont see this change requiring full exhaustive tests, since if this change works ok for couple of API tests, it will work for everything else.

This seems to be a critical fix, so I vote that we merge it to trunk.

review: Approve (netstack-core)
Revision history for this message
Brad Hall (bgh) wrote :

Looks good to me

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'quantum/api/__init__.py'
--- quantum/api/__init__.py 2011-06-08 10:21:47 +0000
+++ quantum/api/__init__.py 2011-07-05 10:28:00 +0000
@@ -24,6 +24,7 @@
24import webob.dec24import webob.dec
25import webob.exc25import webob.exc
2626
27from quantum import manager
27from quantum.api import faults28from quantum.api import faults
28from quantum.api import networks29from quantum.api import networks
29from quantum.api import ports30from quantum.api import ports
@@ -46,32 +47,32 @@
46 super(APIRouterV01, self).__init__(mapper)47 super(APIRouterV01, self).__init__(mapper)
4748
48 def _setup_routes(self, mapper):49 def _setup_routes(self, mapper):
4950 # Loads the quantum plugin
51 plugin = manager.QuantumManager().get_plugin()
50 uri_prefix = '/tenants/{tenant_id}/'52 uri_prefix = '/tenants/{tenant_id}/'
51 mapper.resource('network', 'networks',53 mapper.resource('network', 'networks',
52 controller=networks.Controller(),54 controller=networks.Controller(plugin),
53 path_prefix=uri_prefix)55 path_prefix=uri_prefix)
54 mapper.resource('port', 'ports',56 mapper.resource('port', 'ports',
55 controller=ports.Controller(),57 controller=ports.Controller(plugin),
56 parent_resource=dict(member_name='network',58 parent_resource=dict(member_name='network',
57 collection_name=uri_prefix +\59 collection_name=uri_prefix +\
58 'networks'))60 'networks'))
59
60 mapper.connect("get_resource",61 mapper.connect("get_resource",
61 uri_prefix + 'networks/{network_id}/' \62 uri_prefix + 'networks/{network_id}/' \
62 'ports/{id}/attachment{.format}',63 'ports/{id}/attachment{.format}',
63 controller=ports.Controller(),64 controller=ports.Controller(plugin),
64 action="get_resource",65 action="get_resource",
65 conditions=dict(method=['GET']))66 conditions=dict(method=['GET']))
66 mapper.connect("attach_resource",67 mapper.connect("attach_resource",
67 uri_prefix + 'networks/{network_id}/' \68 uri_prefix + 'networks/{network_id}/' \
68 'ports/{id}/attachment{.format}',69 'ports/{id}/attachment{.format}',
69 controller=ports.Controller(),70 controller=ports.Controller(plugin),
70 action="attach_resource",71 action="attach_resource",
71 conditions=dict(method=['PUT']))72 conditions=dict(method=['PUT']))
72 mapper.connect("detach_resource",73 mapper.connect("detach_resource",
73 uri_prefix + 'networks/{network_id}/' \74 uri_prefix + 'networks/{network_id}/' \
74 'ports/{id}/attachment{.format}',75 'ports/{id}/attachment{.format}',
75 controller=ports.Controller(),76 controller=ports.Controller(plugin),
76 action="detach_resource",77 action="detach_resource",
77 conditions=dict(method=['DELETE']))78 conditions=dict(method=['DELETE']))
7879
=== modified file 'quantum/api/api_common.py'
--- quantum/api/api_common.py 2011-05-31 17:15:00 +0000
+++ quantum/api/api_common.py 2011-07-05 10:28:00 +0000
@@ -19,7 +19,6 @@
1919
20from webob import exc20from webob import exc
2121
22from quantum import manager
23from quantum.common import wsgi22from quantum.common import wsgi
2423
25XML_NS_V01 = 'http://netstack.org/quantum/api/v0.1'24XML_NS_V01 = 'http://netstack.org/quantum/api/v0.1'
@@ -30,8 +29,8 @@
30class QuantumController(wsgi.Controller):29class QuantumController(wsgi.Controller):
31 """ Base controller class for Quantum API """30 """ Base controller class for Quantum API """
3231
33 def __init__(self, plugin_conf_file=None):32 def __init__(self, plugin):
34 self._setup_network_manager()33 self._plugin = plugin
35 super(QuantumController, self).__init__()34 super(QuantumController, self).__init__()
3635
37 def _parse_request_params(self, req, params):36 def _parse_request_params(self, req, params):
@@ -65,6 +64,3 @@
65 raise exc.HTTPBadRequest(msg)64 raise exc.HTTPBadRequest(msg)
66 results[param_name] = param_value or param.get('default-value')65 results[param_name] = param_value or param.get('default-value')
67 return results66 return results
68
69 def _setup_network_manager(self):
70 self.network_manager = manager.QuantumManager().get_manager()
7167
=== modified file 'quantum/api/networks.py'
--- quantum/api/networks.py 2011-06-08 10:21:47 +0000
+++ quantum/api/networks.py 2011-07-05 10:28:00 +0000
@@ -40,9 +40,9 @@
40 },40 },
41 }41 }
4242
43 def __init__(self, plugin_conf_file=None):43 def __init__(self, plugin):
44 self._resource_name = 'network'44 self._resource_name = 'network'
45 super(Controller, self).__init__()45 super(Controller, self).__init__(plugin)
4646
47 def index(self, request, tenant_id):47 def index(self, request, tenant_id):
48 """ Returns a list of network ids """48 """ Returns a list of network ids """
@@ -51,7 +51,7 @@
5151
52 def _items(self, request, tenant_id, is_detail):52 def _items(self, request, tenant_id, is_detail):
53 """ Returns a list of networks. """53 """ Returns a list of networks. """
54 networks = self.network_manager.get_all_networks(tenant_id)54 networks = self._plugin.get_all_networks(tenant_id)
55 builder = networks_view.get_view_builder(request)55 builder = networks_view.get_view_builder(request)
56 result = [builder.build(network, is_detail)['network']56 result = [builder.build(network, is_detail)['network']
57 for network in networks]57 for network in networks]
@@ -60,7 +60,7 @@
60 def show(self, request, tenant_id, id):60 def show(self, request, tenant_id, id):
61 """ Returns network details for the given network id """61 """ Returns network details for the given network id """
62 try:62 try:
63 network = self.network_manager.get_network_details(63 network = self._plugin.get_network_details(
64 tenant_id, id)64 tenant_id, id)
65 builder = networks_view.get_view_builder(request)65 builder = networks_view.get_view_builder(request)
66 #build response with details66 #build response with details
@@ -78,7 +78,7 @@
78 self._network_ops_param_list)78 self._network_ops_param_list)
79 except exc.HTTPError as e:79 except exc.HTTPError as e:
80 return faults.Fault(e)80 return faults.Fault(e)
81 network = self.network_manager.\81 network = self._plugin.\
82 create_network(tenant_id,82 create_network(tenant_id,
83 request_params['network-name'])83 request_params['network-name'])
84 builder = networks_view.get_view_builder(request)84 builder = networks_view.get_view_builder(request)
@@ -94,7 +94,7 @@
94 except exc.HTTPError as e:94 except exc.HTTPError as e:
95 return faults.Fault(e)95 return faults.Fault(e)
96 try:96 try:
97 network = self.network_manager.rename_network(tenant_id,97 network = self._plugin.rename_network(tenant_id,
98 id, request_params['network-name'])98 id, request_params['network-name'])
9999
100 builder = networks_view.get_view_builder(request)100 builder = networks_view.get_view_builder(request)
@@ -106,7 +106,7 @@
106 def delete(self, request, tenant_id, id):106 def delete(self, request, tenant_id, id):
107 """ Destroys the network with the given id """107 """ Destroys the network with the given id """
108 try:108 try:
109 self.network_manager.delete_network(tenant_id, id)109 self._plugin.delete_network(tenant_id, id)
110 return exc.HTTPAccepted()110 return exc.HTTPAccepted()
111 except exception.NetworkNotFound as e:111 except exception.NetworkNotFound as e:
112 return faults.Fault(faults.NetworkNotFound(e))112 return faults.Fault(faults.NetworkNotFound(e))
113113
=== modified file 'quantum/api/ports.py'
--- quantum/api/ports.py 2011-06-08 10:21:47 +0000
+++ quantum/api/ports.py 2011-07-05 10:28:00 +0000
@@ -42,9 +42,9 @@
42 "attributes": {42 "attributes": {
43 "port": ["id", "state"], }, }, }43 "port": ["id", "state"], }, }, }
4444
45 def __init__(self, plugin_conf_file=None):45 def __init__(self, plugin):
46 self._resource_name = 'port'46 self._resource_name = 'port'
47 super(Controller, self).__init__()47 super(Controller, self).__init__(plugin)
4848
49 def index(self, request, tenant_id, network_id):49 def index(self, request, tenant_id, network_id):
50 """ Returns a list of port ids for a given network """50 """ Returns a list of port ids for a given network """
@@ -53,7 +53,7 @@
53 def _items(self, request, tenant_id, network_id, is_detail):53 def _items(self, request, tenant_id, network_id, is_detail):
54 """ Returns a list of networks. """54 """ Returns a list of networks. """
55 try:55 try:
56 ports = self.network_manager.get_all_ports(tenant_id, network_id)56 ports = self._plugin.get_all_ports(tenant_id, network_id)
57 builder = ports_view.get_view_builder(request)57 builder = ports_view.get_view_builder(request)
58 result = [builder.build(port, is_detail)['port']58 result = [builder.build(port, is_detail)['port']
59 for port in ports]59 for port in ports]
@@ -64,7 +64,7 @@
64 def show(self, request, tenant_id, network_id, id):64 def show(self, request, tenant_id, network_id, id):
65 """ Returns port details for given port and network """65 """ Returns port details for given port and network """
66 try:66 try:
67 port = self.network_manager.get_port_details(67 port = self._plugin.get_port_details(
68 tenant_id, network_id, id)68 tenant_id, network_id, id)
69 builder = ports_view.get_view_builder(request)69 builder = ports_view.get_view_builder(request)
70 #build response with details70 #build response with details
@@ -84,7 +84,7 @@
84 except exc.HTTPError as e:84 except exc.HTTPError as e:
85 return faults.Fault(e)85 return faults.Fault(e)
86 try:86 try:
87 port = self.network_manager.create_port(tenant_id,87 port = self._plugin.create_port(tenant_id,
88 network_id,88 network_id,
89 request_params['port-state'])89 request_params['port-state'])
90 builder = ports_view.get_view_builder(request)90 builder = ports_view.get_view_builder(request)
@@ -104,7 +104,7 @@
104 except exc.HTTPError as e:104 except exc.HTTPError as e:
105 return faults.Fault(e)105 return faults.Fault(e)
106 try:106 try:
107 port = self.network_manager.update_port(tenant_id, network_id, id,107 port = self._plugin.update_port(tenant_id, network_id, id,
108 request_params['port-state'])108 request_params['port-state'])
109 builder = ports_view.get_view_builder(request)109 builder = ports_view.get_view_builder(request)
110 result = builder.build(port, True)110 result = builder.build(port, True)
@@ -120,7 +120,7 @@
120 """ Destroys the port with the given id """120 """ Destroys the port with the given id """
121 #look for port state in request121 #look for port state in request
122 try:122 try:
123 self.network_manager.delete_port(tenant_id, network_id, id)123 self._plugin.delete_port(tenant_id, network_id, id)
124 return exc.HTTPAccepted()124 return exc.HTTPAccepted()
125 #TODO(salvatore-orlando): Handle portInUse error125 #TODO(salvatore-orlando): Handle portInUse error
126 except exception.NetworkNotFound as e:126 except exception.NetworkNotFound as e:
@@ -132,7 +132,7 @@
132132
133 def get_resource(self, request, tenant_id, network_id, id):133 def get_resource(self, request, tenant_id, network_id, id):
134 try:134 try:
135 result = self.network_manager.get_interface_details(135 result = self._plugin.get_interface_details(
136 tenant_id, network_id, id)136 tenant_id, network_id, id)
137 return dict(attachment=result)137 return dict(attachment=result)
138 except exception.NetworkNotFound as e:138 except exception.NetworkNotFound as e:
@@ -151,7 +151,7 @@
151 except exc.HTTPError as e:151 except exc.HTTPError as e:
152 return faults.Fault(e)152 return faults.Fault(e)
153 try:153 try:
154 self.network_manager.plug_interface(tenant_id,154 self._plugin.plug_interface(tenant_id,
155 network_id, id,155 network_id, id,
156 request_params['attachment-id'])156 request_params['attachment-id'])
157 return exc.HTTPAccepted()157 return exc.HTTPAccepted()
@@ -167,7 +167,7 @@
167 #TODO - Complete implementation of these APIs167 #TODO - Complete implementation of these APIs
168 def detach_resource(self, request, tenant_id, network_id, id):168 def detach_resource(self, request, tenant_id, network_id, id):
169 try:169 try:
170 self.network_manager.unplug_interface(tenant_id,170 self._plugin.unplug_interface(tenant_id,
171 network_id, id)171 network_id, id)
172 return exc.HTTPAccepted()172 return exc.HTTPAccepted()
173 except exception.NetworkNotFound as e:173 except exception.NetworkNotFound as e:
174174
=== modified file 'quantum/manager.py'
--- quantum/manager.py 2011-06-08 10:21:47 +0000
+++ quantum/manager.py 2011-07-05 10:28:00 +0000
@@ -26,10 +26,9 @@
26"""26"""
27import gettext27import gettext
28import os28import os
29
29gettext.install('quantum', unicode=1)30gettext.install('quantum', unicode=1)
3031
31import os
32
33from common import utils32from common import utils
34from quantum_plugin_base import QuantumPluginBase33from quantum_plugin_base import QuantumPluginBase
3534
@@ -51,7 +50,6 @@
51 else:50 else:
52 self.configuration_file = config51 self.configuration_file = config
53 plugin_location = utils.getPluginFromConfig(self.configuration_file)52 plugin_location = utils.getPluginFromConfig(self.configuration_file)
54 print "PLUGIN LOCATION:%s" % plugin_location
55 plugin_klass = utils.import_class(plugin_location)53 plugin_klass = utils.import_class(plugin_location)
56 if not issubclass(plugin_klass, QuantumPluginBase):54 if not issubclass(plugin_klass, QuantumPluginBase):
57 raise Exception("Configured Quantum plug-in " \55 raise Exception("Configured Quantum plug-in " \
@@ -61,5 +59,5 @@
61 "All compatibility tests passed\n")59 "All compatibility tests passed\n")
62 self.plugin = plugin_klass()60 self.plugin = plugin_klass()
6361
64 def get_manager(self):62 def get_plugin(self):
65 return self.plugin63 return self.plugin

Subscribers

People subscribed via source and target branches