Merge lp:~gandelman-a/ubuntu/precise/quantum/UCA_2012.2.1 into lp:~ubuntu-cloud-archive/ubuntu/precise/quantum/folsom
- Precise (12.04)
- UCA_2012.2.1
- Merge into folsom
Proposed by
Adam Gandelman
Status: | Merged |
---|---|
Approved by: | Chuck Short |
Approved revision: | 28 |
Merged at revision: | 28 |
Proposed branch: | lp:~gandelman-a/ubuntu/precise/quantum/UCA_2012.2.1 |
Merge into: | lp:~ubuntu-cloud-archive/ubuntu/precise/quantum/folsom |
Diff against target: |
5927 lines (+2828/-679) 70 files modified
.pc/fix-quantum-configuration.patch/etc/l3_agent.ini (+1/-1) .pc/fix-quantum-configuration.patch/etc/quantum.conf (+0/-12) .pc/fix-quantum-configuration.patch/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini (+1/-1) .pc/fix-ubuntu-tests.patch/quantum/tests/unit/test_linux_ip_lib.py (+35/-0) AUTHORS (+6/-0) ChangeLog (+1106/-247) PKG-INFO (+1/-1) bin/quantum-rootwrap (+8/-0) debian/changelog (+73/-0) debian/control (+0/-1) debian/rules (+1/-1) etc/l3_agent.ini (+1/-1) etc/quantum.conf (+0/-12) etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini (+1/-1) quantum.egg-info/PKG-INFO (+1/-1) quantum.egg-info/SOURCES.txt (+2/-0) quantum.egg-info/entry_points.txt (+1/-1) quantum.egg-info/requires.txt (+1/-1) quantum.egg-info/top_level.txt (+1/-1) quantum/agent/dhcp_agent.py (+5/-0) quantum/agent/l3_agent.py (+4/-3) quantum/agent/linux/dhcp.py (+3/-0) quantum/agent/linux/ip_lib.py (+40/-0) quantum/agent/linux/iptables_manager.py (+1/-1) quantum/agent/linux/utils.py (+8/-0) quantum/api/v2/attributes.py (+183/-18) quantum/api/v2/base.py (+5/-1) quantum/api/v2/resource.py (+4/-1) quantum/common/config.py (+1/-0) quantum/common/utils.py (+39/-0) quantum/db/api.py (+8/-3) quantum/db/db_base_plugin_v2.py (+76/-25) quantum/db/l3_db.py (+83/-64) quantum/extensions/extensions.py (+5/-0) quantum/extensions/l3.py (+17/-3) quantum/openstack/common/cfg.py (+1/-1) quantum/openstack/common/log.py (+4/-5) quantum/openstack/common/notifier/api.py (+3/-3) quantum/openstack/common/policy.py (+3/-2) quantum/openstack/common/rpc/__init__.py (+9/-3) quantum/openstack/common/rpc/amqp.py (+8/-0) quantum/openstack/common/rpc/impl_kombu.py (+18/-12) quantum/openstack/common/rpc/impl_qpid.py (+35/-53) quantum/openstack/common/timeutils.py (+7/-3) quantum/plugins/cisco/network_plugin.py (+5/-0) quantum/plugins/linuxbridge/agent/linuxbridge_quantum_agent.py (+62/-81) quantum/plugins/linuxbridge/lb_quantum_plugin.py (+4/-2) quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py (+5/-1) quantum/plugins/nicira/nicira_nvp_plugin/nvplib.py (+9/-2) quantum/plugins/openvswitch/agent/ovs_quantum_agent.py (+19/-16) quantum/plugins/openvswitch/common/config.py (+1/-1) quantum/plugins/openvswitch/ovs_quantum_plugin.py (+8/-4) quantum/plugins/ryu/nova/vif.py (+3/-3) quantum/quantum_plugin_base_v2.py (+62/-3) quantum/quota.py (+13/-3) quantum/rootwrap/filters.py (+4/-0) quantum/tests/unit/linuxbridge/test_lb_quantum_agent.py (+54/-0) quantum/tests/unit/test_api_v2.py (+36/-24) quantum/tests/unit/test_attributes.py (+130/-13) quantum/tests/unit/test_common_utils.py (+60/-0) quantum/tests/unit/test_db_plugin.py (+267/-3) quantum/tests/unit/test_iptables_manager.py (+24/-24) quantum/tests/unit/test_l3_plugin.py (+190/-11) quantum/tests/unit/test_linux_dhcp.py (+8/-0) quantum/tests/unit/test_linux_ip_lib.py (+35/-0) quantum/tests/unit/test_rootwrap.py (+14/-0) quantum/vcsversion.py (+2/-2) quantum/version.py (+1/-1) setup.py (+1/-1) tools/pip-requires (+1/-1) |
To merge this branch: | bzr merge lp:~gandelman-a/ubuntu/precise/quantum/UCA_2012.2.1 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Chuck Short | Pending | ||
Review via email: mp+142217@code.launchpad.net |
Commit message
Description of the change
Syncs the lp:~ubuntu-cloud-archive branch to current state of the package in the U.C.A., and imports current SRU pending in quantal-proposed.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file '.pc/fix-quantum-configuration.patch/etc/l3_agent.ini' |
2 | --- .pc/fix-quantum-configuration.patch/etc/l3_agent.ini 2012-09-21 13:01:18 +0000 |
3 | +++ .pc/fix-quantum-configuration.patch/etc/l3_agent.ini 2013-01-08 00:32:21 +0000 |
4 | @@ -34,7 +34,7 @@ |
5 | # value should be set to the UUID of that external network. If empty, |
6 | # the agent will enforce that only a single external networks exists and |
7 | # use that external network id |
8 | -# gateway_external_net_id = |
9 | +# gateway_external_network_id = |
10 | |
11 | # Indicates that this L3 agent should also handle routers that do not have |
12 | # an external network gateway configured. This option should be True only |
13 | |
14 | === modified file '.pc/fix-quantum-configuration.patch/etc/quantum.conf' |
15 | --- .pc/fix-quantum-configuration.patch/etc/quantum.conf 2012-09-26 15:14:31 +0000 |
16 | +++ .pc/fix-quantum-configuration.patch/etc/quantum.conf 2013-01-08 00:32:21 +0000 |
17 | @@ -107,18 +107,6 @@ |
18 | # qpid_password = '' |
19 | # Space separated list of SASL mechanisms to use for auth |
20 | # qpid_sasl_mechanisms = '' |
21 | -# Automatically reconnect |
22 | -# qpid_reconnect = True |
23 | -# Reconnection timeout in seconds |
24 | -# qpid_reconnect_timeout = 0 |
25 | -# Max reconnections before giving up |
26 | -# qpid_reconnect_limit = 0 |
27 | -# Minimum seconds between reconnection attempts |
28 | -# qpid_reconnect_interval_min = 0 |
29 | -# Maximum seconds between reconnection attempts |
30 | -# qpid_reconnect_interval_max = 0 |
31 | -# Equivalent to setting max and min to the same value |
32 | -# qpid_reconnect_interval = 0 |
33 | # Seconds between connection keepalive heartbeats |
34 | # qpid_heartbeat = 60 |
35 | # Transport to use, either 'tcp' or 'ssl' |
36 | |
37 | === modified file '.pc/fix-quantum-configuration.patch/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini' |
38 | --- .pc/fix-quantum-configuration.patch/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini 2012-09-12 13:41:20 +0000 |
39 | +++ .pc/fix-quantum-configuration.patch/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini 2013-01-08 00:32:21 +0000 |
40 | @@ -64,7 +64,7 @@ |
41 | # empty for the server. Set local-ip to be the local IP address of |
42 | # this hypervisor. |
43 | # |
44 | -# Default: local_ip = 10.0.0.3 |
45 | +# Default: local_ip = |
46 | |
47 | # (ListOpt) Comma-separated list of <physical_network>:<bridge> tuples |
48 | # mapping physical network names to the agent's node-specific OVS |
49 | |
50 | === modified file '.pc/fix-ubuntu-tests.patch/quantum/tests/unit/test_linux_ip_lib.py' |
51 | --- .pc/fix-ubuntu-tests.patch/quantum/tests/unit/test_linux_ip_lib.py 2012-09-21 13:01:18 +0000 |
52 | +++ .pc/fix-ubuntu-tests.patch/quantum/tests/unit/test_linux_ip_lib.py 2013-01-08 00:32:21 +0000 |
53 | @@ -72,6 +72,13 @@ |
54 | default via 10.35.19.254 |
55 | """) |
56 | |
57 | +DEVICE_ROUTE_SAMPLE = ("10.0.0.0/24 scope link src 10.0.0.2") |
58 | + |
59 | +SUBNET_SAMPLE1 = ("10.0.0.0/24 dev qr-23380d11-d2 scope link src 10.0.0.1\n" |
60 | + "10.0.0.0/24 dev tap1d7888a7-10 scope link src 10.0.0.2") |
61 | +SUBNET_SAMPLE2 = ("10.0.0.0/24 dev tap1d7888a7-10 scope link src 10.0.0.2\n" |
62 | + "10.0.0.0/24 dev qr-23380d11-d2 scope link src 10.0.0.1") |
63 | + |
64 | |
65 | class TestSubProcessBase(unittest.TestCase): |
66 | def setUp(self): |
67 | @@ -543,6 +550,34 @@ |
68 | self.assertEquals(self.route_cmd.get_gateway(), |
69 | test_case['expected']) |
70 | |
71 | + def test_pullup_route(self): |
72 | + # interface is not the first in the list - requires |
73 | + # deleting and creating existing entries |
74 | + output = [DEVICE_ROUTE_SAMPLE, SUBNET_SAMPLE1] |
75 | + |
76 | + def pullup_side_effect(self, *args): |
77 | + result = output.pop(0) |
78 | + return result |
79 | + |
80 | + self.parent._run = mock.Mock(side_effect=pullup_side_effect) |
81 | + self.route_cmd.pullup_route('tap1d7888a7-10') |
82 | + self._assert_sudo([], ('del', '10.0.0.0/24', 'dev', 'qr-23380d11-d2')) |
83 | + self._assert_sudo([], ('append', '10.0.0.0/24', 'proto', 'kernel', |
84 | + 'src', '10.0.0.1', 'dev', 'qr-23380d11-d2')) |
85 | + |
86 | + def test_pullup_route_first(self): |
87 | + # interface is first in the list - no changes |
88 | + output = [DEVICE_ROUTE_SAMPLE, SUBNET_SAMPLE2] |
89 | + |
90 | + def pullup_side_effect(self, *args): |
91 | + result = output.pop(0) |
92 | + return result |
93 | + |
94 | + self.parent._run = mock.Mock(side_effect=pullup_side_effect) |
95 | + self.route_cmd.pullup_route('tap1d7888a7-10') |
96 | + # Check two calls - device get and subnet get |
97 | + self.assertEqual(len(self.parent._run.mock_calls), 2) |
98 | + |
99 | |
100 | class TestIpNetnsCommand(TestIPCmdBase): |
101 | def setUp(self): |
102 | |
103 | === modified file 'AUTHORS' |
104 | --- AUTHORS 2012-09-21 13:01:18 +0000 |
105 | +++ AUTHORS 2013-01-08 00:32:21 +0000 |
106 | @@ -11,6 +11,7 @@ |
107 | Brian Waldon <bcwaldon@gmail.com> |
108 | chnm-kulkarni <chnm.kulkarni@gmail.com> |
109 | Clark Boylan <clark.boylan@gmail.com> |
110 | +Dan Prince <dprince@redhat.com> |
111 | Dan Wendlandt <dan@nicira.com> |
112 | Dave Lapsley <dlapsley@nicira.com> |
113 | Debo <dedutta@cisco.com> |
114 | @@ -28,10 +29,12 @@ |
115 | Hiroaki KAWAI <hiroaki.kawai@gmail.com> |
116 | Hisaharu Ishii <ishii@nttmcl.com> |
117 | Ionuț Arțăriși <iartarisi@suse.cz> |
118 | +Iryoung Jeong <iryoung@gmail.com> |
119 | Isaku Yamahata <yamahata@valinux.co.jp> |
120 | James E. Blair <james.blair@rackspace.com> |
121 | James E. Blair <jeblair@hp.com> |
122 | Jason Kölker <jason@koelker.net> |
123 | +Jeremy Hanmer <jeremy@dreamhost.com> |
124 | Jeremy Stanley <fungi@yuggoth.org> |
125 | Jesse Andrews <anotherjesse@gmail.com> |
126 | Jiajun Liu <iamljj@gmail.com> |
127 | @@ -46,6 +49,7 @@ |
128 | Madhav Puri <madhav.puri@gmail.com> |
129 | Major Hayden <major@mhtx.net> |
130 | Mark McClain <mark.mcclain@dreamhost.com> |
131 | +Mark McLoughlin <markmc@redhat.com> |
132 | Maru Newby <mnewby@internap.com> |
133 | mat <mathieu.rohon@gmail.com> |
134 | Monty Taylor <mordred@inaugust.com> |
135 | @@ -76,8 +80,10 @@ |
136 | Shweta P <shweta.ap05@gmail.com> |
137 | siyingchun <siyingchun@sina.com> |
138 | Soheil Hassas Yeganeh <soheil@cs.toronto.edu> |
139 | +Somik Behera <somikbehera@gmail.com> |
140 | Somik Behera <somik@nicira.com> |
141 | Sumit Naiksatam <snaiksat@cisco.com> |
142 | +Takaaki Suzuki <suzuki@midokura.com> |
143 | Thierry Carrez <thierry@openstack.org> |
144 | Tyler Smith <tylesmit@cisco.com> |
145 | vinkesh banka <vinkeshb@thoughtworks.com> |
146 | |
147 | === modified file 'ChangeLog' |
148 | --- ChangeLog 2012-09-26 15:14:31 +0000 |
149 | +++ ChangeLog 2013-01-08 00:32:21 +0000 |
150 | @@ -1,3 +1,862 @@ |
151 | +commit 3a6cc2f6dce82b6554618418a9424588a047ffc6 |
152 | +Author: Mark McLoughlin <markmc@redhat.com> |
153 | +Date: Thu Nov 29 21:25:50 2012 +0000 |
154 | + |
155 | + Final 2012.2.1 versioning |
156 | + |
157 | + Change-Id: Iedbe1d2f4586f93e27a878a40ce00f65914035a7 |
158 | + |
159 | + quantum/version.py | 2 +- |
160 | + 1 file changed, 1 insertion(+), 1 deletion(-) |
161 | + |
162 | +commit aeabb42493e7889992fa8b1a32dabda4432174c5 |
163 | +Author: Gary Kotton <gkotton@redhat.com> |
164 | +Date: Mon Nov 26 17:07:12 2012 +0000 |
165 | + |
166 | + Fixes order of route entries. |
167 | + |
168 | + Fixes bug 1083238 |
169 | + |
170 | + This patch makes sure that a route entry for dnsmasq is placed first |
171 | + before any others (for example the l3-agent one). This makes DHCP work |
172 | + when network namespaces are disabled. |
173 | + |
174 | + Change-Id: I241a8e30127d614f7582e10d999521f6486e5255 |
175 | + |
176 | + quantum/agent/dhcp_agent.py | 5 ++++ |
177 | + quantum/agent/linux/ip_lib.py | 40 +++++++++++++++++++++++++++++++ |
178 | + quantum/tests/unit/test_linux_ip_lib.py | 35 +++++++++++++++++++++++++++ |
179 | + 3 files changed, 80 insertions(+) |
180 | + |
181 | +commit abb2bd3a0d0d72c4e4183221c23321ad24623e30 |
182 | +Merge: ca7fc10 04aab72 |
183 | +Author: Jenkins <jenkins@review.openstack.org> |
184 | +Date: Tue Nov 27 23:46:53 2012 +0000 |
185 | + |
186 | + Merge "Part of the patch set that enables VM's to use libvirts bridge type." into stable/folsom |
187 | + |
188 | +commit ca7fc10dac532fdea5398b394ac3e58b1c3d8791 |
189 | +Author: Dan Wendlandt <dan@nicira.com> |
190 | +Date: Tue Nov 27 13:14:54 2012 -0800 |
191 | + |
192 | + Use DB count to get resource counts. |
193 | + |
194 | + Fixes bug 1075369, and includes bugs 1081259, 1083696 which fixed |
195 | + regression in the original version of this patch and bug 1083180 |
196 | + which improves the documentation of the original patch. |
197 | + |
198 | + During quota check we used to simply retrieve the entire collection |
199 | + of resources from the database, then counting them in Python. This |
200 | + patch introduces a specialized _get_collection_count() method, which |
201 | + instead take advantage of the DB's built-in count capabilities. |
202 | + |
203 | + In order to take advantage of this, plugins can now implement |
204 | + get_*_count() methods for their resources. This is used (if present) |
205 | + by the quota checking function. |
206 | + |
207 | + Change-Id: Idc347cfacc363f2cac47356296514fe735625f29 |
208 | + |
209 | + quantum/db/db_base_plugin_v2.py | 30 ++++++++++++-- |
210 | + quantum/db/l3_db.py | 8 ++++ |
211 | + quantum/extensions/l3.py | 6 +++ |
212 | + quantum/plugins/cisco/network_plugin.py | 5 +++ |
213 | + quantum/quantum_plugin_base_v2.py | 65 +++++++++++++++++++++++++++++-- |
214 | + quantum/quota.py | 16 ++++++-- |
215 | + quantum/tests/unit/test_api_v2.py | 46 ++++++++++++++-------- |
216 | + quantum/tests/unit/test_db_plugin.py | 9 ++++- |
217 | + quantum/tests/unit/test_l3_plugin.py | 1 + |
218 | + 9 files changed, 158 insertions(+), 28 deletions(-) |
219 | + |
220 | +commit 66605e8d9121bca00b5b5245294d82b46b4708e0 |
221 | +Author: gongysh <gongysh@cn.ibm.com> |
222 | +Date: Tue Nov 27 09:59:40 2012 +0800 |
223 | + |
224 | + Make sure we can update when there is no gateway port linked to it |
225 | + |
226 | + Bug #1083387 |
227 | + |
228 | + Change-Id: I7e56d072a6e430ddde816781fe480c6028577c5f |
229 | + |
230 | + quantum/db/l3_db.py | 10 ++++------ |
231 | + quantum/tests/unit/test_l3_plugin.py | 29 +++++++++++++++++++++++++++++ |
232 | + 2 files changed, 33 insertions(+), 6 deletions(-) |
233 | + |
234 | +commit 9f3d9119bb9b4e524b9fca2a6a7e77be81bc0672 |
235 | +Merge: d334d5b c60051a |
236 | +Author: Jenkins <jenkins@review.openstack.org> |
237 | +Date: Tue Nov 27 06:21:32 2012 +0000 |
238 | + |
239 | + Merge "Updates tearDown() to release instance objects" into stable/folsom |
240 | + |
241 | +commit d334d5b7fb918d5bfc379e8fab49db9c92771fad |
242 | +Merge: c1e19d7 3179dfc |
243 | +Author: Jenkins <jenkins@review.openstack.org> |
244 | +Date: Tue Nov 27 06:20:56 2012 +0000 |
245 | + |
246 | + Merge "Updates clear_db() to unregister models and close session." into stable/folsom |
247 | + |
248 | +commit c1e19d7a903863f2343bf6068e0ff54ebcb5599b |
249 | +Author: Gary Kotton <gkotton@redhat.com> |
250 | +Date: Wed Nov 7 05:46:08 2012 +0000 |
251 | + |
252 | + Treat case when pid is None |
253 | + |
254 | + Fixes bug 1077651 |
255 | + |
256 | + Change-Id: Id80d923d36a0339eee860e8cf37aacc6866fc6bc |
257 | + |
258 | + quantum/agent/linux/dhcp.py | 3 +++ |
259 | + quantum/tests/unit/test_linux_dhcp.py | 8 ++++++++ |
260 | + 2 files changed, 11 insertions(+) |
261 | + |
262 | +commit c60051ac6b95d0e146f81d04dba0367edc8b9f78 |
263 | +Author: Iryoung Jeong <iryoung@gmail.com> |
264 | +Date: Thu Nov 22 12:58:47 2012 +0900 |
265 | + |
266 | + Updates tearDown() to release instance objects |
267 | + |
268 | + This change fixes the bug by releasing the objects of the instance |
269 | + of class QuantumDbPluginV2TestCase. Removing unnecessary objects |
270 | + explicitly reduces the memory required by unit tests. |
271 | + |
272 | + Fixes bug 1065276 |
273 | + |
274 | + Change-Id: Ia003a7718e1aedc4e4c8fb02b723f4a511ebc319 |
275 | + |
276 | + quantum/tests/unit/test_db_plugin.py | 4 ++++ |
277 | + 1 file changed, 4 insertions(+) |
278 | + |
279 | +commit 375b737ec350079693fe98da7ff68b4c0cb6653d |
280 | +Merge: 9a0a216 af9e076 |
281 | +Author: Jenkins <jenkins@review.openstack.org> |
282 | +Date: Thu Nov 22 16:55:48 2012 +0000 |
283 | + |
284 | + Merge "Ensure that the expiration time for leased IP is updated correctly" into stable/folsom |
285 | + |
286 | +commit 9a0a21698df6130d5ac07e7a3f9d8feb81ada648 |
287 | +Merge: eacc9d3 e0d1a7d |
288 | +Author: Jenkins <jenkins@review.openstack.org> |
289 | +Date: Thu Nov 22 16:55:37 2012 +0000 |
290 | + |
291 | + Merge "bug 1057844: improve floating-ip association checks" into stable/folsom |
292 | + |
293 | +commit af9e07628907bb6a2f2095325e9b6a47b9cbaedd |
294 | +Author: Gary Kotton <gkotton@redhat.com> |
295 | +Date: Sat Nov 17 05:51:47 2012 +0000 |
296 | + |
297 | + Ensure that the expiration time for leased IP is updated correctly |
298 | + |
299 | + Fixes bug 1081664 |
300 | + |
301 | + Change-Id: I77596ef65be817a874fad41b49e7ddbc0663c237 |
302 | + |
303 | + quantum/db/db_base_plugin_v2.py | 3 ++- |
304 | + 1 file changed, 2 insertions(+), 1 deletion(-) |
305 | + |
306 | +commit aeef038f589b6e6a4be801ab5347f2d5d545d2cd |
307 | +Merge: fd8b072 8471d79 |
308 | +Author: Jenkins <jenkins@review.openstack.org> |
309 | +Date: Tue Nov 20 16:37:03 2012 +0000 |
310 | + |
311 | + Merge "Ensure that deleted gateway IP address is recycled correctly" into stable/folsom |
312 | + |
313 | +commit fd8b0729b25059c93caa29e077880c0098d47a48 |
314 | +Merge: 51b4c82 aca8b4a |
315 | +Author: Jenkins <jenkins@review.openstack.org> |
316 | +Date: Tue Nov 20 16:36:53 2012 +0000 |
317 | + |
318 | + Merge "Ensure that fixed port IP address is in valid allocation range." into stable/folsom |
319 | + |
320 | +commit 04aab72941894287f1f3bd0fd43351807ac0bcc0 |
321 | +Author: Gary Kotton <gkotton@redhat.com> |
322 | +Date: Thu Oct 25 03:22:03 2012 +0000 |
323 | + |
324 | + Part of the patch set that enables VM's to use libvirts bridge type. |
325 | + |
326 | + Fixes bug 1078210 |
327 | + |
328 | + The patch set enables the following: |
329 | + 1. Bridges to be created by Nova |
330 | + 2. Bridges to be created by the agent |
331 | + |
332 | + The code is backward compatible, that is, if Nova does not create the brdige |
333 | + then the agent will create the bridge. |
334 | + |
335 | + In addition to this it cleans gateway code no longer used. |
336 | + |
337 | + The patch enables the following Nova code to be backported: |
338 | + https://review.openstack.org/#/c/14830/ |
339 | + |
340 | + Change-Id: Ia621ba5edd12d8eb7ea412a2993fea43189bd511 |
341 | + |
342 | + .../linuxbridge/agent/linuxbridge_quantum_agent.py | 113 ++++++++------------ |
343 | + .../unit/linuxbridge/test_lb_quantum_agent.py | 54 ++++++++++ |
344 | + 2 files changed, 100 insertions(+), 67 deletions(-) |
345 | + |
346 | +commit e0d1a7d61036074633fc9815ad96be244462d8f4 |
347 | +Author: Dan Wendlandt <dan@nicira.com> |
348 | +Date: Tue Nov 20 14:09:19 2012 -0800 |
349 | + |
350 | + bug 1057844: improve floating-ip association checks |
351 | + |
352 | + allow multiple floating ips to be associated with the same internal port |
353 | + as long as they map to different external nets (not yet supported in |
354 | + Folsom) or different internal fixed IPs. With Quantum, there is no |
355 | + need to disallow either scenario. |
356 | + |
357 | + Also improve check for a valid external network to router to internal |
358 | + subnet path when a floating IP is bound. |
359 | + |
360 | + Change-Id: Iced675e1f064172ee8a5bb6b9e37032e83af5711 |
361 | + |
362 | + quantum/db/l3_db.py | 67 +++++++++++++++++++--------------- |
363 | + quantum/extensions/l3.py | 8 ++-- |
364 | + quantum/tests/unit/test_l3_plugin.py | 15 +++----- |
365 | + 3 files changed, 49 insertions(+), 41 deletions(-) |
366 | + |
367 | +commit eacc9d3c344d018e3d32b0352c90239e1e4c25b3 |
368 | +Author: Bob Kukura <rkukura@redhat.com> |
369 | +Date: Tue Nov 13 13:50:53 2012 -0500 |
370 | + |
371 | + Improve openvswitch and linuxbridge agents' parsing of mappings |
372 | + |
373 | + Created generic quantum.utils.parse_mappings function that detects |
374 | + duplicate key or value strings, and changed openvswitch and |
375 | + linuxbridge agents to use this to parse their mappings from physical |
376 | + networks to bridges or interfaces. Fixes bug 1067669. |
377 | + |
378 | + Also fixed some typos in comments. |
379 | + |
380 | + Change-Id: I342eaeeb6ff4c6e25d57d631f250faac082011b8 |
381 | + |
382 | + quantum/common/utils.py | 31 ++++++++++ |
383 | + .../linuxbridge/agent/linuxbridge_quantum_agent.py | 22 ++++--- |
384 | + .../plugins/openvswitch/agent/ovs_quantum_agent.py | 25 ++++---- |
385 | + quantum/tests/unit/test_common_utils.py | 60 ++++++++++++++++++++ |
386 | + 4 files changed, 111 insertions(+), 27 deletions(-) |
387 | + |
388 | +commit 3179dfc5805d5488483422a7483443f71fedcc44 |
389 | +Author: Iryoung Jeong <iryoung@gmail.com> |
390 | +Date: Thu Nov 15 15:23:12 2012 +0900 |
391 | + |
392 | + Updates clear_db() to unregister models and close session. |
393 | + |
394 | + fixes bug 1080988 |
395 | + |
396 | + This change fixes the bug by ensuring the metadata and session objects |
397 | + are properly cleaned up by clear_db(). Using the proper calls reduces |
398 | + the memory required by unit tests. |
399 | + |
400 | + Change-Id: I1d1802b642eff83b7f96211608195afaf68e855a |
401 | + |
402 | + quantum/db/api.py | 11 ++++++++--- |
403 | + 1 file changed, 8 insertions(+), 3 deletions(-) |
404 | + |
405 | +commit 51b4c82fe548477c6c6a1d65d4af59686bdf9cae |
406 | +Author: Dan Wendlandt <dan@nicira.com> |
407 | +Date: Mon Nov 19 09:29:52 2012 -0800 |
408 | + |
409 | + fix incorrect kwarg param name for region with l3-agent |
410 | + |
411 | + bug 1080793 |
412 | + |
413 | + Change-Id: Iec600e98406b0210ab3a472c97f3b4d8f0f96d44 |
414 | + |
415 | + quantum/agent/l3_agent.py | 2 +- |
416 | + 1 file changed, 1 insertion(+), 1 deletion(-) |
417 | + |
418 | +commit 82b1ac5a019fcaa6e21faf3b14eca9f8b8fa0e88 |
419 | +Merge: 978d345 6f0a486 |
420 | +Author: Jenkins <jenkins@review.openstack.org> |
421 | +Date: Mon Nov 19 12:46:30 2012 +0000 |
422 | + |
423 | + Merge "Delete floating port and floatingip in the same transaction" into stable/folsom |
424 | + |
425 | +commit 978d345872557d0c4d977b7d8de5f1e871b7611e |
426 | +Merge: a112840 db6cda7 |
427 | +Author: Jenkins <jenkins@review.openstack.org> |
428 | +Date: Mon Nov 19 12:41:40 2012 +0000 |
429 | + |
430 | + Merge "Remove qpid configuration variables no longer supported" into stable/folsom |
431 | + |
432 | +commit a112840bc38d4a7d0d821740d06e4721b4086f82 |
433 | +Author: Aaron Rosen <arosen@nicira.com> |
434 | +Date: Thu Nov 15 09:40:53 2012 -0800 |
435 | + |
436 | + Allow NVP plugin to use per-tenant quota extension |
437 | + |
438 | + Change-Id: I704b52471e44b2d4e75dcf4435d55d6c6974a870 |
439 | + |
440 | + quantum/extensions/extensions.py | 5 +++++ |
441 | + 1 file changed, 5 insertions(+) |
442 | + |
443 | +commit 8471d79d5dc4a3eda1f0c86e2ffc47d4d74e7226 |
444 | +Author: Gary Kotton <gkotton@redhat.com> |
445 | +Date: Tue Nov 13 00:12:45 2012 +0000 |
446 | + |
447 | + Ensure that deleted gateway IP address is recycled correctly |
448 | + |
449 | + Fixes bug 1079980 |
450 | + |
451 | + Change-Id: I6819899cae6f366423ade70613c85fd84d1a270d |
452 | + |
453 | + quantum/db/db_base_plugin_v2.py | 3 ++- |
454 | + quantum/tests/unit/test_db_plugin.py | 2 ++ |
455 | + 2 files changed, 4 insertions(+), 1 deletion(-) |
456 | + |
457 | +commit aca8b4a0f8c1d8d7191a58eef9feaab8169e8d64 |
458 | +Author: Gary Kotton <gkotton@redhat.com> |
459 | +Date: Wed Nov 7 00:44:35 2012 +0000 |
460 | + |
461 | + Ensure that fixed port IP address is in valid allocation range. |
462 | + |
463 | + Fixes bug 1077292 |
464 | + |
465 | + Change-Id: I587655bece83d0f6aa665e522efbc0ecd5ef1734 |
466 | + |
467 | + quantum/db/db_base_plugin_v2.py | 56 +++++++++++++++++++++++++--------- |
468 | + quantum/tests/unit/test_db_plugin.py | 34 +++++++++++++++++++++ |
469 | + 2 files changed, 76 insertions(+), 14 deletions(-) |
470 | + |
471 | +commit 6f0a4864dba3853fb92b26cd8468c9b5ddef3b35 |
472 | +Author: gongysh <gongysh@cn.ibm.com> |
473 | +Date: Mon Nov 19 10:00:01 2012 +0800 |
474 | + |
475 | + Delete floating port and floatingip in the same transaction |
476 | + |
477 | + Bug #1080516 |
478 | + |
479 | + Change-Id: Icb5b71e29af582cb0e381e22909f46b325063d71 |
480 | + |
481 | + quantum/db/l3_db.py | 6 +++--- |
482 | + 1 file changed, 3 insertions(+), 3 deletions(-) |
483 | + |
484 | +commit db6cda725e1f9dd6093bb45e029428bf5f465226 |
485 | +Author: Gary Kotton <gkotton@redhat.com> |
486 | +Date: Sat Nov 10 22:29:35 2012 +0000 |
487 | + |
488 | + Remove qpid configuration variables no longer supported |
489 | + |
490 | + Change-Id: I25396654fdd03ae54d7d7470a9d2952689836c50 |
491 | + |
492 | + etc/quantum.conf | 12 ------------ |
493 | + 1 file changed, 12 deletions(-) |
494 | + |
495 | +commit 82b1a55cc98519240169c27be0652ee00fd1dffc |
496 | +Author: Gary Kotton <gkotton@redhat.com> |
497 | +Date: Sat Nov 10 06:59:33 2012 +0000 |
498 | + |
499 | + Update stable with stable oslo (aka common) |
500 | + |
501 | + This fixes bug 1073999 |
502 | + |
503 | + Change-Id: I191af50a7b0ab6c3c19fd24757d7466e67549615 |
504 | + |
505 | + quantum/openstack/common/cfg.py | 2 +- |
506 | + quantum/openstack/common/log.py | 9 ++- |
507 | + quantum/openstack/common/notifier/api.py | 6 +- |
508 | + quantum/openstack/common/policy.py | 5 +- |
509 | + quantum/openstack/common/rpc/__init__.py | 12 +++- |
510 | + quantum/openstack/common/rpc/amqp.py | 8 +++ |
511 | + quantum/openstack/common/rpc/impl_kombu.py | 30 ++++++---- |
512 | + quantum/openstack/common/rpc/impl_qpid.py | 88 +++++++++++----------------- |
513 | + quantum/openstack/common/timeutils.py | 10 +++- |
514 | + 9 files changed, 88 insertions(+), 82 deletions(-) |
515 | + |
516 | +commit 60cf2e04fd01389536628ee6a12d810b92090d6a |
517 | +Merge: fcd12ba c01a839 |
518 | +Author: Jenkins <jenkins@review.openstack.org> |
519 | +Date: Wed Nov 14 17:21:08 2012 +0000 |
520 | + |
521 | + Merge "Validate L3 inputs." into stable/folsom |
522 | + |
523 | +commit fcd12bab09330247dd654c1daf16d4493b38f72b |
524 | +Merge: 49f649c 26b383f |
525 | +Author: Jenkins <jenkins@review.openstack.org> |
526 | +Date: Wed Nov 14 17:10:06 2012 +0000 |
527 | + |
528 | + Merge "Add check for cidr overrapping for adding external gateway" into stable/folsom |
529 | + |
530 | +commit 26b383f839bdd9933bda3eac7b39a36b6f472f12 |
531 | +Author: Nachi Ueno <nachi@nttmcl.com> |
532 | +Date: Fri Sep 21 20:52:16 2012 +0000 |
533 | + |
534 | + Add check for cidr overrapping for adding external gateway |
535 | + |
536 | + Fixes bug 1053633 |
537 | + Also add check for cidr overrapping between external gateway and |
538 | + interfaces |
539 | + |
540 | + Change-Id: I5bfb2fd96ea467b63e940893979a912caf550deb |
541 | + |
542 | + quantum/db/l3_db.py | 9 ++++++-- |
543 | + quantum/tests/unit/test_l3_plugin.py | 40 +++++++++++++++++++++++++++++++--- |
544 | + 2 files changed, 44 insertions(+), 5 deletions(-) |
545 | + |
546 | +commit c01a8391d772f41685a7b06acb81993ca341e3ab |
547 | +Author: Gary Kotton <gkotton@redhat.com> |
548 | +Date: Wed Nov 7 22:57:59 2012 +0000 |
549 | + |
550 | + Validate L3 inputs. |
551 | + |
552 | + Fixes bug 1064765 |
553 | + |
554 | + Change-Id: Idb8d078f3c640d450bcb738cddf875b5e49f1b60 |
555 | + |
556 | + quantum/extensions/l3.py | 6 ++++++ |
557 | + 1 file changed, 6 insertions(+) |
558 | + |
559 | +commit 49f649c80d0d67feb4cdcb8ec7cb0570abbfbe4b |
560 | +Author: Gary Kotton <gkotton@redhat.com> |
561 | +Date: Mon Oct 8 05:58:00 2012 +0000 |
562 | + |
563 | + Ensure that HTTP 400 codes are returned for invalid input |
564 | + |
565 | + Fixes bug 1062046 |
566 | + |
567 | + A number of additional validation functions were added. They |
568 | + do basic validations. |
569 | + |
570 | + Change-Id: I0fc207e996f11b50fdaa4d80075ae5704cba7003 |
571 | + |
572 | + quantum/api/v2/attributes.py | 192 ++++++++++++++++++++++++++++++--- |
573 | + quantum/api/v2/base.py | 6 +- |
574 | + quantum/api/v2/resource.py | 5 +- |
575 | + quantum/db/db_base_plugin_v2.py | 8 +- |
576 | + quantum/tests/unit/test_attributes.py | 111 ++++++++++++++++--- |
577 | + quantum/tests/unit/test_db_plugin.py | 180 ++++++++++++++++++++++++++++++- |
578 | + 6 files changed, 461 insertions(+), 41 deletions(-) |
579 | + |
580 | +commit 4546a18cb4bfbd8b1a8fc0614e4236ec3e546b17 |
581 | +Author: Jeremy Hanmer <jeremy@dreamhost.com> |
582 | +Date: Thu Oct 18 16:26:41 2012 -0700 |
583 | + |
584 | + IP subnet validation fixes |
585 | + |
586 | + Fixes bug #1067959 |
587 | + |
588 | + Assure prefix length is included in CIDR definition. |
589 | + |
590 | + Change-Id: I32bb3dd1e5bffb409b3adee03015e21cce71caea |
591 | + |
592 | + quantum/api/v2/attributes.py | 11 +++++---- |
593 | + quantum/tests/unit/test_attributes.py | 40 +++++++++++++++++++++++++++++++++ |
594 | + quantum/tests/unit/test_db_plugin.py | 22 ++++++++++++++++++ |
595 | + 3 files changed, 69 insertions(+), 4 deletions(-) |
596 | + |
597 | +commit bab220a5091de2c46d2874606be271cf14ed93f8 |
598 | +Merge: 63b81f6 9ba453a |
599 | +Author: Jenkins <jenkins@review.openstack.org> |
600 | +Date: Wed Nov 7 07:59:19 2012 +0000 |
601 | + |
602 | + Merge "Update KillFilter to handle 'deleted' exe's." into stable/folsom |
603 | + |
604 | +commit 9ba453a1ae65b1ee450a3a42314038f6c9011630 |
605 | +Author: Dan Prince <dprince@redhat.com> |
606 | +Date: Wed Oct 31 22:11:42 2012 -0400 |
607 | + |
608 | + Update KillFilter to handle 'deleted' exe's. |
609 | + |
610 | + Updates KillFilter so that it handles the case where the executable |
611 | + linked to by /proc/PID/exe is updated or deleted. |
612 | + |
613 | + Includes new test case with coverage for this fix as well. |
614 | + |
615 | + Fixes LP Bug #1073768 |
616 | + |
617 | + Change-Id: If568693e0b491f8806ff0156701766929ca0b3e0 |
618 | + |
619 | + quantum/rootwrap/filters.py | 4 ++++ |
620 | + quantum/tests/unit/test_rootwrap.py | 14 ++++++++++++++ |
621 | + 2 files changed, 18 insertions(+) |
622 | + |
623 | +commit ec9f1a47bbaa7d0f3c45416fcb706038010274fa |
624 | +Merge: 70e07d7 7c8a55c |
625 | +Author: Jenkins <jenkins@review.openstack.org> |
626 | +Date: Sun Nov 4 04:57:16 2012 +0000 |
627 | + |
628 | + Merge "Make create_floatingip support transaction" into stable/folsom |
629 | + |
630 | +commit 70e07d799ad94cf842e17c69c88c5a8a2d888cd1 |
631 | +Merge: ee0fbe3 c9b84cf |
632 | +Author: Jenkins <jenkins@review.openstack.org> |
633 | +Date: Thu Nov 1 14:39:16 2012 +0000 |
634 | + |
635 | + Merge "Fix exception when port status is updated with linux bridge plugin" into stable/folsom |
636 | + |
637 | +commit ee0fbe31ba085e413f0040b1f12b8abb107b5f18 |
638 | +Merge: 574e278 cb57932 |
639 | +Author: Jenkins <jenkins@review.openstack.org> |
640 | +Date: Thu Nov 1 11:40:21 2012 +0000 |
641 | + |
642 | + Merge "Get subnets of router interfaces with an elevated context." into stable/folsom |
643 | + |
644 | +commit 574e278b7501016d7d8f071aa616b8f685cde839 |
645 | +Author: Yoshihiro Kaneko <ykaneko0929@gmail.com> |
646 | +Date: Mon Oct 1 15:56:50 2012 +0900 |
647 | + |
648 | + Update vif driver of Ryu plugin |
649 | + |
650 | + Fixes bug 1059393 |
651 | + |
652 | + This patch allows Ryu plugin to be compatible with Nova Security Groups. |
653 | + |
654 | + Change-Id: I55d0122f3b5b10c9b86eb300635a372eb800b658 |
655 | + |
656 | + quantum/plugins/ryu/nova/vif.py | 6 +++--- |
657 | + 1 file changed, 3 insertions(+), 3 deletions(-) |
658 | + |
659 | +commit c9b84cfc5ed9f99b57170e53d1d05d3dd1c2dfa7 |
660 | +Author: Gary Kotton <gkotton@redhat.com> |
661 | +Date: Thu Oct 25 03:30:24 2012 +0000 |
662 | + |
663 | + Fix exception when port status is updated with linux bridge plugin |
664 | + |
665 | + Fixes bug 1072713 |
666 | + |
667 | + Change-Id: I3466e747764fc379d413d9493cf80ea35552179f |
668 | + |
669 | + quantum/plugins/linuxbridge/agent/linuxbridge_quantum_agent.py | 2 ++ |
670 | + 1 file changed, 2 insertions(+) |
671 | + |
672 | +commit c35635366dac8213250dd0a58dbffc9bbece7dc1 |
673 | +Merge: 168ce12 607f486 |
674 | +Author: Jenkins <jenkins@review.openstack.org> |
675 | +Date: Wed Oct 31 13:52:55 2012 +0000 |
676 | + |
677 | + Merge "Logging indicates when service starts and terminates" into stable/folsom |
678 | + |
679 | +commit 168ce12b42b62310a37f2cfdbb66189909d21cb6 |
680 | +Merge: 067c7ee 21a0fdf |
681 | +Author: Jenkins <jenkins@review.openstack.org> |
682 | +Date: Wed Oct 31 13:52:46 2012 +0000 |
683 | + |
684 | + Merge "Fix flag name for l3 agent external network id" into stable/folsom |
685 | + |
686 | +commit 067c7eeffb06c9db1ec0825c561e983e1f4dc606 |
687 | +Merge: bff17fb 5cbaff4 |
688 | +Author: Jenkins <jenkins@review.openstack.org> |
689 | +Date: Wed Oct 31 13:49:59 2012 +0000 |
690 | + |
691 | + Merge "use object directly instead of the foreigh key to update master db object." into stable/folsom |
692 | + |
693 | +commit 63b81f648ea207d2618e4b48533c59f6d58184f8 |
694 | +Author: gongysh <gongysh@cn.ibm.com> |
695 | +Date: Wed Oct 24 16:13:09 2012 +0800 |
696 | + |
697 | + Delete the child object via setting the parent's attribute to None. |
698 | + |
699 | + Bug #1070335 |
700 | + |
701 | + We should not operate the foreigh key attribute of parent attribute |
702 | + directly. |
703 | + |
704 | + Change-Id: I98dc8eae78fdf67f0e7189e73afba77c6affcc0e |
705 | + |
706 | + quantum/db/l3_db.py | 2 +- |
707 | + quantum/tests/unit/test_l3_plugin.py | 24 ++++++++++++++++++++++++ |
708 | + 2 files changed, 25 insertions(+), 1 deletion(-) |
709 | + |
710 | +commit 7c8a55ce9f4d5e1caa32cc7e14f53ce638686241 |
711 | +Author: Nachi Ueno <nachi@nttmcl.com> |
712 | +Date: Thu Oct 25 21:14:48 2012 +0000 |
713 | + |
714 | + Make create_floatingip support transaction |
715 | + |
716 | + Fixes bug #1064748 |
717 | + Also added unit test |
718 | + |
719 | + Change-Id: I82b2031af0a87a92ace9a8b86f89772beaca5e8f |
720 | + |
721 | + quantum/db/l3_db.py | 39 ++++++++++++++++------------------ |
722 | + quantum/tests/unit/test_l3_plugin.py | 39 ++++++++++++++++++++++++++++++++++ |
723 | + 2 files changed, 57 insertions(+), 21 deletions(-) |
724 | + |
725 | +commit cb5793241739dfb2c3b2b74cc1c5f6972f37cccc |
726 | +Author: Akihiro MOTOKI <motoki@da.jp.nec.com> |
727 | +Date: Mon Oct 29 22:37:37 2012 +0900 |
728 | + |
729 | + Get subnets of router interfaces with an elevated context. |
730 | + |
731 | + Fixes bug 1057558 |
732 | + |
733 | + A router may have interfaces owned by other tenants (by admin operations). |
734 | + An elevated context is required to get subnet information for such interfaces. |
735 | + |
736 | + Change-Id: Iaf24c842c2c1e3c52573e7f9831d5f6d8fc01885 |
737 | + |
738 | + quantum/db/l3_db.py | 3 ++- |
739 | + quantum/tests/unit/test_l3_plugin.py | 40 ++++++++++++++++++++++++++++++++++ |
740 | + 2 files changed, 42 insertions(+), 1 deletion(-) |
741 | + |
742 | +commit bff17fb84038f31ec8869b412fba4789f803f868 |
743 | +Author: Gary Kotton <gkotton@redhat.com> |
744 | +Date: Sat Oct 27 02:36:25 2012 +0000 |
745 | + |
746 | + Ensure that the SqlSoup import is still supported. |
747 | + |
748 | + The sqlalchemy package 0.8.0b1 released on October 30, 2012 |
749 | + removed SQLSoup (http://docs.sqlalchemy.org/en/latest/changelog/migration_08.html#sqlsoup) |
750 | + |
751 | + A number of quantum agents make use of this code to access the |
752 | + database. |
753 | + |
754 | + Change-Id: I6ed6424277d60598d9b2b66eb0b206f1a634991e |
755 | + |
756 | + tools/pip-requires | 2 +- |
757 | + 1 file changed, 1 insertion(+), 1 deletion(-) |
758 | + |
759 | +commit 607f486ef5483303bcb9c458b54bbaae6402150d |
760 | +Author: Gary Kotton <gkotton@redhat.com> |
761 | +Date: Mon Oct 8 02:44:50 2012 +0000 |
762 | + |
763 | + Logging indicates when service starts and terminates |
764 | + |
765 | + Fixes bug 1064070 |
766 | + |
767 | + The patch adds a log entry indication that the service has started. In |
768 | + addition to this if there is an "exit" statement in the code, then the |
769 | + log message will indicate that the service has been terminated. |
770 | + |
771 | + Change-Id: Idb6cff4b85d26331df2c6e14aa0680e82b4e2cd7 |
772 | + |
773 | + quantum/common/config.py | 1 + |
774 | + .../plugins/linuxbridge/agent/linuxbridge_quantum_agent.py | 6 ++++-- |
775 | + quantum/plugins/linuxbridge/lb_quantum_plugin.py | 6 ++++-- |
776 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 10 +++++++--- |
777 | + quantum/plugins/openvswitch/ovs_quantum_plugin.py | 12 ++++++++---- |
778 | + 5 files changed, 24 insertions(+), 11 deletions(-) |
779 | + |
780 | +commit 632e3c8d5a992c311ec983a1d05aa75a3ad002e7 |
781 | +Merge: 5e1fe1c e091a29 |
782 | +Author: Jenkins <jenkins@review.openstack.org> |
783 | +Date: Sun Oct 28 23:03:45 2012 +0000 |
784 | + |
785 | + Merge "l3_nat_agent was renamed to l3_agent and this was missed." into stable/folsom |
786 | + |
787 | +commit 5e1fe1c48ebfc064f459accd11dec9f11377499a |
788 | +Merge: 122d927 9030969 |
789 | +Author: Jenkins <jenkins@review.openstack.org> |
790 | +Date: Sun Oct 28 22:48:44 2012 +0000 |
791 | + |
792 | + Merge "remove default value of local_ip in OVS agent" into stable/folsom |
793 | + |
794 | +commit 122d927237625b7dd27e2a3a42e7594ada10dcdd |
795 | +Merge: 0e2cb4c 425e942 |
796 | +Author: Jenkins <jenkins@review.openstack.org> |
797 | +Date: Sun Oct 28 22:38:51 2012 +0000 |
798 | + |
799 | + Merge "Call iptables without absolute path." into stable/folsom |
800 | + |
801 | +commit 0e2cb4cc19ce786fff115d411a3f249639527052 |
802 | +Merge: d345667 51c8799 |
803 | +Author: Jenkins <jenkins@review.openstack.org> |
804 | +Date: Sun Oct 28 22:34:29 2012 +0000 |
805 | + |
806 | + Merge "Ensures port is not created when database exception occurs" into stable/folsom |
807 | + |
808 | +commit d345667736fd322b14f923fe596d4aaa0f502e73 |
809 | +Merge: b4f9b1f fc97da9 |
810 | +Author: Jenkins <jenkins@review.openstack.org> |
811 | +Date: Sun Oct 28 22:02:17 2012 +0000 |
812 | + |
813 | + Merge "correct nvplib to update device_id" into stable/folsom |
814 | + |
815 | +commit 2504f628217099208982e14caa3a5afcb77e4d25 |
816 | +Author: Aaron Rosen <arosen@nicira.com> |
817 | +Date: Thu Oct 4 16:18:58 2012 -0700 |
818 | + |
819 | + get_network in nvp plugin didn't return subnet information |
820 | + |
821 | + Adds unit test for show network which checks for subnet. |
822 | + |
823 | + Fixes bug 1061781 |
824 | + |
825 | + Change-Id: I459a1f11a9e4294c31d002c8dbcfde873e43c800 |
826 | + |
827 | + quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py | 4 +++- |
828 | + quantum/tests/unit/test_db_plugin.py | 8 ++++++++ |
829 | + 2 files changed, 11 insertions(+), 1 deletion(-) |
830 | + |
831 | +commit 21a0fdf8bdeca0edadbd2068795a7c27b4ee6fa2 |
832 | +Author: Takaaki Suzuki <suzuki@midokura.com> |
833 | +Date: Tue Sep 25 15:32:33 2012 +0900 |
834 | + |
835 | + Fix flag name for l3 agent external network id |
836 | + |
837 | + Bug #1056720 |
838 | + |
839 | + Change-Id: I744da7e1584d5230a23c4fc8b6fc258814babfa9 |
840 | + |
841 | + etc/l3_agent.ini | 2 +- |
842 | + quantum/agent/l3_agent.py | 2 +- |
843 | + 2 files changed, 2 insertions(+), 2 deletions(-) |
844 | + |
845 | +commit 5cbaff430fc85db80c5c36b6976f43a6367d5ddc |
846 | +Author: gongysh <gongysh@cn.ibm.com> |
847 | +Date: Tue Oct 23 22:40:26 2012 +0800 |
848 | + |
849 | + use object directly instead of the foreigh key to update master db object. |
850 | + |
851 | + Bug #1064235 |
852 | + |
853 | + Change-Id: I74fe3e758681c40590de87c82fd093224d329f51 |
854 | + |
855 | + quantum/db/l3_db.py | 3 ++- |
856 | + quantum/tests/unit/test_l3_plugin.py | 15 +++++++++++++++ |
857 | + 2 files changed, 17 insertions(+), 1 deletion(-) |
858 | + |
859 | +commit 9030969d047f12e9d30def3eb102ea74d7c8913e |
860 | +Author: Mark McClain <mark.mcclain@dreamhost.com> |
861 | +Date: Mon Sep 17 17:28:00 2012 -0400 |
862 | + |
863 | + remove default value of local_ip in OVS agent |
864 | + |
865 | + fixes bug 1051744 |
866 | + |
867 | + Remove the default value for local_ip in the OVS agent config. |
868 | + |
869 | + Change-Id: Ie23ba8510c0cf5c17443c805e0befce6eccb253c |
870 | + |
871 | + etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini | 2 +- |
872 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 4 ++++ |
873 | + quantum/plugins/openvswitch/common/config.py | 2 +- |
874 | + 3 files changed, 6 insertions(+), 2 deletions(-) |
875 | + |
876 | +commit 425e942fa28667f57282044f653a73c7fa60cfff |
877 | +Author: Akihiro MOTOKI <motoki@da.jp.nec.com> |
878 | +Date: Wed Oct 24 22:14:06 2012 +0900 |
879 | + |
880 | + Call iptables without absolute path. |
881 | + |
882 | + Fixes bug 1069966 |
883 | + |
884 | + rootwrap expects the command name is not absolute. We need to call |
885 | + the command without path to make rootwrap work well. |
886 | + |
887 | + Change-Id: I6120103908d10ca257d177a320294de06a89c646 |
888 | + |
889 | + quantum/agent/linux/iptables_manager.py | 2 +- |
890 | + quantum/tests/unit/test_iptables_manager.py | 48 +++++++++++++-------------- |
891 | + 2 files changed, 25 insertions(+), 25 deletions(-) |
892 | + |
893 | +commit fc97da9cf103542c6b8849cebf682b5211a9a29f |
894 | +Author: Aaron Rosen <arosen@nicira.com> |
895 | +Date: Wed Oct 3 21:52:43 2012 -0700 |
896 | + |
897 | + correct nvplib to update device_id |
898 | + |
899 | + Fixes bug 1061391 |
900 | + |
901 | + Change-Id: Ide8efdfb12dd0f403d7e4f468b1c9f3cc024f9a9 |
902 | + |
903 | + quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py | 2 ++ |
904 | + quantum/plugins/nicira/nicira_nvp_plugin/nvplib.py | 11 +++++++++-- |
905 | + 2 files changed, 11 insertions(+), 2 deletions(-) |
906 | + |
907 | +commit e091a298c8126b14976bd5d6e4beeb421ba59696 |
908 | +Author: Somik Behera <somikbehera@gmail.com> |
909 | +Date: Mon Oct 1 22:33:12 2012 -0700 |
910 | + |
911 | + l3_nat_agent was renamed to l3_agent |
912 | + and this was missed. |
913 | + |
914 | + This broke quantum-l3-agent when setup.py was |
915 | + used to install but did not affect package installs. |
916 | + |
917 | + This change fixes the issue. |
918 | + |
919 | + Change-Id: I820d26fba5d2774262577ed4fbae81dc7362e93e |
920 | + |
921 | + setup.py | 2 +- |
922 | + 1 file changed, 1 insertion(+), 1 deletion(-) |
923 | + |
924 | +commit 51c87994700bc5cda4349d7cebcbc400ce7c1ee9 |
925 | +Author: Gary Kotton <gkotton@redhat.com> |
926 | +Date: Mon Oct 8 04:18:11 2012 +0000 |
927 | + |
928 | + Ensures port is not created when database exception occurs |
929 | + |
930 | + Fixes bug 1064261 |
931 | + |
932 | + The port creation code did not correctly treat a database error. That is, |
933 | + if there was an exception the port would be created and an error returned |
934 | + to the client. |
935 | + |
936 | + Change-Id: I6cf36d1c641b46716afb16f228b8daa631099a5d |
937 | + |
938 | + quantum/db/db_base_plugin_v2.py | 5 ++--- |
939 | + quantum/tests/unit/test_db_plugin.py | 13 +++++++++++++ |
940 | + 2 files changed, 15 insertions(+), 3 deletions(-) |
941 | + |
942 | +commit b4f9b1f5f629e4be21ca51c17cfd72cab4aefe39 |
943 | +Author: Gary Kotton <gkotton@redhat.com> |
944 | +Date: Fri Oct 5 06:07:13 2012 -0400 |
945 | + |
946 | + Treat invalid namespace call |
947 | + |
948 | + Fixes bug 1060559 |
949 | + |
950 | + Change-Id: I29250100416b87f55781fb7e97339f6d3761513f |
951 | + |
952 | + quantum/agent/l3_agent.py | 3 ++- |
953 | + 1 file changed, 2 insertions(+), 1 deletion(-) |
954 | + |
955 | +commit 4946d4bb286a603ac804b1a27e74aea6ada99a6c |
956 | +Merge: c623f72 3bbf281 |
957 | +Author: Jenkins <jenkins@review.openstack.org> |
958 | +Date: Sat Oct 13 23:21:51 2012 +0000 |
959 | + |
960 | + Merge "Restore SIGPIPE default action for subprocesses" into stable/folsom |
961 | + |
962 | +commit c623f725486271d2fa349c2a89fe25829c9d29ef |
963 | +Author: Mark McLoughlin <markmc@redhat.com> |
964 | +Date: Sat Oct 13 22:46:34 2012 +0100 |
965 | + |
966 | + Set defaultbranch in .gitreview to stable/folsom |
967 | + |
968 | + This allows people run git-review without any arguments. |
969 | + |
970 | + Change-Id: I2b2488ffffd783b64e5c760324e7d4a00d5a39db |
971 | + |
972 | + .gitreview | 1 + |
973 | + 1 file changed, 1 insertion(+) |
974 | + |
975 | +commit 3bbf281b15866fc6aecdf8283bca696e5c646300 |
976 | +Author: Thierry Carrez <thierry@openstack.org> |
977 | +Date: Thu Sep 20 14:42:53 2012 +0200 |
978 | + |
979 | + Restore SIGPIPE default action for subprocesses |
980 | + |
981 | + Python ignores SIGPIPE on startup, because it prefers to check every |
982 | + write and raise an IOError exception rather than taking the signal. Most |
983 | + Unix subprocesses don't expect to work this way. This patch (adapted |
984 | + from Colin Watson's post at http://tinyurl.com/2a7mzh5) sets SIGPIPE |
985 | + back to the default action for quantum.agent.linux.utils.execute, |
986 | + quantum.common.utils.execute and quantum-rootwrap created subprocesses. |
987 | + |
988 | + Fixes bug 1053364 |
989 | + |
990 | + Change-Id: Ib805f1f8846c245b75a5ea64278c840b823c1fb2 |
991 | + |
992 | + bin/quantum-rootwrap | 8 ++++++++ |
993 | + quantum/agent/linux/utils.py | 8 ++++++++ |
994 | + quantum/common/utils.py | 8 ++++++++ |
995 | + 3 files changed, 24 insertions(+) |
996 | + |
997 | +commit 5a5dec2d65c5f6e5e97ea89278ee278470090b6c |
998 | +Author: Thierry Carrez <thierry@openstack.org> |
999 | +Date: Fri Sep 28 15:53:14 2012 +0200 |
1000 | + |
1001 | + Bump next version to 2012.2.1 |
1002 | + |
1003 | + Open stable/folsom by bumping next version to 2012.2.1. |
1004 | + |
1005 | + Change-Id: I1d6d3a4dadc21427b5aa23a1f093850fd667f741 |
1006 | + |
1007 | + quantum/version.py | 4 ++-- |
1008 | + 1 file changed, 2 insertions(+), 2 deletions(-) |
1009 | + |
1010 | commit a9b17b66b77c2bfeef52e11a8eff45f5d11d906f |
1011 | Merge: 22993a0 5dfc99b |
1012 | Author: Jenkins <jenkins@review.openstack.org> |
1013 | @@ -527,7 +1386,7 @@ |
1014 | |
1015 | Change-Id: I569e60aa1f8ab8313e5427bd16798cc6b4079a09 |
1016 | |
1017 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 4 ++-- |
1018 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 4 ++-- |
1019 | 1 file changed, 2 insertions(+), 2 deletions(-) |
1020 | |
1021 | commit 03694682b7437f1f71ba0769e1c0962aacbb22e6 |
1022 | @@ -1954,7 +2813,7 @@ |
1023 | |
1024 | Change-Id: Icd2e79722cfcb816bfdfa85bd8b8ab5198908474 |
1025 | |
1026 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 7 ++++--- |
1027 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 7 ++++--- |
1028 | 1 file changed, 4 insertions(+), 3 deletions(-) |
1029 | |
1030 | commit 8e34320bbc844c42066b9499e6afff8feda1fa56 |
1031 | @@ -2187,8 +3046,8 @@ |
1032 | |
1033 | Change-Id: Iafb7fd02d37415c3466213d28280bcb4573de4a8 |
1034 | |
1035 | - .../linuxbridge/agent/linuxbridge_quantum_agent.py | 2 +- |
1036 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 2 +- |
1037 | + quantum/plugins/linuxbridge/agent/linuxbridge_quantum_agent.py | 2 +- |
1038 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 2 +- |
1039 | 2 files changed, 2 insertions(+), 2 deletions(-) |
1040 | |
1041 | commit 7dcaeecfd51065cda93d2c88a24ba330efac6f73 |
1042 | @@ -2318,7 +3177,7 @@ |
1043 | |
1044 | Change-Id: I54315831f240c6810707e7247e7a76c1bfa8742e |
1045 | |
1046 | - .../linuxbridge/agent/linuxbridge_quantum_agent.py | 16 +++++++++------- |
1047 | + .../linuxbridge/agent/linuxbridge_quantum_agent.py | 16 +++++++++------- |
1048 | 1 file changed, 9 insertions(+), 7 deletions(-) |
1049 | |
1050 | commit 8fb4e6efe8dcf1987d41917f71da8db345647321 |
1051 | @@ -3027,10 +3886,10 @@ |
1052 | |
1053 | Change-Id: Id8e5df04cc0183cd4b2a9ab23cd403a83a2db637 |
1054 | |
1055 | - .../linuxbridge/agent/linuxbridge_quantum_agent.py | 4 ---- |
1056 | - .../metaplugin/agent/linuxbridge_quantum_agent.py | 3 --- |
1057 | - .../plugins/metaplugin/agent/ovs_quantum_agent.py | 4 ---- |
1058 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 4 ---- |
1059 | + quantum/plugins/linuxbridge/agent/linuxbridge_quantum_agent.py | 4 ---- |
1060 | + quantum/plugins/metaplugin/agent/linuxbridge_quantum_agent.py | 3 --- |
1061 | + quantum/plugins/metaplugin/agent/ovs_quantum_agent.py | 4 ---- |
1062 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 4 ---- |
1063 | 4 files changed, 15 deletions(-) |
1064 | |
1065 | commit 1b090e5365952fdc63ddd185dfdf5a21f4f48b12 |
1066 | @@ -3115,8 +3974,8 @@ |
1067 | |
1068 | Change-Id: Ib6500813d4111ae42675459fac64dfb2e9c40d91 |
1069 | |
1070 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 10 +++++++--- |
1071 | - .../plugins/openvswitch/tests/unit/test_tunnel.py | 10 ++++++++-- |
1072 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 10 +++++++--- |
1073 | + quantum/plugins/openvswitch/tests/unit/test_tunnel.py | 10 ++++++++-- |
1074 | 2 files changed, 15 insertions(+), 5 deletions(-) |
1075 | |
1076 | commit 9c915b0d7f58a5da8f63ebf09b13853d52e520e6 |
1077 | @@ -3354,7 +4213,7 @@ |
1078 | |
1079 | Change-Id: Iaa4778562b4efc13919341832f5281b1516f8f8c |
1080 | |
1081 | - .../linuxbridge/agent/linuxbridge_quantum_agent.py | 9 +++++++-- |
1082 | + .../plugins/linuxbridge/agent/linuxbridge_quantum_agent.py | 9 +++++++-- |
1083 | 1 file changed, 7 insertions(+), 2 deletions(-) |
1084 | |
1085 | commit 1798c82dfa7de36de2502bb44e8b646d93574290 |
1086 | @@ -5070,10 +5929,10 @@ |
1087 | |
1088 | Change-Id: I99130f863928abf30a521e9a2b6d1233a274d9c6 |
1089 | |
1090 | - .../plugins/linuxbridge/db/l2network_models_v2.py | 3 ++- |
1091 | - quantum/plugins/linuxbridge/lb_quantum_plugin.py | 4 ++-- |
1092 | - quantum/plugins/openvswitch/ovs_quantum_plugin.py | 3 ++- |
1093 | - quantum/plugins/ryu/ryu_quantum_plugin.py | 3 ++- |
1094 | + quantum/plugins/linuxbridge/db/l2network_models_v2.py | 3 ++- |
1095 | + quantum/plugins/linuxbridge/lb_quantum_plugin.py | 4 ++-- |
1096 | + quantum/plugins/openvswitch/ovs_quantum_plugin.py | 3 ++- |
1097 | + quantum/plugins/ryu/ryu_quantum_plugin.py | 3 ++- |
1098 | 4 files changed, 8 insertions(+), 5 deletions(-) |
1099 | |
1100 | commit ddcc951f08dc24c2fc605b45937a429c2c354e51 |
1101 | @@ -5157,7 +6016,7 @@ |
1102 | |
1103 | Change-Id: Ie37ef0c3355e86f504fa71417921bb828b40e347 |
1104 | |
1105 | - .../plugins/openvswitch/tests/unit/test_tunnel.py | 3 ++- |
1106 | + quantum/plugins/openvswitch/tests/unit/test_tunnel.py | 3 ++- |
1107 | 1 file changed, 2 insertions(+), 1 deletion(-) |
1108 | |
1109 | commit 610017c460b85e1b7d11327d050972bb03fcc0c3 |
1110 | @@ -5212,7 +6071,7 @@ |
1111 | |
1112 | Change-Id: I7c7e029fbf88e0fd62aba821e81a55d3aca02190 |
1113 | |
1114 | - .../tests/unit/_test_linuxbridgeAgent.py | 4 +++- |
1115 | + quantum/plugins/linuxbridge/tests/unit/_test_linuxbridgeAgent.py | 4 +++- |
1116 | 1 file changed, 3 insertions(+), 1 deletion(-) |
1117 | |
1118 | commit 5583de27c24a2ba8c045a3097d98312905dc5180 |
1119 | @@ -5682,7 +6541,7 @@ |
1120 | |
1121 | Change-Id: Ica3aa3f6c81e4fd062b752867487c89515fb9446 |
1122 | |
1123 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 3 ++- |
1124 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 3 ++- |
1125 | 1 file changed, 2 insertions(+), 1 deletion(-) |
1126 | |
1127 | commit f3e4b701fd9158cd7c167d9f188bfb71fa319671 |
1128 | @@ -5717,18 +6576,18 @@ |
1129 | |
1130 | Change-Id: Ibfea9bac87ba36f301671a35de81577debcd460e |
1131 | |
1132 | - .../plugins/linuxbridge/linuxbridge_conf.ini | 3 +++ |
1133 | - .../plugins/openvswitch/ovs_quantum_plugin.ini | 3 +++ |
1134 | - quantum/db/api.py | 17 +++++++++++++---- |
1135 | - quantum/plugins/linuxbridge/common/config.py | 1 + |
1136 | - quantum/plugins/linuxbridge/db/l2network_db.py | 1 + |
1137 | - quantum/plugins/openvswitch/common/config.py | 1 + |
1138 | - quantum/plugins/openvswitch/ovs_quantum_plugin.py | 4 ++++ |
1139 | - quantum/plugins/ryu/common/config.py | 1 + |
1140 | - quantum/plugins/ryu/ovs_quantum_plugin_base.py | 2 ++ |
1141 | - quantum/tests/unit/test_lb_config.py | 3 +++ |
1142 | - quantum/tests/unit/test_ovs_config.py | 3 +++ |
1143 | - quantum/tests/unit/test_ryu_config.py | 3 +++ |
1144 | + etc/quantum/plugins/linuxbridge/linuxbridge_conf.ini | 3 +++ |
1145 | + .../plugins/openvswitch/ovs_quantum_plugin.ini | 3 +++ |
1146 | + quantum/db/api.py | 17 +++++++++++++---- |
1147 | + quantum/plugins/linuxbridge/common/config.py | 1 + |
1148 | + quantum/plugins/linuxbridge/db/l2network_db.py | 1 + |
1149 | + quantum/plugins/openvswitch/common/config.py | 1 + |
1150 | + quantum/plugins/openvswitch/ovs_quantum_plugin.py | 4 ++++ |
1151 | + quantum/plugins/ryu/common/config.py | 1 + |
1152 | + quantum/plugins/ryu/ovs_quantum_plugin_base.py | 2 ++ |
1153 | + quantum/tests/unit/test_lb_config.py | 3 +++ |
1154 | + quantum/tests/unit/test_ovs_config.py | 3 +++ |
1155 | + quantum/tests/unit/test_ryu_config.py | 3 +++ |
1156 | 12 files changed, 38 insertions(+), 4 deletions(-) |
1157 | |
1158 | commit eb6eded3d13b658a195a432dcde94605e951f3e4 |
1159 | @@ -5922,10 +6781,10 @@ |
1160 | |
1161 | Change-Id: I58b6d4356b071624c725b4dd0d98a60592ef0b45 |
1162 | |
1163 | - .../cisco/nova/quantum_port_aware_scheduler.py | 2 +- |
1164 | - quantum/plugins/cisco/nova/vifdirect.py | 2 +- |
1165 | - quantum/plugins/ryu/nova/linux_net.py | 2 +- |
1166 | - quantum/plugins/ryu/nova/vif.py | 2 +- |
1167 | + quantum/plugins/cisco/nova/quantum_port_aware_scheduler.py | 2 +- |
1168 | + quantum/plugins/cisco/nova/vifdirect.py | 2 +- |
1169 | + quantum/plugins/ryu/nova/linux_net.py | 2 +- |
1170 | + quantum/plugins/ryu/nova/vif.py | 2 +- |
1171 | 4 files changed, 4 insertions(+), 4 deletions(-) |
1172 | |
1173 | commit 13070251129155ba4eb435f0af3d61418e9775e2 |
1174 | @@ -6105,7 +6964,7 @@ |
1175 | |
1176 | Change-Id: I8a1f6cc7be930c04ce302d7f87814b9bd5bed129 |
1177 | |
1178 | - .../linuxbridge/agent/linuxbridge_quantum_agent.py | 13 +++++++++++-- |
1179 | + .../linuxbridge/agent/linuxbridge_quantum_agent.py | 13 +++++++++++-- |
1180 | 1 file changed, 11 insertions(+), 2 deletions(-) |
1181 | |
1182 | commit 072dce2ad09a6b28813f9b8f13d3e8a7bcc0d987 |
1183 | @@ -6243,9 +7102,9 @@ |
1184 | |
1185 | Change-Id: If11244d48a5c966bbbf8786e3e9f42d205a70164 |
1186 | |
1187 | - .../plugins/openvswitch/ovs_quantum_plugin.ini | 2 ++ |
1188 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 9 +++++++++ |
1189 | - quantum/plugins/openvswitch/common/config.py | 1 + |
1190 | + etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini | 2 ++ |
1191 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 9 +++++++++ |
1192 | + quantum/plugins/openvswitch/common/config.py | 1 + |
1193 | 3 files changed, 12 insertions(+) |
1194 | |
1195 | commit 7841b681f123e3b636d7ee6b5301de6358871c04 |
1196 | @@ -6335,7 +7194,7 @@ |
1197 | |
1198 | Change-Id: I3105131e853d45609bc441482bf5b3c3e035a129 |
1199 | |
1200 | - .../linuxbridge/agent/linuxbridge_quantum_agent.py | 10 +++++----- |
1201 | + .../plugins/linuxbridge/agent/linuxbridge_quantum_agent.py | 10 +++++----- |
1202 | 1 file changed, 5 insertions(+), 5 deletions(-) |
1203 | |
1204 | commit a79b1c34258616eb25bd77e4ec5b253c32d90fa3 |
1205 | @@ -6348,46 +7207,46 @@ |
1206 | |
1207 | Change-Id: I849d73fc756b830b78492a6ed0e8cf2d32fde8cd |
1208 | |
1209 | - quantum/agent/linux/utils.py | 2 +- |
1210 | - quantum/api/__init__.py | 2 +- |
1211 | - quantum/api/api_common.py | 2 +- |
1212 | - quantum/api/v2/resource.py | 4 ++-- |
1213 | - quantum/api/v2/router.py | 4 ++-- |
1214 | - quantum/api/versions.py | 2 +- |
1215 | - quantum/db/db_base_plugin_v2.py | 2 +- |
1216 | - quantum/db/model_base.py | 2 +- |
1217 | - quantum/extensions/novatenant.py | 2 +- |
1218 | - quantum/plugins/cisco/client/cli.py | 2 +- |
1219 | - quantum/plugins/cisco/db/l2network_db.py | 2 +- |
1220 | - quantum/plugins/cisco/db/l2network_models.py | 2 +- |
1221 | - quantum/plugins/cisco/db/ucs_models.py | 2 +- |
1222 | - quantum/plugins/cisco/l2network_plugin.py | 4 ++-- |
1223 | - .../plugins/cisco/models/l2network_multi_blade.py | 2 +- |
1224 | - .../plugins/cisco/models/l2network_single_blade.py | 2 +- |
1225 | - .../plugins/cisco/services/services_logistics.py | 4 ++-- |
1226 | - quantum/plugins/cisco/tests/unit/__init__.py | 2 ++ |
1227 | - .../plugins/cisco/tests/unit/test_l2networkApi.py | 4 ++-- |
1228 | - quantum/plugins/cisco/tests/unit/test_vlan_mgr.py | 2 +- |
1229 | - quantum/plugins/cisco/ucs/cisco_ucs_inventory.py | 6 +++--- |
1230 | - quantum/plugins/linuxbridge/db/l2network_db.py | 2 +- |
1231 | - .../tests/unit/_test_linuxbridgeAgent.py | 2 +- |
1232 | - .../api_client/client_eventlet.py | 2 +- |
1233 | - .../api_client/request_eventlet.py | 2 +- |
1234 | - .../nicira/nicira_nvp_plugin/tests/test_check.py | 2 +- |
1235 | - .../nicira/nicira_nvp_plugin/tests/test_network.py | 2 +- |
1236 | - .../nicira/nicira_nvp_plugin/tests/test_port.py | 2 +- |
1237 | - quantum/plugins/openvswitch/ovs_quantum_plugin.py | 2 +- |
1238 | - .../plugins/openvswitch/tests/unit/test_tunnel.py | 2 +- |
1239 | - quantum/plugins/ryu/ovs_quantum_plugin_base.py | 2 +- |
1240 | - quantum/plugins/ryu/ryu_quantum_plugin.py | 4 ++-- |
1241 | - quantum/plugins/ryu/tests/unit/test_plugin_base.py | 2 +- |
1242 | - quantum/plugins/ryu/tests/unit/test_ryu_driver.py | 2 +- |
1243 | - quantum/plugins/ryu/tests/unit/utils.py | 2 +- |
1244 | - quantum/policy.py | 2 +- |
1245 | - quantum/quantum_plugin_base.py | 2 +- |
1246 | - quantum/tests/unit/_test_api.py | 4 ++-- |
1247 | - quantum/tests/unit/test_api_v2.py | 6 +++--- |
1248 | - quantum/tests/unit/test_db_plugin.py | 8 ++++---- |
1249 | + quantum/agent/linux/utils.py | 2 +- |
1250 | + quantum/api/__init__.py | 2 +- |
1251 | + quantum/api/api_common.py | 2 +- |
1252 | + quantum/api/v2/resource.py | 4 ++-- |
1253 | + quantum/api/v2/router.py | 4 ++-- |
1254 | + quantum/api/versions.py | 2 +- |
1255 | + quantum/db/db_base_plugin_v2.py | 2 +- |
1256 | + quantum/db/model_base.py | 2 +- |
1257 | + quantum/extensions/novatenant.py | 2 +- |
1258 | + quantum/plugins/cisco/client/cli.py | 2 +- |
1259 | + quantum/plugins/cisco/db/l2network_db.py | 2 +- |
1260 | + quantum/plugins/cisco/db/l2network_models.py | 2 +- |
1261 | + quantum/plugins/cisco/db/ucs_models.py | 2 +- |
1262 | + quantum/plugins/cisco/l2network_plugin.py | 4 ++-- |
1263 | + quantum/plugins/cisco/models/l2network_multi_blade.py | 2 +- |
1264 | + quantum/plugins/cisco/models/l2network_single_blade.py | 2 +- |
1265 | + quantum/plugins/cisco/services/services_logistics.py | 4 ++-- |
1266 | + quantum/plugins/cisco/tests/unit/__init__.py | 2 ++ |
1267 | + quantum/plugins/cisco/tests/unit/test_l2networkApi.py | 4 ++-- |
1268 | + quantum/plugins/cisco/tests/unit/test_vlan_mgr.py | 2 +- |
1269 | + quantum/plugins/cisco/ucs/cisco_ucs_inventory.py | 6 +++--- |
1270 | + quantum/plugins/linuxbridge/db/l2network_db.py | 2 +- |
1271 | + .../plugins/linuxbridge/tests/unit/_test_linuxbridgeAgent.py | 2 +- |
1272 | + .../nicira/nicira_nvp_plugin/api_client/client_eventlet.py | 2 +- |
1273 | + .../nicira/nicira_nvp_plugin/api_client/request_eventlet.py | 2 +- |
1274 | + quantum/plugins/nicira/nicira_nvp_plugin/tests/test_check.py | 2 +- |
1275 | + quantum/plugins/nicira/nicira_nvp_plugin/tests/test_network.py | 2 +- |
1276 | + quantum/plugins/nicira/nicira_nvp_plugin/tests/test_port.py | 2 +- |
1277 | + quantum/plugins/openvswitch/ovs_quantum_plugin.py | 2 +- |
1278 | + quantum/plugins/openvswitch/tests/unit/test_tunnel.py | 2 +- |
1279 | + quantum/plugins/ryu/ovs_quantum_plugin_base.py | 2 +- |
1280 | + quantum/plugins/ryu/ryu_quantum_plugin.py | 4 ++-- |
1281 | + quantum/plugins/ryu/tests/unit/test_plugin_base.py | 2 +- |
1282 | + quantum/plugins/ryu/tests/unit/test_ryu_driver.py | 2 +- |
1283 | + quantum/plugins/ryu/tests/unit/utils.py | 2 +- |
1284 | + quantum/policy.py | 2 +- |
1285 | + quantum/quantum_plugin_base.py | 2 +- |
1286 | + quantum/tests/unit/_test_api.py | 4 ++-- |
1287 | + quantum/tests/unit/test_api_v2.py | 6 +++--- |
1288 | + quantum/tests/unit/test_db_plugin.py | 8 ++++---- |
1289 | 40 files changed, 55 insertions(+), 53 deletions(-) |
1290 | |
1291 | commit 0061c0ce4443395a258a99c70e1c1a7d0435e84e |
1292 | @@ -6629,10 +7488,10 @@ |
1293 | |
1294 | Change-Id: Iaba819e62d70a9c9935cae195718dbf74d13884a |
1295 | |
1296 | - .../plugins/openvswitch/ovs_quantum_plugin.ini | 4 ++++ |
1297 | - quantum/plugins/openvswitch/common/config.py | 2 ++ |
1298 | - quantum/plugins/openvswitch/ovs_quantum_plugin.py | 19 ++++++++++++++----- |
1299 | - .../openvswitch/tests/unit/test_vlan_map.py | 12 ++++++------ |
1300 | + .../plugins/openvswitch/ovs_quantum_plugin.ini | 4 ++++ |
1301 | + quantum/plugins/openvswitch/common/config.py | 2 ++ |
1302 | + quantum/plugins/openvswitch/ovs_quantum_plugin.py | 19 ++++++++++++++----- |
1303 | + .../plugins/openvswitch/tests/unit/test_vlan_map.py | 12 ++++++------ |
1304 | 4 files changed, 26 insertions(+), 11 deletions(-) |
1305 | |
1306 | commit 412c7aa0308974a5ba338383ef0da2f91f92f113 |
1307 | @@ -6892,7 +7751,7 @@ |
1308 | |
1309 | Change-Id: Ifa81a5ddb4f2a9dcb6ce94fa0d941ba6e6c2e038 |
1310 | |
1311 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 6 +++--- |
1312 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 6 +++--- |
1313 | 1 file changed, 3 insertions(+), 3 deletions(-) |
1314 | |
1315 | commit c0d0e891c000a7f2b8940b0bbf2c01957a33fa14 |
1316 | @@ -7013,40 +7872,40 @@ |
1317 | |
1318 | Change-Id: Ie2ca545ecfaadd033652554c9e59d6a83d44ed09 |
1319 | |
1320 | - quantum/common/test_lib.py | 2 -- |
1321 | - quantum/extensions/multiport.py | 1 - |
1322 | - quantum/plugins/cisco/client/cli.py | 2 -- |
1323 | - quantum/plugins/cisco/common/cisco_configparser.py | 2 -- |
1324 | - quantum/plugins/cisco/common/cisco_credentials.py | 1 - |
1325 | - quantum/plugins/cisco/common/cisco_utils.py | 4 ---- |
1326 | - quantum/plugins/cisco/db/l2network_db.py | 3 --- |
1327 | - quantum/plugins/cisco/db/services_db.py | 1 - |
1328 | - quantum/plugins/cisco/l2network_plugin.py | 1 - |
1329 | - .../cisco/l2network_plugin_configuration.py | 2 -- |
1330 | - .../plugins/cisco/models/l2network_multi_blade.py | 3 --- |
1331 | - .../plugins/cisco/models/l2network_single_blade.py | 3 --- |
1332 | - .../cisco/nexus/cisco_nexus_configuration.py | 1 - |
1333 | - .../cisco/nexus/cisco_nexus_network_driver.py | 1 - |
1334 | - .../plugins/cisco/nexus/cisco_nexus_snippets.py | 2 -- |
1335 | - .../cisco/nova/quantum_port_aware_scheduler.py | 1 - |
1336 | - quantum/plugins/cisco/run_tests.py | 1 - |
1337 | - .../plugins/cisco/ucs/cisco_ucs_configuration.py | 2 -- |
1338 | - quantum/plugins/cisco/ucs/cisco_ucs_inventory.py | 1 - |
1339 | - .../cisco/ucs/cisco_ucs_inventory_configuration.py | 2 -- |
1340 | - .../plugins/cisco/ucs/cisco_ucs_network_driver.py | 2 -- |
1341 | - quantum/plugins/cisco/ucs/cisco_ucs_plugin.py | 1 - |
1342 | - quantum/plugins/linuxbridge/db/l2network_models.py | 4 ---- |
1343 | - quantum/plugins/linuxbridge/run_tests.py | 4 ---- |
1344 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 2 -- |
1345 | - quantum/plugins/openvswitch/ovs_db.py | 1 - |
1346 | - quantum/plugins/openvswitch/ovs_models.py | 6 +----- |
1347 | - quantum/plugins/openvswitch/ovs_quantum_plugin.py | 2 -- |
1348 | - quantum/plugins/openvswitch/run_tests.py | 3 --- |
1349 | - .../plugins/openvswitch/tests/unit/test_tunnel.py | 1 - |
1350 | - quantum/plugins/ryu/db/models.py | 1 - |
1351 | - quantum/plugins/ryu/run_tests.py | 3 --- |
1352 | - quantum/plugins/ryu/tests/unit/basetest.py | 1 - |
1353 | - quantum/tests/unit/test_api.py | 2 +- |
1354 | + quantum/common/test_lib.py | 2 -- |
1355 | + quantum/extensions/multiport.py | 1 - |
1356 | + quantum/plugins/cisco/client/cli.py | 2 -- |
1357 | + quantum/plugins/cisco/common/cisco_configparser.py | 2 -- |
1358 | + quantum/plugins/cisco/common/cisco_credentials.py | 1 - |
1359 | + quantum/plugins/cisco/common/cisco_utils.py | 4 ---- |
1360 | + quantum/plugins/cisco/db/l2network_db.py | 3 --- |
1361 | + quantum/plugins/cisco/db/services_db.py | 1 - |
1362 | + quantum/plugins/cisco/l2network_plugin.py | 1 - |
1363 | + quantum/plugins/cisco/l2network_plugin_configuration.py | 2 -- |
1364 | + quantum/plugins/cisco/models/l2network_multi_blade.py | 3 --- |
1365 | + quantum/plugins/cisco/models/l2network_single_blade.py | 3 --- |
1366 | + quantum/plugins/cisco/nexus/cisco_nexus_configuration.py | 1 - |
1367 | + quantum/plugins/cisco/nexus/cisco_nexus_network_driver.py | 1 - |
1368 | + quantum/plugins/cisco/nexus/cisco_nexus_snippets.py | 2 -- |
1369 | + quantum/plugins/cisco/nova/quantum_port_aware_scheduler.py | 1 - |
1370 | + quantum/plugins/cisco/run_tests.py | 1 - |
1371 | + quantum/plugins/cisco/ucs/cisco_ucs_configuration.py | 2 -- |
1372 | + quantum/plugins/cisco/ucs/cisco_ucs_inventory.py | 1 - |
1373 | + quantum/plugins/cisco/ucs/cisco_ucs_inventory_configuration.py | 2 -- |
1374 | + quantum/plugins/cisco/ucs/cisco_ucs_network_driver.py | 2 -- |
1375 | + quantum/plugins/cisco/ucs/cisco_ucs_plugin.py | 1 - |
1376 | + quantum/plugins/linuxbridge/db/l2network_models.py | 4 ---- |
1377 | + quantum/plugins/linuxbridge/run_tests.py | 4 ---- |
1378 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 2 -- |
1379 | + quantum/plugins/openvswitch/ovs_db.py | 1 - |
1380 | + quantum/plugins/openvswitch/ovs_models.py | 6 +----- |
1381 | + quantum/plugins/openvswitch/ovs_quantum_plugin.py | 2 -- |
1382 | + quantum/plugins/openvswitch/run_tests.py | 3 --- |
1383 | + quantum/plugins/openvswitch/tests/unit/test_tunnel.py | 1 - |
1384 | + quantum/plugins/ryu/db/models.py | 1 - |
1385 | + quantum/plugins/ryu/run_tests.py | 3 --- |
1386 | + quantum/plugins/ryu/tests/unit/basetest.py | 1 - |
1387 | + quantum/tests/unit/test_api.py | 2 +- |
1388 | 34 files changed, 2 insertions(+), 67 deletions(-) |
1389 | |
1390 | commit 268040c3365aacef4e53bb7795ae598dd98bb77f |
1391 | @@ -7224,7 +8083,7 @@ |
1392 | |
1393 | Change-Id: If6673e59afc545e51df3625d8259ec3fca9aaefb |
1394 | |
1395 | - .../plugins/openvswitch/agent/xenserver_install.sh | 10 ++++------ |
1396 | + quantum/plugins/openvswitch/agent/xenserver_install.sh | 10 ++++------ |
1397 | 1 file changed, 4 insertions(+), 6 deletions(-) |
1398 | |
1399 | commit 0324ea3e63140428918b3192fd83f7bbacf8d9f5 |
1400 | @@ -7282,22 +8141,22 @@ |
1401 | |
1402 | Change-Id: Iab4c2ada2bfcb99452f940666b25cb1f7d4d7e58 |
1403 | |
1404 | - quantum/api/api_common.py | 2 +- |
1405 | - quantum/api/views/filters.py | 3 ++- |
1406 | - quantum/common/utils.py | 7 ++++--- |
1407 | - quantum/openstack/common/setup.py | 4 ++-- |
1408 | - quantum/plugins/cisco/db/l2network_db.py | 4 ++-- |
1409 | - quantum/plugins/cisco/db/services_db.py | 2 +- |
1410 | - quantum/plugins/cisco/db/ucs_db.py | 5 +++-- |
1411 | - quantum/plugins/cisco/l2network_plugin.py | 2 +- |
1412 | - quantum/plugins/cisco/nova/vifdirect.py | 16 ++++++++-------- |
1413 | - .../plugins/cisco/services/service_insertion.py | 4 ++-- |
1414 | - quantum/plugins/linuxbridge/LinuxBridgePlugin.py | 2 +- |
1415 | - .../linuxbridge/agent/linuxbridge_quantum_agent.py | 6 +++--- |
1416 | - .../nicira/nicira_nvp_plugin/QuantumPlugin.py | 4 ++-- |
1417 | - quantum/plugins/nicira/nicira_nvp_plugin/cli.py | 2 +- |
1418 | - quantum/plugins/nicira/nicira_nvp_plugin/nvplib.py | 2 +- |
1419 | - setup.py | 9 +++------ |
1420 | + quantum/api/api_common.py | 2 +- |
1421 | + quantum/api/views/filters.py | 3 ++- |
1422 | + quantum/common/utils.py | 7 ++++--- |
1423 | + quantum/openstack/common/setup.py | 4 ++-- |
1424 | + quantum/plugins/cisco/db/l2network_db.py | 4 ++-- |
1425 | + quantum/plugins/cisco/db/services_db.py | 2 +- |
1426 | + quantum/plugins/cisco/db/ucs_db.py | 5 +++-- |
1427 | + quantum/plugins/cisco/l2network_plugin.py | 2 +- |
1428 | + quantum/plugins/cisco/nova/vifdirect.py | 16 ++++++++-------- |
1429 | + quantum/plugins/cisco/services/service_insertion.py | 4 ++-- |
1430 | + quantum/plugins/linuxbridge/LinuxBridgePlugin.py | 2 +- |
1431 | + .../linuxbridge/agent/linuxbridge_quantum_agent.py | 6 +++--- |
1432 | + .../plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py | 4 ++-- |
1433 | + quantum/plugins/nicira/nicira_nvp_plugin/cli.py | 2 +- |
1434 | + quantum/plugins/nicira/nicira_nvp_plugin/nvplib.py | 2 +- |
1435 | + setup.py | 9 +++------ |
1436 | 16 files changed, 37 insertions(+), 37 deletions(-) |
1437 | |
1438 | commit 9895ac62c0ca73e9bcfa57b8609d21fb93129943 |
1439 | @@ -7345,8 +8204,8 @@ |
1440 | |
1441 | Change-Id: Ic7a97179d6fbb90f8c7f544a5725e1ff56fd9653 |
1442 | |
1443 | - .../linuxbridge/agent/linuxbridge_quantum_agent.py | 2 +- |
1444 | - quantum/plugins/linuxbridge/common/config.py | 2 +- |
1445 | + quantum/plugins/linuxbridge/agent/linuxbridge_quantum_agent.py | 2 +- |
1446 | + quantum/plugins/linuxbridge/common/config.py | 2 +- |
1447 | 2 files changed, 2 insertions(+), 2 deletions(-) |
1448 | |
1449 | commit 93ee2838a2937e346e78c2e3ee21f5fed478d66f |
1450 | @@ -7370,8 +8229,8 @@ |
1451 | |
1452 | Change-Id: I437c3f13fa7a81aeabcdfca7ba03e94a0a7aa32b |
1453 | |
1454 | - quantum/plugins/linuxbridge/LinuxBridgePlugin.py | 10 +--------- |
1455 | - .../tests/unit/_test_linuxbridgeAgent.py | 17 +++++++++++++++++ |
1456 | + quantum/plugins/linuxbridge/LinuxBridgePlugin.py | 10 +--------- |
1457 | + .../linuxbridge/tests/unit/_test_linuxbridgeAgent.py | 17 +++++++++++++++++ |
1458 | 2 files changed, 18 insertions(+), 9 deletions(-) |
1459 | |
1460 | commit 76b2d851af70adc52f53241e8bc864674ce9cfba |
1461 | @@ -7384,7 +8243,7 @@ |
1462 | |
1463 | Change-Id: Ib3530af9aa885a719cb712554d05e7d70834186a |
1464 | |
1465 | - .../plugins/cisco/nexus/cisco_nexus_snippets.py | 1 - |
1466 | + quantum/plugins/cisco/nexus/cisco_nexus_snippets.py | 1 - |
1467 | 1 file changed, 1 deletion(-) |
1468 | |
1469 | commit 91d3b02bc1bdaa4ab3caf462aa93a8b9db45e6eb |
1470 | @@ -7464,7 +8323,7 @@ |
1471 | |
1472 | Change-Id: Id03dc4a12a0114c8597cb90f4eabcdd3dc9b3f5c |
1473 | |
1474 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 6 ------ |
1475 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 6 ------ |
1476 | 1 file changed, 6 deletions(-) |
1477 | |
1478 | commit d2a21ec921e4158a4fa7573c3d7541d92157dd52 |
1479 | @@ -7532,7 +8391,7 @@ |
1480 | |
1481 | Change-Id: I95b1143702bc8f06067969c6b7040eea861bb56b |
1482 | |
1483 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 2 -- |
1484 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 2 -- |
1485 | 1 file changed, 2 deletions(-) |
1486 | |
1487 | commit c8091791412293f25e22a658ed3f4361429e4df2 |
1488 | @@ -7653,7 +8512,7 @@ |
1489 | |
1490 | Change-Id: I733d80df8f87ff314f4233b10fa8afaf454eedf0 |
1491 | |
1492 | - .../cisco/nova/quantum_port_aware_scheduler.py | 1 + |
1493 | + quantum/plugins/cisco/nova/quantum_port_aware_scheduler.py | 1 + |
1494 | 1 file changed, 1 insertion(+) |
1495 | |
1496 | commit c73ab6d10fe40a7a63c9874de27a53cc7a7344bd |
1497 | @@ -7799,7 +8658,7 @@ |
1498 | |
1499 | Change-Id: I464080e433b4cad71da4510fb95dd5f902da0616 |
1500 | |
1501 | - .../plugins/openvswitch/agent/xenserver_install.sh | 16 ++++++++-------- |
1502 | + quantum/plugins/openvswitch/agent/xenserver_install.sh | 16 ++++++++-------- |
1503 | 1 file changed, 8 insertions(+), 8 deletions(-) |
1504 | |
1505 | commit d1c563c57df14b4d968bd576bc366d7db86b3e79 |
1506 | @@ -7833,7 +8692,7 @@ |
1507 | |
1508 | Change-Id: I1a951d60eb75384676309e8db29ea7baa48055bc |
1509 | |
1510 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 8 ++++++++ |
1511 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 8 ++++++++ |
1512 | 1 file changed, 8 insertions(+) |
1513 | |
1514 | commit ce93dca89aa4d0da55e71376853aafc142669362 |
1515 | @@ -8116,7 +8975,7 @@ |
1516 | |
1517 | Change-Id: I62b3bd6ea9adac7c1f4995fc18af9838a7e25b43 |
1518 | |
1519 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 10 +++++----- |
1520 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 10 +++++----- |
1521 | 1 file changed, 5 insertions(+), 5 deletions(-) |
1522 | |
1523 | commit 676ba0fd70a10e66e95fec47091ff0b494b95fec |
1524 | @@ -8250,7 +9109,7 @@ |
1525 | |
1526 | Change-Id: Ic7f633b59d963e8a14a993468048ccbded9aba34 |
1527 | |
1528 | - .../docbkx/quantum-api-1.0/quantum-api-guide.xml | 2 +- |
1529 | + doc/source/docbkx/quantum-api-1.0/quantum-api-guide.xml | 2 +- |
1530 | 1 file changed, 1 insertion(+), 1 deletion(-) |
1531 | |
1532 | commit 18aa80234864a1bf7d4c343d203469705d08f8f2 |
1533 | @@ -8554,7 +9413,7 @@ |
1534 | |
1535 | Change-Id: I0bec330256f1dd3de43bc3202cedada2f9d40c01 |
1536 | |
1537 | - .../docbkx/quantum-api-1.0/quantum-api-guide.xml | 4 ++-- |
1538 | + doc/source/docbkx/quantum-api-1.0/quantum-api-guide.xml | 4 ++-- |
1539 | 1 file changed, 2 insertions(+), 2 deletions(-) |
1540 | |
1541 | commit beed3d11227e9e5c59e09297df579e4114aa7b88 |
1542 | @@ -8569,7 +9428,7 @@ |
1543 | |
1544 | Change-Id: I0f7fae73efa80b617da0a895b80a95f60cb12c42 |
1545 | |
1546 | - .../docbkx/quantum-api-1.0/quantum-api-guide.xml | 2 +- |
1547 | + doc/source/docbkx/quantum-api-1.0/quantum-api-guide.xml | 2 +- |
1548 | 1 file changed, 1 insertion(+), 1 deletion(-) |
1549 | |
1550 | commit 4bacc462ea2cefc612c1df7bdd82029fa74b1b21 |
1551 | @@ -8908,7 +9767,7 @@ |
1552 | |
1553 | Change-Id: I001e281145c3b6ba23a84e27e3f0e9315c879d96 |
1554 | |
1555 | - .../plugins/openvswitch/ovs_quantum_plugin.ini | 2 +- |
1556 | + etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini | 2 +- |
1557 | 1 file changed, 1 insertion(+), 1 deletion(-) |
1558 | |
1559 | commit b9805bd234edc0076ff69fafc2ab020562863b58 |
1560 | @@ -9630,7 +10489,7 @@ |
1561 | |
1562 | Change-Id: Ie91b554e5549193fb3568cf0bb0dec7c58a6dfc5 |
1563 | |
1564 | - .../plugins/openvswitch/ovs_quantum_plugin.ini | 2 +- |
1565 | + etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini | 2 +- |
1566 | 1 file changed, 1 insertion(+), 1 deletion(-) |
1567 | |
1568 | commit f268b5e62ca8bbf1712225d4c8d6d38580f38fba |
1569 | @@ -9727,22 +10586,22 @@ |
1570 | |
1571 | Change-Id: Id5c797d3339d0d7015bac386088133540f0c0c9e |
1572 | |
1573 | - quantum/api/api_common.py | 2 +- |
1574 | - quantum/client/__init__.py | 6 +++--- |
1575 | - quantum/common/flags.py | 2 +- |
1576 | - quantum/common/serializer.py | 4 ++-- |
1577 | - quantum/common/utils.py | 11 +++++------ |
1578 | - quantum/extensions/_pprofiles.py | 2 +- |
1579 | - quantum/plugins/cisco/l2network_plugin.py | 4 ++-- |
1580 | - .../plugins/cisco/models/l2network_single_blade.py | 2 +- |
1581 | - .../plugins/cisco/services/services_logistics.py | 4 ++-- |
1582 | - quantum/plugins/cisco/tests/unit/test_database.py | 6 +++--- |
1583 | - .../plugins/cisco/tests/unit/test_ucs_plugin.py | 2 +- |
1584 | - quantum/plugins/cisco/ucs/cisco_ucs_inventory.py | 8 ++++---- |
1585 | - quantum/plugins/openvswitch/ovs_quantum_plugin.py | 6 +++--- |
1586 | - .../openvswitch/tests/unit/test_vlan_map.py | 2 +- |
1587 | - quantum/tests/unit/test_database.py | 2 +- |
1588 | - quantum/wsgi.py | 12 ++++++------ |
1589 | + quantum/api/api_common.py | 2 +- |
1590 | + quantum/client/__init__.py | 6 +++--- |
1591 | + quantum/common/flags.py | 2 +- |
1592 | + quantum/common/serializer.py | 4 ++-- |
1593 | + quantum/common/utils.py | 11 +++++------ |
1594 | + quantum/extensions/_pprofiles.py | 2 +- |
1595 | + quantum/plugins/cisco/l2network_plugin.py | 4 ++-- |
1596 | + quantum/plugins/cisco/models/l2network_single_blade.py | 2 +- |
1597 | + quantum/plugins/cisco/services/services_logistics.py | 4 ++-- |
1598 | + quantum/plugins/cisco/tests/unit/test_database.py | 6 +++--- |
1599 | + quantum/plugins/cisco/tests/unit/test_ucs_plugin.py | 2 +- |
1600 | + quantum/plugins/cisco/ucs/cisco_ucs_inventory.py | 8 ++++---- |
1601 | + quantum/plugins/openvswitch/ovs_quantum_plugin.py | 6 +++--- |
1602 | + quantum/plugins/openvswitch/tests/unit/test_vlan_map.py | 2 +- |
1603 | + quantum/tests/unit/test_database.py | 2 +- |
1604 | + quantum/wsgi.py | 12 ++++++------ |
1605 | 16 files changed, 37 insertions(+), 38 deletions(-) |
1606 | |
1607 | commit 98d04ae684ea761070d8df160a5f47e1701bc072 |
1608 | @@ -10497,8 +11356,8 @@ |
1609 | |
1610 | Change-Id: I38053df8b398e3fadcc6820c1118b3685ccd4174 |
1611 | |
1612 | - .../plugins/cisco/ucs/cisco_ucs_inventory.py | 6 +++--- |
1613 | - .../cisco/ucs/cisco_ucs_inventory_configuration.py | 4 ++-- |
1614 | + .../lib/quantum/plugins/cisco/ucs/cisco_ucs_inventory.py | 6 +++--- |
1615 | + .../plugins/cisco/ucs/cisco_ucs_inventory_configuration.py | 4 ++-- |
1616 | 2 files changed, 5 insertions(+), 5 deletions(-) |
1617 | |
1618 | commit d2bb51ca2529ef1ce8f8ffa412ac76778e6fd829 |
1619 | @@ -10515,7 +11374,7 @@ |
1620 | |
1621 | Change-Id: Id01d9da1761016bcd983ad06621c62e94b2445c1 |
1622 | |
1623 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 19 ++++++++++++++++++- |
1624 | + .../plugins/openvswitch/agent/ovs_quantum_agent.py | 19 ++++++++++++++++++- |
1625 | 1 file changed, 18 insertions(+), 1 deletion(-) |
1626 | |
1627 | commit a73ba62920e643355ce6e9b836c075f139623fd9 |
1628 | @@ -10571,13 +11430,13 @@ |
1629 | |
1630 | Change-Id: I687793b0f8f7284019e05c044e53d91e0f3f09c2 |
1631 | |
1632 | - quantum/common/config.py | 8 ++++++-- |
1633 | - quantum/plugins/cisco/common/cisco_credentials.py | 3 ++- |
1634 | - .../cisco/l2network_plugin_configuration.py | 6 +++--- |
1635 | - .../cisco/nexus/cisco_nexus_configuration.py | 3 ++- |
1636 | - .../cisco/tests/unit/test_cisco_extension.py | 3 ++- |
1637 | - .../plugins/cisco/ucs/cisco_ucs_configuration.py | 5 +++-- |
1638 | - .../cisco/ucs/cisco_ucs_inventory_configuration.py | 2 +- |
1639 | + quantum/common/config.py | 8 ++++++-- |
1640 | + quantum/plugins/cisco/common/cisco_credentials.py | 3 ++- |
1641 | + quantum/plugins/cisco/l2network_plugin_configuration.py | 6 +++--- |
1642 | + quantum/plugins/cisco/nexus/cisco_nexus_configuration.py | 3 ++- |
1643 | + quantum/plugins/cisco/tests/unit/test_cisco_extension.py | 3 ++- |
1644 | + quantum/plugins/cisco/ucs/cisco_ucs_configuration.py | 5 +++-- |
1645 | + quantum/plugins/cisco/ucs/cisco_ucs_inventory_configuration.py | 2 +- |
1646 | 7 files changed, 19 insertions(+), 11 deletions(-) |
1647 | |
1648 | commit e95aa008efa6eeddd89e02487c8a06a9c45a4aec |
1649 | @@ -10590,7 +11449,7 @@ |
1650 | |
1651 | Change-Id: Iba76359d5ee4f625b6a7007b318cf0eb5f1119da |
1652 | |
1653 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 9 +++++++-- |
1654 | + quantum/plugins/openvswitch/agent/ovs_quantum_agent.py | 9 +++++++-- |
1655 | 1 file changed, 7 insertions(+), 2 deletions(-) |
1656 | |
1657 | commit e85d007c074b1e7ab7e48612d8c8a6dc461d9665 |
1658 | @@ -11240,9 +12099,9 @@ |
1659 | |
1660 | Change-Id: I900f8052416cbded698a806895fe145e61d47f1c |
1661 | |
1662 | - .../cisco/nexus/cisco_nexus_network_driver.py | 5 ++--- |
1663 | - quantum/plugins/cisco/nexus/cisco_nexus_plugin.py | 5 ++--- |
1664 | - .../plugins/cisco/nexus/cisco_nexus_snippets.py | 5 ++--- |
1665 | + quantum/plugins/cisco/nexus/cisco_nexus_network_driver.py | 5 ++--- |
1666 | + quantum/plugins/cisco/nexus/cisco_nexus_plugin.py | 5 ++--- |
1667 | + quantum/plugins/cisco/nexus/cisco_nexus_snippets.py | 5 ++--- |
1668 | 3 files changed, 6 insertions(+), 9 deletions(-) |
1669 | |
1670 | commit 121a3fe444d6f72b654ebb0528716f1c20aa7221 |
1671 | @@ -11375,7 +12234,7 @@ |
1672 | |
1673 | Change-Id: Ib54909082a0dca6e205ce25eadfa3987523892c0 |
1674 | |
1675 | - .../plugins/openvswitch/agent/xenserver_install.sh | 1 - |
1676 | + quantum/plugins/openvswitch/agent/xenserver_install.sh | 1 - |
1677 | 1 file changed, 1 deletion(-) |
1678 | |
1679 | commit 7406b69aa4e2d2bc8e3035943011462fa1647f85 |
1680 | @@ -12229,9 +13088,9 @@ |
1681 | |
1682 | Fixing the extensions URL to 1.0 and pep8 error. |
1683 | |
1684 | - .../plugins/cisco/nova/quantum_aware_scheduler.py | 2 +- |
1685 | - quantum/plugins/cisco/nova/vifdirect.py | 2 +- |
1686 | - quantum/plugins/cisco/ucs/cisco_ucs_inventory.py | 2 +- |
1687 | + quantum/plugins/cisco/nova/quantum_aware_scheduler.py | 2 +- |
1688 | + quantum/plugins/cisco/nova/vifdirect.py | 2 +- |
1689 | + quantum/plugins/cisco/ucs/cisco_ucs_inventory.py | 2 +- |
1690 | 3 files changed, 3 insertions(+), 3 deletions(-) |
1691 | |
1692 | commit e87990643e34b2ebb8c614f248cb4c010d9abceb |
1693 | @@ -12296,7 +13155,7 @@ |
1694 | |
1695 | Dictionary key values changes in test_extension |
1696 | |
1697 | - .../cisco/tests/unit/test_cisco_extension.py | 8 ++++---- |
1698 | + quantum/plugins/cisco/tests/unit/test_cisco_extension.py | 8 ++++---- |
1699 | 1 file changed, 4 insertions(+), 4 deletions(-) |
1700 | |
1701 | commit 3c232b44ae21664b6a6d2a2142e0bfd6d821e855 |
1702 | @@ -12368,12 +13227,12 @@ |
1703 | |
1704 | Also renaming API router: APIRouterV01 --> APIRouterV1 |
1705 | |
1706 | - etc/quantum.conf | 2 +- |
1707 | - quantum/api/__init__.py | 6 ++---- |
1708 | - quantum/common/extensions.py | 2 +- |
1709 | - quantum/manager.py | 2 +- |
1710 | - .../cisco/tests/unit/test_cisco_extension.py | 2 +- |
1711 | - tests/unit/test_api.py | 2 +- |
1712 | + etc/quantum.conf | 2 +- |
1713 | + quantum/api/__init__.py | 6 ++---- |
1714 | + quantum/common/extensions.py | 2 +- |
1715 | + quantum/manager.py | 2 +- |
1716 | + quantum/plugins/cisco/tests/unit/test_cisco_extension.py | 2 +- |
1717 | + tests/unit/test_api.py | 2 +- |
1718 | 6 files changed, 7 insertions(+), 9 deletions(-) |
1719 | |
1720 | commit 976007b95188af757e5fbf7b75e6d7dc9b5fe7af |
1721 | @@ -12487,10 +13346,10 @@ |
1722 | |
1723 | Changes qos description to string; changes extension API names for get_host and get_instance_port |
1724 | |
1725 | - quantum/plugins/cisco/l2network_plugin.py | 10 +++++----- |
1726 | - .../plugins/cisco/models/l2network_multi_blade.py | 8 ++++---- |
1727 | - .../plugins/cisco/models/l2network_single_blade.py | 8 ++++---- |
1728 | - quantum/plugins/cisco/ucs/cisco_ucs_inventory.py | 8 ++++---- |
1729 | + quantum/plugins/cisco/l2network_plugin.py | 10 +++++----- |
1730 | + quantum/plugins/cisco/models/l2network_multi_blade.py | 8 ++++---- |
1731 | + quantum/plugins/cisco/models/l2network_single_blade.py | 8 ++++---- |
1732 | + quantum/plugins/cisco/ucs/cisco_ucs_inventory.py | 8 ++++---- |
1733 | 4 files changed, 17 insertions(+), 17 deletions(-) |
1734 | |
1735 | commit 3f700ddb9e8fbea61c38015474eeb3f62e822a10 |
1736 | @@ -12536,9 +13395,9 @@ |
1737 | |
1738 | Sorting correctly all imports for the Nexus Driver and Unit Test |
1739 | |
1740 | - .../cisco/nexus/cisco_nexus_network_driver.py | 2 +- |
1741 | - quantum/plugins/cisco/nexus/cisco_nexus_plugin.py | 2 +- |
1742 | - .../plugins/cisco/tests/unit/test_nexus_plugin.py | 4 ++-- |
1743 | + quantum/plugins/cisco/nexus/cisco_nexus_network_driver.py | 2 +- |
1744 | + quantum/plugins/cisco/nexus/cisco_nexus_plugin.py | 2 +- |
1745 | + quantum/plugins/cisco/tests/unit/test_nexus_plugin.py | 4 ++-- |
1746 | 3 files changed, 4 insertions(+), 4 deletions(-) |
1747 | |
1748 | commit 51ddffa2641d0cf0725f7a5147ad0b90551e36a0 |
1749 | @@ -12547,8 +13406,8 @@ |
1750 | |
1751 | Fixed the Unit Test for Nexus Driver |
1752 | |
1753 | - .../cisco/nexus/cisco_nexus_network_driver.py | 2 ++ |
1754 | - .../plugins/cisco/tests/unit/test_nexus_plugin.py | 18 +++++++++++++++++- |
1755 | + .../cisco/nexus/cisco_nexus_network_driver.py | 2 ++ |
1756 | + .../plugins/cisco/tests/unit/test_nexus_plugin.py | 18 +++++++++++++++++- |
1757 | 2 files changed, 19 insertions(+), 1 deletion(-) |
1758 | |
1759 | commit 6b477714ba576b8a858b9ad222b14e7fe77e58ca |
1760 | @@ -12595,11 +13454,11 @@ |
1761 | |
1762 | Changing the order of imports (to satisfy convention). |
1763 | |
1764 | - quantum/plugins/cisco/common/cisco_credentials.py | 2 +- |
1765 | - quantum/plugins/cisco/l2network_model.py | 2 +- |
1766 | - quantum/plugins/cisco/l2network_plugin.py | 2 +- |
1767 | - .../plugins/cisco/ucs/cisco_ucs_network_driver.py | 2 +- |
1768 | - quantum/plugins/cisco/ucs/cisco_ucs_plugin.py | 2 +- |
1769 | + quantum/plugins/cisco/common/cisco_credentials.py | 2 +- |
1770 | + quantum/plugins/cisco/l2network_model.py | 2 +- |
1771 | + quantum/plugins/cisco/l2network_plugin.py | 2 +- |
1772 | + quantum/plugins/cisco/ucs/cisco_ucs_network_driver.py | 2 +- |
1773 | + quantum/plugins/cisco/ucs/cisco_ucs_plugin.py | 2 +- |
1774 | 5 files changed, 5 insertions(+), 5 deletions(-) |
1775 | |
1776 | commit fd27733783a0f6f9f0db4f84084f206b7d05122a |
1777 | @@ -12886,8 +13745,8 @@ |
1778 | |
1779 | Noticed some pep8 errors, fixed them. |
1780 | |
1781 | - .../plugins/cisco/nova/quantum_aware_scheduler.py | 5 ++--- |
1782 | - quantum/plugins/cisco/nova/vifdirect.py | 3 +-- |
1783 | + quantum/plugins/cisco/nova/quantum_aware_scheduler.py | 5 ++--- |
1784 | + quantum/plugins/cisco/nova/vifdirect.py | 3 +-- |
1785 | 2 files changed, 3 insertions(+), 5 deletions(-) |
1786 | |
1787 | commit 0e88293280969683667c4d2e5c6b2c657a9e0659 |
1788 | @@ -12941,8 +13800,8 @@ |
1789 | pep8 passed |
1790 | pylint 9.10 |
1791 | |
1792 | - .../cisco/nexus/cisco_nexus_network_driver.py | 19 +++++++++++++------ |
1793 | - .../plugins/cisco/nexus/cisco_nexus_snippets.py | 11 ++++------- |
1794 | + .../cisco/nexus/cisco_nexus_network_driver.py | 19 +++++++++++++------ |
1795 | + quantum/plugins/cisco/nexus/cisco_nexus_snippets.py | 11 ++++------- |
1796 | 2 files changed, 17 insertions(+), 13 deletions(-) |
1797 | |
1798 | commit 8fe560cdaad3f84f81d806e664e9c059976f3106 |
1799 | @@ -13021,10 +13880,10 @@ |
1800 | |
1801 | Code clean up as per reviewr's request; documentation strings, unused code, etc. |
1802 | |
1803 | - quantum/plugins/cisco/common/cisco_exceptions.py | 10 ++++++---- |
1804 | - quantum/plugins/cisco/db/nexus_models.py | 2 -- |
1805 | - quantum/plugins/cisco/l2network_plugin.py | 8 ++++---- |
1806 | - .../cisco/l2network_plugin_configuration.py | 9 +++++++++ |
1807 | + quantum/plugins/cisco/common/cisco_exceptions.py | 10 ++++++---- |
1808 | + quantum/plugins/cisco/db/nexus_models.py | 2 -- |
1809 | + quantum/plugins/cisco/l2network_plugin.py | 8 ++++---- |
1810 | + quantum/plugins/cisco/l2network_plugin_configuration.py | 9 +++++++++ |
1811 | 4 files changed, 19 insertions(+), 10 deletions(-) |
1812 | |
1813 | commit c72cb36ef93246051b2e1ac498161c3301b600df |
1814 | @@ -13399,7 +14258,7 @@ |
1815 | |
1816 | Change profile-id |
1817 | |
1818 | - .../plugins/cisco/tests/unit/test_l2networkApi.py | 18 +++++++++--------- |
1819 | + .../plugins/cisco/tests/unit/test_l2networkApi.py | 18 +++++++++--------- |
1820 | 1 file changed, 9 insertions(+), 9 deletions(-) |
1821 | |
1822 | commit 54368197605597cd1c10455ce5a788ec8c7d7b3b |
1823 | @@ -13422,7 +14281,7 @@ |
1824 | |
1825 | Review Changes |
1826 | |
1827 | - .../cisco/tests/unit/test_cisco_extension.py | 9 ++++----- |
1828 | + quantum/plugins/cisco/tests/unit/test_cisco_extension.py | 9 ++++----- |
1829 | 1 file changed, 4 insertions(+), 5 deletions(-) |
1830 | |
1831 | commit 28daf38fa7ebcb11885d0705458d88847be7c6a4 |
1832 | @@ -13506,8 +14365,8 @@ |
1833 | |
1834 | Code refactored, made changes are per reviwer's suggestions. |
1835 | |
1836 | - .../plugins/cisco/nova/quantum_aware_scheduler.py | 12 +++++------- |
1837 | - quantum/plugins/cisco/nova/vifdirect.py | 13 ++++++------- |
1838 | + quantum/plugins/cisco/nova/quantum_aware_scheduler.py | 12 +++++------- |
1839 | + quantum/plugins/cisco/nova/vifdirect.py | 13 ++++++------- |
1840 | 2 files changed, 11 insertions(+), 14 deletions(-) |
1841 | |
1842 | commit 2f1aba8dcf590d960040f625ad682593f7e15c76 |
1843 | @@ -13606,12 +14465,12 @@ |
1844 | pep8 passed |
1845 | pylint 8.81/10 |
1846 | |
1847 | - quantum/plugins/cisco/README | 7 ++++--- |
1848 | - quantum/plugins/cisco/conf/nexus.ini | 5 +++-- |
1849 | - .../cisco/nexus/cisco_nexus_configuration.py | 3 ++- |
1850 | - .../cisco/nexus/cisco_nexus_network_driver.py | 14 +++++++++----- |
1851 | - quantum/plugins/cisco/nexus/cisco_nexus_plugin.py | 17 +++++++++++++---- |
1852 | - .../plugins/cisco/tests/unit/test_nexus_plugin.py | 3 ++- |
1853 | + quantum/plugins/cisco/README | 7 ++++--- |
1854 | + quantum/plugins/cisco/conf/nexus.ini | 5 +++-- |
1855 | + .../plugins/cisco/nexus/cisco_nexus_configuration.py | 3 ++- |
1856 | + .../plugins/cisco/nexus/cisco_nexus_network_driver.py | 14 +++++++++----- |
1857 | + quantum/plugins/cisco/nexus/cisco_nexus_plugin.py | 17 +++++++++++++---- |
1858 | + quantum/plugins/cisco/tests/unit/test_nexus_plugin.py | 3 ++- |
1859 | 6 files changed, 33 insertions(+), 16 deletions(-) |
1860 | |
1861 | commit 84d0f0a4f7b280cdab2cb84773aaa10416a738c1 |
1862 | @@ -13712,8 +14571,8 @@ |
1863 | |
1864 | Removed concatenation per review comments. |
1865 | |
1866 | - .../plugins/cisco/nova/quantum_aware_scheduler.py | 2 +- |
1867 | - quantum/plugins/cisco/nova/vifdirect.py | 2 +- |
1868 | + quantum/plugins/cisco/nova/quantum_aware_scheduler.py | 2 +- |
1869 | + quantum/plugins/cisco/nova/vifdirect.py | 2 +- |
1870 | 2 files changed, 2 insertions(+), 2 deletions(-) |
1871 | |
1872 | commit 5834bcc8e20654feb4e22cab53c83502a315f071 |
1873 | @@ -13826,8 +14685,8 @@ |
1874 | |
1875 | Removed extra spaces to satisfy pep8. |
1876 | |
1877 | - .../plugins/cisco/nova/quantum_aware_scheduler.py | 4 +--- |
1878 | - quantum/plugins/cisco/nova/vifdirect.py | 4 +--- |
1879 | + quantum/plugins/cisco/nova/quantum_aware_scheduler.py | 4 +--- |
1880 | + quantum/plugins/cisco/nova/vifdirect.py | 4 +--- |
1881 | 2 files changed, 2 insertions(+), 6 deletions(-) |
1882 | |
1883 | commit ad0199a73c280279d7aac7f390f597b0c365975f |
1884 | @@ -14097,7 +14956,7 @@ |
1885 | |
1886 | Adding the changed UCS Driver function names in test_ucs_driver. |
1887 | |
1888 | - .../plugins/cisco/tests/unit/test_ucs_driver.py | 4 ++-- |
1889 | + quantum/plugins/cisco/tests/unit/test_ucs_driver.py | 4 ++-- |
1890 | 1 file changed, 2 insertions(+), 2 deletions(-) |
1891 | |
1892 | commit 7c73d56e1183c93f90a3ffecfa0d7a92d68360f6 |
1893 | @@ -14312,7 +15171,7 @@ |
1894 | |
1895 | Removing extra testing function on Nexus Driver |
1896 | |
1897 | - .../cisco/nexus/cisco_nexus_network_driver.py | 10 ---------- |
1898 | + quantum/plugins/cisco/nexus/cisco_nexus_network_driver.py | 10 ---------- |
1899 | 1 file changed, 10 deletions(-) |
1900 | |
1901 | commit 0d8580a2239dc2fe45525c1a878e170651e06e3f |
1902 | @@ -15237,9 +16096,9 @@ |
1903 | |
1904 | Fixed issue with creating new port profiles (one configuration parameter got left out during the migration to the new configuration scheme). Also fixed a bug in the calculation of the profile id. |
1905 | |
1906 | - quantum/plugins/cisco/conf/l2network_plugin.ini | 4 +++- |
1907 | - quantum/plugins/cisco/l2network_plugin.py | 19 ++++++++++++++++--- |
1908 | - .../cisco/l2network_plugin_configuration.py | 3 +++ |
1909 | + quantum/plugins/cisco/conf/l2network_plugin.ini | 4 +++- |
1910 | + quantum/plugins/cisco/l2network_plugin.py | 19 ++++++++++++++++--- |
1911 | + .../plugins/cisco/l2network_plugin_configuration.py | 3 +++ |
1912 | 3 files changed, 22 insertions(+), 4 deletions(-) |
1913 | |
1914 | commit d523ce7c18420c998f5f0e8bf16ffad64e005c42 |
1915 | @@ -15397,7 +16256,7 @@ |
1916 | |
1917 | Fixed pep8 error. |
1918 | |
1919 | - .../plugins/cisco/ucs/cisco_ucs_network_driver.py | 6 ++++-- |
1920 | + quantum/plugins/cisco/ucs/cisco_ucs_network_driver.py | 6 ++++-- |
1921 | 1 file changed, 4 insertions(+), 2 deletions(-) |
1922 | |
1923 | commit e1c068a99968e664ae6778813d95433b74b50305 |
1924 | @@ -15420,8 +16279,8 @@ |
1925 | |
1926 | Fixed an issue selecting the right port interface and also properly switching off the Nexus Interface |
1927 | |
1928 | - .../cisco/nexus/cisco_nexus_network_driver.py | 12 ++++++++++-- |
1929 | - quantum/plugins/cisco/nexus/cisco_nexus_plugin.py | 2 +- |
1930 | + quantum/plugins/cisco/nexus/cisco_nexus_network_driver.py | 12 ++++++++++-- |
1931 | + quantum/plugins/cisco/nexus/cisco_nexus_plugin.py | 2 +- |
1932 | 2 files changed, 11 insertions(+), 3 deletions(-) |
1933 | |
1934 | commit 303eb0bedbcdc6b711f9e048c408625f9e1811a1 |
1935 | @@ -15465,7 +16324,7 @@ |
1936 | |
1937 | Earlier fix resulted in a different issue (profile client name, was also being used as profile name, hence breaking). |
1938 | |
1939 | - .../plugins/cisco/ucs/cisco_ucs_network_driver.py | 6 +++--- |
1940 | + quantum/plugins/cisco/ucs/cisco_ucs_network_driver.py | 6 +++--- |
1941 | 1 file changed, 3 insertions(+), 3 deletions(-) |
1942 | |
1943 | commit 9f8b25e53c9957f09bab49a14f198356e00bce6c |
1944 | @@ -15474,7 +16333,7 @@ |
1945 | |
1946 | Truncated the port profile client name length to 16 characters (ucsm excepts max 17 chars). |
1947 | |
1948 | - .../plugins/cisco/ucs/cisco_ucs_network_driver.py | 2 +- |
1949 | + quantum/plugins/cisco/ucs/cisco_ucs_network_driver.py | 2 +- |
1950 | 1 file changed, 1 insertion(+), 1 deletion(-) |
1951 | |
1952 | commit d67baf0657f4151686d168fc634901b5e24c8dec |
1953 | @@ -15698,9 +16557,9 @@ |
1954 | |
1955 | make ovs plugin pay attention to port state |
1956 | |
1957 | - .../plugins/openvswitch/agent/ovs_quantum_agent.py | 2 +- |
1958 | - quantum/plugins/openvswitch/ovs_quantum_plugin.py | 12 ++++++------ |
1959 | - tests/unit/test_api.py | 17 +++++++++++++++++ |
1960 | + .../plugins/openvswitch/agent/ovs_quantum_agent.py | 2 +- |
1961 | + quantum/plugins/openvswitch/ovs_quantum_plugin.py | 12 ++++++------ |
1962 | + tests/unit/test_api.py | 17 +++++++++++++++++ |
1963 | 3 files changed, 24 insertions(+), 7 deletions(-) |
1964 | |
1965 | commit c1e123de812d2cb9012ae7464812e852acbdac8b |
1966 | @@ -17808,7 +18667,7 @@ |
1967 | |
1968 | Removing excess imports |
1969 | |
1970 | - .../cisco/tests/unit/test_l2network_multi_blade.py | 2 -- |
1971 | + quantum/plugins/cisco/tests/unit/test_l2network_multi_blade.py | 2 -- |
1972 | 1 file changed, 2 deletions(-) |
1973 | |
1974 | commit e6dc574255821d2a97c91426fafd42bababfbddd |
1975 | @@ -17952,7 +18811,7 @@ |
1976 | |
1977 | Removing a couple extra lines |
1978 | |
1979 | - .../cisco/tests/unit/test_l2network_multi_blade.py | 4 ---- |
1980 | + quantum/plugins/cisco/tests/unit/test_l2network_multi_blade.py | 4 ---- |
1981 | 1 file changed, 4 deletions(-) |
1982 | |
1983 | commit 891d938d9755d392bdbc5e090d1a1fc0b1fb22cc |
1984 | @@ -17970,7 +18829,7 @@ |
1985 | |
1986 | Adding author information |
1987 | |
1988 | - .../cisco/tests/unit/test_l2network_multi_blade.py | 3 +++ |
1989 | + quantum/plugins/cisco/tests/unit/test_l2network_multi_blade.py | 3 +++ |
1990 | 1 file changed, 3 insertions(+) |
1991 | |
1992 | commit 4cd616014cebe413c6802aeae1c55dc7bdc9c572 |
1993 | @@ -17979,7 +18838,7 @@ |
1994 | |
1995 | Removing a negative test until I can figure out how to implement it |
1996 | |
1997 | - .../cisco/tests/unit/test_l2network_multi_blade.py | 19 ------------------- |
1998 | + .../cisco/tests/unit/test_l2network_multi_blade.py | 19 ------------------- |
1999 | 1 file changed, 19 deletions(-) |
2000 | |
2001 | commit 9fc4f1ba33e56aa22a8000de6838e7140ca1329e |
2002 | @@ -18006,7 +18865,7 @@ |
2003 | |
2004 | Fixing port-related calls |
2005 | |
2006 | - .../cisco/tests/unit/test_l2network_multi_blade.py | 15 ++++++++------- |
2007 | + .../cisco/tests/unit/test_l2network_multi_blade.py | 15 ++++++++------- |
2008 | 1 file changed, 8 insertions(+), 7 deletions(-) |
2009 | |
2010 | commit aa98712148ed3f4377246fd30eb6210d6a29f05d |
2011 | |
2012 | === modified file 'PKG-INFO' |
2013 | --- PKG-INFO 2012-06-22 12:49:23 +0000 |
2014 | +++ PKG-INFO 2013-01-08 00:32:21 +0000 |
2015 | @@ -1,6 +1,6 @@ |
2016 | Metadata-Version: 1.0 |
2017 | Name: quantum |
2018 | -Version: 2012.2 |
2019 | +Version: 2012.2.1 |
2020 | Summary: Quantum (virtual network service) |
2021 | Home-page: https://launchpad.net/quantum |
2022 | Author: Netstack |
2023 | |
2024 | === modified file 'bin/quantum-rootwrap' |
2025 | --- bin/quantum-rootwrap 2012-09-07 18:50:09 +0000 |
2026 | +++ bin/quantum-rootwrap 2013-01-08 00:32:21 +0000 |
2027 | @@ -38,6 +38,7 @@ |
2028 | |
2029 | import ConfigParser |
2030 | import os |
2031 | +import signal |
2032 | import subprocess |
2033 | import sys |
2034 | |
2035 | @@ -47,6 +48,12 @@ |
2036 | RC_BADCONFIG = 97 |
2037 | |
2038 | |
2039 | +def _subprocess_setup(): |
2040 | + # Python installs a SIGPIPE handler by default. This is usually not what |
2041 | + # non-Python subprocesses expect. |
2042 | + signal.signal(signal.SIGPIPE, signal.SIG_DFL) |
2043 | + |
2044 | + |
2045 | if __name__ == '__main__': |
2046 | # Split arguments, require at least a command |
2047 | execname = sys.argv.pop(0) |
2048 | @@ -84,6 +91,7 @@ |
2049 | stdin=sys.stdin, |
2050 | stdout=sys.stdout, |
2051 | stderr=sys.stderr, |
2052 | + preexec_fn=_subprocess_setup, |
2053 | env=filtermatch.get_environment(userargs)) |
2054 | obj.wait() |
2055 | sys.exit(obj.returncode) |
2056 | |
2057 | === modified file 'debian/changelog' |
2058 | --- debian/changelog 2012-09-27 15:53:04 +0000 |
2059 | +++ debian/changelog 2013-01-08 00:32:21 +0000 |
2060 | @@ -1,3 +1,76 @@ |
2061 | +quantum (2012.2.1-0ubuntu1~cloud0) precise-folsom; urgency=low |
2062 | + |
2063 | + * Stable update for the Ubuntu Cloud Archive. |
2064 | + |
2065 | + -- Adam Gandelman <adamg@ubuntu.com> Mon, 07 Jan 2013 16:19:50 -0800 |
2066 | + |
2067 | +quantum (2012.2.1-0ubuntu1) quantal-proposed; urgency=low |
2068 | + |
2069 | + * Resynchronize with stable/folsom (1e774867) (LP: #1085255): |
2070 | + - [aeabb42] There are routing problems when the dnsmasq port does not come |
2071 | + first in the routing table (LP: #1083238) |
2072 | + - [04aab72] Quantum linux bridge not optimized with libvirt (LP: #1078210) |
2073 | + - [ca7fc10] getting quotas from database has severe performance implications |
2074 | + (LP: #1075369) |
2075 | + - [66605e8] failed to update an external network into non external network |
2076 | + (LP: #1083387) |
2077 | + - [c60051a] Quantum test suite leaks memory like a sieve (LP: #1065276) |
2078 | + - [3179dfc] clear_db() does incomplete db teardown (LP: #1080988) |
2079 | + - [c1e19d7] Unauthorized command: cat /proc/None/cmdline (LP: #1077651) |
2080 | + - [af9e076] At times a instance will not receive an IP address from the DHCP |
2081 | + agent (LP: #1081664) |
2082 | + - [e0d1a7d] allow multiple floating-ip on single port if they use different |
2083 | + fixed ips and/or external nets (LP: #1057844) |
2084 | + - [8471d79] Delete port fails to gateway ip (LP: #1079980) |
2085 | + - [aca8b4a] fixed_ip allocation which is not included within |
2086 | + allocation_pools makes error when delete port or re-create port |
2087 | + (LP: #1077292) |
2088 | + - [eacc9d3] Mapping same bridge to different phyiscal networks succeed |
2089 | + (LP: #1067669) |
2090 | + - [51b4c82] python-quantum: not region aware (LP: #1080793) |
2091 | + - [6f0a486] delete floatingip should be in one transaction to delete port |
2092 | + (LP: #1080516) |
2093 | + - [db6cda7] Remove qpid configuration variables no longer supported |
2094 | + - [a112840] Allow NVP plugin to use per-tenant quota extension |
2095 | + - [82b1a55] Quantum service does not restart after reboot (LP: #1073999) |
2096 | + - [c01a839] There are some cases that L3 API with an invalid parameter |
2097 | + returns 500. (LP: #1064765) |
2098 | + - [26b383f] external network can be plugged also as internal network for one |
2099 | + router (LP: #1053633) |
2100 | + - [49f649c] There is a lot of cases that API with an invalid parameter |
2101 | + returns 500. (LP: #1062046) |
2102 | + - [4546a18] When create subnet, you con set up the value as cidr (the value |
2103 | + isn't cidr form). (LP: #1067959) |
2104 | + - [9ba453a] killfilter should handle updated/deleted executables |
2105 | + (LP: #1073768) |
2106 | + - [7c8a55c] a port which is not able to delete is made when floatingip |
2107 | + create fails. (LP: #1064748) |
2108 | + - [c9b84cf] Linux bridge port update causes exception (LP: #1072713) |
2109 | + - [cb57932] I can't add interface to router, if there is another port in |
2110 | + non-shared network of other tenant (LP: #1057558) |
2111 | + - [574e278] Ryu plugin does not support Security Groups (LP: #1059393) |
2112 | + - [607f486] tap device added to integration bridge without tag |
2113 | + (LP: #1064070) |
2114 | + - [21a0fdf] L3 agent external network flag (LP: #1056720) |
2115 | + - [5cbaff4] router create with external_gateway_info fails with 500 always. |
2116 | + (LP: #1064235) |
2117 | + - [63b81f6] l3 db operations failed in multiple transactions (LP: #1070335) |
2118 | + - [bff17fb] Ensure that the SqlSoup import is still supported. |
2119 | + - [e091a29] l3_nat_agent was renamed to l3_agent |
2120 | + - [9030969] remove default value of 'local_ip' of 10.0.0.3 in |
2121 | + ovs_quantum_plugin.ini (LP: #1051744) |
2122 | + - [425e942] rootwrap error with L3 agent (LP: #1069966) |
2123 | + - [51c8799] Port create with invalid IP data creates port. (LP: #1064261) |
2124 | + - [fc97da9] nvp_plugin does not update device_id in nvplib (LP: #1061391) |
2125 | + - [2504f62] get_network in nvp plugin didn't return subnet information |
2126 | + (LP: #1061781) |
2127 | + - [b4f9b1f] l3_agent not disabling namespace use (LP: #1060559) |
2128 | + - [3bbf281] Add SIGPIPE handler to subprocess execution in rootwrap and |
2129 | + utils.execute (LP: #1053364) |
2130 | + - [c623f72] Set defaultbranch in .gitreview to stable/folsom |
2131 | + |
2132 | + -- Adam Gandelman <adamg@ubuntu.com> Tue, 04 Dec 2012 09:19:46 -0800 |
2133 | + |
2134 | quantum (2012.2-0ubuntu1~cloud0) precise-folsom; urgency=low |
2135 | |
2136 | * New release candidate for the Ubuntu Cloud Archive. |
2137 | |
2138 | === modified file 'debian/control' |
2139 | --- debian/control 2012-09-27 15:53:04 +0000 |
2140 | +++ debian/control 2013-01-08 00:32:21 +0000 |
2141 | @@ -10,7 +10,6 @@ |
2142 | python-anyjson, |
2143 | python-cliff, |
2144 | python-configobj, |
2145 | - python-cliff, |
2146 | python-coverage, |
2147 | python-eventlet, |
2148 | python-gflags, |
2149 | |
2150 | === modified file 'debian/rules' |
2151 | --- debian/rules 2012-09-27 15:53:04 +0000 |
2152 | +++ debian/rules 2013-01-08 00:32:21 +0000 |
2153 | @@ -17,5 +17,5 @@ |
2154 | |
2155 | ifeq (,$(findstring nocheck, $(DEB_BUILD_OPTIONS))) |
2156 | override_dh_auto_test: |
2157 | - ./run_tests.sh -N -P || true |
2158 | + ./run_tests.sh -N -P |
2159 | endif |
2160 | |
2161 | === modified file 'etc/l3_agent.ini' |
2162 | --- etc/l3_agent.ini 2012-09-21 13:01:18 +0000 |
2163 | +++ etc/l3_agent.ini 2013-01-08 00:32:21 +0000 |
2164 | @@ -34,7 +34,7 @@ |
2165 | # value should be set to the UUID of that external network. If empty, |
2166 | # the agent will enforce that only a single external networks exists and |
2167 | # use that external network id |
2168 | -# gateway_external_net_id = |
2169 | +# gateway_external_network_id = |
2170 | |
2171 | # Indicates that this L3 agent should also handle routers that do not have |
2172 | # an external network gateway configured. This option should be True only |
2173 | |
2174 | === modified file 'etc/quantum.conf' |
2175 | --- etc/quantum.conf 2012-09-26 15:14:31 +0000 |
2176 | +++ etc/quantum.conf 2013-01-08 00:32:21 +0000 |
2177 | @@ -107,18 +107,6 @@ |
2178 | # qpid_password = '' |
2179 | # Space separated list of SASL mechanisms to use for auth |
2180 | # qpid_sasl_mechanisms = '' |
2181 | -# Automatically reconnect |
2182 | -# qpid_reconnect = True |
2183 | -# Reconnection timeout in seconds |
2184 | -# qpid_reconnect_timeout = 0 |
2185 | -# Max reconnections before giving up |
2186 | -# qpid_reconnect_limit = 0 |
2187 | -# Minimum seconds between reconnection attempts |
2188 | -# qpid_reconnect_interval_min = 0 |
2189 | -# Maximum seconds between reconnection attempts |
2190 | -# qpid_reconnect_interval_max = 0 |
2191 | -# Equivalent to setting max and min to the same value |
2192 | -# qpid_reconnect_interval = 0 |
2193 | # Seconds between connection keepalive heartbeats |
2194 | # qpid_heartbeat = 60 |
2195 | # Transport to use, either 'tcp' or 'ssl' |
2196 | |
2197 | === modified file 'etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini' |
2198 | --- etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini 2012-09-12 13:41:20 +0000 |
2199 | +++ etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini 2013-01-08 00:32:21 +0000 |
2200 | @@ -64,7 +64,7 @@ |
2201 | # empty for the server. Set local-ip to be the local IP address of |
2202 | # this hypervisor. |
2203 | # |
2204 | -# Default: local_ip = 10.0.0.3 |
2205 | +# Default: local_ip = |
2206 | |
2207 | # (ListOpt) Comma-separated list of <physical_network>:<bridge> tuples |
2208 | # mapping physical network names to the agent's node-specific OVS |
2209 | |
2210 | === modified file 'quantum.egg-info/PKG-INFO' |
2211 | --- quantum.egg-info/PKG-INFO 2012-06-22 12:49:23 +0000 |
2212 | +++ quantum.egg-info/PKG-INFO 2013-01-08 00:32:21 +0000 |
2213 | @@ -1,6 +1,6 @@ |
2214 | Metadata-Version: 1.0 |
2215 | Name: quantum |
2216 | -Version: 2012.2 |
2217 | +Version: 2012.2.1 |
2218 | Summary: Quantum (virtual network service) |
2219 | Home-page: https://launchpad.net/quantum |
2220 | Author: Netstack |
2221 | |
2222 | === modified file 'quantum.egg-info/SOURCES.txt' |
2223 | --- quantum.egg-info/SOURCES.txt 2012-09-26 15:14:31 +0000 |
2224 | +++ quantum.egg-info/SOURCES.txt 2013-01-08 00:32:21 +0000 |
2225 | @@ -478,6 +478,7 @@ |
2226 | quantum/tests/unit/test_api_v2.py |
2227 | quantum/tests/unit/test_attributes.py |
2228 | quantum/tests/unit/test_auth.py |
2229 | +quantum/tests/unit/test_common_utils.py |
2230 | quantum/tests/unit/test_db_plugin.py |
2231 | quantum/tests/unit/test_db_rpc_base.py |
2232 | quantum/tests/unit/test_debug_commands.py |
2233 | @@ -503,6 +504,7 @@ |
2234 | quantum/tests/unit/linuxbridge/__init__.py |
2235 | quantum/tests/unit/linuxbridge/test_defaults.py |
2236 | quantum/tests/unit/linuxbridge/test_lb_db.py |
2237 | +quantum/tests/unit/linuxbridge/test_lb_quantum_agent.py |
2238 | quantum/tests/unit/linuxbridge/test_linuxbridge_plugin.py |
2239 | quantum/tests/unit/linuxbridge/test_rpcapi.py |
2240 | quantum/tests/unit/metaplugin/__init__.py |
2241 | |
2242 | === modified file 'quantum.egg-info/entry_points.txt' |
2243 | --- quantum.egg-info/entry_points.txt 2012-09-07 18:50:09 +0000 |
2244 | +++ quantum.egg-info/entry_points.txt 2013-01-08 00:32:21 +0000 |
2245 | @@ -4,7 +4,7 @@ |
2246 | quantum-dhcp-agent-dnsmasq-lease-update = quantum.agent.linux.dhcp:Dnsmasq.lease_update |
2247 | quantum-dhcp-agent = quantum.agent.dhcp_agent:main |
2248 | quantum-ryu-agent = quantum.plugins.ryu.agent.ryu_quantum_agent:main |
2249 | -quantum-l3-agent = quantum.agent.l3_nat_agent:main |
2250 | +quantum-l3-agent = quantum.agent.l3_agent:main |
2251 | quantum-openvswitch-agent = quantum.plugins.openvswitch.agent.ovs_quantum_agent:main |
2252 | quantum-server = quantum.server:main |
2253 | quantum-linuxbridge-agent = quantum.plugins.linuxbridge.agent.linuxbridge_quantum_agent:main |
2254 | |
2255 | === modified file 'quantum.egg-info/requires.txt' |
2256 | --- quantum.egg-info/requires.txt 2012-09-07 18:50:09 +0000 |
2257 | +++ quantum.egg-info/requires.txt 2013-01-08 00:32:21 +0000 |
2258 | @@ -12,5 +12,5 @@ |
2259 | netaddr |
2260 | python-quantumclient>=2.0 |
2261 | pyudev |
2262 | -sqlalchemy>0.6.4 |
2263 | +sqlalchemy>0.6.4,<=0.7.9 |
2264 | webob==1.0.8 |
2265 | \ No newline at end of file |
2266 | |
2267 | === modified file 'quantum.egg-info/top_level.txt' |
2268 | --- quantum.egg-info/top_level.txt 2012-06-22 12:49:23 +0000 |
2269 | +++ quantum.egg-info/top_level.txt 2013-01-08 00:32:21 +0000 |
2270 | @@ -1,3 +1,3 @@ |
2271 | +bin |
2272 | quantum |
2273 | -bin |
2274 | tools |
2275 | |
2276 | === modified file 'quantum/agent/dhcp_agent.py' |
2277 | --- quantum/agent/dhcp_agent.py 2012-09-12 13:41:20 +0000 |
2278 | +++ quantum/agent/dhcp_agent.py 2013-01-08 00:32:21 +0000 |
2279 | @@ -444,6 +444,11 @@ |
2280 | self.driver.init_l3(interface_name, ip_cidrs, |
2281 | namespace=namespace) |
2282 | |
2283 | + # ensure that the dhcp interface is first in the list |
2284 | + if namespace is None: |
2285 | + device = ip_lib.IPDevice(interface_name, self.conf.root_helper) |
2286 | + device.route.pullup_route(interface_name) |
2287 | + |
2288 | return interface_name |
2289 | |
2290 | def destroy(self, network, device_name): |
2291 | |
2292 | === modified file 'quantum/agent/l3_agent.py' |
2293 | --- quantum/agent/l3_agent.py 2012-09-21 13:01:18 +0000 |
2294 | +++ quantum/agent/l3_agent.py 2013-01-08 00:32:21 +0000 |
2295 | @@ -123,10 +123,11 @@ |
2296 | tenant_name=self.conf.admin_tenant_name, |
2297 | auth_url=self.conf.auth_url, |
2298 | auth_strategy=self.conf.auth_strategy, |
2299 | - auth_region=self.conf.auth_region |
2300 | + region_name=self.conf.auth_region |
2301 | ) |
2302 | |
2303 | - self._destroy_all_router_namespaces() |
2304 | + if self.conf.use_namespaces: |
2305 | + self._destroy_all_router_namespaces() |
2306 | |
2307 | def _destroy_all_router_namespaces(self): |
2308 | """Destroy all router namespaces on the host to eliminate |
2309 | @@ -181,7 +182,7 @@ |
2310 | params = {'router:external': True} |
2311 | ex_nets = self.qclient.list_networks(**params)['networks'] |
2312 | if len(ex_nets) > 1: |
2313 | - raise Exception("must configure 'external_network_id' if " |
2314 | + raise Exception("must configure 'gateway_external_network_id' if " |
2315 | "Quantum has more than one external network.") |
2316 | if len(ex_nets) == 0: |
2317 | return None |
2318 | |
2319 | === modified file 'quantum/agent/linux/dhcp.py' |
2320 | --- quantum/agent/linux/dhcp.py 2012-09-07 18:50:09 +0000 |
2321 | +++ quantum/agent/linux/dhcp.py 2013-01-08 00:32:21 +0000 |
2322 | @@ -167,6 +167,9 @@ |
2323 | @property |
2324 | def active(self): |
2325 | pid = self.pid |
2326 | + if pid is None: |
2327 | + return False |
2328 | + |
2329 | cmd = ['cat', '/proc/%s/cmdline' % pid] |
2330 | try: |
2331 | return self.network.id in utils.execute(cmd, self.root_helper) |
2332 | |
2333 | === modified file 'quantum/agent/linux/ip_lib.py' |
2334 | --- quantum/agent/linux/ip_lib.py 2012-09-12 13:41:20 +0000 |
2335 | +++ quantum/agent/linux/ip_lib.py 2013-01-08 00:32:21 +0000 |
2336 | @@ -327,6 +327,46 @@ |
2337 | |
2338 | return retval |
2339 | |
2340 | + def pullup_route(self, interface_name): |
2341 | + """ |
2342 | + Ensures that the route entry for the interface is before all |
2343 | + others on the same subnet. |
2344 | + """ |
2345 | + device_list = [] |
2346 | + device_route_list_lines = self._run('list', 'proto', 'kernel', |
2347 | + 'dev', interface_name).split('\n') |
2348 | + for device_route_line in device_route_list_lines: |
2349 | + try: |
2350 | + subnet = device_route_line.split()[0] |
2351 | + except: |
2352 | + continue |
2353 | + subnet_route_list_lines = self._run('list', 'proto', 'kernel', |
2354 | + 'match', subnet).split('\n') |
2355 | + for subnet_route_line in subnet_route_list_lines: |
2356 | + i = iter(subnet_route_line.split()) |
2357 | + while(i.next() != 'dev'): |
2358 | + pass |
2359 | + device = i.next() |
2360 | + try: |
2361 | + while(i.next() != 'src'): |
2362 | + pass |
2363 | + src = i.next() |
2364 | + except: |
2365 | + src = '' |
2366 | + if device != interface_name: |
2367 | + device_list.append((device, src)) |
2368 | + else: |
2369 | + break |
2370 | + |
2371 | + for (device, src) in device_list: |
2372 | + self._as_root('del', subnet, 'dev', device) |
2373 | + if (src != ''): |
2374 | + self._as_root('append', subnet, 'proto', 'kernel', |
2375 | + 'src', src, 'dev', device) |
2376 | + else: |
2377 | + self._as_root('append', subnet, 'proto', 'kernel', |
2378 | + 'dev', device) |
2379 | + |
2380 | |
2381 | class IpNetnsCommand(IpCommandBase): |
2382 | COMMAND = 'netns' |
2383 | |
2384 | === modified file 'quantum/agent/linux/iptables_manager.py' |
2385 | --- quantum/agent/linux/iptables_manager.py 2012-09-12 13:41:20 +0000 |
2386 | +++ quantum/agent/linux/iptables_manager.py 2013-01-08 00:32:21 +0000 |
2387 | @@ -269,7 +269,7 @@ |
2388 | rules. This happens atomically, thanks to iptables-restore. |
2389 | |
2390 | """ |
2391 | - s = [('/sbin/iptables', self.ipv4)] |
2392 | + s = [('iptables', self.ipv4)] |
2393 | if self.use_ipv6: |
2394 | s += [('ip6tables', self.ipv6)] |
2395 | |
2396 | |
2397 | === modified file 'quantum/agent/linux/utils.py' |
2398 | --- quantum/agent/linux/utils.py 2012-08-17 10:42:58 +0000 |
2399 | +++ quantum/agent/linux/utils.py 2013-01-08 00:32:21 +0000 |
2400 | @@ -21,6 +21,7 @@ |
2401 | import logging |
2402 | import os |
2403 | import shlex |
2404 | +import signal |
2405 | import socket |
2406 | import struct |
2407 | |
2408 | @@ -30,6 +31,12 @@ |
2409 | LOG = logging.getLogger(__name__) |
2410 | |
2411 | |
2412 | +def _subprocess_setup(): |
2413 | + # Python installs a SIGPIPE handler by default. This is usually not what |
2414 | + # non-Python subprocesses expect. |
2415 | + signal.signal(signal.SIGPIPE, signal.SIG_DFL) |
2416 | + |
2417 | + |
2418 | def execute(cmd, root_helper=None, process_input=None, addl_env=None, |
2419 | check_exit_code=True, return_stderr=False): |
2420 | if root_helper: |
2421 | @@ -42,6 +49,7 @@ |
2422 | env.update(addl_env) |
2423 | obj = subprocess.Popen(cmd, shell=False, stdin=subprocess.PIPE, |
2424 | stdout=subprocess.PIPE, stderr=subprocess.PIPE, |
2425 | + preexec_fn=_subprocess_setup, |
2426 | env=env) |
2427 | |
2428 | _stdout, _stderr = (process_input and |
2429 | |
2430 | === modified file 'quantum/api/v2/attributes.py' |
2431 | --- quantum/api/v2/attributes.py 2012-09-21 13:01:18 +0000 |
2432 | +++ quantum/api/v2/attributes.py 2013-01-08 00:32:21 +0000 |
2433 | @@ -35,7 +35,7 @@ |
2434 | if data in [True, False]: |
2435 | return |
2436 | else: |
2437 | - msg = _("%s is not boolean") % data |
2438 | + msg = _("'%s' is not boolean") % data |
2439 | LOG.debug("validate_boolean: %s", msg) |
2440 | return msg |
2441 | |
2442 | @@ -50,6 +50,19 @@ |
2443 | return msg |
2444 | |
2445 | |
2446 | +def _validate_string(data, max_len=None): |
2447 | + if not isinstance(data, basestring): |
2448 | + msg = _("'%s' is not a valid string") % data |
2449 | + LOG.debug("validate_string: %s", msg) |
2450 | + return msg |
2451 | + if max_len is not None: |
2452 | + if len(data) > max_len: |
2453 | + msg = _("'%(data)s' exceeds maximum length of " |
2454 | + "%(max_len)s.") % locals() |
2455 | + LOG.debug("validate_string: %s", msg) |
2456 | + return msg |
2457 | + |
2458 | + |
2459 | def _validate_range(data, valid_values=None): |
2460 | min_value = valid_values[0] |
2461 | max_value = valid_values[1] |
2462 | @@ -68,7 +81,7 @@ |
2463 | netaddr.EUI(data) |
2464 | return |
2465 | except Exception: |
2466 | - msg = _("%s is not a valid MAC address") % data |
2467 | + msg = _("'%s' is not a valid MAC address") % data |
2468 | LOG.debug("validate_mac_address: %s", msg) |
2469 | return msg |
2470 | |
2471 | @@ -78,11 +91,131 @@ |
2472 | netaddr.IPAddress(data) |
2473 | return |
2474 | except Exception: |
2475 | - msg = _("%s is not a valid IP address") % data |
2476 | + msg = _("'%s' is not a valid IP address") % data |
2477 | LOG.debug("validate_ip_address: %s", msg) |
2478 | return msg |
2479 | |
2480 | |
2481 | +def _validate_ip_pools(data, valid_values=None): |
2482 | + """Validate that start and end IP addresses are present |
2483 | + |
2484 | + In addition to this the IP addresses will also be validated""" |
2485 | + if not isinstance(data, list): |
2486 | + msg = _("'%s' in not a valid IP pool") % data |
2487 | + LOG.debug("validate_ip_pools: %s", msg) |
2488 | + return msg |
2489 | + |
2490 | + expected_keys = set(['start', 'end']) |
2491 | + try: |
2492 | + for ip_pool in data: |
2493 | + if set(ip_pool.keys()) != expected_keys: |
2494 | + msg = _("Expected keys not found. Expected: %s " |
2495 | + "Provided: %s") % (expected_keys, ip_pool.keys()) |
2496 | + LOG.debug("validate_ip_pools: %s", msg) |
2497 | + return msg |
2498 | + for k in expected_keys: |
2499 | + msg = _validate_ip_address(ip_pool[k]) |
2500 | + if msg: |
2501 | + LOG.debug("validate_ip_pools: %s", msg) |
2502 | + return msg |
2503 | + except KeyError, e: |
2504 | + args = {'key_name': e.message, 'ip_pool': ip_pool} |
2505 | + msg = _("Invalid input. Required key: '%(key_name)s' " |
2506 | + "missing from %(ip_pool)s.") % args |
2507 | + LOG.debug("validate_ip_pools: %s", msg) |
2508 | + return msg |
2509 | + except TypeError, e: |
2510 | + msg = _("Invalid input. Pool %s must be a dictionary.") % ip_pool |
2511 | + LOG.debug("validate_ip_pools: %s", msg) |
2512 | + return msg |
2513 | + except Exception: |
2514 | + msg = _("'%s' in not a valid IP pool") % data |
2515 | + LOG.debug("validate_ip_pools: %s", msg) |
2516 | + return msg |
2517 | + |
2518 | + |
2519 | +def _validate_fixed_ips(data, valid_values=None): |
2520 | + if not isinstance(data, list): |
2521 | + msg = _("'%s' in not a valid fixed IP") % data |
2522 | + LOG.debug("validate_fixed_ips: %s", msg) |
2523 | + return msg |
2524 | + ips = [] |
2525 | + try: |
2526 | + for fixed_ip in data: |
2527 | + if 'ip_address' in fixed_ip: |
2528 | + msg = _validate_ip_address(fixed_ip['ip_address']) |
2529 | + if msg: |
2530 | + LOG.debug("validate_fixed_ips: %s", msg) |
2531 | + return msg |
2532 | + if 'subnet_id' in fixed_ip: |
2533 | + msg = _validate_regex(fixed_ip['subnet_id'], UUID_PATTERN) |
2534 | + if msg: |
2535 | + LOG.debug("validate_fixed_ips: %s", msg) |
2536 | + return msg |
2537 | + # Ensure that duplicate entries are not set - just checking IP |
2538 | + # suffices. Duplicate subnet_id's are legitimate. |
2539 | + if 'ip_address' in fixed_ip: |
2540 | + if fixed_ip['ip_address'] in ips: |
2541 | + msg = _("Duplicate entry %s") % fixed_ip |
2542 | + LOG.debug("validate_fixed_ips: %s", msg) |
2543 | + return msg |
2544 | + ips.append(fixed_ip['ip_address']) |
2545 | + except Exception: |
2546 | + msg = _("'%s' in not a valid fixed IP") % data |
2547 | + LOG.debug("validate_fixed_ips: %s", msg) |
2548 | + return msg |
2549 | + |
2550 | + |
2551 | +def _validate_nameservers(data, valid_values=None): |
2552 | + if not hasattr(data, '__iter__'): |
2553 | + msg = _("'%s' in not a valid nameserver") % data |
2554 | + LOG.debug("validate_nameservers: %s", msg) |
2555 | + return msg |
2556 | + ips = set() |
2557 | + for ip in data: |
2558 | + msg = _validate_ip_address(ip) |
2559 | + if msg: |
2560 | + # This may be a hostname |
2561 | + msg = _validate_regex(ip, HOSTNAME_PATTERN) |
2562 | + if msg: |
2563 | + msg = _("'%s' in not a valid nameserver") % ip |
2564 | + LOG.debug("validate_nameservers: %s", msg) |
2565 | + return msg |
2566 | + if ip in ips: |
2567 | + msg = _("Duplicate nameserver %s") % ip |
2568 | + LOG.debug("validate_nameservers: %s", msg) |
2569 | + return msg |
2570 | + ips.add(ip) |
2571 | + |
2572 | + |
2573 | +def _validate_hostroutes(data, valid_values=None): |
2574 | + if not isinstance(data, list): |
2575 | + msg = _("'%s' in not a valid hostroute") % data |
2576 | + LOG.debug("validate_hostroutes: %s", msg) |
2577 | + return msg |
2578 | + hostroutes = [] |
2579 | + try: |
2580 | + for hostroute in data: |
2581 | + msg = _validate_subnet(hostroute['destination']) |
2582 | + if msg: |
2583 | + LOG.debug("validate_hostroutes: %s", msg) |
2584 | + return msg |
2585 | + msg = _validate_ip_address(hostroute['nexthop']) |
2586 | + if msg: |
2587 | + LOG.debug("validate_hostroutes: %s", msg) |
2588 | + return msg |
2589 | + if hostroute in hostroutes: |
2590 | + msg = _("Duplicate hostroute %s") % hostroute |
2591 | + LOG.debug("validate_hostroutes: %s", msg) |
2592 | + if msg: |
2593 | + return msg |
2594 | + hostroutes.append(hostroute) |
2595 | + except: |
2596 | + msg = _("'%s' in not a valid hostroute") % data |
2597 | + LOG.debug("validate_hostroutes: %s", msg) |
2598 | + return msg |
2599 | + |
2600 | + |
2601 | def _validate_ip_address_or_none(data, valid_values=None): |
2602 | if data is None: |
2603 | return None |
2604 | @@ -92,21 +225,26 @@ |
2605 | def _validate_subnet(data, valid_values=None): |
2606 | try: |
2607 | netaddr.IPNetwork(data) |
2608 | - return |
2609 | + if len(data.split('/')) == 2: |
2610 | + return |
2611 | except Exception: |
2612 | - msg = _("%s is not a valid IP subnet") % data |
2613 | - LOG.debug("validate_subnet: %s", msg) |
2614 | - return msg |
2615 | + pass |
2616 | + |
2617 | + msg = _("'%s' is not a valid IP subnet") % data |
2618 | + LOG.debug("validate_subnet: %s", msg) |
2619 | + return msg |
2620 | |
2621 | |
2622 | def _validate_regex(data, valid_values=None): |
2623 | - match = re.match(valid_values, data) |
2624 | - if match: |
2625 | - return |
2626 | - else: |
2627 | - msg = _("%s is not valid") % data |
2628 | - LOG.debug("validate_regex: %s", msg) |
2629 | - return msg |
2630 | + try: |
2631 | + if re.match(valid_values, data): |
2632 | + return |
2633 | + except TypeError: |
2634 | + pass |
2635 | + |
2636 | + msg = _("'%s' is not valid input") % data |
2637 | + LOG.debug("validate_regex: %s", msg) |
2638 | + return msg |
2639 | |
2640 | |
2641 | def convert_to_boolean(data): |
2642 | @@ -118,15 +256,23 @@ |
2643 | return True |
2644 | else: |
2645 | return False |
2646 | - except ValueError, TypeError: |
2647 | + except (ValueError, TypeError): |
2648 | if (data == "True" or data == "true"): |
2649 | return True |
2650 | if (data == "False" or data == "false"): |
2651 | return False |
2652 | - msg = _("%s is not boolean") % data |
2653 | + msg = _("'%s' is not boolean") % data |
2654 | raise q_exc.InvalidInput(error_message=msg) |
2655 | |
2656 | |
2657 | +def convert_to_int(data): |
2658 | + try: |
2659 | + return int(data) |
2660 | + except (ValueError, TypeError): |
2661 | + msg = _("'%s' is not a integer") % data |
2662 | + raise q_exc.InvalidInput(error_message=msg) |
2663 | + |
2664 | + |
2665 | def convert_kvp_str_to_list(data): |
2666 | """Convert a value of the form 'key=value' to ['key', 'value']. |
2667 | |
2668 | @@ -157,6 +303,8 @@ |
2669 | kvp_map[key].add(value) |
2670 | return dict((x, list(y)) for x, y in kvp_map.iteritems()) |
2671 | |
2672 | +HOSTNAME_PATTERN = ("(?=^.{1,254}$)(^(?:(?!\d+\.|-)[a-zA-Z0-9_\-]" |
2673 | + "{1,63}(?<!-)\.?)+(?:[a-zA-Z]{2,})$)") |
2674 | |
2675 | HEX_ELEM = '[0-9A-Fa-f]' |
2676 | UUID_PATTERN = '-'.join([HEX_ELEM + '{8}', HEX_ELEM + '{4}', |
2677 | @@ -169,12 +317,17 @@ |
2678 | # Dictionary that maintains a list of validation functions |
2679 | validators = {'type:boolean': _validate_boolean, |
2680 | 'type:values': _validate_values, |
2681 | + 'type:string': _validate_string, |
2682 | 'type:range': _validate_range, |
2683 | 'type:mac_address': _validate_mac_address, |
2684 | + 'type:fixed_ips': _validate_fixed_ips, |
2685 | 'type:ip_address': _validate_ip_address, |
2686 | 'type:ip_address_or_none': _validate_ip_address_or_none, |
2687 | 'type:subnet': _validate_subnet, |
2688 | - 'type:regex': _validate_regex} |
2689 | + 'type:regex': _validate_regex, |
2690 | + 'type:ip_pools': _validate_ip_pools, |
2691 | + 'type:hostroutes': _validate_hostroutes, |
2692 | + 'type:nameservers': _validate_nameservers} |
2693 | |
2694 | # Note: a default of ATTR_NOT_SPECIFIED indicates that an |
2695 | # attribute is not required, but will be generated by the plugin |
2696 | @@ -205,6 +358,7 @@ |
2697 | 'validate': {'type:regex': UUID_PATTERN}, |
2698 | 'is_visible': True}, |
2699 | 'name': {'allow_post': True, 'allow_put': True, |
2700 | + 'validate': {'type:string': None}, |
2701 | 'default': '', 'is_visible': True}, |
2702 | 'subnets': {'allow_post': False, 'allow_put': False, |
2703 | 'default': [], |
2704 | @@ -217,6 +371,7 @@ |
2705 | 'status': {'allow_post': False, 'allow_put': False, |
2706 | 'is_visible': True}, |
2707 | 'tenant_id': {'allow_post': True, 'allow_put': False, |
2708 | + 'validate': {'type:string': None}, |
2709 | 'required_by_policy': True, |
2710 | 'is_visible': True}, |
2711 | SHARED: {'allow_post': True, |
2712 | @@ -233,6 +388,7 @@ |
2713 | 'validate': {'type:regex': UUID_PATTERN}, |
2714 | 'is_visible': True}, |
2715 | 'name': {'allow_post': True, 'allow_put': True, 'default': '', |
2716 | + 'validate': {'type:string': None}, |
2717 | 'is_visible': True}, |
2718 | 'network_id': {'allow_post': True, 'allow_put': False, |
2719 | 'required_by_policy': True, |
2720 | @@ -251,15 +407,19 @@ |
2721 | 'fixed_ips': {'allow_post': True, 'allow_put': True, |
2722 | 'default': ATTR_NOT_SPECIFIED, |
2723 | 'convert_list_to': convert_kvp_list_to_dict, |
2724 | + 'validate': {'type:fixed_ips': None}, |
2725 | 'enforce_policy': True, |
2726 | 'is_visible': True}, |
2727 | 'device_id': {'allow_post': True, 'allow_put': True, |
2728 | + 'validate': {'type:string': None}, |
2729 | 'default': '', |
2730 | 'is_visible': True}, |
2731 | 'device_owner': {'allow_post': True, 'allow_put': True, |
2732 | + 'validate': {'type:string': None}, |
2733 | 'default': '', |
2734 | 'is_visible': True}, |
2735 | 'tenant_id': {'allow_post': True, 'allow_put': False, |
2736 | + 'validate': {'type:string': None}, |
2737 | 'required_by_policy': True, |
2738 | 'is_visible': True}, |
2739 | 'status': {'allow_post': False, 'allow_put': False, |
2740 | @@ -270,9 +430,10 @@ |
2741 | 'validate': {'type:regex': UUID_PATTERN}, |
2742 | 'is_visible': True}, |
2743 | 'name': {'allow_post': True, 'allow_put': True, 'default': '', |
2744 | + 'validate': {'type:string': None}, |
2745 | 'is_visible': True}, |
2746 | 'ip_version': {'allow_post': True, 'allow_put': False, |
2747 | - 'convert_to': int, |
2748 | + 'convert_to': convert_to_int, |
2749 | 'validate': {'type:values': [4, 6]}, |
2750 | 'is_visible': True}, |
2751 | 'network_id': {'allow_post': True, 'allow_put': False, |
2752 | @@ -289,14 +450,18 @@ |
2753 | #TODO(salvatore-orlando): Enable PUT on allocation_pools |
2754 | 'allocation_pools': {'allow_post': True, 'allow_put': False, |
2755 | 'default': ATTR_NOT_SPECIFIED, |
2756 | + 'validate': {'type:ip_pools': None}, |
2757 | 'is_visible': True}, |
2758 | 'dns_nameservers': {'allow_post': True, 'allow_put': True, |
2759 | 'default': ATTR_NOT_SPECIFIED, |
2760 | + 'validate': {'type:nameservers': None}, |
2761 | 'is_visible': True}, |
2762 | 'host_routes': {'allow_post': True, 'allow_put': True, |
2763 | 'default': ATTR_NOT_SPECIFIED, |
2764 | + 'validate': {'type:hostroutes': None}, |
2765 | 'is_visible': True}, |
2766 | 'tenant_id': {'allow_post': True, 'allow_put': False, |
2767 | + 'validate': {'type:string': None}, |
2768 | 'required_by_policy': True, |
2769 | 'is_visible': True}, |
2770 | 'enable_dhcp': {'allow_post': True, 'allow_put': True, |
2771 | |
2772 | === modified file 'quantum/api/v2/base.py' |
2773 | --- quantum/api/v2/base.py 2012-09-21 13:01:18 +0000 |
2774 | +++ quantum/api/v2/base.py 2013-01-08 00:32:21 +0000 |
2775 | @@ -16,6 +16,7 @@ |
2776 | import logging |
2777 | import socket |
2778 | |
2779 | +import netaddr |
2780 | import webob.exc |
2781 | |
2782 | from quantum.api.v2 import attributes |
2783 | @@ -44,7 +45,10 @@ |
2784 | exceptions.HostRoutesExhausted: webob.exc.HTTPBadRequest, |
2785 | exceptions.DNSNameServersExhausted: webob.exc.HTTPBadRequest, |
2786 | # Some plugins enforce policies as well |
2787 | - exceptions.PolicyNotAuthorized: webob.exc.HTTPForbidden |
2788 | + exceptions.PolicyNotAuthorized: webob.exc.HTTPForbidden, |
2789 | + netaddr.AddrFormatError: webob.exc.HTTPBadRequest, |
2790 | + AttributeError: webob.exc.HTTPBadRequest, |
2791 | + ValueError: webob.exc.HTTPBadRequest, |
2792 | } |
2793 | |
2794 | QUOTAS = quota.QUOTAS |
2795 | |
2796 | === modified file 'quantum/api/v2/resource.py' |
2797 | --- quantum/api/v2/resource.py 2012-09-12 13:41:20 +0000 |
2798 | +++ quantum/api/v2/resource.py 2013-01-08 00:32:21 +0000 |
2799 | @@ -18,6 +18,7 @@ |
2800 | """ |
2801 | import logging |
2802 | |
2803 | +import netaddr |
2804 | import webob |
2805 | import webob.dec |
2806 | import webob.exc |
2807 | @@ -93,7 +94,9 @@ |
2808 | method = getattr(controller, action) |
2809 | |
2810 | result = method(request=request, **args) |
2811 | - except exceptions.QuantumException as e: |
2812 | + except (ValueError, AttributeError, |
2813 | + exceptions.QuantumException, |
2814 | + netaddr.AddrFormatError) as e: |
2815 | LOG.exception('%s failed' % action) |
2816 | body = serializer({'QuantumError': str(e)}) |
2817 | kwargs = {'body': body, 'content_type': content_type} |
2818 | |
2819 | === modified file 'quantum/common/config.py' |
2820 | --- quantum/common/config.py 2012-09-26 15:14:31 +0000 |
2821 | +++ quantum/common/config.py 2013-01-08 00:32:21 +0000 |
2822 | @@ -114,6 +114,7 @@ |
2823 | |
2824 | handler.setFormatter(formatter) |
2825 | root_logger.addHandler(handler) |
2826 | + LOG.info("Logging enabled!") |
2827 | |
2828 | |
2829 | def load_paste_app(app_name): |
2830 | |
2831 | === modified file 'quantum/common/utils.py' |
2832 | --- quantum/common/utils.py 2012-09-12 13:41:20 +0000 |
2833 | +++ quantum/common/utils.py 2013-01-08 00:32:21 +0000 |
2834 | @@ -23,6 +23,7 @@ |
2835 | |
2836 | import logging |
2837 | import os |
2838 | +import signal |
2839 | import subprocess |
2840 | import uuid |
2841 | |
2842 | @@ -47,6 +48,12 @@ |
2843 | return subject |
2844 | |
2845 | |
2846 | +def _subprocess_setup(): |
2847 | + # Python installs a SIGPIPE handler by default. This is usually not what |
2848 | + # non-Python subprocesses expect. |
2849 | + signal.signal(signal.SIGPIPE, signal.SIG_DFL) |
2850 | + |
2851 | + |
2852 | def execute(cmd, process_input=None, addl_env=None, check_exit_code=True): |
2853 | logging.debug("Running cmd: %s", cmd) |
2854 | env = os.environ.copy() |
2855 | @@ -54,6 +61,7 @@ |
2856 | env.update(addl_env) |
2857 | obj = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, |
2858 | stdout=subprocess.PIPE, stderr=subprocess.PIPE, |
2859 | + preexec_fn=_subprocess_setup, |
2860 | env=env) |
2861 | result = None |
2862 | if process_input is not None: |
2863 | @@ -144,3 +152,34 @@ |
2864 | def str_uuid(): |
2865 | """Return a uuid as a string""" |
2866 | return str(uuid.uuid4()) |
2867 | + |
2868 | + |
2869 | +def parse_mappings(mapping_list, unique_values=True): |
2870 | + """Parse a list of of mapping strings into a dictionary. |
2871 | + |
2872 | + :param mapping_list: a list of strings of the form '<key>:<value>' |
2873 | + :param unique_values: values must be unique if True |
2874 | + :returns: a dict mapping keys to values |
2875 | + """ |
2876 | + mappings = {} |
2877 | + for mapping in mapping_list: |
2878 | + mapping = mapping.strip() |
2879 | + if not mapping: |
2880 | + continue |
2881 | + split_result = mapping.split(':') |
2882 | + if len(split_result) != 2: |
2883 | + raise ValueError(_("Invalid mapping: '%s'") % mapping) |
2884 | + key = split_result[0].strip() |
2885 | + if not key: |
2886 | + raise ValueError(_("Missing key in mapping: '%s'") % mapping) |
2887 | + value = split_result[1].strip() |
2888 | + if not value: |
2889 | + raise ValueError(_("Missing value in mapping: '%s'") % mapping) |
2890 | + if key in mappings: |
2891 | + raise ValueError(_("Key %s in mapping: '%s' not unique") % |
2892 | + (key, mapping)) |
2893 | + if unique_values and value in mappings.itervalues(): |
2894 | + raise ValueError(_("Value %s in mapping: '%s' not unique") % |
2895 | + (value, mapping)) |
2896 | + mappings[key] = value |
2897 | + return mappings |
2898 | |
2899 | === modified file 'quantum/db/api.py' |
2900 | --- quantum/db/api.py 2012-09-12 13:41:20 +0000 |
2901 | +++ quantum/db/api.py 2013-01-08 00:32:21 +0000 |
2902 | @@ -85,10 +85,15 @@ |
2903 | |
2904 | |
2905 | def clear_db(base=BASE): |
2906 | - global _ENGINE |
2907 | + global _ENGINE, _MAKER |
2908 | assert _ENGINE |
2909 | - for table in reversed(base.metadata.sorted_tables): |
2910 | - _ENGINE.execute(table.delete()) |
2911 | + |
2912 | + unregister_models(base) |
2913 | + if _MAKER: |
2914 | + _MAKER.close_all() |
2915 | + _MAKER = None |
2916 | + _ENGINE.dispose() |
2917 | + _ENGINE = None |
2918 | |
2919 | |
2920 | def get_session(autocommit=True, expire_on_commit=False): |
2921 | |
2922 | === modified file 'quantum/db/db_base_plugin_v2.py' |
2923 | --- quantum/db/db_base_plugin_v2.py 2012-09-26 15:14:31 +0000 |
2924 | +++ quantum/db/db_base_plugin_v2.py 2013-01-08 00:32:21 +0000 |
2925 | @@ -207,11 +207,18 @@ |
2926 | query = query.filter(column.in_(value)) |
2927 | return query |
2928 | |
2929 | + def _get_collection_query(self, context, model, filters=None): |
2930 | + collection = self._model_query(context, model) |
2931 | + collection = self._apply_filters_to_query(collection, model, filters) |
2932 | + return collection |
2933 | + |
2934 | def _get_collection(self, context, model, dict_func, filters=None, |
2935 | fields=None): |
2936 | - collection = self._model_query(context, model) |
2937 | - collection = self._apply_filters_to_query(collection, model, filters) |
2938 | - return [dict_func(c, fields) for c in collection.all()] |
2939 | + query = self._get_collection_query(context, model, filters) |
2940 | + return [dict_func(c, fields) for c in query.all()] |
2941 | + |
2942 | + def _get_collection_count(self, context, model, filters=None): |
2943 | + return self._get_collection_query(context, model, filters).count() |
2944 | |
2945 | @staticmethod |
2946 | def _generate_mac(context, network_id): |
2947 | @@ -374,7 +381,8 @@ |
2948 | def update_fixed_ip_lease_expiration(self, context, network_id, |
2949 | ip_address, lease_remaining): |
2950 | |
2951 | - expiration = timeutils.utcnow() + datetime.timedelta(lease_remaining) |
2952 | + expiration = (timeutils.utcnow() + |
2953 | + datetime.timedelta(seconds=lease_remaining)) |
2954 | |
2955 | query = context.session.query(models_v2.IPAllocation) |
2956 | query = query.filter_by(network_id=network_id, ip_address=ip_address) |
2957 | @@ -486,6 +494,31 @@ |
2958 | return True |
2959 | return False |
2960 | |
2961 | + @staticmethod |
2962 | + def _check_ip_in_allocation_pool(context, subnet_id, gateway_ip, |
2963 | + ip_address): |
2964 | + """Validate IP in allocation pool. |
2965 | + |
2966 | + Validates that the IP address is either the default gateway or |
2967 | + in the allocation pools of the subnet. |
2968 | + """ |
2969 | + # Check if the IP is the gateway |
2970 | + if ip_address == gateway_ip: |
2971 | + # Gateway is not in allocation pool |
2972 | + return False |
2973 | + |
2974 | + # Check if the requested IP is in a defined allocation pool |
2975 | + pool_qry = context.session.query(models_v2.IPAllocationPool) |
2976 | + allocation_pools = pool_qry.filter_by(subnet_id=subnet_id).all() |
2977 | + ip = netaddr.IPAddress(ip_address) |
2978 | + for allocation_pool in allocation_pools: |
2979 | + allocation_pool_range = netaddr.IPRange( |
2980 | + allocation_pool['first_ip'], |
2981 | + allocation_pool['last_ip']) |
2982 | + if ip in allocation_pool_range: |
2983 | + return True |
2984 | + return False |
2985 | + |
2986 | def _test_fixed_ips_for_port(self, context, network_id, fixed_ips): |
2987 | """Test fixed IPs for port. |
2988 | |
2989 | @@ -929,6 +962,10 @@ |
2990 | self._make_network_dict, |
2991 | filters=filters, fields=fields) |
2992 | |
2993 | + def get_networks_count(self, context, filters=None): |
2994 | + return self._get_collection_count(context, models_v2.Network, |
2995 | + filters=filters) |
2996 | + |
2997 | def create_subnet_bulk(self, context, subnets): |
2998 | return self._create_bulk('subnet', context, subnets) |
2999 | |
3000 | @@ -956,8 +993,8 @@ |
3001 | s['gateway_ip'] != attributes.ATTR_NOT_SPECIFIED): |
3002 | self._validate_ip_version(ip_ver, s['gateway_ip'], 'gateway_ip') |
3003 | |
3004 | - if 'dns_nameservers' in s and \ |
3005 | - s['dns_nameservers'] != attributes.ATTR_NOT_SPECIFIED: |
3006 | + if ('dns_nameservers' in s and |
3007 | + s['dns_nameservers'] != attributes.ATTR_NOT_SPECIFIED): |
3008 | if len(s['dns_nameservers']) > cfg.CONF.max_dns_nameservers: |
3009 | raise q_exc.DNSNameServersExhausted( |
3010 | subnet_id=id, |
3011 | @@ -970,8 +1007,8 @@ |
3012 | error_message=("error parsing dns address %s" % dns)) |
3013 | self._validate_ip_version(ip_ver, dns, 'dns_nameserver') |
3014 | |
3015 | - if 'host_routes' in s and \ |
3016 | - s['host_routes'] != attributes.ATTR_NOT_SPECIFIED: |
3017 | + if ('host_routes' in s and |
3018 | + s['host_routes'] != attributes.ATTR_NOT_SPECIFIED): |
3019 | if len(s['host_routes']) > cfg.CONF.max_subnet_host_routes: |
3020 | raise q_exc.HostRoutesExhausted( |
3021 | subnet_id=id, |
3022 | @@ -1120,6 +1157,10 @@ |
3023 | self._make_subnet_dict, |
3024 | filters=filters, fields=fields) |
3025 | |
3026 | + def get_subnets_count(self, context, filters=None): |
3027 | + return self._get_collection_count(context, models_v2.Subnet, |
3028 | + filters=filters) |
3029 | + |
3030 | def create_port_bulk(self, context, ports): |
3031 | return self._create_bulk('port', context, ports) |
3032 | |
3033 | @@ -1160,9 +1201,8 @@ |
3034 | device_owner=p['device_owner']) |
3035 | context.session.add(port) |
3036 | |
3037 | - # Update the allocated IP's |
3038 | - if ips: |
3039 | - with context.session.begin(subtransactions=True): |
3040 | + # Update the allocated IP's |
3041 | + if ips: |
3042 | for ip in ips: |
3043 | LOG.debug("Allocated IP %s (%s/%s/%s)", ip['ip_address'], |
3044 | port['network_id'], ip['subnet_id'], port.id) |
3045 | @@ -1216,34 +1256,38 @@ |
3046 | |
3047 | allocated_qry = context.session.query(models_v2.IPAllocation) |
3048 | # recycle all of the IP's |
3049 | - # NOTE(garyk) this may be have to be addressed differently when |
3050 | - # working with a DHCP server. |
3051 | allocated = allocated_qry.filter_by(port_id=id).all() |
3052 | if allocated: |
3053 | for a in allocated: |
3054 | subnet = self._get_subnet(context, a['subnet_id']) |
3055 | - if a['ip_address'] == subnet['gateway_ip']: |
3056 | - # Gateway address will not be recycled, but we do |
3057 | - # need to delete the allocation from the DB |
3058 | + # Check if IP was allocated from allocation pool |
3059 | + if QuantumDbPluginV2._check_ip_in_allocation_pool( |
3060 | + context, a['subnet_id'], subnet['gateway_ip'], |
3061 | + a['ip_address']): |
3062 | + QuantumDbPluginV2._hold_ip(context, |
3063 | + a['network_id'], |
3064 | + a['subnet_id'], |
3065 | + id, |
3066 | + a['ip_address']) |
3067 | + else: |
3068 | + # IPs out of allocation pool will not be recycled, but |
3069 | + # we do need to delete the allocation from the DB |
3070 | QuantumDbPluginV2._delete_ip_allocation( |
3071 | context, a['network_id'], |
3072 | a['subnet_id'], a['ip_address']) |
3073 | - LOG.debug("Gateway address (%s/%s) is not recycled", |
3074 | - a['ip_address'], a['subnet_id']) |
3075 | - continue |
3076 | + msg_dict = dict(address=a['ip_address'], |
3077 | + subnet_id=a['subnet_id']) |
3078 | + msg = _("%(address)s (%(subnet_id)s) is not " |
3079 | + "recycled") % msg_dict |
3080 | + LOG.debug(msg) |
3081 | |
3082 | - QuantumDbPluginV2._hold_ip(context, |
3083 | - a['network_id'], |
3084 | - a['subnet_id'], |
3085 | - id, |
3086 | - a['ip_address']) |
3087 | context.session.delete(port) |
3088 | |
3089 | def get_port(self, context, id, fields=None): |
3090 | port = self._get_port(context, id) |
3091 | return self._make_port_dict(port, fields) |
3092 | |
3093 | - def get_ports(self, context, filters=None, fields=None): |
3094 | + def _get_ports_query(self, context, filters=None): |
3095 | Port = models_v2.Port |
3096 | IPAllocation = models_v2.IPAllocation |
3097 | |
3098 | @@ -1263,4 +1307,11 @@ |
3099 | query = query.filter(IPAllocation.subnet_id.in_(subnet_ids)) |
3100 | |
3101 | query = self._apply_filters_to_query(query, Port, filters) |
3102 | + return query |
3103 | + |
3104 | + def get_ports(self, context, filters=None, fields=None): |
3105 | + query = self._get_ports_query(context, filters) |
3106 | return [self._make_port_dict(c, fields) for c in query.all()] |
3107 | + |
3108 | + def get_ports_count(self, context, filters=None): |
3109 | + return self._get_ports_query(context, filters).count() |
3110 | |
3111 | === modified file 'quantum/db/l3_db.py' |
3112 | --- quantum/db/l3_db.py 2012-09-12 13:41:20 +0000 |
3113 | +++ quantum/db/l3_db.py 2013-01-08 00:32:21 +0000 |
3114 | @@ -186,13 +186,19 @@ |
3115 | # figure out if we need to delete existing port |
3116 | if gw_port and gw_port['network_id'] != network_id: |
3117 | with context.session.begin(subtransactions=True): |
3118 | - router.update({'gw_port_id': None}) |
3119 | + router.gw_port = None |
3120 | context.session.add(router) |
3121 | self.delete_port(context.elevated(), gw_port['id'], |
3122 | l3_port_check=False) |
3123 | |
3124 | if network_id is not None and (gw_port is None or |
3125 | gw_port['network_id'] != network_id): |
3126 | + subnets = self._get_subnets_by_network(context, |
3127 | + network_id) |
3128 | + for subnet in subnets: |
3129 | + self._check_for_dup_router_subnet(context, router_id, |
3130 | + network_id, subnet['id']) |
3131 | + |
3132 | # Port has no 'tenant-id', as it is hidden from user |
3133 | gw_port = self.create_port(context.elevated(), { |
3134 | 'port': |
3135 | @@ -213,7 +219,8 @@ |
3136 | raise q_exc.BadRequest(resource='router', msg=msg) |
3137 | |
3138 | with context.session.begin(subtransactions=True): |
3139 | - router.update({'gw_port_id': gw_port['id']}) |
3140 | + router.gw_port = self._get_port(context.elevated(), |
3141 | + gw_port['id']) |
3142 | context.session.add(router) |
3143 | |
3144 | def delete_router(self, context, id): |
3145 | @@ -244,13 +251,16 @@ |
3146 | self._make_router_dict, |
3147 | filters=filters, fields=fields) |
3148 | |
3149 | + def get_routers_count(self, context, filters=None): |
3150 | + return self._get_collection_count(context, Router, |
3151 | + filters=filters) |
3152 | + |
3153 | def _check_for_dup_router_subnet(self, context, router_id, |
3154 | network_id, subnet_id): |
3155 | try: |
3156 | rport_qry = context.session.query(models_v2.Port) |
3157 | rports = rport_qry.filter_by( |
3158 | - device_id=router_id, |
3159 | - device_owner=DEVICE_OWNER_ROUTER_INTF,).all() |
3160 | + device_id=router_id).all() |
3161 | # its possible these ports on on the same network, but |
3162 | # different subnet |
3163 | new_cidr = self._get_subnet(context, subnet_id)['cidr'] |
3164 | @@ -261,7 +271,8 @@ |
3165 | msg = ("Router already has a port on subnet %s" |
3166 | % subnet_id) |
3167 | raise q_exc.BadRequest(resource='router', msg=msg) |
3168 | - cidr = self._get_subnet(context, ip['subnet_id'])['cidr'] |
3169 | + cidr = self._get_subnet(context.elevated(), |
3170 | + ip['subnet_id'])['cidr'] |
3171 | ipnet = netaddr.IPNetwork(cidr) |
3172 | match1 = netaddr.all_matching_cidrs(new_ipnet, [cidr]) |
3173 | match2 = netaddr.all_matching_cidrs(ipnet, [new_cidr]) |
3174 | @@ -408,34 +419,35 @@ |
3175 | 'fixed_ip_address': floatingip['fixed_ip_address']} |
3176 | return self._fields(res, fields) |
3177 | |
3178 | - def _get_router_for_internal_subnet(self, context, internal_port, |
3179 | - internal_subnet_id): |
3180 | + def _get_router_for_floatingip(self, context, internal_port, |
3181 | + internal_subnet_id, |
3182 | + external_network_id): |
3183 | subnet_db = self._get_subnet(context, internal_subnet_id) |
3184 | if not subnet_db['gateway_ip']: |
3185 | msg = ('Cannot add floating IP to port on subnet %s ' |
3186 | 'which has no gateway_ip' % internal_subnet_id) |
3187 | raise q_exc.BadRequest(resource='floatingip', msg=msg) |
3188 | |
3189 | - #FIXME(danwent): can do join, but cannot use standard F-K syntax? |
3190 | - # just do it inefficiently for now |
3191 | - port_qry = context.session.query(models_v2.Port) |
3192 | - ports = port_qry.filter_by(network_id=internal_port['network_id']) |
3193 | - for p in ports: |
3194 | - ips = [ip['ip_address'] for ip in p['fixed_ips']] |
3195 | - if len(ips) != 1: |
3196 | - continue |
3197 | - fixed = p['fixed_ips'][0] |
3198 | - if (fixed['ip_address'] == subnet_db['gateway_ip'] and |
3199 | - fixed['subnet_id'] == internal_subnet_id): |
3200 | - router_qry = context.session.query(Router) |
3201 | - try: |
3202 | - router = router_qry.filter_by(id=p['device_id']).one() |
3203 | - return router['id'] |
3204 | - except exc.NoResultFound: |
3205 | - pass |
3206 | + # find router interface ports on this network |
3207 | + router_intf_qry = context.session.query(models_v2.Port) |
3208 | + router_intf_ports = router_intf_qry.filter_by( |
3209 | + network_id=internal_port['network_id'], |
3210 | + device_owner=DEVICE_OWNER_ROUTER_INTF) |
3211 | + |
3212 | + for intf_p in router_intf_ports: |
3213 | + if intf_p['fixed_ips'][0]['subnet_id'] == internal_subnet_id: |
3214 | + router_id = intf_p['device_id'] |
3215 | + router_gw_qry = context.session.query(models_v2.Port) |
3216 | + has_gw_port = router_gw_qry.filter_by( |
3217 | + network_id=external_network_id, |
3218 | + device_id=router_id, |
3219 | + device_owner=DEVICE_OWNER_ROUTER_GW).count() |
3220 | + if has_gw_port: |
3221 | + return router_id |
3222 | |
3223 | raise l3.ExternalGatewayForFloatingIPNotFound( |
3224 | subnet_id=internal_subnet_id, |
3225 | + external_network_id=external_network_id, |
3226 | port_id=internal_port['id']) |
3227 | |
3228 | def get_assoc_data(self, context, fip, floating_network_id): |
3229 | @@ -483,9 +495,10 @@ |
3230 | internal_ip_address = internal_port['fixed_ips'][0]['ip_address'] |
3231 | internal_subnet_id = internal_port['fixed_ips'][0]['subnet_id'] |
3232 | |
3233 | - router_id = self._get_router_for_internal_subnet(context, |
3234 | - internal_port, |
3235 | - internal_subnet_id) |
3236 | + router_id = self._get_router_for_floatingip(context, |
3237 | + internal_port, |
3238 | + internal_subnet_id, |
3239 | + floating_network_id) |
3240 | # confirm that this router has a floating |
3241 | # ip enabled gateway with support for this floating IP network |
3242 | try: |
3243 | @@ -508,17 +521,24 @@ |
3244 | msg = "fixed_ip_address cannot be specified without a port_id" |
3245 | raise q_exc.BadRequest(resource='floatingip', msg=msg) |
3246 | if 'port_id' in fip and fip['port_id']: |
3247 | - port_qry = context.session.query(FloatingIP) |
3248 | - try: |
3249 | - port_qry.filter_by(fixed_port_id=fip['port_id']).one() |
3250 | - raise l3.FloatingIPPortAlreadyAssociated( |
3251 | - port_id=fip['port_id']) |
3252 | - except exc.NoResultFound: |
3253 | - pass |
3254 | port_id, internal_ip_address, router_id = self.get_assoc_data( |
3255 | context, |
3256 | fip, |
3257 | floatingip_db['floating_network_id']) |
3258 | + fip_qry = context.session.query(FloatingIP) |
3259 | + try: |
3260 | + fip_qry.filter_by( |
3261 | + fixed_port_id=fip['port_id'], |
3262 | + floating_network_id=floatingip_db['floating_network_id'], |
3263 | + fixed_ip_address=internal_ip_address).one() |
3264 | + raise l3.FloatingIPPortAlreadyAssociated( |
3265 | + port_id=fip['port_id'], |
3266 | + fip_id=floatingip_db['id'], |
3267 | + floating_ip_address=floatingip_db['floating_ip_address'], |
3268 | + fixed_ip=internal_ip_address, |
3269 | + net_id=floatingip_db['floating_network_id']) |
3270 | + except exc.NoResultFound: |
3271 | + pass |
3272 | floatingip_db.update({'fixed_ip_address': internal_ip_address, |
3273 | 'fixed_port_id': port_id, |
3274 | 'router_id': router_id}) |
3275 | @@ -536,27 +556,26 @@ |
3276 | # This external port is never exposed to the tenant. |
3277 | # it is used purely for internal system and admin use when |
3278 | # managing floating IPs. |
3279 | - external_port = self.create_port(context.elevated(), { |
3280 | - 'port': |
3281 | - {'tenant_id': '', # tenant intentionally not set |
3282 | - 'network_id': f_net_id, |
3283 | - 'mac_address': attributes.ATTR_NOT_SPECIFIED, |
3284 | - 'fixed_ips': attributes.ATTR_NOT_SPECIFIED, |
3285 | - 'admin_state_up': True, |
3286 | - 'device_id': fip_id, |
3287 | - 'device_owner': DEVICE_OWNER_FLOATINGIP, |
3288 | - 'name': ''}}) |
3289 | - # Ensure IP addresses are allocated on external port |
3290 | - if not external_port['fixed_ips']: |
3291 | - msg = "Unable to find any IP address on external network" |
3292 | - # remove the external port |
3293 | - self.delete_port(context.elevated(), external_port['id'], |
3294 | - l3_port_check=False) |
3295 | - raise q_exc.BadRequest(resource='floatingip', msg=msg) |
3296 | - |
3297 | - floating_ip_address = external_port['fixed_ips'][0]['ip_address'] |
3298 | try: |
3299 | with context.session.begin(subtransactions=True): |
3300 | + external_port = self.create_port(context.elevated(), { |
3301 | + 'port': |
3302 | + {'tenant_id': '', # tenant intentionally not set |
3303 | + 'network_id': f_net_id, |
3304 | + 'mac_address': attributes.ATTR_NOT_SPECIFIED, |
3305 | + 'fixed_ips': attributes.ATTR_NOT_SPECIFIED, |
3306 | + 'admin_state_up': True, |
3307 | + 'device_id': fip_id, |
3308 | + 'device_owner': DEVICE_OWNER_FLOATINGIP, |
3309 | + 'name': ''}}) |
3310 | + # Ensure IP addresses are allocated on external port |
3311 | + if not external_port['fixed_ips']: |
3312 | + msg = "Unable to find any IP address on external network" |
3313 | + # remove the external port |
3314 | + raise q_exc.BadRequest(resource='floatingip', msg=msg) |
3315 | + |
3316 | + floating_fixed_ip = external_port['fixed_ips'][0] |
3317 | + floating_ip_address = floating_fixed_ip['ip_address'] |
3318 | floatingip_db = FloatingIP( |
3319 | id=fip_id, |
3320 | tenant_id=tenant_id, |
3321 | @@ -578,8 +597,6 @@ |
3322 | except Exception: |
3323 | LOG.exception("Floating IP association failed") |
3324 | # Remove the port created for internal purposes |
3325 | - self.delete_port(context.elevated(), external_port['id'], |
3326 | - l3_port_check=False) |
3327 | raise |
3328 | |
3329 | return self._make_floatingip_dict(floatingip_db) |
3330 | @@ -600,9 +617,9 @@ |
3331 | floatingip = self._get_floatingip(context, id) |
3332 | with context.session.begin(subtransactions=True): |
3333 | context.session.delete(floatingip) |
3334 | - self.delete_port(context.elevated(), |
3335 | - floatingip['floating_port_id'], |
3336 | - l3_port_check=False) |
3337 | + self.delete_port(context.elevated(), |
3338 | + floatingip['floating_port_id'], |
3339 | + l3_port_check=False) |
3340 | |
3341 | def get_floatingip(self, context, id, fields=None): |
3342 | floatingip = self._get_floatingip(context, id) |
3343 | @@ -613,6 +630,10 @@ |
3344 | self._make_floatingip_dict, |
3345 | filters=filters, fields=fields) |
3346 | |
3347 | + def get_floatingips_count(self, context, filters=None): |
3348 | + return self._get_collection_count(context, FloatingIP, |
3349 | + filters=filters) |
3350 | + |
3351 | def prevent_l3_port_deletion(self, context, port_id): |
3352 | """ Checks to make sure a port is allowed to be deleted, raising |
3353 | an exception if this is not the case. This should be called by |
3354 | @@ -697,13 +718,11 @@ |
3355 | # must make sure we do not have any external gateway ports |
3356 | # (and thus, possible floating IPs) on this network before |
3357 | # allow it to be update to external=False |
3358 | - try: |
3359 | - context.session.query(models_v2.Port).filter_by( |
3360 | - device_owner=DEVICE_OWNER_ROUTER_GW, |
3361 | - network_id=net_id).first() |
3362 | + port = context.session.query(models_v2.Port).filter_by( |
3363 | + device_owner=DEVICE_OWNER_ROUTER_GW, |
3364 | + network_id=net_id).first() |
3365 | + if port: |
3366 | raise l3.ExternalNetworkInUse(net_id=net_id) |
3367 | - except exc.NoResultFound: |
3368 | - pass # expected |
3369 | |
3370 | context.session.query(ExternalNetwork).filter_by( |
3371 | network_id=net_id).delete() |
3372 | |
3373 | === modified file 'quantum/extensions/extensions.py' |
3374 | --- quantum/extensions/extensions.py 2012-09-07 18:50:09 +0000 |
3375 | +++ quantum/extensions/extensions.py 2013-01-08 00:32:21 +0000 |
3376 | @@ -50,6 +50,11 @@ |
3377 | 'ext_alias': ["quotas"], |
3378 | 'ext_db_models': ['quantum.extensions._quotav2_model.Quota'], |
3379 | }, |
3380 | + 'quantum.plugins.nicira.nicira_nvp_plugin.QuantumPlugin.NvpPluginV2': |
3381 | + { |
3382 | + 'ext_alias': ["quotas"], |
3383 | + 'ext_db_models': ['quantum.extensions._quotav2_model.Quota'], |
3384 | + }, |
3385 | } |
3386 | |
3387 | |
3388 | |
3389 | === modified file 'quantum/extensions/l3.py' |
3390 | --- quantum/extensions/l3.py 2012-09-12 13:41:20 +0000 |
3391 | +++ quantum/extensions/l3.py 2013-01-08 00:32:21 +0000 |
3392 | @@ -44,14 +44,16 @@ |
3393 | |
3394 | |
3395 | class ExternalGatewayForFloatingIPNotFound(qexception.NotFound): |
3396 | - message = _("Could not find an external network gateway reachable " |
3397 | + message = _("External network %(external_network_id)s is not reachable " |
3398 | "from subnet %(subnet_id)s. Therefore, cannot associate " |
3399 | "Port %(port_id)s with a Floating IP.") |
3400 | |
3401 | |
3402 | class FloatingIPPortAlreadyAssociated(qexception.InUse): |
3403 | - message = _("Port %(port_id)s already has a floating IP" |
3404 | - " associated with it") |
3405 | + message = _("Cannot associate floating IP %(floating_ip_address)s " |
3406 | + "(%(fip_id)s) with port %(port_id)s " |
3407 | + "using fixed IP %(fixed_ip)s, as that fixed IP already " |
3408 | + "has a floating IP on external network %(net_id)s.") |
3409 | |
3410 | |
3411 | class L3PortInUse(qexception.InUse): |
3412 | @@ -78,6 +80,7 @@ |
3413 | 'validate': {'type:regex': attr.UUID_PATTERN}, |
3414 | 'is_visible': True}, |
3415 | 'name': {'allow_post': True, 'allow_put': True, |
3416 | + 'validate': {'type:string': None}, |
3417 | 'is_visible': True, 'default': ''}, |
3418 | 'admin_state_up': {'allow_post': True, 'allow_put': True, |
3419 | 'default': True, |
3420 | @@ -88,19 +91,23 @@ |
3421 | 'is_visible': True}, |
3422 | 'tenant_id': {'allow_post': True, 'allow_put': False, |
3423 | 'required_by_policy': True, |
3424 | + 'validate': {'type:string': None}, |
3425 | 'is_visible': True}, |
3426 | 'external_gateway_info': {'allow_post': True, 'allow_put': True, |
3427 | 'is_visible': True, 'default': None} |
3428 | }, |
3429 | 'floatingips': { |
3430 | 'id': {'allow_post': False, 'allow_put': False, |
3431 | + 'validate': {'type:uuid': None}, |
3432 | 'is_visible': True}, |
3433 | 'floating_ip_address': {'allow_post': False, 'allow_put': False, |
3434 | + 'validate': {'type:ip_address_or_none': None}, |
3435 | 'is_visible': True}, |
3436 | 'floating_network_id': {'allow_post': True, 'allow_put': False, |
3437 | 'validate': {'type:regex': attr.UUID_PATTERN}, |
3438 | 'is_visible': True}, |
3439 | 'router_id': {'allow_post': False, 'allow_put': False, |
3440 | + 'validate': {'type:uuid_or_none': None}, |
3441 | 'is_visible': True, 'default': None}, |
3442 | 'port_id': {'allow_post': True, 'allow_put': True, |
3443 | 'validate': {'type:uuid_or_none': None}, |
3444 | @@ -110,6 +117,7 @@ |
3445 | 'is_visible': True, 'default': None}, |
3446 | 'tenant_id': {'allow_post': True, 'allow_put': False, |
3447 | 'required_by_policy': True, |
3448 | + 'validate': {'type:string': None}, |
3449 | 'is_visible': True} |
3450 | }, |
3451 | } |
3452 | @@ -245,3 +253,9 @@ |
3453 | @abstractmethod |
3454 | def get_floatingips(self, context, filters=None, fields=None): |
3455 | pass |
3456 | + |
3457 | + def get_routers_count(self, context, filters=None): |
3458 | + raise qexception.NotImplementedError() |
3459 | + |
3460 | + def get_floatingips_count(self, context, filters=None): |
3461 | + raise qexception.NotImplementedError() |
3462 | |
3463 | === modified file 'quantum/openstack/common/cfg.py' |
3464 | --- quantum/openstack/common/cfg.py 2012-09-07 18:50:09 +0000 |
3465 | +++ quantum/openstack/common/cfg.py 2013-01-08 00:32:21 +0000 |
3466 | @@ -1507,7 +1507,7 @@ |
3467 | if ('default' in info or 'override' in info): |
3468 | continue |
3469 | |
3470 | - if self._get(opt.name, group) is None: |
3471 | + if self._get(opt.dest, group) is None: |
3472 | raise RequiredOptError(opt.name, group) |
3473 | |
3474 | def _parse_cli_opts(self, args): |
3475 | |
3476 | === modified file 'quantum/openstack/common/log.py' |
3477 | --- quantum/openstack/common/log.py 2012-08-17 10:42:58 +0000 |
3478 | +++ quantum/openstack/common/log.py 2013-01-08 00:32:21 +0000 |
3479 | @@ -54,15 +54,14 @@ |
3480 | '%(message)s', |
3481 | help='format string to use for log messages with context'), |
3482 | cfg.StrOpt('logging_default_format_string', |
3483 | - default='%(asctime)s %(levelname)s %(name)s [-] %(instance)s' |
3484 | - '%(message)s', |
3485 | + default='%(asctime)s %(process)d %(levelname)s %(name)s [-]' |
3486 | + ' %(instance)s%(message)s', |
3487 | help='format string to use for log messages without context'), |
3488 | cfg.StrOpt('logging_debug_format_suffix', |
3489 | - default='from (pid=%(process)d) %(funcName)s ' |
3490 | - '%(pathname)s:%(lineno)d', |
3491 | + default='%(funcName)s %(pathname)s:%(lineno)d', |
3492 | help='data to append to log format when level is DEBUG'), |
3493 | cfg.StrOpt('logging_exception_prefix', |
3494 | - default='%(asctime)s TRACE %(name)s %(instance)s', |
3495 | + default='%(asctime)s %(process)d TRACE %(name)s %(instance)s', |
3496 | help='prefix each line of exception output with this format'), |
3497 | cfg.ListOpt('default_log_levels', |
3498 | default=[ |
3499 | |
3500 | === modified file 'quantum/openstack/common/notifier/api.py' |
3501 | --- quantum/openstack/common/notifier/api.py 2012-09-07 18:50:09 +0000 |
3502 | +++ quantum/openstack/common/notifier/api.py 2013-01-08 00:32:21 +0000 |
3503 | @@ -139,8 +139,8 @@ |
3504 | driver.notify(context, msg) |
3505 | except Exception, e: |
3506 | LOG.exception(_("Problem '%(e)s' attempting to " |
3507 | - "send to notification system. Payload=%(payload)s") % |
3508 | - locals()) |
3509 | + "send to notification system. " |
3510 | + "Payload=%(payload)s") % locals()) |
3511 | |
3512 | |
3513 | _drivers = None |
3514 | @@ -169,7 +169,7 @@ |
3515 | except ImportError as e: |
3516 | LOG.exception(_("Failed to load notifier %s. " |
3517 | "These notifications will not be sent.") % |
3518 | - notification_driver) |
3519 | + notification_driver) |
3520 | else: |
3521 | # Driver is already loaded; just add the object. |
3522 | _drivers[notification_driver] = notification_driver |
3523 | |
3524 | === modified file 'quantum/openstack/common/policy.py' |
3525 | --- quantum/openstack/common/policy.py 2012-09-07 18:50:09 +0000 |
3526 | +++ quantum/openstack/common/policy.py 2013-01-08 00:32:21 +0000 |
3527 | @@ -172,8 +172,9 @@ |
3528 | else: |
3529 | LOG.warning(_("Inheritance-based rules are deprecated; update " |
3530 | "_check_%s") % match_kind) |
3531 | - func = (lambda brain, kind, value, target, cred: |
3532 | - old_func(value, target, cred)) |
3533 | + func = lambda brain, kind, value, target, cred: old_func(value, |
3534 | + target, |
3535 | + cred) |
3536 | |
3537 | if not func: |
3538 | LOG.error(_("No handler for matches of kind %s") % match_kind) |
3539 | |
3540 | === modified file 'quantum/openstack/common/rpc/__init__.py' |
3541 | --- quantum/openstack/common/rpc/__init__.py 2012-08-17 10:42:58 +0000 |
3542 | +++ quantum/openstack/common/rpc/__init__.py 2013-01-08 00:32:21 +0000 |
3543 | @@ -49,15 +49,21 @@ |
3544 | cfg.ListOpt('allowed_rpc_exception_modules', |
3545 | default=['quantum.openstack.common.exception', |
3546 | 'nova.exception', |
3547 | + 'cinder.exception', |
3548 | ], |
3549 | help='Modules of exceptions that are permitted to be recreated' |
3550 | 'upon receiving exception data from an rpc call.'), |
3551 | - cfg.StrOpt('control_exchange', |
3552 | - default='nova', |
3553 | - help='AMQP exchange to connect to if using RabbitMQ or Qpid'), |
3554 | cfg.BoolOpt('fake_rabbit', |
3555 | default=False, |
3556 | help='If passed, use a fake RabbitMQ provider'), |
3557 | + # |
3558 | + # The following options are not registered here, but are expected to be |
3559 | + # present. The project using this library must register these options with |
3560 | + # the configuration so that project-specific defaults may be defined. |
3561 | + # |
3562 | + #cfg.StrOpt('control_exchange', |
3563 | + # default='nova', |
3564 | + # help='AMQP exchange to connect to if using RabbitMQ or Qpid'), |
3565 | ] |
3566 | |
3567 | cfg.CONF.register_opts(rpc_opts) |
3568 | |
3569 | === modified file 'quantum/openstack/common/rpc/amqp.py' |
3570 | --- quantum/openstack/common/rpc/amqp.py 2012-08-17 10:42:58 +0000 |
3571 | +++ quantum/openstack/common/rpc/amqp.py 2013-01-08 00:32:21 +0000 |
3572 | @@ -34,6 +34,7 @@ |
3573 | from eventlet import pools |
3574 | from eventlet import semaphore |
3575 | |
3576 | +from quantum.openstack.common import cfg |
3577 | from quantum.openstack.common import excutils |
3578 | from quantum.openstack.common.gettextutils import _ |
3579 | from quantum.openstack.common import local |
3580 | @@ -416,3 +417,10 @@ |
3581 | def cleanup(connection_pool): |
3582 | if connection_pool: |
3583 | connection_pool.empty() |
3584 | + |
3585 | + |
3586 | +def get_control_exchange(conf): |
3587 | + try: |
3588 | + return conf.control_exchange |
3589 | + except cfg.NoSuchOptError: |
3590 | + return 'openstack' |
3591 | |
3592 | === modified file 'quantum/openstack/common/rpc/impl_kombu.py' |
3593 | --- quantum/openstack/common/rpc/impl_kombu.py 2012-08-17 10:42:58 +0000 |
3594 | +++ quantum/openstack/common/rpc/impl_kombu.py 2013-01-08 00:32:21 +0000 |
3595 | @@ -210,7 +210,8 @@ |
3596 | 'auto_delete': False, |
3597 | 'exclusive': False} |
3598 | options.update(kwargs) |
3599 | - exchange = kombu.entity.Exchange(name=conf.control_exchange, |
3600 | + exchange_name = rpc_amqp.get_control_exchange(conf) |
3601 | + exchange = kombu.entity.Exchange(name=exchange_name, |
3602 | type='topic', |
3603 | durable=options['durable'], |
3604 | auto_delete=options['auto_delete']) |
3605 | @@ -307,8 +308,12 @@ |
3606 | 'auto_delete': False, |
3607 | 'exclusive': False} |
3608 | options.update(kwargs) |
3609 | - super(TopicPublisher, self).__init__(channel, conf.control_exchange, |
3610 | - topic, type='topic', **options) |
3611 | + exchange_name = rpc_amqp.get_control_exchange(conf) |
3612 | + super(TopicPublisher, self).__init__(channel, |
3613 | + exchange_name, |
3614 | + topic, |
3615 | + type='topic', |
3616 | + **options) |
3617 | |
3618 | |
3619 | class FanoutPublisher(Publisher): |
3620 | @@ -486,9 +491,9 @@ |
3621 | log_info.update(self.params) |
3622 | |
3623 | if self.max_retries and attempt == self.max_retries: |
3624 | - LOG.exception(_('Unable to connect to AMQP server on ' |
3625 | - '%(hostname)s:%(port)d after %(max_retries)d ' |
3626 | - 'tries: %(err_str)s') % log_info) |
3627 | + LOG.error(_('Unable to connect to AMQP server on ' |
3628 | + '%(hostname)s:%(port)d after %(max_retries)d ' |
3629 | + 'tries: %(err_str)s') % log_info) |
3630 | # NOTE(comstud): Copied from original code. There's |
3631 | # really no better recourse because if this was a queue we |
3632 | # need to consume on, we have no way to consume anymore. |
3633 | @@ -502,9 +507,9 @@ |
3634 | sleep_time = min(sleep_time, self.interval_max) |
3635 | |
3636 | log_info['sleep_time'] = sleep_time |
3637 | - LOG.exception(_('AMQP server on %(hostname)s:%(port)d is' |
3638 | - ' unreachable: %(err_str)s. Trying again in ' |
3639 | - '%(sleep_time)d seconds.') % log_info) |
3640 | + LOG.error(_('AMQP server on %(hostname)s:%(port)d is ' |
3641 | + 'unreachable: %(err_str)s. Trying again in ' |
3642 | + '%(sleep_time)d seconds.') % log_info) |
3643 | time.sleep(sleep_time) |
3644 | |
3645 | def ensure(self, error_callback, method, *args, **kwargs): |
3646 | @@ -512,7 +517,8 @@ |
3647 | try: |
3648 | return method(*args, **kwargs) |
3649 | except (self.connection_errors, socket.timeout, IOError), e: |
3650 | - pass |
3651 | + if error_callback: |
3652 | + error_callback(e) |
3653 | except Exception, e: |
3654 | # NOTE(comstud): Unfortunately it's possible for amqplib |
3655 | # to return an error not covered by its transport |
3656 | @@ -522,8 +528,8 @@ |
3657 | # and try to reconnect in this case. |
3658 | if 'timeout' not in str(e): |
3659 | raise |
3660 | - if error_callback: |
3661 | - error_callback(e) |
3662 | + if error_callback: |
3663 | + error_callback(e) |
3664 | self.reconnect() |
3665 | |
3666 | def get_channel(self): |
3667 | |
3668 | === modified file 'quantum/openstack/common/rpc/impl_qpid.py' |
3669 | --- quantum/openstack/common/rpc/impl_qpid.py 2012-09-21 13:01:18 +0000 |
3670 | +++ quantum/openstack/common/rpc/impl_qpid.py 2013-01-08 00:32:21 +0000 |
3671 | @@ -50,24 +50,6 @@ |
3672 | cfg.StrOpt('qpid_sasl_mechanisms', |
3673 | default='', |
3674 | help='Space separated list of SASL mechanisms to use for auth'), |
3675 | - cfg.BoolOpt('qpid_reconnect', |
3676 | - default=True, |
3677 | - help='Automatically reconnect'), |
3678 | - cfg.IntOpt('qpid_reconnect_timeout', |
3679 | - default=0, |
3680 | - help='Reconnection timeout in seconds'), |
3681 | - cfg.IntOpt('qpid_reconnect_limit', |
3682 | - default=0, |
3683 | - help='Max reconnections before giving up'), |
3684 | - cfg.IntOpt('qpid_reconnect_interval_min', |
3685 | - default=0, |
3686 | - help='Minimum seconds between reconnection attempts'), |
3687 | - cfg.IntOpt('qpid_reconnect_interval_max', |
3688 | - default=0, |
3689 | - help='Maximum seconds between reconnection attempts'), |
3690 | - cfg.IntOpt('qpid_reconnect_interval', |
3691 | - default=0, |
3692 | - help='Equivalent to setting max and min to the same value'), |
3693 | cfg.IntOpt('qpid_heartbeat', |
3694 | default=60, |
3695 | help='Seconds between connection keepalive heartbeats'), |
3696 | @@ -180,9 +162,9 @@ |
3697 | :param name: optional queue name, defaults to topic |
3698 | """ |
3699 | |
3700 | + exchange_name = rpc_amqp.get_control_exchange(conf) |
3701 | super(TopicConsumer, self).__init__(session, callback, |
3702 | - "%s/%s" % (conf.control_exchange, |
3703 | - topic), |
3704 | + "%s/%s" % (exchange_name, topic), |
3705 | {}, name or topic, {}) |
3706 | |
3707 | |
3708 | @@ -256,9 +238,9 @@ |
3709 | def __init__(self, conf, session, topic): |
3710 | """init a 'topic' publisher. |
3711 | """ |
3712 | - super(TopicPublisher, self).__init__( |
3713 | - session, |
3714 | - "%s/%s" % (conf.control_exchange, topic)) |
3715 | + exchange_name = rpc_amqp.get_control_exchange(conf) |
3716 | + super(TopicPublisher, self).__init__(session, |
3717 | + "%s/%s" % (exchange_name, topic)) |
3718 | |
3719 | |
3720 | class FanoutPublisher(Publisher): |
3721 | @@ -276,10 +258,10 @@ |
3722 | def __init__(self, conf, session, topic): |
3723 | """init a 'topic' publisher. |
3724 | """ |
3725 | - super(NotifyPublisher, self).__init__( |
3726 | - session, |
3727 | - "%s/%s" % (conf.control_exchange, topic), |
3728 | - {"durable": True}) |
3729 | + exchange_name = rpc_amqp.get_control_exchange(conf) |
3730 | + super(NotifyPublisher, self).__init__(session, |
3731 | + "%s/%s" % (exchange_name, topic), |
3732 | + {"durable": True}) |
3733 | |
3734 | |
3735 | class Connection(object): |
3736 | @@ -306,37 +288,27 @@ |
3737 | params.setdefault(key, default_params[key]) |
3738 | |
3739 | self.broker = params['hostname'] + ":" + str(params['port']) |
3740 | + self.username = params['username'] |
3741 | + self.password = params['password'] |
3742 | + self.connection_create() |
3743 | + self.reconnect() |
3744 | + |
3745 | + def connection_create(self): |
3746 | # Create the connection - this does not open the connection |
3747 | self.connection = qpid.messaging.Connection(self.broker) |
3748 | |
3749 | # Check if flags are set and if so set them for the connection |
3750 | # before we call open |
3751 | - self.connection.username = params['username'] |
3752 | - self.connection.password = params['password'] |
3753 | + self.connection.username = self.username |
3754 | + self.connection.password = self.password |
3755 | + |
3756 | self.connection.sasl_mechanisms = self.conf.qpid_sasl_mechanisms |
3757 | - self.connection.reconnect = self.conf.qpid_reconnect |
3758 | - if self.conf.qpid_reconnect_timeout: |
3759 | - self.connection.reconnect_timeout = ( |
3760 | - self.conf.qpid_reconnect_timeout) |
3761 | - if self.conf.qpid_reconnect_limit: |
3762 | - self.connection.reconnect_limit = self.conf.qpid_reconnect_limit |
3763 | - if self.conf.qpid_reconnect_interval_max: |
3764 | - self.connection.reconnect_interval_max = ( |
3765 | - self.conf.qpid_reconnect_interval_max) |
3766 | - if self.conf.qpid_reconnect_interval_min: |
3767 | - self.connection.reconnect_interval_min = ( |
3768 | - self.conf.qpid_reconnect_interval_min) |
3769 | - if self.conf.qpid_reconnect_interval: |
3770 | - self.connection.reconnect_interval = ( |
3771 | - self.conf.qpid_reconnect_interval) |
3772 | + # Reconnection is done by self.reconnect() |
3773 | + self.connection.reconnect = False |
3774 | self.connection.heartbeat = self.conf.qpid_heartbeat |
3775 | self.connection.protocol = self.conf.qpid_protocol |
3776 | self.connection.tcp_nodelay = self.conf.qpid_tcp_nodelay |
3777 | |
3778 | - # Open is part of reconnect - |
3779 | - # NOTE(WGH) not sure we need this with the reconnect flags |
3780 | - self.reconnect() |
3781 | - |
3782 | def _register_consumer(self, consumer): |
3783 | self.consumers[str(consumer.get_receiver())] = consumer |
3784 | |
3785 | @@ -351,12 +323,18 @@ |
3786 | except qpid.messaging.exceptions.ConnectionError: |
3787 | pass |
3788 | |
3789 | + delay = 1 |
3790 | while True: |
3791 | try: |
3792 | + self.connection_create() |
3793 | self.connection.open() |
3794 | except qpid.messaging.exceptions.ConnectionError, e: |
3795 | - LOG.error(_('Unable to connect to AMQP server: %s'), e) |
3796 | - time.sleep(self.conf.qpid_reconnect_interval or 1) |
3797 | + msg_dict = dict(e=e, delay=delay) |
3798 | + msg = _("Unable to connect to AMQP server: %(e)s. " |
3799 | + "Sleeping %(delay)s seconds") % msg_dict |
3800 | + LOG.error(msg) |
3801 | + time.sleep(delay) |
3802 | + delay = min(2 * delay, 60) |
3803 | else: |
3804 | break |
3805 | |
3806 | @@ -364,10 +342,14 @@ |
3807 | |
3808 | self.session = self.connection.session() |
3809 | |
3810 | - for consumer in self.consumers.itervalues(): |
3811 | - consumer.reconnect(self.session) |
3812 | - |
3813 | if self.consumers: |
3814 | + consumers = self.consumers |
3815 | + self.consumers = {} |
3816 | + |
3817 | + for consumer in consumers.itervalues(): |
3818 | + consumer.reconnect(self.session) |
3819 | + self._register_consumer(consumer) |
3820 | + |
3821 | LOG.debug(_("Re-established AMQP queues")) |
3822 | |
3823 | def ensure(self, error_callback, method, *args, **kwargs): |
3824 | |
3825 | === modified file 'quantum/openstack/common/timeutils.py' |
3826 | --- quantum/openstack/common/timeutils.py 2012-09-07 18:50:09 +0000 |
3827 | +++ quantum/openstack/common/timeutils.py 2013-01-08 00:32:21 +0000 |
3828 | @@ -121,6 +121,10 @@ |
3829 | |
3830 | def unmarshall_time(tyme): |
3831 | """Unmarshall a datetime dict.""" |
3832 | - return datetime.datetime(day=tyme['day'], month=tyme['month'], |
3833 | - year=tyme['year'], hour=tyme['hour'], minute=tyme['minute'], |
3834 | - second=tyme['second'], microsecond=tyme['microsecond']) |
3835 | + return datetime.datetime(day=tyme['day'], |
3836 | + month=tyme['month'], |
3837 | + year=tyme['year'], |
3838 | + hour=tyme['hour'], |
3839 | + minute=tyme['minute'], |
3840 | + second=tyme['second'], |
3841 | + microsecond=tyme['microsecond']) |
3842 | |
3843 | === modified file 'quantum/plugins/cisco/network_plugin.py' |
3844 | --- quantum/plugins/cisco/network_plugin.py 2012-09-07 18:50:09 +0000 |
3845 | +++ quantum/plugins/cisco/network_plugin.py 2013-01-08 00:32:21 +0000 |
3846 | @@ -92,6 +92,11 @@ |
3847 | """ |
3848 | if hasattr(self._model, name): |
3849 | return getattr(self._model, name) |
3850 | + else: |
3851 | + # Must make sure we re-raise the error that led us here, since |
3852 | + # otherwise getattr() and even hasattr() doesn't work corretly. |
3853 | + raise AttributeError("'%s' object has no attribute '%s'" % |
3854 | + (self._model, name)) |
3855 | |
3856 | """ |
3857 | Core API implementation |
3858 | |
3859 | === modified file 'quantum/plugins/linuxbridge/agent/linuxbridge_quantum_agent.py' |
3860 | --- quantum/plugins/linuxbridge/agent/linuxbridge_quantum_agent.py 2012-09-12 13:41:20 +0000 |
3861 | +++ quantum/plugins/linuxbridge/agent/linuxbridge_quantum_agent.py 2013-01-08 00:32:21 +0000 |
3862 | @@ -40,6 +40,7 @@ |
3863 | from quantum.common import config as logging_config |
3864 | from quantum.common import constants |
3865 | from quantum.common import topics |
3866 | +from quantum.common import utils as q_utils |
3867 | from quantum.openstack.common import cfg |
3868 | from quantum.openstack.common import context |
3869 | from quantum.openstack.common import rpc |
3870 | @@ -51,7 +52,6 @@ |
3871 | LOG = logging.getLogger(__name__) |
3872 | |
3873 | BRIDGE_NAME_PREFIX = "brq" |
3874 | -GATEWAY_INTERFACE_PREFIX = "gw-" |
3875 | TAP_INTERFACE_PREFIX = "tap" |
3876 | BRIDGE_FS = "/sys/devices/virtual/net/" |
3877 | BRIDGE_NAME_PLACEHOLDER = "bridge_name" |
3878 | @@ -147,12 +147,6 @@ |
3879 | except RuntimeError: |
3880 | return self._get_prefixed_ip_link_devices(TAP_INTERFACE_PREFIX) |
3881 | |
3882 | - def get_all_gateway_devices(self): |
3883 | - try: |
3884 | - return self._get_prefixed_tap_devices(GATEWAY_INTERFACE_PREFIX) |
3885 | - except RuntimeError: |
3886 | - return self._get_prefixed_ip_link_devices(GATEWAY_INTERFACE_PREFIX) |
3887 | - |
3888 | def get_bridge_for_tap_device(self, tap_device_name): |
3889 | bridges = self.get_all_quantum_bridges() |
3890 | for bridge in bridges: |
3891 | @@ -281,72 +275,64 @@ |
3892 | bridge_name, e) |
3893 | return |
3894 | |
3895 | + def ensure_physical_in_bridge(self, network_id, |
3896 | + physical_network, |
3897 | + vlan_id): |
3898 | + physical_interface = self.interface_mappings.get(physical_network) |
3899 | + if not physical_interface: |
3900 | + LOG.error("No mapping for physical network %s" % |
3901 | + physical_network) |
3902 | + return False |
3903 | + |
3904 | + if int(vlan_id) == lconst.FLAT_VLAN_ID: |
3905 | + self.ensure_flat_bridge(network_id, physical_interface) |
3906 | + else: |
3907 | + self.ensure_vlan_bridge(network_id, physical_interface, |
3908 | + vlan_id) |
3909 | + return True |
3910 | + |
3911 | def add_tap_interface(self, network_id, physical_network, vlan_id, |
3912 | tap_device_name): |
3913 | """ |
3914 | If a VIF has been plugged into a network, this function will |
3915 | add the corresponding tap device to the relevant bridge |
3916 | """ |
3917 | - if not tap_device_name: |
3918 | - return False |
3919 | - |
3920 | if not self.device_exists(tap_device_name): |
3921 | - LOG.debug("Tap device: %s does not exist on this host, skipped" % |
3922 | - tap_device_name) |
3923 | + LOG.debug(_("Tap device: %s does not exist on " |
3924 | + "this host, skipped" % tap_device_name)) |
3925 | return False |
3926 | |
3927 | - current_bridge_name = self.get_bridge_for_tap_device(tap_device_name) |
3928 | bridge_name = self.get_bridge_name(network_id) |
3929 | - if bridge_name == current_bridge_name: |
3930 | - return False |
3931 | - LOG.debug("Adding device %s to bridge %s" % (tap_device_name, |
3932 | - bridge_name)) |
3933 | - if current_bridge_name: |
3934 | - if utils.execute(['brctl', 'delif', current_bridge_name, |
3935 | - tap_device_name], root_helper=self.root_helper): |
3936 | - return False |
3937 | - |
3938 | if int(vlan_id) == lconst.LOCAL_VLAN_ID: |
3939 | self.ensure_local_bridge(network_id) |
3940 | else: |
3941 | - physical_interface = self.interface_mappings.get(physical_network) |
3942 | - if not physical_interface: |
3943 | - LOG.error("No mapping for physical network %s" % |
3944 | - physical_network) |
3945 | - return False |
3946 | - |
3947 | - if int(vlan_id) == lconst.FLAT_VLAN_ID: |
3948 | - self.ensure_flat_bridge(network_id, physical_interface) |
3949 | - else: |
3950 | - self.ensure_vlan_bridge(network_id, physical_interface, |
3951 | - vlan_id) |
3952 | - |
3953 | - if utils.execute(['brctl', 'addif', bridge_name, tap_device_name], |
3954 | - root_helper=self.root_helper): |
3955 | - return False |
3956 | - |
3957 | - LOG.debug("Done adding device %s to bridge %s" % (tap_device_name, |
3958 | - bridge_name)) |
3959 | + result = self.ensure_physical_in_bridge(network_id, |
3960 | + physical_network, |
3961 | + vlan_id) |
3962 | + if not result: |
3963 | + return False |
3964 | + |
3965 | + # Check if device needs to be added to bridge |
3966 | + tap_device_in_bridge = self.get_bridge_for_tap_device(tap_device_name) |
3967 | + if not tap_device_in_bridge: |
3968 | + msg = _("Adding device %(tap_device_name)s to bridge " |
3969 | + "%(bridge_name)s") % locals() |
3970 | + LOG.debug(msg) |
3971 | + if utils.execute(['brctl', 'addif', bridge_name, tap_device_name], |
3972 | + root_helper=self.root_helper): |
3973 | + return False |
3974 | + else: |
3975 | + msg = _("%(tap_device_name)s already exists on bridge " |
3976 | + "%(bridge_name)s") % locals() |
3977 | + LOG.debug(msg) |
3978 | return True |
3979 | |
3980 | def add_interface(self, network_id, physical_network, vlan_id, |
3981 | - interface_id): |
3982 | - if not interface_id: |
3983 | - """ |
3984 | - Since the VIF id is null, no VIF is plugged into this port |
3985 | - no more processing is required |
3986 | - """ |
3987 | - return False |
3988 | - |
3989 | - if interface_id.startswith(GATEWAY_INTERFACE_PREFIX): |
3990 | - return self.add_tap_interface(network_id, |
3991 | - physical_network, vlan_id, |
3992 | - interface_id) |
3993 | - else: |
3994 | - tap_device_name = self.get_tap_device_name(interface_id) |
3995 | - return self.add_tap_interface(network_id, |
3996 | - physical_network, vlan_id, |
3997 | - tap_device_name) |
3998 | + port_id): |
3999 | + tap_device_name = self.get_tap_device_name(port_id) |
4000 | + return self.add_tap_interface(network_id, |
4001 | + physical_network, vlan_id, |
4002 | + tap_device_name) |
4003 | |
4004 | def delete_vlan_bridge(self, bridge_name): |
4005 | if self.device_exists(bridge_name): |
4006 | @@ -427,8 +413,10 @@ |
4007 | port = kwargs.get('port') |
4008 | if port['admin_state_up']: |
4009 | vlan_id = kwargs.get('vlan_id') |
4010 | + physical_network = kwargs.get('physical_network') |
4011 | # create the networking for the port |
4012 | self.linux_br.add_interface(port['network_id'], |
4013 | + physical_network, |
4014 | vlan_id, |
4015 | port['id']) |
4016 | else: |
4017 | @@ -636,7 +624,8 @@ |
4018 | if devices: |
4019 | mac = utils.get_interface_mac(devices[0].name) |
4020 | else: |
4021 | - LOG.error("Unable to obtain MAC of any device for agent_id") |
4022 | + LOG.error("Unable to obtain MAC address for unique ID. " |
4023 | + "Agent terminated!") |
4024 | exit(1) |
4025 | self.agent_id = '%s%s' % ('lb', (mac.replace(":", ""))) |
4026 | LOG.info("RPC agent_id: %s" % self.agent_id) |
4027 | @@ -664,12 +653,6 @@ |
4028 | def setup_linux_bridge(self, interface_mappings): |
4029 | self.linux_br = LinuxBridge(interface_mappings, self.root_helper) |
4030 | |
4031 | - def process_port_binding(self, network_id, interface_id, |
4032 | - physical_network, vlan_id): |
4033 | - return self.linux_br.add_interface(network_id, |
4034 | - physical_network, vlan_id, |
4035 | - interface_id) |
4036 | - |
4037 | def remove_port_binding(self, network_id, interface_id): |
4038 | bridge_name = self.linux_br.get_bridge_name(network_id) |
4039 | tap_device_name = self.linux_br.get_tap_device_name(interface_id) |
4040 | @@ -712,7 +695,7 @@ |
4041 | def treat_devices_added(self, devices): |
4042 | resync = False |
4043 | for device in devices: |
4044 | - LOG.info("Port %s added", device) |
4045 | + LOG.debug("Port %s added", device) |
4046 | try: |
4047 | details = self.plugin_rpc.get_device_details(self.context, |
4048 | device, |
4049 | @@ -725,15 +708,15 @@ |
4050 | LOG.info("Port %s updated. Details: %s", device, details) |
4051 | if details['admin_state_up']: |
4052 | # create the networking for the port |
4053 | - self.process_port_binding(details['network_id'], |
4054 | - details['port_id'], |
4055 | - details['physical_network'], |
4056 | - details['vlan_id']) |
4057 | + self.linux_br.add_interface(details['network_id'], |
4058 | + details['physical_network'], |
4059 | + details['vlan_id'], |
4060 | + details['port_id']) |
4061 | else: |
4062 | self.remove_port_binding(details['network_id'], |
4063 | details['port_id']) |
4064 | else: |
4065 | - LOG.debug("Device %s not defined on plugin", device) |
4066 | + LOG.info("Device %s not defined on plugin", device) |
4067 | return resync |
4068 | |
4069 | def treat_devices_removed(self, devices): |
4070 | @@ -792,17 +775,14 @@ |
4071 | # (TODO) gary - swap with common logging |
4072 | logging_config.setup_logging(cfg.CONF) |
4073 | |
4074 | - interface_mappings = {} |
4075 | - for mapping in cfg.CONF.LINUX_BRIDGE.physical_interface_mappings: |
4076 | - try: |
4077 | - physical_network, physical_interface = mapping.split(':') |
4078 | - interface_mappings[physical_network] = physical_interface |
4079 | - LOG.debug("physical network %s mapped to physical interface %s" % |
4080 | - (physical_network, physical_interface)) |
4081 | - except ValueError as ex: |
4082 | - LOG.error("Invalid physical interface mapping: \'%s\' - %s" % |
4083 | - (mapping, ex)) |
4084 | - sys.exit(1) |
4085 | + try: |
4086 | + interface_mappings = q_utils.parse_mappings( |
4087 | + cfg.CONF.LINUX_BRIDGE.physical_interface_mappings) |
4088 | + except ValueError as e: |
4089 | + LOG.error(_("Parsing physical_interface_mappings failed: %s." |
4090 | + " Agent terminated!"), e) |
4091 | + sys.exit(1) |
4092 | + LOG.info(_("Interface mappings: %s") % interface_mappings) |
4093 | |
4094 | polling_interval = cfg.CONF.AGENT.polling_interval |
4095 | reconnect_interval = cfg.CONF.DATABASE.reconnect_interval |
4096 | @@ -823,5 +803,6 @@ |
4097 | plugin.daemon_loop() |
4098 | sys.exit(0) |
4099 | |
4100 | + |
4101 | if __name__ == "__main__": |
4102 | main() |
4103 | |
4104 | === modified file 'quantum/plugins/linuxbridge/lb_quantum_plugin.py' |
4105 | --- quantum/plugins/linuxbridge/lb_quantum_plugin.py 2012-09-12 13:41:20 +0000 |
4106 | +++ quantum/plugins/linuxbridge/lb_quantum_plugin.py 2013-01-08 00:32:21 +0000 |
4107 | @@ -163,7 +163,8 @@ |
4108 | if self.tenant_network_type not in [constants.TYPE_LOCAL, |
4109 | constants.TYPE_VLAN, |
4110 | constants.TYPE_NONE]: |
4111 | - LOG.error("Invalid tenant_network_type: %s" % |
4112 | + LOG.error("Invalid tenant_network_type: %s. " |
4113 | + "Service terminated!" % |
4114 | self.tenant_network_type) |
4115 | sys.exit(1) |
4116 | self.agent_rpc = cfg.CONF.AGENT.rpc |
4117 | @@ -194,7 +195,8 @@ |
4118 | int(vlan_min), |
4119 | int(vlan_max)) |
4120 | except ValueError as ex: |
4121 | - LOG.error("Invalid network VLAN range: \'%s\' - %s" % |
4122 | + LOG.error("Invalid network VLAN range: '%s' - %s. " |
4123 | + "Service terminated!" % |
4124 | (entry, ex)) |
4125 | sys.exit(1) |
4126 | else: |
4127 | |
4128 | === modified file 'quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py' |
4129 | --- quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py 2012-09-21 13:01:18 +0000 |
4130 | +++ quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py 2013-01-08 00:32:21 +0000 |
4131 | @@ -453,13 +453,15 @@ |
4132 | if 'lswitch-display-name' not in result: |
4133 | raise exception.NetworkNotFound(net_id=id) |
4134 | |
4135 | + # Fetch network in quantum |
4136 | + quantum_db = super(NvpPluginV2, self).get_network(context, id, fields) |
4137 | d = {'id': id, |
4138 | 'name': result['lswitch-display-name'], |
4139 | 'tenant_id': network['tenant_id'], |
4140 | 'admin_state_up': True, |
4141 | 'status': constants.NET_STATUS_ACTIVE, |
4142 | 'shared': network['shared'], |
4143 | - 'subnets': []} |
4144 | + 'subnets': quantum_db.get('subnets', [])} |
4145 | |
4146 | LOG.debug("get_network() completed for tenant %s: %s" % ( |
4147 | context.tenant_id, d)) |
4148 | @@ -811,6 +813,8 @@ |
4149 | |
4150 | params["cluster"] = cluster |
4151 | params["port"] = port["port"] |
4152 | + params["port"]["id"] = quantum_db["id"] |
4153 | + params["port"]["tenant_id"] = quantum_db["tenant_id"] |
4154 | result = nvplib.update_port(quantum_db["network_id"], |
4155 | port_nvp["uuid"], **params) |
4156 | LOG.debug("update_port() completed for tenant: %s" % context.tenant_id) |
4157 | |
4158 | === modified file 'quantum/plugins/nicira/nicira_nvp_plugin/nvplib.py' |
4159 | --- quantum/plugins/nicira/nicira_nvp_plugin/nvplib.py 2012-09-07 18:50:09 +0000 |
4160 | +++ quantum/plugins/nicira/nicira_nvp_plugin/nvplib.py 2013-01-08 00:32:21 +0000 |
4161 | @@ -373,11 +373,20 @@ |
4162 | |
4163 | admin_state_up = params['port'].get('admin_state_up') |
4164 | name = params["port"].get("name") |
4165 | + device_id = params["port"].get("device_id") |
4166 | if admin_state_up: |
4167 | lport_obj["admin_status_enabled"] = admin_state_up |
4168 | if name: |
4169 | lport_obj["display_name"] = name |
4170 | |
4171 | + if device_id: |
4172 | + # device_id can be longer than 40 so we rehash it |
4173 | + device_id = hashlib.sha1(device_id).hexdigest() |
4174 | + lport_obj["tags"] = ( |
4175 | + [dict(scope='os_tid', tag=params["port"].get("tenant_id")), |
4176 | + dict(scope='q_port_id', tag=params["port"]["id"]), |
4177 | + dict(scope='vm_id', tag=device_id)]) |
4178 | + |
4179 | uri = "/ws.v1/lswitch/" + network + "/lport/" + port_id |
4180 | try: |
4181 | resp_obj = do_single_request("PUT", uri, json.dumps(lport_obj), |
4182 | @@ -394,8 +403,6 @@ |
4183 | |
4184 | |
4185 | def create_port(tenant, **params): |
4186 | - print "create_port_nvplib" |
4187 | - print params |
4188 | clusters = params["clusters"] |
4189 | dest_cluster = clusters[0] # primary cluster |
4190 | |
4191 | |
4192 | === modified file 'quantum/plugins/openvswitch/agent/ovs_quantum_agent.py' |
4193 | --- quantum/plugins/openvswitch/agent/ovs_quantum_agent.py 2012-09-21 13:01:18 +0000 |
4194 | +++ quantum/plugins/openvswitch/agent/ovs_quantum_agent.py 2013-01-08 00:32:21 +0000 |
4195 | @@ -34,6 +34,7 @@ |
4196 | from quantum.common import constants as q_const |
4197 | from quantum.common import config as logging_config |
4198 | from quantum.common import topics |
4199 | +from quantum.common import utils as q_utils |
4200 | from quantum.openstack.common import cfg |
4201 | from quantum.openstack.common import context |
4202 | from quantum.openstack.common import rpc |
4203 | @@ -141,7 +142,7 @@ |
4204 | :param integ_br: name of the integration bridge. |
4205 | :param tun_br: name of the tunnel bridge. |
4206 | :param local_ip: local IP address of this hypervisor. |
4207 | - :param bridge_mappings: mappings from phyiscal interface to bridge. |
4208 | + :param bridge_mappings: mappings from physical network name to bridge. |
4209 | :param root_helper: utility to use when running shell cmds. |
4210 | :param polling_interval: interval (secs) to poll DB. |
4211 | :param reconnect_internal: retry interval (secs) on DB error. |
4212 | @@ -452,7 +453,8 @@ |
4213 | if int(self.patch_tun_ofport) < 0 or int(self.patch_int_ofport) < 0: |
4214 | LOG.error("Failed to create OVS patch port. Cannot have tunneling " |
4215 | "enabled on this agent, since this version of OVS does " |
4216 | - "not support tunnels or patch ports.") |
4217 | + "not support tunnels or patch ports. " |
4218 | + "Agent terminated!") |
4219 | exit(1) |
4220 | self.tun_br.remove_all_flows() |
4221 | self.tun_br.add_flow(priority=1, actions="drop") |
4222 | @@ -460,7 +462,7 @@ |
4223 | def setup_physical_bridges(self, bridge_mappings): |
4224 | '''Setup the physical network bridges. |
4225 | |
4226 | - Creates phyiscal network bridges and links them to the |
4227 | + Creates physical network bridges and links them to the |
4228 | integration bridge using veths. |
4229 | |
4230 | :param bridge_mappings: map physical network names to bridge names.''' |
4231 | @@ -471,7 +473,8 @@ |
4232 | for physical_network, bridge in bridge_mappings.iteritems(): |
4233 | # setup physical bridge |
4234 | if not ip_lib.device_exists(bridge, self.root_helper): |
4235 | - LOG.error("Bridge %s for physical network %s does not exist", |
4236 | + LOG.error("Bridge %s for physical network %s does not exist. " |
4237 | + "Agent terminated!", |
4238 | bridge, physical_network) |
4239 | sys.exit(1) |
4240 | br = ovs_lib.OVSBridge(bridge, self.root_helper) |
4241 | @@ -802,24 +805,24 @@ |
4242 | local_ip = cfg.CONF.OVS.local_ip |
4243 | enable_tunneling = cfg.CONF.OVS.enable_tunneling |
4244 | |
4245 | - bridge_mappings = {} |
4246 | - for mapping in cfg.CONF.OVS.bridge_mappings: |
4247 | - mapping = mapping.strip() |
4248 | - if mapping != '': |
4249 | - try: |
4250 | - physical_network, bridge = mapping.split(':') |
4251 | - bridge_mappings[physical_network] = bridge |
4252 | - LOG.info("Physical network %s mapped to bridge %s", |
4253 | - physical_network, bridge) |
4254 | - except ValueError as ex: |
4255 | - LOG.error("Invalid bridge mapping: \'%s\' - %s", mapping, ex) |
4256 | - sys.exit(1) |
4257 | + if enable_tunneling and not local_ip: |
4258 | + LOG.error("Tunnelling cannot be enabled without a valid local_ip.") |
4259 | + sys.exit(1) |
4260 | + |
4261 | + try: |
4262 | + bridge_mappings = q_utils.parse_mappings(cfg.CONF.OVS.bridge_mappings) |
4263 | + except ValueError as e: |
4264 | + LOG.error(_("Parsing bridge mappings failed: %s." |
4265 | + " Agent terminated!"), e) |
4266 | + sys.exit(1) |
4267 | + LOG.info(_("Bridge mappings: %s") % bridge_mappings) |
4268 | |
4269 | plugin = OVSQuantumAgent(integ_br, tun_br, local_ip, bridge_mappings, |
4270 | root_helper, polling_interval, |
4271 | reconnect_interval, rpc, enable_tunneling) |
4272 | |
4273 | # Start everything. |
4274 | + LOG.info("Agent initialized successfully, now running... ") |
4275 | plugin.daemon_loop(db_connection_url) |
4276 | |
4277 | sys.exit(0) |
4278 | |
4279 | === modified file 'quantum/plugins/openvswitch/common/config.py' |
4280 | --- quantum/plugins/openvswitch/common/config.py 2012-09-12 13:41:20 +0000 |
4281 | +++ quantum/plugins/openvswitch/common/config.py 2013-01-08 00:32:21 +0000 |
4282 | @@ -31,7 +31,7 @@ |
4283 | cfg.StrOpt('integration_bridge', default='br-int'), |
4284 | cfg.BoolOpt('enable_tunneling', default=False), |
4285 | cfg.StrOpt('tunnel_bridge', default='br-tun'), |
4286 | - cfg.StrOpt('local_ip', default='10.0.0.3'), |
4287 | + cfg.StrOpt('local_ip', default=''), |
4288 | cfg.ListOpt('bridge_mappings', |
4289 | default=DEFAULT_BRIDGE_MAPPINGS, |
4290 | help="List of <physical_network>:<bridge>"), |
4291 | |
4292 | === modified file 'quantum/plugins/openvswitch/ovs_quantum_plugin.py' |
4293 | --- quantum/plugins/openvswitch/ovs_quantum_plugin.py 2012-09-12 13:41:20 +0000 |
4294 | +++ quantum/plugins/openvswitch/ovs_quantum_plugin.py 2013-01-08 00:32:21 +0000 |
4295 | @@ -200,7 +200,8 @@ |
4296 | constants.TYPE_VLAN, |
4297 | constants.TYPE_GRE, |
4298 | constants.TYPE_NONE]: |
4299 | - LOG.error("Invalid tenant_network_type: %s", |
4300 | + LOG.error("Invalid tenant_network_type: %s. " |
4301 | + "Agent terminated!", |
4302 | self.tenant_network_type) |
4303 | sys.exit(1) |
4304 | self.enable_tunneling = cfg.CONF.OVS.enable_tunneling |
4305 | @@ -209,7 +210,8 @@ |
4306 | self._parse_tunnel_id_ranges() |
4307 | ovs_db_v2.sync_tunnel_allocations(self.tunnel_id_ranges) |
4308 | elif self.tenant_network_type == constants.TYPE_GRE: |
4309 | - LOG.error("Tunneling disabled but tenant_network_type is 'gre'") |
4310 | + LOG.error("Tunneling disabled but tenant_network_type is 'gre'. " |
4311 | + "Agent terminated!") |
4312 | sys.exit(1) |
4313 | self.agent_rpc = cfg.CONF.AGENT.rpc |
4314 | self.setup_rpc() |
4315 | @@ -239,7 +241,8 @@ |
4316 | int(vlan_min), |
4317 | int(vlan_max)) |
4318 | except ValueError as ex: |
4319 | - LOG.error("Invalid network VLAN range: \'%s\' - %s", |
4320 | + LOG.error("Invalid network VLAN range: '%s' - %s. " |
4321 | + "Agent terminated!", |
4322 | entry, ex) |
4323 | sys.exit(1) |
4324 | else: |
4325 | @@ -261,7 +264,8 @@ |
4326 | tun_min, tun_max = entry.split(':') |
4327 | self.tunnel_id_ranges.append((int(tun_min), int(tun_max))) |
4328 | except ValueError as ex: |
4329 | - LOG.error("Invalid tunnel ID range: \'%s\' - %s", entry, ex) |
4330 | + LOG.error("Invalid tunnel ID range: '%s' - %s. " |
4331 | + "Agent terminated!", entry, ex) |
4332 | sys.exit(1) |
4333 | LOG.info("Tunnel ID ranges: %s", self.tunnel_id_ranges) |
4334 | |
4335 | |
4336 | === modified file 'quantum/plugins/ryu/nova/vif.py' |
4337 | --- quantum/plugins/ryu/nova/vif.py 2012-08-17 10:42:58 +0000 |
4338 | +++ quantum/plugins/ryu/nova/vif.py 2013-01-08 00:32:21 +0000 |
4339 | @@ -48,7 +48,7 @@ |
4340 | return int(out.strip()) |
4341 | |
4342 | |
4343 | -class LibvirtOpenVswitchOFPRyuDriver(libvirt_vif.LibvirtOpenVswitchDriver): |
4344 | +class LibvirtOpenVswitchOFPRyuDriver(libvirt_vif.LibvirtHybridOVSBridgeDriver): |
4345 | def __init__(self, **kwargs): |
4346 | super(LibvirtOpenVswitchOFPRyuDriver, self).__init__() |
4347 | LOG.debug('ryu rest host %s', FLAGS.libvirt_ovs_bridge) |
4348 | @@ -57,8 +57,8 @@ |
4349 | |
4350 | def _get_port_no(self, mapping): |
4351 | iface_id = mapping['vif_uuid'] |
4352 | - dev = self.get_dev_name(iface_id) |
4353 | - return _get_port_no(dev) |
4354 | + _v1_name, v2_name = self.get_veth_pair_names(iface_id) |
4355 | + return _get_port_no(v2_name) |
4356 | |
4357 | def plug(self, instance, vif): |
4358 | result = super(LibvirtOpenVswitchOFPRyuDriver, self).plug( |
4359 | |
4360 | === modified file 'quantum/quantum_plugin_base_v2.py' |
4361 | --- quantum/quantum_plugin_base_v2.py 2012-09-07 18:50:09 +0000 |
4362 | +++ quantum/quantum_plugin_base_v2.py 2013-01-08 00:32:21 +0000 |
4363 | @@ -23,6 +23,8 @@ |
4364 | |
4365 | from abc import ABCMeta, abstractmethod |
4366 | |
4367 | +from quantum.common import exceptions |
4368 | + |
4369 | |
4370 | class QuantumPluginBaseV2(object): |
4371 | |
4372 | @@ -70,7 +72,7 @@ |
4373 | def get_subnets(self, context, filters=None, fields=None): |
4374 | """ |
4375 | Retrieve a list of subnets. The contents of the list depends on |
4376 | - the identify of the user making the request (as indicated by the |
4377 | + the identity of the user making the request (as indicated by the |
4378 | context) as well as any filters. |
4379 | : param context: quantum api request context |
4380 | : param filters: a dictionary with keys that are valid keys for |
4381 | @@ -87,6 +89,25 @@ |
4382 | """ |
4383 | pass |
4384 | |
4385 | + def get_subnets_count(self, context, filters=None): |
4386 | + """ |
4387 | + Return the number of subnets. The result depends on the identity of |
4388 | + the user making the request (as indicated by the context) as well as |
4389 | + any filters. |
4390 | + : param context: quantum api request context |
4391 | + : param filters: a dictionary with keys that are valid keys for |
4392 | + a network as listed in the RESOURCE_ATTRIBUTE_MAP object |
4393 | + in quantum/api/v2/attributes.py. Values in this dictiontary |
4394 | + are an iterable containing values that will be used for an exact |
4395 | + match comparison for that value. Each result returned by this |
4396 | + function will have matched one of the values for each key in |
4397 | + filters. |
4398 | + |
4399 | + NOTE: this method is optional, as it was not part of the originally |
4400 | + defined plugin API. |
4401 | + """ |
4402 | + raise exceptions.NotImplementedError() |
4403 | + |
4404 | @abstractmethod |
4405 | def delete_subnet(self, context, id): |
4406 | """ |
4407 | @@ -138,7 +159,7 @@ |
4408 | def get_networks(self, context, filters=None, fields=None): |
4409 | """ |
4410 | Retrieve a list of networks. The contents of the list depends on |
4411 | - the identify of the user making the request (as indicated by the |
4412 | + the identity of the user making the request (as indicated by the |
4413 | context) as well as any filters. |
4414 | : param context: quantum api request context |
4415 | : param filters: a dictionary with keys that are valid keys for |
4416 | @@ -155,6 +176,25 @@ |
4417 | """ |
4418 | pass |
4419 | |
4420 | + def get_networks_count(self, context, filters=None): |
4421 | + """ |
4422 | + Return the number of networks. The result depends on the identity |
4423 | + of the user making the request (as indicated by the context) as well |
4424 | + as any filters. |
4425 | + : param context: quantum api request context |
4426 | + : param filters: a dictionary with keys that are valid keys for |
4427 | + a network as listed in the RESOURCE_ATTRIBUTE_MAP object |
4428 | + in quantum/api/v2/attributes.py. Values in this dictiontary |
4429 | + are an iterable containing values that will be used for an exact |
4430 | + match comparison for that value. Each result returned by this |
4431 | + function will have matched one of the values for each key in |
4432 | + filters. |
4433 | + |
4434 | + NOTE: this method is optional, as it was not part of the originally |
4435 | + defined plugin API. |
4436 | + """ |
4437 | + raise exceptions.NotImplementedError() |
4438 | + |
4439 | @abstractmethod |
4440 | def delete_network(self, context, id): |
4441 | """ |
4442 | @@ -206,7 +246,7 @@ |
4443 | def get_ports(self, context, filters=None, fields=None): |
4444 | """ |
4445 | Retrieve a list of ports. The contents of the list depends on |
4446 | - the identify of the user making the request (as indicated by the |
4447 | + the identity of the user making the request (as indicated by the |
4448 | context) as well as any filters. |
4449 | : param context: quantum api request context |
4450 | : param filters: a dictionary with keys that are valid keys for |
4451 | @@ -223,6 +263,25 @@ |
4452 | """ |
4453 | pass |
4454 | |
4455 | + def get_ports_count(self, context, filters=None): |
4456 | + """ |
4457 | + Return the number of ports. The result depends on the identity of |
4458 | + the user making the request (as indicated by the context) as well as |
4459 | + any filters. |
4460 | + : param context: quantum api request context |
4461 | + : param filters: a dictionary with keys that are valid keys for |
4462 | + a network as listed in the RESOURCE_ATTRIBUTE_MAP object |
4463 | + in quantum/api/v2/attributes.py. Values in this dictiontary |
4464 | + are an iterable containing values that will be used for an exact |
4465 | + match comparison for that value. Each result returned by this |
4466 | + function will have matched one of the values for each key in |
4467 | + filters. |
4468 | + |
4469 | + NOTE: this method is optional, as it was not part of the originally |
4470 | + defined plugin API. |
4471 | + """ |
4472 | + raise exceptions.NotImplementedError() |
4473 | + |
4474 | @abstractmethod |
4475 | def delete_port(self, context, id): |
4476 | """ |
4477 | |
4478 | === modified file 'quantum/quota.py' |
4479 | --- quantum/quota.py 2012-08-17 10:42:58 +0000 |
4480 | +++ quantum/quota.py 2013-01-08 00:32:21 +0000 |
4481 | @@ -267,9 +267,19 @@ |
4482 | |
4483 | |
4484 | def _count_resource(context, plugin, resources, tenant_id): |
4485 | - obj_getter = getattr(plugin, "get_%s" % resources) |
4486 | - obj_list = obj_getter(context, filters={'tenant_id': [tenant_id]}) |
4487 | - return len(obj_list) if obj_list else 0 |
4488 | + count_getter_name = "get_%s_count" % resources |
4489 | + |
4490 | + # Some plugins support a count method for particular resources, |
4491 | + # using a DB's optimized counting features. We try to use that one |
4492 | + # if present. Otherwise just use regular getter to retrieve all objects |
4493 | + # and count in python, allowing older plugins to still be supported |
4494 | + try: |
4495 | + obj_count_getter = getattr(plugin, count_getter_name) |
4496 | + return obj_count_getter(context, filters={'tenant_id': [tenant_id]}) |
4497 | + except (exceptions.NotImplementedError, AttributeError): |
4498 | + obj_getter = getattr(plugin, "get_%s" % resources) |
4499 | + obj_list = obj_getter(context, filters={'tenant_id': [tenant_id]}) |
4500 | + return len(obj_list) if obj_list else 0 |
4501 | |
4502 | |
4503 | resources = [] |
4504 | |
4505 | === modified file 'quantum/rootwrap/filters.py' |
4506 | --- quantum/rootwrap/filters.py 2012-09-26 15:14:31 +0000 |
4507 | +++ quantum/rootwrap/filters.py 2013-01-08 00:32:21 +0000 |
4508 | @@ -158,6 +158,10 @@ |
4509 | |
4510 | try: |
4511 | command = os.readlink("/proc/%d/exe" % int(args[1])) |
4512 | + # NOTE(dprince): /proc/PID/exe may have ' (deleted)' on |
4513 | + # the end if an executable is updated or deleted |
4514 | + if command.endswith(" (deleted)"): |
4515 | + command = command[:command.rindex(" ")] |
4516 | if command != self.args[0]: |
4517 | # Affected executable doesn't match |
4518 | return False |
4519 | |
4520 | === added file 'quantum/tests/unit/linuxbridge/test_lb_quantum_agent.py' |
4521 | --- quantum/tests/unit/linuxbridge/test_lb_quantum_agent.py 1970-01-01 00:00:00 +0000 |
4522 | +++ quantum/tests/unit/linuxbridge/test_lb_quantum_agent.py 2013-01-08 00:32:21 +0000 |
4523 | @@ -0,0 +1,54 @@ |
4524 | +# vim: tabstop=4 shiftwidth=4 softtabstop=4 |
4525 | + |
4526 | +# Copyright (c) 2012 OpenStack, LLC. |
4527 | +# |
4528 | +# Licensed under the Apache License, Version 2.0 (the "License"); you may |
4529 | +# not use this file except in compliance with the License. You may obtain |
4530 | +# a copy of the License at |
4531 | +# |
4532 | +# http://www.apache.org/licenses/LICENSE-2.0 |
4533 | +# |
4534 | +# Unless required by applicable law or agreed to in writing, software |
4535 | +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
4536 | +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
4537 | +# License for the specific language governing permissions and limitations |
4538 | +# under the License. |
4539 | + |
4540 | +import mock |
4541 | +import unittest2 as unittest |
4542 | + |
4543 | +from quantum.openstack.common import cfg |
4544 | +from quantum.plugins.linuxbridge.agent import linuxbridge_quantum_agent |
4545 | +from quantum.plugins.linuxbridge.common import config |
4546 | +from quantum.plugins.linuxbridge.common import constants as lconst |
4547 | + |
4548 | + |
4549 | +class TestLinuxBridge(unittest.TestCase): |
4550 | + |
4551 | + def setUp(self): |
4552 | + self.addCleanup(cfg.CONF.reset) |
4553 | + interface_mappings = {'physnet1': 'eth1'} |
4554 | + root_helper = cfg.CONF.AGENT.root_helper |
4555 | + |
4556 | + self.linux_bridge = linuxbridge_quantum_agent.LinuxBridge( |
4557 | + interface_mappings, root_helper) |
4558 | + |
4559 | + def test_ensure_physical_in_bridge_invalid(self): |
4560 | + result = self.linux_bridge.ensure_physical_in_bridge('network_id', |
4561 | + 'physnetx', |
4562 | + 7) |
4563 | + self.assertFalse(result) |
4564 | + |
4565 | + def test_ensure_physical_in_bridge_flat(self): |
4566 | + with mock.patch.object(self.linux_bridge, |
4567 | + 'ensure_flat_bridge') as flat_bridge_func: |
4568 | + result = self.linux_bridge.ensure_physical_in_bridge( |
4569 | + 'network_id', 'physnet1', lconst.FLAT_VLAN_ID) |
4570 | + self.assertTrue(flat_bridge_func.called) |
4571 | + |
4572 | + def test_ensure_physical_in_bridge_vlan(self): |
4573 | + with mock.patch.object(self.linux_bridge, |
4574 | + 'ensure_vlan_bridge') as vlan_bridge_func: |
4575 | + result = self.linux_bridge.ensure_physical_in_bridge( |
4576 | + 'network_id', 'physnet1', 7) |
4577 | + self.assertTrue(vlan_bridge_func.called) |
4578 | |
4579 | === modified file 'quantum/tests/unit/test_api_v2.py' |
4580 | --- quantum/tests/unit/test_api_v2.py 2012-09-21 13:01:18 +0000 |
4581 | +++ quantum/tests/unit/test_api_v2.py 2013-01-08 00:32:21 +0000 |
4582 | @@ -369,6 +369,7 @@ |
4583 | |
4584 | instance = self.plugin.return_value |
4585 | instance.create_network.return_value = return_value |
4586 | + instance.get_networks_count.return_value = 0 |
4587 | |
4588 | res = self.api.post_json(_get_path('networks'), data) |
4589 | |
4590 | @@ -390,6 +391,7 @@ |
4591 | |
4592 | instance = self.plugin.return_value |
4593 | instance.create_network.return_value = return_value |
4594 | + instance.get_networks_count.return_value = 0 |
4595 | |
4596 | res = self.api.post_json(_get_path('networks'), initial_input) |
4597 | |
4598 | @@ -423,6 +425,7 @@ |
4599 | |
4600 | instance = self.plugin.return_value |
4601 | instance.create_network.return_value = return_value |
4602 | + instance.get_networks_count.return_value = 0 |
4603 | |
4604 | res = self.api.post_json(_get_path('networks'), initial_input, |
4605 | extra_environ=env) |
4606 | @@ -479,6 +482,7 @@ |
4607 | |
4608 | instance = self.plugin.return_value |
4609 | instance.create_network.side_effect = side_effect |
4610 | + instance.get_networks_count.return_value = 0 |
4611 | |
4612 | res = self.api.post_json(_get_path('networks'), data) |
4613 | self.assertEqual(res.status_int, exc.HTTPCreated.code) |
4614 | @@ -525,6 +529,7 @@ |
4615 | |
4616 | instance = self.plugin.return_value |
4617 | instance.get_network.return_value = {'tenant_id': unicode(tenant_id)} |
4618 | + instance.get_ports_count.return_value = 1 |
4619 | instance.create_port.return_value = return_value |
4620 | res = self.api.post_json(_get_path('ports'), initial_input) |
4621 | |
4622 | @@ -545,6 +550,7 @@ |
4623 | |
4624 | instance = self.plugin.return_value |
4625 | instance.create_network.return_value = return_value |
4626 | + instance.get_networks_count.return_value = 0 |
4627 | |
4628 | res = self.api.post_json(_get_path('networks'), data) |
4629 | |
4630 | @@ -699,6 +705,7 @@ |
4631 | initial_input = {resource: {'name': 'myname'}} |
4632 | instance = self.plugin.return_value |
4633 | instance.get_networks.return_value = initial_input |
4634 | + instance.get_networks_count.return_value = 0 |
4635 | expected_code = exc.HTTPCreated.code |
4636 | with mock.patch.object(notifer_api, 'notify') as mynotifier: |
4637 | if opname == 'create': |
4638 | @@ -742,37 +749,41 @@ |
4639 | class QuotaTest(APIv2TestBase): |
4640 | def test_create_network_quota(self): |
4641 | cfg.CONF.set_override('quota_network', 1, group='QUOTAS') |
4642 | - net_id = _uuid() |
4643 | - initial_input = {'network': {'name': 'net1', 'tenant_id': _uuid()}} |
4644 | - full_input = {'network': {'admin_state_up': True, 'subnets': []}} |
4645 | - full_input['network'].update(initial_input['network']) |
4646 | - |
4647 | - return_value = {'id': net_id, 'status': "ACTIVE"} |
4648 | - return_value.update(full_input['network']) |
4649 | - return_networks = {'networks': [return_value]} |
4650 | - instance = self.plugin.return_value |
4651 | - instance.get_networks.return_value = return_networks |
4652 | - res = self.api.post_json( |
4653 | - _get_path('networks'), initial_input, expect_errors=True) |
4654 | - instance.get_networks.assert_called_with(mock.ANY, |
4655 | - filters=mock.ANY) |
4656 | + initial_input = {'network': {'name': 'net1', 'tenant_id': _uuid()}} |
4657 | + full_input = {'network': {'admin_state_up': True, 'subnets': []}} |
4658 | + full_input['network'].update(initial_input['network']) |
4659 | + |
4660 | + instance = self.plugin.return_value |
4661 | + instance.get_networks_count.return_value = 1 |
4662 | + res = self.api.post_json( |
4663 | + _get_path('networks'), initial_input, expect_errors=True) |
4664 | + instance.get_networks_count.assert_called_with(mock.ANY, |
4665 | + filters=mock.ANY) |
4666 | + self.assertTrue("Quota exceeded for resources" in |
4667 | + res.json['QuantumError']) |
4668 | + |
4669 | + def test_create_network_quota_no_counts(self): |
4670 | + cfg.CONF.set_override('quota_network', 1, group='QUOTAS') |
4671 | + initial_input = {'network': {'name': 'net1', 'tenant_id': _uuid()}} |
4672 | + full_input = {'network': {'admin_state_up': True, 'subnets': []}} |
4673 | + full_input['network'].update(initial_input['network']) |
4674 | + |
4675 | + instance = self.plugin.return_value |
4676 | + instance.get_networks_count.side_effect = ( |
4677 | + q_exc.NotImplementedError()) |
4678 | + instance.get_networks.return_value = ["foo"] |
4679 | + res = self.api.post_json( |
4680 | + _get_path('networks'), initial_input, expect_errors=True) |
4681 | + instance.get_networks_count.assert_called_with(mock.ANY, |
4682 | + filters=mock.ANY) |
4683 | self.assertTrue("Quota exceeded for resources" in |
4684 | res.json['QuantumError']) |
4685 | |
4686 | def test_create_network_quota_without_limit(self): |
4687 | cfg.CONF.set_override('quota_network', -1, group='QUOTAS') |
4688 | - net_id = _uuid() |
4689 | initial_input = {'network': {'name': 'net1', 'tenant_id': _uuid()}} |
4690 | - full_input = {'network': {'admin_state_up': True, 'subnets': []}} |
4691 | - full_input['network'].update(initial_input['network']) |
4692 | - return_networks = [] |
4693 | - for i in xrange(0, 3): |
4694 | - return_value = {'id': net_id + str(i), 'status': "ACTIVE"} |
4695 | - return_value.update(full_input['network']) |
4696 | - return_networks.append(return_value) |
4697 | - self.assertEquals(3, len(return_networks)) |
4698 | instance = self.plugin.return_value |
4699 | - instance.get_networks.return_value = return_networks |
4700 | + instance.get_networks_count.return_value = 3 |
4701 | res = self.api.post_json( |
4702 | _get_path('networks'), initial_input) |
4703 | self.assertEqual(res.status_int, exc.HTTPCreated.code) |
4704 | @@ -836,6 +847,7 @@ |
4705 | |
4706 | instance = self.plugin.return_value |
4707 | instance.create_network.return_value = return_value |
4708 | + instance.get_networks_count.return_value = 0 |
4709 | |
4710 | res = self.api.post_json(_get_path('networks'), initial_input) |
4711 | |
4712 | |
4713 | === modified file 'quantum/tests/unit/test_attributes.py' |
4714 | --- quantum/tests/unit/test_attributes.py 2012-09-21 13:01:18 +0000 |
4715 | +++ quantum/tests/unit/test_attributes.py 2013-01-08 00:32:21 +0000 |
4716 | @@ -23,6 +23,90 @@ |
4717 | |
4718 | class TestAttributes(unittest2.TestCase): |
4719 | |
4720 | + def test_strings(self): |
4721 | + msg = attributes._validate_string(None, None) |
4722 | + self.assertEquals(msg, "'None' is not a valid string") |
4723 | + |
4724 | + msg = attributes._validate_string("OK", None) |
4725 | + self.assertEquals(msg, None) |
4726 | + |
4727 | + msg = attributes._validate_string("123456789", 9) |
4728 | + self.assertIsNone(msg) |
4729 | + |
4730 | + msg = attributes._validate_string("1234567890", 9) |
4731 | + self.assertIsNotNone(msg) |
4732 | + |
4733 | + def test_ip_pools(self): |
4734 | + pools = [[{'end': '10.0.0.254'}], |
4735 | + [{'start': '10.0.0.254'}], |
4736 | + [{'start': '1000.0.0.254', |
4737 | + 'end': '1.1.1.1'}], |
4738 | + [{'start': '10.0.0.2', 'end': '10.0.0.254', |
4739 | + 'forza': 'juve'}], |
4740 | + [{'start': '10.0.0.2', 'end': '10.0.0.254'}, |
4741 | + {'end': '10.0.0.254'}], |
4742 | + None] |
4743 | + for pool in pools: |
4744 | + msg = attributes._validate_ip_pools(pool, None) |
4745 | + self.assertIsNotNone(msg) |
4746 | + |
4747 | + pools = [[{'end': '10.0.0.254', 'start': '10.0.0.2'}, |
4748 | + {'start': '11.0.0.2', 'end': '11.1.1.1'}], |
4749 | + [{'start': '11.0.0.2', 'end': '11.0.0.100'}]] |
4750 | + for pool in pools: |
4751 | + msg = attributes._validate_ip_pools(pool, None) |
4752 | + self.assertIsNone(msg) |
4753 | + |
4754 | + def test_fixed_ips(self): |
4755 | + fixed_ips = [[{'subnet_id': '00000000-ffff-ffff-ffff-000000000000', |
4756 | + 'ip_address': '1111.1.1.1'}], |
4757 | + [{'subnet_id': 'invalid'}], |
4758 | + None, |
4759 | + [{'subnet_id': '00000000-0fff-ffff-ffff-000000000000', |
4760 | + 'ip_address': '1.1.1.1'}, |
4761 | + {'subnet_id': '00000000-ffff-ffff-ffff-000000000000', |
4762 | + 'ip_address': '1.1.1.1'}], |
4763 | + [{'subnet_id': '00000000-ffff-ffff-ffff-000000000000', |
4764 | + 'ip_address': '1.1.1.1'}, |
4765 | + {'subnet_id': '00000000-ffff-ffff-ffff-000000000000', |
4766 | + 'ip_address': '1.1.1.1'}]] |
4767 | + for fixed in fixed_ips: |
4768 | + msg = attributes._validate_fixed_ips(fixed, None) |
4769 | + self.assertIsNotNone(msg) |
4770 | + |
4771 | + def test_nameservers(self): |
4772 | + ns_pools = [['1.1.1.2', '1.1.1.2'], |
4773 | + ['www.hostname.com', 'www.hostname.com'], |
4774 | + ['77.hostname.com'], |
4775 | + ['1000.0.0.1'], |
4776 | + None] |
4777 | + |
4778 | + for ns in ns_pools: |
4779 | + msg = attributes._validate_nameservers(ns, None) |
4780 | + self.assertIsNotNone(msg) |
4781 | + |
4782 | + ns_pools = [['100.0.0.2'], |
4783 | + ['www.hostname.com'], |
4784 | + ['www.great.marathons.to.travel'], |
4785 | + ['valid'], |
4786 | + ['www.internal.hostname.com']] |
4787 | + |
4788 | + for ns in ns_pools: |
4789 | + msg = attributes._validate_nameservers(ns, None) |
4790 | + self.assertIsNone(msg) |
4791 | + |
4792 | + def test_hostroutes(self): |
4793 | + hostroute_pools = [[{'destination': '100.0.0.0/24'}], |
4794 | + [{'nexthop': '10.0.2.20'}], |
4795 | + [{'nexthop': '10.0.2.20', |
4796 | + 'destination': '100.0.0.0/8'}, |
4797 | + {'nexthop': '10.0.2.20', |
4798 | + 'destination': '100.0.0.0/8'}], |
4799 | + None] |
4800 | + for host_routes in hostroute_pools: |
4801 | + msg = attributes._validate_hostroutes(host_routes, None) |
4802 | + self.assertIsNotNone(msg) |
4803 | + |
4804 | def test_mac_addresses(self): |
4805 | # Valid - 3 octets |
4806 | base_mac = "fa:16:3e:00:00:00" |
4807 | @@ -40,49 +124,82 @@ |
4808 | base_mac = "01:16:3e:4f:00:00" |
4809 | msg = attributes._validate_regex(base_mac, |
4810 | attributes.MAC_PATTERN) |
4811 | - error = '%s is not valid' % base_mac |
4812 | - self.assertEquals(msg, error) |
4813 | + self.assertIsNotNone(msg) |
4814 | |
4815 | # Invalid - invalid format |
4816 | base_mac = "a:16:3e:4f:00:00" |
4817 | msg = attributes._validate_regex(base_mac, |
4818 | attributes.MAC_PATTERN) |
4819 | - error = '%s is not valid' % base_mac |
4820 | - self.assertEquals(msg, error) |
4821 | + self.assertIsNotNone(msg) |
4822 | |
4823 | # Invalid - invalid format |
4824 | base_mac = "ffa:16:3e:4f:00:00" |
4825 | msg = attributes._validate_regex(base_mac, |
4826 | attributes.MAC_PATTERN) |
4827 | - error = '%s is not valid' % base_mac |
4828 | - self.assertEquals(msg, error) |
4829 | + self.assertIsNotNone(msg) |
4830 | |
4831 | # Invalid - invalid format |
4832 | base_mac = "01163e4f0000" |
4833 | msg = attributes._validate_regex(base_mac, |
4834 | attributes.MAC_PATTERN) |
4835 | - error = '%s is not valid' % base_mac |
4836 | - self.assertEquals(msg, error) |
4837 | + self.assertIsNotNone(msg) |
4838 | |
4839 | # Invalid - invalid format |
4840 | base_mac = "01-16-3e-4f-00-00" |
4841 | msg = attributes._validate_regex(base_mac, |
4842 | attributes.MAC_PATTERN) |
4843 | - error = '%s is not valid' % base_mac |
4844 | - self.assertEquals(msg, error) |
4845 | + self.assertIsNotNone(msg) |
4846 | |
4847 | # Invalid - invalid format |
4848 | base_mac = "00:16:3:f:00:00" |
4849 | msg = attributes._validate_regex(base_mac, |
4850 | attributes.MAC_PATTERN) |
4851 | - error = '%s is not valid' % base_mac |
4852 | - self.assertEquals(msg, error) |
4853 | + self.assertIsNotNone(msg) |
4854 | |
4855 | # Invalid - invalid format |
4856 | base_mac = "12:3:4:5:67:89ab" |
4857 | msg = attributes._validate_regex(base_mac, |
4858 | attributes.MAC_PATTERN) |
4859 | - error = '%s is not valid' % base_mac |
4860 | + self.assertIsNotNone(msg) |
4861 | + |
4862 | + def test_cidr(self): |
4863 | + # Valid - IPv4 |
4864 | + cidr = "10.0.2.0/24" |
4865 | + msg = attributes._validate_subnet(cidr, |
4866 | + None) |
4867 | + self.assertEquals(msg, None) |
4868 | + |
4869 | + # Valid - IPv6 without final octets |
4870 | + cidr = "fe80::/24" |
4871 | + msg = attributes._validate_subnet(cidr, |
4872 | + None) |
4873 | + self.assertEquals(msg, None) |
4874 | + |
4875 | + # Valid - IPv6 with final octets |
4876 | + cidr = "fe80::0/24" |
4877 | + msg = attributes._validate_subnet(cidr, |
4878 | + None) |
4879 | + self.assertEquals(msg, None) |
4880 | + |
4881 | + # Invalid - IPv4 missing mask |
4882 | + cidr = "10.0.2.0" |
4883 | + msg = attributes._validate_subnet(cidr, |
4884 | + None) |
4885 | + error = "'%s' is not a valid IP subnet" % cidr |
4886 | + self.assertEquals(msg, error) |
4887 | + |
4888 | + # Invalid - IPv6 without final octets, missing mask |
4889 | + cidr = "fe80::" |
4890 | + msg = attributes._validate_subnet(cidr, |
4891 | + None) |
4892 | + error = "'%s' is not a valid IP subnet" % cidr |
4893 | + self.assertEquals(msg, error) |
4894 | + |
4895 | + # Invalid - IPv6 with final octets, missing mask |
4896 | + cidr = "fe80::0" |
4897 | + msg = attributes._validate_subnet(cidr, |
4898 | + None) |
4899 | + error = "'%s' is not a valid IP subnet" % cidr |
4900 | self.assertEquals(msg, error) |
4901 | |
4902 | |
4903 | |
4904 | === added file 'quantum/tests/unit/test_common_utils.py' |
4905 | --- quantum/tests/unit/test_common_utils.py 1970-01-01 00:00:00 +0000 |
4906 | +++ quantum/tests/unit/test_common_utils.py 2013-01-08 00:32:21 +0000 |
4907 | @@ -0,0 +1,60 @@ |
4908 | +# Copyright (c) 2012 OpenStack, LLC. |
4909 | +# |
4910 | +# Licensed under the Apache License, Version 2.0 (the "License"); you may |
4911 | +# not use this file except in compliance with the License. You may obtain |
4912 | +# a copy of the License at |
4913 | +# |
4914 | +# http://www.apache.org/licenses/LICENSE-2.0 |
4915 | +# |
4916 | +# Unless required by applicable law or agreed to in writing, software |
4917 | +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
4918 | +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
4919 | +# License for the specific language governing permissions and limitations |
4920 | +# under the License. |
4921 | + |
4922 | +import unittest2 as unittest |
4923 | + |
4924 | +from quantum.common import utils |
4925 | + |
4926 | + |
4927 | +class TestParseMappings(unittest.TestCase): |
4928 | + def parse(self, mapping_list, unique_values=True): |
4929 | + return utils.parse_mappings(mapping_list, unique_values) |
4930 | + |
4931 | + def test_parse_mappings_fails_for_missing_separator(self): |
4932 | + with self.assertRaises(ValueError): |
4933 | + self.parse(['key']) |
4934 | + |
4935 | + def test_parse_mappings_fails_for_missing_key(self): |
4936 | + with self.assertRaises(ValueError): |
4937 | + self.parse([':val']) |
4938 | + |
4939 | + def test_parse_mappings_fails_for_missing_value(self): |
4940 | + with self.assertRaises(ValueError): |
4941 | + self.parse(['key:']) |
4942 | + |
4943 | + def test_parse_mappings_fails_for_extra_separator(self): |
4944 | + with self.assertRaises(ValueError): |
4945 | + self.parse(['key:val:junk']) |
4946 | + |
4947 | + def test_parse_mappings_fails_for_duplicate_key(self): |
4948 | + with self.assertRaises(ValueError): |
4949 | + self.parse(['key:val1', 'key:val2']) |
4950 | + |
4951 | + def test_parse_mappings_fails_for_duplicate_value(self): |
4952 | + with self.assertRaises(ValueError): |
4953 | + self.parse(['key1:val', 'key2:val']) |
4954 | + |
4955 | + def test_parse_mappings_succeeds_for_one_mapping(self): |
4956 | + self.assertEqual(self.parse(['key:val']), {'key': 'val'}) |
4957 | + |
4958 | + def test_parse_mappings_succeeds_for_n_mappings(self): |
4959 | + self.assertEqual(self.parse(['key1:val1', 'key2:val2']), |
4960 | + {'key1': 'val1', 'key2': 'val2'}) |
4961 | + |
4962 | + def test_parse_mappings_succeeds_for_duplicate_value(self): |
4963 | + self.assertEqual(self.parse(['key1:val', 'key2:val'], False), |
4964 | + {'key1': 'val', 'key2': 'val'}) |
4965 | + |
4966 | + def test_parse_mappings_succeeds_for_no_mappings(self): |
4967 | + self.assertEqual(self.parse(['']), {}) |
4968 | |
4969 | === modified file 'quantum/tests/unit/test_db_plugin.py' |
4970 | --- quantum/tests/unit/test_db_plugin.py 2012-09-26 15:14:31 +0000 |
4971 | +++ quantum/tests/unit/test_db_plugin.py 2013-01-08 00:32:21 +0000 |
4972 | @@ -112,6 +112,10 @@ |
4973 | |
4974 | def tearDown(self): |
4975 | super(QuantumDbPluginV2TestCase, self).tearDown() |
4976 | + self.api = None |
4977 | + self._deserializers = None |
4978 | + self._skip_native_bulk = None |
4979 | + self.ext_api = None |
4980 | # NOTE(jkoelker) for a 'pluggable' framework, Quantum sure |
4981 | # doesn't like when the plugin changes ;) |
4982 | db._ENGINE = None |
4983 | @@ -354,12 +358,12 @@ |
4984 | def _do_side_effect(self, patched_plugin, orig, *args, **kwargs): |
4985 | """ Invoked by test cases for injecting failures in plugin """ |
4986 | def second_call(*args, **kwargs): |
4987 | - raise Exception('boom') |
4988 | + raise AttributeError |
4989 | patched_plugin.side_effect = second_call |
4990 | return orig(*args, **kwargs) |
4991 | |
4992 | def _validate_behavior_on_bulk_failure(self, res, collection): |
4993 | - self.assertEqual(res.status_int, 500) |
4994 | + self.assertEqual(res.status_int, 400) |
4995 | req = self.new_list_request(collection) |
4996 | res = req.get_response(self.api) |
4997 | self.assertEquals(res.status_int, 200) |
4998 | @@ -378,6 +382,7 @@ |
4999 | def network(self, name='net1', |
5000 | admin_status_up=True, |
The diff has been truncated for viewing.