Merge lp:~salvatore-orlando/neutron/bug804237 into lp:neutron/diablo
- bug804237
- Merge into 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 | ||||
Related bugs: |
|
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 |
Commit message
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 : | # |
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)
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'quantum/api/__init__.py' | |||
2 | --- quantum/api/__init__.py 2011-06-08 10:21:47 +0000 | |||
3 | +++ quantum/api/__init__.py 2011-07-05 10:28:00 +0000 | |||
4 | @@ -24,6 +24,7 @@ | |||
5 | 24 | import webob.dec | 24 | import webob.dec |
6 | 25 | import webob.exc | 25 | import webob.exc |
7 | 26 | 26 | ||
8 | 27 | from quantum import manager | ||
9 | 27 | from quantum.api import faults | 28 | from quantum.api import faults |
10 | 28 | from quantum.api import networks | 29 | from quantum.api import networks |
11 | 29 | from quantum.api import ports | 30 | from quantum.api import ports |
12 | @@ -46,32 +47,32 @@ | |||
13 | 46 | super(APIRouterV01, self).__init__(mapper) | 47 | super(APIRouterV01, self).__init__(mapper) |
14 | 47 | 48 | ||
15 | 48 | def _setup_routes(self, mapper): | 49 | def _setup_routes(self, mapper): |
17 | 49 | 50 | # Loads the quantum plugin | |
18 | 51 | plugin = manager.QuantumManager().get_plugin() | ||
19 | 50 | uri_prefix = '/tenants/{tenant_id}/' | 52 | uri_prefix = '/tenants/{tenant_id}/' |
20 | 51 | mapper.resource('network', 'networks', | 53 | mapper.resource('network', 'networks', |
22 | 52 | controller=networks.Controller(), | 54 | controller=networks.Controller(plugin), |
23 | 53 | path_prefix=uri_prefix) | 55 | path_prefix=uri_prefix) |
24 | 54 | mapper.resource('port', 'ports', | 56 | mapper.resource('port', 'ports', |
26 | 55 | controller=ports.Controller(), | 57 | controller=ports.Controller(plugin), |
27 | 56 | parent_resource=dict(member_name='network', | 58 | parent_resource=dict(member_name='network', |
28 | 57 | collection_name=uri_prefix +\ | 59 | collection_name=uri_prefix +\ |
29 | 58 | 'networks')) | 60 | 'networks')) |
30 | 59 | |||
31 | 60 | mapper.connect("get_resource", | 61 | mapper.connect("get_resource", |
32 | 61 | uri_prefix + 'networks/{network_id}/' \ | 62 | uri_prefix + 'networks/{network_id}/' \ |
33 | 62 | 'ports/{id}/attachment{.format}', | 63 | 'ports/{id}/attachment{.format}', |
35 | 63 | controller=ports.Controller(), | 64 | controller=ports.Controller(plugin), |
36 | 64 | action="get_resource", | 65 | action="get_resource", |
37 | 65 | conditions=dict(method=['GET'])) | 66 | conditions=dict(method=['GET'])) |
38 | 66 | mapper.connect("attach_resource", | 67 | mapper.connect("attach_resource", |
39 | 67 | uri_prefix + 'networks/{network_id}/' \ | 68 | uri_prefix + 'networks/{network_id}/' \ |
40 | 68 | 'ports/{id}/attachment{.format}', | 69 | 'ports/{id}/attachment{.format}', |
42 | 69 | controller=ports.Controller(), | 70 | controller=ports.Controller(plugin), |
43 | 70 | action="attach_resource", | 71 | action="attach_resource", |
44 | 71 | conditions=dict(method=['PUT'])) | 72 | conditions=dict(method=['PUT'])) |
45 | 72 | mapper.connect("detach_resource", | 73 | mapper.connect("detach_resource", |
46 | 73 | uri_prefix + 'networks/{network_id}/' \ | 74 | uri_prefix + 'networks/{network_id}/' \ |
47 | 74 | 'ports/{id}/attachment{.format}', | 75 | 'ports/{id}/attachment{.format}', |
49 | 75 | controller=ports.Controller(), | 76 | controller=ports.Controller(plugin), |
50 | 76 | action="detach_resource", | 77 | action="detach_resource", |
51 | 77 | conditions=dict(method=['DELETE'])) | 78 | conditions=dict(method=['DELETE'])) |
52 | 78 | 79 | ||
53 | === modified file 'quantum/api/api_common.py' | |||
54 | --- quantum/api/api_common.py 2011-05-31 17:15:00 +0000 | |||
55 | +++ quantum/api/api_common.py 2011-07-05 10:28:00 +0000 | |||
56 | @@ -19,7 +19,6 @@ | |||
57 | 19 | 19 | ||
58 | 20 | from webob import exc | 20 | from webob import exc |
59 | 21 | 21 | ||
60 | 22 | from quantum import manager | ||
61 | 23 | from quantum.common import wsgi | 22 | from quantum.common import wsgi |
62 | 24 | 23 | ||
63 | 25 | XML_NS_V01 = 'http://netstack.org/quantum/api/v0.1' | 24 | XML_NS_V01 = 'http://netstack.org/quantum/api/v0.1' |
64 | @@ -30,8 +29,8 @@ | |||
65 | 30 | class QuantumController(wsgi.Controller): | 29 | class QuantumController(wsgi.Controller): |
66 | 31 | """ Base controller class for Quantum API """ | 30 | """ Base controller class for Quantum API """ |
67 | 32 | 31 | ||
70 | 33 | def __init__(self, plugin_conf_file=None): | 32 | def __init__(self, plugin): |
71 | 34 | self._setup_network_manager() | 33 | self._plugin = plugin |
72 | 35 | super(QuantumController, self).__init__() | 34 | super(QuantumController, self).__init__() |
73 | 36 | 35 | ||
74 | 37 | def _parse_request_params(self, req, params): | 36 | def _parse_request_params(self, req, params): |
75 | @@ -65,6 +64,3 @@ | |||
76 | 65 | raise exc.HTTPBadRequest(msg) | 64 | raise exc.HTTPBadRequest(msg) |
77 | 66 | results[param_name] = param_value or param.get('default-value') | 65 | results[param_name] = param_value or param.get('default-value') |
78 | 67 | return results | 66 | return results |
79 | 68 | |||
80 | 69 | def _setup_network_manager(self): | ||
81 | 70 | self.network_manager = manager.QuantumManager().get_manager() | ||
82 | 71 | 67 | ||
83 | === modified file 'quantum/api/networks.py' | |||
84 | --- quantum/api/networks.py 2011-06-08 10:21:47 +0000 | |||
85 | +++ quantum/api/networks.py 2011-07-05 10:28:00 +0000 | |||
86 | @@ -40,9 +40,9 @@ | |||
87 | 40 | }, | 40 | }, |
88 | 41 | } | 41 | } |
89 | 42 | 42 | ||
91 | 43 | def __init__(self, plugin_conf_file=None): | 43 | def __init__(self, plugin): |
92 | 44 | self._resource_name = 'network' | 44 | self._resource_name = 'network' |
94 | 45 | super(Controller, self).__init__() | 45 | super(Controller, self).__init__(plugin) |
95 | 46 | 46 | ||
96 | 47 | def index(self, request, tenant_id): | 47 | def index(self, request, tenant_id): |
97 | 48 | """ Returns a list of network ids """ | 48 | """ Returns a list of network ids """ |
98 | @@ -51,7 +51,7 @@ | |||
99 | 51 | 51 | ||
100 | 52 | def _items(self, request, tenant_id, is_detail): | 52 | def _items(self, request, tenant_id, is_detail): |
101 | 53 | """ Returns a list of networks. """ | 53 | """ Returns a list of networks. """ |
103 | 54 | networks = self.network_manager.get_all_networks(tenant_id) | 54 | networks = self._plugin.get_all_networks(tenant_id) |
104 | 55 | builder = networks_view.get_view_builder(request) | 55 | builder = networks_view.get_view_builder(request) |
105 | 56 | result = [builder.build(network, is_detail)['network'] | 56 | result = [builder.build(network, is_detail)['network'] |
106 | 57 | for network in networks] | 57 | for network in networks] |
107 | @@ -60,7 +60,7 @@ | |||
108 | 60 | def show(self, request, tenant_id, id): | 60 | def show(self, request, tenant_id, id): |
109 | 61 | """ Returns network details for the given network id """ | 61 | """ Returns network details for the given network id """ |
110 | 62 | try: | 62 | try: |
112 | 63 | network = self.network_manager.get_network_details( | 63 | network = self._plugin.get_network_details( |
113 | 64 | tenant_id, id) | 64 | tenant_id, id) |
114 | 65 | builder = networks_view.get_view_builder(request) | 65 | builder = networks_view.get_view_builder(request) |
115 | 66 | #build response with details | 66 | #build response with details |
116 | @@ -78,7 +78,7 @@ | |||
117 | 78 | self._network_ops_param_list) | 78 | self._network_ops_param_list) |
118 | 79 | except exc.HTTPError as e: | 79 | except exc.HTTPError as e: |
119 | 80 | return faults.Fault(e) | 80 | return faults.Fault(e) |
121 | 81 | network = self.network_manager.\ | 81 | network = self._plugin.\ |
122 | 82 | create_network(tenant_id, | 82 | create_network(tenant_id, |
123 | 83 | request_params['network-name']) | 83 | request_params['network-name']) |
124 | 84 | builder = networks_view.get_view_builder(request) | 84 | builder = networks_view.get_view_builder(request) |
125 | @@ -94,7 +94,7 @@ | |||
126 | 94 | except exc.HTTPError as e: | 94 | except exc.HTTPError as e: |
127 | 95 | return faults.Fault(e) | 95 | return faults.Fault(e) |
128 | 96 | try: | 96 | try: |
130 | 97 | network = self.network_manager.rename_network(tenant_id, | 97 | network = self._plugin.rename_network(tenant_id, |
131 | 98 | id, request_params['network-name']) | 98 | id, request_params['network-name']) |
132 | 99 | 99 | ||
133 | 100 | builder = networks_view.get_view_builder(request) | 100 | builder = networks_view.get_view_builder(request) |
134 | @@ -106,7 +106,7 @@ | |||
135 | 106 | def delete(self, request, tenant_id, id): | 106 | def delete(self, request, tenant_id, id): |
136 | 107 | """ Destroys the network with the given id """ | 107 | """ Destroys the network with the given id """ |
137 | 108 | try: | 108 | try: |
139 | 109 | self.network_manager.delete_network(tenant_id, id) | 109 | self._plugin.delete_network(tenant_id, id) |
140 | 110 | return exc.HTTPAccepted() | 110 | return exc.HTTPAccepted() |
141 | 111 | except exception.NetworkNotFound as e: | 111 | except exception.NetworkNotFound as e: |
142 | 112 | return faults.Fault(faults.NetworkNotFound(e)) | 112 | return faults.Fault(faults.NetworkNotFound(e)) |
143 | 113 | 113 | ||
144 | === modified file 'quantum/api/ports.py' | |||
145 | --- quantum/api/ports.py 2011-06-08 10:21:47 +0000 | |||
146 | +++ quantum/api/ports.py 2011-07-05 10:28:00 +0000 | |||
147 | @@ -42,9 +42,9 @@ | |||
148 | 42 | "attributes": { | 42 | "attributes": { |
149 | 43 | "port": ["id", "state"], }, }, } | 43 | "port": ["id", "state"], }, }, } |
150 | 44 | 44 | ||
152 | 45 | def __init__(self, plugin_conf_file=None): | 45 | def __init__(self, plugin): |
153 | 46 | self._resource_name = 'port' | 46 | self._resource_name = 'port' |
155 | 47 | super(Controller, self).__init__() | 47 | super(Controller, self).__init__(plugin) |
156 | 48 | 48 | ||
157 | 49 | def index(self, request, tenant_id, network_id): | 49 | def index(self, request, tenant_id, network_id): |
158 | 50 | """ Returns a list of port ids for a given network """ | 50 | """ Returns a list of port ids for a given network """ |
159 | @@ -53,7 +53,7 @@ | |||
160 | 53 | def _items(self, request, tenant_id, network_id, is_detail): | 53 | def _items(self, request, tenant_id, network_id, is_detail): |
161 | 54 | """ Returns a list of networks. """ | 54 | """ Returns a list of networks. """ |
162 | 55 | try: | 55 | try: |
164 | 56 | ports = self.network_manager.get_all_ports(tenant_id, network_id) | 56 | ports = self._plugin.get_all_ports(tenant_id, network_id) |
165 | 57 | builder = ports_view.get_view_builder(request) | 57 | builder = ports_view.get_view_builder(request) |
166 | 58 | result = [builder.build(port, is_detail)['port'] | 58 | result = [builder.build(port, is_detail)['port'] |
167 | 59 | for port in ports] | 59 | for port in ports] |
168 | @@ -64,7 +64,7 @@ | |||
169 | 64 | def show(self, request, tenant_id, network_id, id): | 64 | def show(self, request, tenant_id, network_id, id): |
170 | 65 | """ Returns port details for given port and network """ | 65 | """ Returns port details for given port and network """ |
171 | 66 | try: | 66 | try: |
173 | 67 | port = self.network_manager.get_port_details( | 67 | port = self._plugin.get_port_details( |
174 | 68 | tenant_id, network_id, id) | 68 | tenant_id, network_id, id) |
175 | 69 | builder = ports_view.get_view_builder(request) | 69 | builder = ports_view.get_view_builder(request) |
176 | 70 | #build response with details | 70 | #build response with details |
177 | @@ -84,7 +84,7 @@ | |||
178 | 84 | except exc.HTTPError as e: | 84 | except exc.HTTPError as e: |
179 | 85 | return faults.Fault(e) | 85 | return faults.Fault(e) |
180 | 86 | try: | 86 | try: |
182 | 87 | port = self.network_manager.create_port(tenant_id, | 87 | port = self._plugin.create_port(tenant_id, |
183 | 88 | network_id, | 88 | network_id, |
184 | 89 | request_params['port-state']) | 89 | request_params['port-state']) |
185 | 90 | builder = ports_view.get_view_builder(request) | 90 | builder = ports_view.get_view_builder(request) |
186 | @@ -104,7 +104,7 @@ | |||
187 | 104 | except exc.HTTPError as e: | 104 | except exc.HTTPError as e: |
188 | 105 | return faults.Fault(e) | 105 | return faults.Fault(e) |
189 | 106 | try: | 106 | try: |
191 | 107 | port = self.network_manager.update_port(tenant_id, network_id, id, | 107 | port = self._plugin.update_port(tenant_id, network_id, id, |
192 | 108 | request_params['port-state']) | 108 | request_params['port-state']) |
193 | 109 | builder = ports_view.get_view_builder(request) | 109 | builder = ports_view.get_view_builder(request) |
194 | 110 | result = builder.build(port, True) | 110 | result = builder.build(port, True) |
195 | @@ -120,7 +120,7 @@ | |||
196 | 120 | """ Destroys the port with the given id """ | 120 | """ Destroys the port with the given id """ |
197 | 121 | #look for port state in request | 121 | #look for port state in request |
198 | 122 | try: | 122 | try: |
200 | 123 | self.network_manager.delete_port(tenant_id, network_id, id) | 123 | self._plugin.delete_port(tenant_id, network_id, id) |
201 | 124 | return exc.HTTPAccepted() | 124 | return exc.HTTPAccepted() |
202 | 125 | #TODO(salvatore-orlando): Handle portInUse error | 125 | #TODO(salvatore-orlando): Handle portInUse error |
203 | 126 | except exception.NetworkNotFound as e: | 126 | except exception.NetworkNotFound as e: |
204 | @@ -132,7 +132,7 @@ | |||
205 | 132 | 132 | ||
206 | 133 | def get_resource(self, request, tenant_id, network_id, id): | 133 | def get_resource(self, request, tenant_id, network_id, id): |
207 | 134 | try: | 134 | try: |
209 | 135 | result = self.network_manager.get_interface_details( | 135 | result = self._plugin.get_interface_details( |
210 | 136 | tenant_id, network_id, id) | 136 | tenant_id, network_id, id) |
211 | 137 | return dict(attachment=result) | 137 | return dict(attachment=result) |
212 | 138 | except exception.NetworkNotFound as e: | 138 | except exception.NetworkNotFound as e: |
213 | @@ -151,7 +151,7 @@ | |||
214 | 151 | except exc.HTTPError as e: | 151 | except exc.HTTPError as e: |
215 | 152 | return faults.Fault(e) | 152 | return faults.Fault(e) |
216 | 153 | try: | 153 | try: |
218 | 154 | self.network_manager.plug_interface(tenant_id, | 154 | self._plugin.plug_interface(tenant_id, |
219 | 155 | network_id, id, | 155 | network_id, id, |
220 | 156 | request_params['attachment-id']) | 156 | request_params['attachment-id']) |
221 | 157 | return exc.HTTPAccepted() | 157 | return exc.HTTPAccepted() |
222 | @@ -167,7 +167,7 @@ | |||
223 | 167 | #TODO - Complete implementation of these APIs | 167 | #TODO - Complete implementation of these APIs |
224 | 168 | def detach_resource(self, request, tenant_id, network_id, id): | 168 | def detach_resource(self, request, tenant_id, network_id, id): |
225 | 169 | try: | 169 | try: |
227 | 170 | self.network_manager.unplug_interface(tenant_id, | 170 | self._plugin.unplug_interface(tenant_id, |
228 | 171 | network_id, id) | 171 | network_id, id) |
229 | 172 | return exc.HTTPAccepted() | 172 | return exc.HTTPAccepted() |
230 | 173 | except exception.NetworkNotFound as e: | 173 | except exception.NetworkNotFound as e: |
231 | 174 | 174 | ||
232 | === modified file 'quantum/manager.py' | |||
233 | --- quantum/manager.py 2011-06-08 10:21:47 +0000 | |||
234 | +++ quantum/manager.py 2011-07-05 10:28:00 +0000 | |||
235 | @@ -26,10 +26,9 @@ | |||
236 | 26 | """ | 26 | """ |
237 | 27 | import gettext | 27 | import gettext |
238 | 28 | import os | 28 | import os |
239 | 29 | |||
240 | 29 | gettext.install('quantum', unicode=1) | 30 | gettext.install('quantum', unicode=1) |
241 | 30 | 31 | ||
242 | 31 | import os | ||
243 | 32 | |||
244 | 33 | from common import utils | 32 | from common import utils |
245 | 34 | from quantum_plugin_base import QuantumPluginBase | 33 | from quantum_plugin_base import QuantumPluginBase |
246 | 35 | 34 | ||
247 | @@ -51,7 +50,6 @@ | |||
248 | 51 | else: | 50 | else: |
249 | 52 | self.configuration_file = config | 51 | self.configuration_file = config |
250 | 53 | plugin_location = utils.getPluginFromConfig(self.configuration_file) | 52 | plugin_location = utils.getPluginFromConfig(self.configuration_file) |
251 | 54 | print "PLUGIN LOCATION:%s" % plugin_location | ||
252 | 55 | plugin_klass = utils.import_class(plugin_location) | 53 | plugin_klass = utils.import_class(plugin_location) |
253 | 56 | if not issubclass(plugin_klass, QuantumPluginBase): | 54 | if not issubclass(plugin_klass, QuantumPluginBase): |
254 | 57 | raise Exception("Configured Quantum plug-in " \ | 55 | raise Exception("Configured Quantum plug-in " \ |
255 | @@ -61,5 +59,5 @@ | |||
256 | 61 | "All compatibility tests passed\n") | 59 | "All compatibility tests passed\n") |
257 | 62 | self.plugin = plugin_klass() | 60 | self.plugin = plugin_klass() |
258 | 63 | 61 | ||
260 | 64 | def get_manager(self): | 62 | def get_plugin(self): |
261 | 65 | return self.plugin | 63 | return self.plugin |
Moving back to WIP until we merge the unit-tests branch