summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-02-01 18:45:40 +0000
committerGerrit Code Review <review@openstack.org>2012-02-01 18:45:40 +0000
commit28a5bfef8d4315fdbce8ceb0c18eee81565161b7 (patch)
tree458e927c81888bba06321205db8d6a82c59f0d21
parenta48781aa8f4d5c89cf52ad23079be9e723cb4cd1 (diff)
parentba21072a43183388e53f47bcdac074cb6246ed83 (diff)
downloadnova-28a5bfef8d4315fdbce8ceb0c18eee81565161b7.tar.gz
nova-28a5bfef8d4315fdbce8ceb0c18eee81565161b7.tar.xz
nova-28a5bfef8d4315fdbce8ceb0c18eee81565161b7.zip
Merge "Correct checking existence of security group rule"
-rw-r--r--nova/api/ec2/cloud.py19
-rw-r--r--nova/api/openstack/compute/contrib/security_groups.py19
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_security_groups.py32
3 files changed, 45 insertions, 25 deletions
diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py
index 5b7841ad5..8fa348129 100644
--- a/nova/api/ec2/cloud.py
+++ b/nova/api/ec2/cloud.py
@@ -594,17 +594,14 @@ class CloudController(object):
defined in the given security group.
"""
for rule in security_group.rules:
- if 'group_id' in values:
- if rule['group_id'] == values['group_id']:
- return rule['id']
- else:
- is_duplicate = True
- for key in ('cidr', 'from_port', 'to_port', 'protocol'):
- if rule[key] != values[key]:
- is_duplicate = False
- break
- if is_duplicate:
- return rule['id']
+ is_duplicate = True
+ keys = ('group_id', 'cidr', 'from_port', 'to_port', 'protocol')
+ for key in keys:
+ if rule.get(key) != values.get(key):
+ is_duplicate = False
+ break
+ if is_duplicate:
+ return rule['id']
return False
def revoke_security_group_ingress(self, context, group_name=None,
diff --git a/nova/api/openstack/compute/contrib/security_groups.py b/nova/api/openstack/compute/contrib/security_groups.py
index 45d72bf61..1faa0537a 100644
--- a/nova/api/openstack/compute/contrib/security_groups.py
+++ b/nova/api/openstack/compute/contrib/security_groups.py
@@ -379,17 +379,14 @@ class SecurityGroupRulesController(SecurityGroupController):
defined in the given security group.
"""
for rule in security_group.rules:
- if 'group_id' in values:
- if rule['group_id'] == values['group_id']:
- return True
- else:
- is_duplicate = True
- for key in ('cidr', 'from_port', 'to_port', 'protocol'):
- if rule[key] != values[key]:
- is_duplicate = False
- break
- if is_duplicate:
- return True
+ is_duplicate = True
+ keys = ('group_id', 'cidr', 'from_port', 'to_port', 'protocol')
+ for key in keys:
+ if rule.get(key) != values.get(key):
+ is_duplicate = False
+ break
+ if is_duplicate:
+ return True
return False
def _rule_args_to_dict(self, context, to_port=None, from_port=None,
diff --git a/nova/tests/api/openstack/compute/contrib/test_security_groups.py b/nova/tests/api/openstack/compute/contrib/test_security_groups.py
index 2acc513a9..b0b2064c5 100644
--- a/nova/tests/api/openstack/compute/contrib/test_security_groups.py
+++ b/nova/tests/api/openstack/compute/contrib/test_security_groups.py
@@ -521,7 +521,7 @@ class TestSecurityGroupRules(test.TestCase):
"10.2.3.124/24")
def test_create_by_group_id(self):
- rule = security_group_rule_template(group_id='1')
+ rule = security_group_rule_template(group_id=1)
req = fakes.HTTPRequest.blank('/v2/fake/os-security-group-rules')
res_dict = self.controller.create(req, {'security_group_rule': rule})
@@ -530,6 +530,23 @@ class TestSecurityGroupRules(test.TestCase):
self.assertNotEquals(security_group_rule['id'], 0)
self.assertEquals(security_group_rule['parent_group_id'], 2)
+ def test_create_by_same_group_id(self):
+ rule1 = security_group_rule_template(group_id=1, from_port=80,
+ to_port=80)
+ self.parent_security_group['rules'] = [security_group_rule_db(rule1)]
+
+ rule2 = security_group_rule_template(group_id=1, from_port=81,
+ to_port=81)
+
+ req = fakes.HTTPRequest.blank('/v2/fake/os-security-group-rules')
+ res_dict = self.controller.create(req, {'security_group_rule': rule2})
+
+ security_group_rule = res_dict['security_group_rule']
+ self.assertNotEquals(security_group_rule['id'], 0)
+ self.assertEquals(security_group_rule['parent_group_id'], 2)
+ self.assertEquals(security_group_rule['from_port'], 81)
+ self.assertEquals(security_group_rule['to_port'], 81)
+
def test_create_by_invalid_cidr_json(self):
rules = {
"security_group_rule": {
@@ -571,7 +588,7 @@ class TestSecurityGroupRules(test.TestCase):
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.create,
req, {'security_group_rule': rule})
- def test_create_add_existing_rules(self):
+ def test_create_add_existing_rules_by_cidr(self):
rule = security_group_rule_template(cidr='10.0.0.0/24')
self.parent_security_group['rules'] = [security_group_rule_db(rule)]
@@ -580,6 +597,15 @@ class TestSecurityGroupRules(test.TestCase):
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.create,
req, {'security_group_rule': rule})
+ def test_create_add_existing_rules_by_group_id(self):
+ rule = security_group_rule_template(group_id=1)
+
+ self.parent_security_group['rules'] = [security_group_rule_db(rule)]
+
+ req = fakes.HTTPRequest.blank('/v2/fake/os-security-group-rules')
+ self.assertRaises(webob.exc.HTTPBadRequest, self.controller.create,
+ req, {'security_group_rule': rule})
+
def test_create_with_no_body(self):
req = fakes.HTTPRequest.blank('/v2/fake/os-security-group-rules')
self.assertRaises(webob.exc.HTTPUnprocessableEntity,
@@ -711,7 +737,7 @@ class TestSecurityGroupRules(test.TestCase):
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.create,
req, {'security_group_rule': rule})
- def test_create_rule_with_same_group_parent_id(self):
+ def test_create_with_same_group_parent_id_and_group_id(self):
rule = security_group_rule_template(group_id=2)
req = fakes.HTTPRequest.blank('/v2/fake/os-security-group-rules')