diff --git a/neutronclient/neutron/v2_0/fw/firewallpolicy.py b/neutronclient/neutron/v2_0/fw/firewallpolicy.py index f2f147337..32f25eba9 100644 --- a/neutronclient/neutron/v2_0/fw/firewallpolicy.py +++ b/neutronclient/neutron/v2_0/fw/firewallpolicy.py @@ -33,6 +33,29 @@ def _format_firewall_rules(firewall_policy): return '' +def common_add_known_arguments(parser): + parser.add_argument( + '--firewall-rules', type=lambda x: x.split(), + help=_('Ordered list of whitespace-delimited firewall rule ' + 'names or IDs; e.g., --firewall-rules \"rule1 rule2\"')) + + +def common_args2body(client, parsed_args): + if parsed_args.firewall_rules: + _firewall_rules = [] + for f in parsed_args.firewall_rules: + _firewall_rules.append( + neutronv20.find_resourceid_by_name_or_id( + client, 'firewall_rule', f)) + body = {'firewall_policy': {'firewall_rules': _firewall_rules}} + else: + body = {'firewall_policy': {}} + neutronv20.update_dict(parsed_args, body['firewall_policy'], + ['name', 'description', 'shared', + 'audited', 'tenant_id']) + return body + + class ListFirewallPolicy(neutronv20.ListCommand): """List firewall policies that belong to a given tenant.""" @@ -69,10 +92,7 @@ class CreateFirewallPolicy(neutronv20.CreateCommand): action='store_true', help=_('Create a shared policy.'), default=argparse.SUPPRESS) - parser.add_argument( - '--firewall-rules', type=lambda x: x.split(), - help=_('Ordered list of whitespace-delimited firewall rule ' - 'names or IDs; e.g., --firewall-rules \"rule1 rule2\"')) + common_add_known_arguments(parser) parser.add_argument( '--audited', action='store_true', @@ -80,22 +100,7 @@ class CreateFirewallPolicy(neutronv20.CreateCommand): default=argparse.SUPPRESS) def args2body(self, parsed_args): - if parsed_args.firewall_rules: - _firewall_rules = [] - for f in parsed_args.firewall_rules: - _firewall_rules.append( - neutronv20.find_resourceid_by_name_or_id( - self.get_client(), 'firewall_rule', f)) - body = {self.resource: { - 'firewall_rules': _firewall_rules, - }, - } - else: - body = {self.resource: {}} - neutronv20.update_dict(parsed_args, body[self.resource], - ['name', 'description', 'shared', - 'audited', 'tenant_id']) - return body + return common_args2body(self.get_client(), parsed_args) class UpdateFirewallPolicy(neutronv20.UpdateCommand): @@ -103,6 +108,12 @@ class UpdateFirewallPolicy(neutronv20.UpdateCommand): resource = 'firewall_policy' + def add_known_arguments(self, parser): + common_add_known_arguments(parser) + + def args2body(self, parsed_args): + return common_args2body(self.get_client(), parsed_args) + class DeleteFirewallPolicy(neutronv20.DeleteCommand): """Delete a given firewall policy.""" diff --git a/neutronclient/tests/unit/fw/test_cli20_firewallpolicy.py b/neutronclient/tests/unit/fw/test_cli20_firewallpolicy.py index 272a98cda..a8786dbbc 100644 --- a/neutronclient/tests/unit/fw/test_cli20_firewallpolicy.py +++ b/neutronclient/tests/unit/fw/test_cli20_firewallpolicy.py @@ -133,6 +133,18 @@ class CLITestV20FirewallPolicyJSON(test_cli20.CLITestV20Base): ['myid', '--name', 'newname'], {'name': 'newname', }) + def test_update_firewall_policy_with_rules(self): + """firewall-policy-update myid --firewall-rules "rule1 rule2".""" + resource = 'firewall_policy' + cmd = firewallpolicy.UpdateFirewallPolicy(test_cli20.MyApp(sys.stdout), + None) + firewall_rules_arg = u'rule_id3 rule_id4' + firewall_rules_res = ['rule_id3', 'rule_id4'] + self._test_update_resource( + resource, cmd, 'myid', + ['myid', '--firewall-rules', firewall_rules_arg], + {'firewall_rules': firewall_rules_res, }) + def test_delete_firewall_policy(self): """firewall-policy-delete my-id.""" resource = 'firewall_policy'