Merge lp:~vishvananda/nova/fix-boto-2 into lp:~hudson-openstack/nova/milestone-proposed

Proposed by Vish Ishaya
Status: Merged
Approved by: Vish Ishaya
Approved revision: 1137
Merged at revision: 1136
Proposed branch: lp:~vishvananda/nova/fix-boto-2
Merge into: lp:~hudson-openstack/nova/milestone-proposed
Diff against target: 181 lines (+69/-32)
3 files modified
nova/api/ec2/cloud.py (+46/-30)
nova/tests/test_api.py (+5/-1)
nova/tests/test_cloud.py (+18/-1)
To merge this branch: bzr merge lp:~vishvananda/nova/fix-boto-2
Reviewer Review Type Date Requested Status
OpenStack release team Pending
Review via email: mp+69501@code.launchpad.net

Description of the change

Fix for boto2.

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 'nova/api/ec2/cloud.py'
2--- nova/api/ec2/cloud.py 2011-07-25 21:24:42 +0000
3+++ nova/api/ec2/cloud.py 2011-07-27 16:22:21 +0000
4@@ -539,15 +539,18 @@
5 return rules
6 if 'ip_ranges' in kwargs:
7 rules = self._cidr_args_split(kwargs)
8+ else:
9+ rules = [kwargs]
10 finalset = []
11 for rule in rules:
12 if 'groups' in rule:
13 groups_values = self._groups_args_split(rule)
14 for groups_value in groups_values:
15- finalset.append(groups_value)
16+ final = self._rule_dict_last_step(context, **groups_value)
17+ finalset.append(final)
18 else:
19- if rule:
20- finalset.append(rule)
21+ final = self._rule_dict_last_step(context, **rule)
22+ finalset.append(final)
23 return finalset
24
25 def _cidr_args_split(self, kwargs):
26@@ -590,6 +593,9 @@
27 db.security_group_get_by_name(context.elevated(),
28 source_project_id,
29 source_security_group_name)
30+ notfound = exception.SecurityGroupNotFound
31+ if not source_security_group:
32+ raise notfound(security_group_id=source_security_group_name)
33 values['group_id'] = source_security_group['id']
34 elif cidr_ip:
35 # If this fails, it throws an exception. This is what we want.
36@@ -628,7 +634,7 @@
37 for rule in security_group.rules:
38 if 'group_id' in values:
39 if rule['group_id'] == values['group_id']:
40- return True
41+ return rule['id']
42 else:
43 is_duplicate = True
44 for key in ('cidr', 'from_port', 'to_port', 'protocol'):
45@@ -636,7 +642,7 @@
46 is_duplicate = False
47 break
48 if is_duplicate:
49- return True
50+ return rule['id']
51 return False
52
53 def revoke_security_group_ingress(self, context, group_name=None,
54@@ -659,22 +665,30 @@
55
56 msg = "Revoke security group ingress %s"
57 LOG.audit(_(msg), security_group['name'], context=context)
58-
59- criteria = self._rule_args_to_dict(context, kwargs)[0]
60- if criteria is None:
61- raise exception.ApiError(_("Not enough parameters to build a "
62- "valid rule."))
63-
64- for rule in security_group.rules:
65- match = True
66- for (k, v) in criteria.iteritems():
67- if getattr(rule, k, False) != v:
68- match = False
69- if match:
70- db.security_group_rule_destroy(context, rule['id'])
71- self.compute_api.trigger_security_group_rules_refresh(context,
72- security_group_id=security_group['id'])
73- return True
74+ prevalues = []
75+ try:
76+ prevalues = kwargs['ip_permissions']
77+ except KeyError:
78+ prevalues.append(kwargs)
79+ rule_id = None
80+ for values in prevalues:
81+ rulesvalues = self._rule_args_to_dict(context, values)
82+ if not rulesvalues:
83+ err = "%s Not enough parameters to build a valid rule"
84+ raise exception.ApiError(_(err % rulesvalues))
85+
86+ for values_for_rule in rulesvalues:
87+ values_for_rule['parent_group_id'] = security_group.id
88+ rule_id = self._security_group_rule_exists(security_group,
89+ values_for_rule)
90+ if rule_id:
91+ db.security_group_rule_destroy(context, rule_id)
92+ if rule_id:
93+ # NOTE(vish): we removed a rule, so refresh
94+ self.compute_api.trigger_security_group_rules_refresh(
95+ context,
96+ security_group_id=security_group['id'])
97+ return True
98 raise exception.ApiError(_("No rule for the specified parameters."))
99
100 # TODO(soren): This has only been tested with Boto as the client.
101@@ -721,15 +735,17 @@
102 postvalues.append(values_for_rule)
103
104 for values_for_rule in postvalues:
105- security_group_rule = db.security_group_rule_create(context,
106- values_for_rule)
107-
108- self.compute_api.trigger_security_group_rules_refresh(context,
109- security_group_id=security_group['id'])
110-
111- group = db.security_group_get_by_name(context, context.project_id,
112- security_group['name'])
113- return True
114+ security_group_rule = db.security_group_rule_create(
115+ context,
116+ values_for_rule)
117+
118+ if postvalues:
119+ self.compute_api.trigger_security_group_rules_refresh(
120+ context,
121+ security_group_id=security_group['id'])
122+ return True
123+
124+ raise exception.ApiError(_("No rule for the specified parameters."))
125
126 def _get_source_project_id(self, context, source_security_group_owner_id):
127 if source_security_group_owner_id:
128
129=== modified file 'nova/tests/test_api.py'
130--- nova/tests/test_api.py 2011-06-27 11:20:42 +0000
131+++ nova/tests/test_api.py 2011-07-27 16:22:21 +0000
132@@ -213,7 +213,11 @@
133 self.http = FakeHttplibConnection(
134 self.app, '%s:8773' % (self.host), False)
135 # pylint: disable=E1103
136- self.ec2.new_http_connection(host, is_secure).AndReturn(self.http)
137+ if boto.Version >= '2':
138+ self.ec2.new_http_connection(host or '%s:8773' % (self.host),
139+ is_secure).AndReturn(self.http)
140+ else:
141+ self.ec2.new_http_connection(host, is_secure).AndReturn(self.http)
142 return self.http
143
144 def test_return_valid_isoformat(self):
145
146=== modified file 'nova/tests/test_cloud.py'
147--- nova/tests/test_cloud.py 2011-07-25 21:24:42 +0000
148+++ nova/tests/test_cloud.py 2011-07-27 16:22:21 +0000
149@@ -287,7 +287,7 @@
150 'ip_protocol': u'tcp'}]}
151 self.assertTrue(authz(self.context, group_name=sec['name'], **kwargs))
152
153- def test_authorize_security_group_ingress_ip_permissions_groups(self):
154+ def test_authorize_security_group_fail_missing_source_group(self):
155 kwargs = {'project_id': self.context.project_id, 'name': 'test'}
156 sec = db.security_group_create(self.context, kwargs)
157 authz = self.cloud.authorize_security_group_ingress
158@@ -295,6 +295,23 @@
159 'ip_ranges':{'1': {'cidr_ip': u'0.0.0.0/0'},
160 '2': {'cidr_ip': u'10.10.10.10/32'}},
161 'groups': {'1': {'user_id': u'someuser',
162+ 'group_name': u'somegroup1'}},
163+ 'ip_protocol': u'tcp'}]}
164+ self.assertRaises(exception.SecurityGroupNotFound, authz,
165+ self.context, group_name=sec['name'], **kwargs)
166+
167+ def test_authorize_security_group_ingress_ip_permissions_groups(self):
168+ kwargs = {'project_id': self.context.project_id, 'name': 'test'}
169+ sec = db.security_group_create(self.context,
170+ {'project_id': 'someuser',
171+ 'name': 'somegroup1'})
172+ sec = db.security_group_create(self.context,
173+ {'project_id': 'someuser',
174+ 'name': 'othergroup2'})
175+ sec = db.security_group_create(self.context, kwargs)
176+ authz = self.cloud.authorize_security_group_ingress
177+ kwargs = {'ip_permissions': [{'to_port': 81, 'from_port': 81,
178+ 'groups': {'1': {'user_id': u'someuser',
179 'group_name': u'somegroup1'},
180 '2': {'user_id': u'someuser',
181 'group_name': u'othergroup2'}},

Subscribers

People subscribed via source and target branches