Merge lp:~gandelman-a/ubuntu/precise/quantum/UCA_2012.2.1 into lp:~ubuntu-cloud-archive/ubuntu/precise/quantum/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
Reviewer Review Type Date Requested Status
Chuck Short Pending
Review via email: mp+142217@code.launchpad.net

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.

Subscribers

People subscribed via source and target branches