diff --git a/horizon/dashboards/nova/access_and_security/security_groups/forms.py b/horizon/dashboards/nova/access_and_security/security_groups/forms.py index c8c9534c3..c0b33075c 100644 --- a/horizon/dashboards/nova/access_and_security/security_groups/forms.py +++ b/horizon/dashboards/nova/access_and_security/security_groups/forms.py @@ -97,8 +97,7 @@ class AddRule(forms.SelfHandlingForm): current_group_id = initials.get('security_group_id', 0) security_groups = initials.get('security_group_list', []) security_groups_choices = [("", "CIDR")] # default choice is CIDR - group_choices = [s for s in security_groups - if str(s[0]) != current_group_id] + group_choices = [s for s in security_groups] if len(group_choices): # add group choice if available security_groups_choices.append(('Security Group', group_choices)) self.fields['source_group'].choices = security_groups_choices diff --git a/horizon/dashboards/nova/access_and_security/security_groups/tests.py b/horizon/dashboards/nova/access_and_security/security_groups/tests.py index 42cbfc25f..eeb0970c5 100644 --- a/horizon/dashboards/nova/access_and_security/security_groups/tests.py +++ b/horizon/dashboards/nova/access_and_security/security_groups/tests.py @@ -179,6 +179,34 @@ class SecurityGroupsViewTests(test.TestCase): msg = 'Either CIDR or Source Group may be specified, but not both.' self.assertFormErrors(res, count=1, message=msg) + def test_edit_rules_add_rule_self_as_source_group(self): + sec_group = self.security_groups.first() + sec_group_list = self.security_groups.list() + rule = self.security_group_rules.get(id=3) + + self.mox.StubOutWithMock(api, 'security_group_rule_create') + self.mox.StubOutWithMock(api, 'security_group_list') + api.security_group_rule_create(IsA(http.HttpRequest), + sec_group.id, + rule.ip_protocol, + int(rule.from_port), + int(rule.to_port), + None, + u'%s' % sec_group.id).AndReturn(rule) + api.security_group_list( + IsA(http.HttpRequest)).AndReturn(sec_group_list) + self.mox.ReplayAll() + + formData = {'method': 'AddRule', + 'security_group_id': sec_group.id, + 'from_port': rule.from_port, + 'to_port': rule.to_port, + 'ip_protocol': rule.ip_protocol, + 'cidr': '0.0.0.0/0', + 'source_group': sec_group.id} + res = self.client.post(self.edit_url, formData) + self.assertRedirectsNoFollow(res, INDEX_URL) + def test_edit_rules_invalid_port_range(self): sec_group = self.security_groups.first() sec_group_list = self.security_groups.list() diff --git a/horizon/tests/test_data/nova_data.py b/horizon/tests/test_data/nova_data.py index f641628ed..417b19771 100644 --- a/horizon/tests/test_data/nova_data.py +++ b/horizon/tests/test_data/nova_data.py @@ -229,12 +229,24 @@ def data(TEST): 'to_port': u"5", 'parent_group_id': 1, 'ip_range': {'cidr': u"0.0.0.0/32"}} + + group_rule = {'id': 3, + 'ip_protocol': u"tcp", + 'from_port': u"80", + 'to_port': u"80", + 'parent_group_id': 1, + 'source_group_id': 1} + rule_obj = rules.SecurityGroupRule(rules.SecurityGroupRuleManager(None), rule) rule_obj2 = rules.SecurityGroupRule(rules.SecurityGroupRuleManager(None), icmp_rule) + rule_obj3 = rules.SecurityGroupRule(rules.SecurityGroupRuleManager(None), + group_rule) + TEST.security_group_rules.add(rule_obj) TEST.security_group_rules.add(rule_obj2) + TEST.security_group_rules.add(rule_obj3) sec_group_1.rules = [rule_obj] sec_group_2.rules = [rule_obj]