Merge lp:~xtoddx/nova/provider-fw-rules-delete into lp:~hudson-openstack/nova/trunk

Proposed by Vish Ishaya
Status: Merged
Approved by: Vish Ishaya
Approved revision: 631
Merged at revision: 1214
Proposed branch: lp:~xtoddx/nova/provider-fw-rules-delete
Merge into: lp:~hudson-openstack/nova/trunk
Diff against target: 137 lines (+80/-0)
5 files modified
nova/api/ec2/admin.py (+20/-0)
nova/db/api.py (+10/-0)
nova/db/sqlalchemy/api.py (+21/-0)
nova/tests/test_adminapi.py (+22/-0)
nova/tests/test_libvirt.py (+7/-0)
To merge this branch: bzr merge lp:~xtoddx/nova/provider-fw-rules-delete
Reviewer Review Type Date Requested Status
Brian Lamar Pending
Vish Ishaya Pending
Brian Waldon Pending
Devin Carlen Pending
Review via email: mp+65849@code.launchpad.net

This proposal supersedes a proposal from 2011-06-11.

Description of the change

Add api methods to delete provider firewall rules.

To post a comment you must log in.
Revision history for this message
Brian Lamar (blamar) wrote : Posted in a previous version of this proposal

Can you add tests for verification?

review: Needs Fixing
Revision history for this message
Brian Waldon (bcwaldon) wrote : Posted in a previous version of this proposal

13: Looks like we may be getting rid of IPy soon. Would you mind using netaddr instead?

review: Needs Fixing
Revision history for this message
Devin Carlen (devcamcar) wrote : Posted in a previous version of this proposal

The Brians comments addressed. :) lgtm

review: Approve
Revision history for this message
Vish Ishaya (vishvananda) wrote : Posted in a previous version of this proposal

lgtm

review: Approve
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Posted in a previous version of this proposal

No proposals found for merge of lp:~xtoddx/nova/provider-fw-rules-list into lp:nova.

Revision history for this message
Brian Waldon (bcwaldon) wrote : Posted in a previous version of this proposal

Looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'nova/api/ec2/admin.py'
2--- nova/api/ec2/admin.py 2011-06-14 18:34:03 +0000
3+++ nova/api/ec2/admin.py 2011-06-25 02:03:45 +0000
4@@ -369,3 +369,23 @@
5 raise exception.ApiError(_('Duplicate rule'))
6 self.compute_api.trigger_provider_fw_rules_refresh(context)
7 return {'status': 'OK', 'message': 'Added %s rules' % rules_added}
8+
9+ def describe_external_address_blocks(self, context):
10+ blocks = db.provider_fw_rule_get_all(context)
11+ # NOTE(todd): use a set since we have icmp/udp/tcp rules with same cidr
12+ blocks = set([b.cidr for b in blocks])
13+ blocks = [{'cidr': b} for b in blocks]
14+ return {'externalIpBlockInfo':
15+ list(sorted(blocks, key=lambda k: k['cidr']))}
16+
17+ def remove_external_address_block(self, context, cidr):
18+ LOG.audit(_('Removing ip block from %s'), cidr, context=context)
19+ cidr = urllib.unquote(cidr).decode()
20+ # raise if invalid
21+ netaddr.IPNetwork(cidr)
22+ rules = db.provider_fw_rule_get_all_by_cidr(context, cidr)
23+ for rule in rules:
24+ db.provider_fw_rule_destroy(context, rule['id'])
25+ if rules:
26+ self.compute_api.trigger_provider_fw_rules_refresh(context)
27+ return {'status': 'OK', 'message': 'Deleted %s rules' % len(rules)}
28
29=== modified file 'nova/db/api.py'
30--- nova/db/api.py 2011-06-23 17:01:18 +0000
31+++ nova/db/api.py 2011-06-25 02:03:45 +0000
32@@ -1044,6 +1044,16 @@
33 return IMPL.provider_fw_rule_get_all(context)
34
35
36+def provider_fw_rule_get_all_by_cidr(context, cidr):
37+ """Get all provider-level firewall rules."""
38+ return IMPL.provider_fw_rule_get_all_by_cidr(context, cidr)
39+
40+
41+def provider_fw_rule_destroy(context, rule_id):
42+ """Delete a provider firewall rule from the database."""
43+ return IMPL.provider_fw_rule_destroy(context, rule_id)
44+
45+
46 ###################
47
48
49
50=== modified file 'nova/db/sqlalchemy/api.py'
51--- nova/db/sqlalchemy/api.py 2011-06-23 17:01:18 +0000
52+++ nova/db/sqlalchemy/api.py 2011-06-25 02:03:45 +0000
53@@ -2189,6 +2189,7 @@
54 return fw_rule_ref
55
56
57+@require_admin_context
58 def provider_fw_rule_get_all(context):
59 session = get_session()
60 return session.query(models.ProviderFirewallRule).\
61@@ -2196,6 +2197,26 @@
62 all()
63
64
65+@require_admin_context
66+def provider_fw_rule_get_all_by_cidr(context, cidr):
67+ session = get_session()
68+ return session.query(models.ProviderFirewallRule).\
69+ filter_by(deleted=can_read_deleted(context)).\
70+ filter_by(cidr=cidr).\
71+ all()
72+
73+
74+@require_admin_context
75+def provider_fw_rule_destroy(context, rule_id):
76+ session = get_session()
77+ with session.begin():
78+ session.query(models.ProviderFirewallRule).\
79+ filter_by(id=rule_id).\
80+ update({'deleted': True,
81+ 'deleted_at': utils.utcnow(),
82+ 'updated_at': literal_column('updated_at')})
83+
84+
85 ###################
86
87
88
89=== modified file 'nova/tests/test_adminapi.py'
90--- nova/tests/test_adminapi.py 2011-06-23 17:59:26 +0000
91+++ nova/tests/test_adminapi.py 2011-06-25 02:03:45 +0000
92@@ -85,5 +85,27 @@
93 def test_block_external_ips(self):
94 """Make sure provider firewall rules are created."""
95 result = self.api.block_external_addresses(self.context, '1.1.1.1/32')
96+ self.api.remove_external_address_block(self.context, '1.1.1.1/32')
97 self.assertEqual('OK', result['status'])
98 self.assertEqual('Added 3 rules', result['message'])
99+
100+ def test_list_blocked_ips(self):
101+ """Make sure we can see the external blocks that exist."""
102+ self.api.block_external_addresses(self.context, '1.1.1.2/32')
103+ result = self.api.describe_external_address_blocks(self.context)
104+ num = len(db.provider_fw_rule_get_all(self.context))
105+ self.api.remove_external_address_block(self.context, '1.1.1.2/32')
106+ # we only list IP, not tcp/udp/icmp rules
107+ self.assertEqual(num / 3, len(result['externalIpBlockInfo']))
108+
109+ def test_remove_ip_block(self):
110+ """Remove ip blocks."""
111+ result = self.api.block_external_addresses(self.context, '1.1.1.3/32')
112+ self.assertEqual('OK', result['status'])
113+ num0 = len(db.provider_fw_rule_get_all(self.context))
114+ result = self.api.remove_external_address_block(self.context,
115+ '1.1.1.3/32')
116+ self.assertEqual('OK', result['status'])
117+ self.assertEqual('Deleted 3 rules', result['message'])
118+ num1 = len(db.provider_fw_rule_get_all(self.context))
119+ self.assert_(num1 < num0)
120
121=== modified file 'nova/tests/test_libvirt.py'
122--- nova/tests/test_libvirt.py 2011-06-11 19:14:46 +0000
123+++ nova/tests/test_libvirt.py 2011-06-25 02:03:45 +0000
124@@ -1115,6 +1115,13 @@
125 provjump_rules.append(rule)
126 self.assertEqual(1, len(provjump_rules))
127
128+ # remove a rule from the db, cast to compute to refresh rule
129+ db.provider_fw_rule_destroy(admin_ctxt, provider_fw1['id'])
130+ self.fw.refresh_provider_fw_rules()
131+ rules = [rule for rule in self.fw.iptables.ipv4['filter'].rules
132+ if rule.chain == 'provider']
133+ self.assertEqual(1, len(rules))
134+
135
136 class NWFilterTestCase(test.TestCase):
137 def setUp(self):