diff --git a/openstack_dashboard/api/fwaas.py b/openstack_dashboard/api/fwaas.py
index d8540688a9..e2f327b558 100644
--- a/openstack_dashboard/api/fwaas.py
+++ b/openstack_dashboard/api/fwaas.py
@@ -16,6 +16,8 @@
from __future__ import absolute_import
+from django.utils.datastructures import SortedDict # noqa
+
from openstack_dashboard.api import neutron
neutronclient = neutron.neutronclient
@@ -71,14 +73,33 @@ def rule_create(request, **kwargs):
def rules_list(request, **kwargs):
+ return _rules_list(request, expand_policy=True, **kwargs)
+
+
+def _rules_list(request, expand_policy, **kwargs):
rules = neutronclient(request).list_firewall_rules(
**kwargs).get('firewall_rules')
+ if expand_policy:
+ policies = _policies_list(request, expand_rule=False)
+ policy_dict = SortedDict((p.id, p) for p in policies)
+ for rule in rules:
+ rule['policy'] = policy_dict.get(rule['firewall_policy_id'])
return [Rule(r) for r in rules]
def rule_get(request, rule_id):
+ return _rule_get(request, rule_id, expand_policy=True)
+
+
+def _rule_get(request, rule_id, expand_policy):
rule = neutronclient(request).show_firewall_rule(
rule_id).get('firewall_rule')
+ if expand_policy:
+ if rule['firewall_policy_id']:
+ rule['policy'] = _policy_get(request, rule['firewall_policy_id'],
+ expand_rule=False)
+ else:
+ rule['policy'] = None
return Rule(rule)
@@ -111,14 +132,36 @@ def policy_create(request, **kwargs):
def policies_list(request, **kwargs):
+ return _policies_list(request, expand_rule=True, **kwargs)
+
+
+def _policies_list(request, expand_rule, **kwargs):
policies = neutronclient(request).list_firewall_policies(
**kwargs).get('firewall_policies')
+ if expand_rule:
+ rules = _rules_list(request, expand_policy=False)
+ rule_dict = SortedDict((rule.id, rule) for rule in rules)
+ for p in policies:
+ p['rules'] = [rule_dict.get(rule) for rule in p['firewall_rules']]
return [Policy(p) for p in policies]
def policy_get(request, policy_id):
+ return _policy_get(request, policy_id, expand_rule=True)
+
+
+def _policy_get(request, policy_id, expand_rule):
policy = neutronclient(request).show_firewall_policy(
policy_id).get('firewall_policy')
+ if expand_rule:
+ policy_rules = policy['firewall_rules']
+ if policy_rules:
+ rules = _rules_list(request, expand_policy=False,
+ firewall_policy_id=policy_id)
+ rule_dict = SortedDict((rule.id, rule) for rule in rules)
+ policy['rules'] = [rule_dict.get(rule) for rule in policy_rules]
+ else:
+ policy['rules'] = []
return Policy(policy)
@@ -162,14 +205,34 @@ def firewall_create(request, **kwargs):
def firewalls_list(request, **kwargs):
+ return _firewalls_list(request, expand_policy=True, **kwargs)
+
+
+def _firewalls_list(request, expand_policy, **kwargs):
firewalls = neutronclient(request).list_firewalls(
**kwargs).get('firewalls')
+ if expand_policy:
+ policies = _policies_list(request, expand_rule=False)
+ policy_dict = SortedDict((p.id, p) for p in policies)
+ for fw in firewalls:
+ fw['policy'] = policy_dict.get(fw['firewall_policy_id'])
return [Firewall(f) for f in firewalls]
def firewall_get(request, firewall_id):
+ return _firewall_get(request, firewall_id, expand_policy=True)
+
+
+def _firewall_get(request, firewall_id, expand_policy):
firewall = neutronclient(request).show_firewall(
firewall_id).get('firewall')
+ if expand_policy:
+ policy_id = firewall['firewall_policy_id']
+ if policy_id:
+ firewall['policy'] = _policy_get(request, policy_id,
+ expand_rule=False)
+ else:
+ firewall['policy'] = None
return Firewall(firewall)
diff --git a/openstack_dashboard/dashboards/project/firewalls/forms.py b/openstack_dashboard/dashboards/project/firewalls/forms.py
index 962138b109..2cd81f07f0 100644
--- a/openstack_dashboard/dashboards/project/firewalls/forms.py
+++ b/openstack_dashboard/dashboards/project/firewalls/forms.py
@@ -234,14 +234,18 @@ class InsertRuleToPolicy(forms.SelfHandlingForm):
def handle(self, request, context):
policy_id = self.initial['policy_id']
+ policy_name_or_id = self.initial['name'] or policy_id
try:
- body = {'firewall_rule_id': context['firewall_rule_id'],
+ insert_rule_id = context['firewall_rule_id']
+ insert_rule = api.fwaas.rule_get(request, insert_rule_id)
+ body = {'firewall_rule_id': insert_rule_id,
'insert_before': context['insert_before'],
'insert_after': context['insert_after']}
policy = api.fwaas.policy_insert_rule(request, policy_id, **body)
msg = _('Rule %(rule)s was successfully inserted to policy '
'%(policy)s.' %
- {'rule': context['firewall_rule_id'], 'policy': policy_id})
+ {'rule': insert_rule.name or insert_rule.id,
+ 'policy': policy_name_or_id})
LOG.debug(msg)
messages.success(request, msg)
return policy
@@ -286,13 +290,16 @@ class RemoveRuleFromPolicy(forms.SelfHandlingForm):
def handle(self, request, context):
policy_id = self.initial['policy_id']
+ policy_name_or_id = self.initial['name'] or policy_id
try:
- body = {'firewall_rule_id': context['firewall_rule_id'], }
+ remove_rule_id = context['firewall_rule_id']
+ remove_rule = api.fwaas.rule_get(request, remove_rule_id)
+ body = {'firewall_rule_id': remove_rule_id}
policy = api.fwaas.policy_remove_rule(request, policy_id, **body)
- msg = _('Rule %(rule)s was successfully removed from policy '
+ msg = _('Rule %(rule)s was successfully remove from policy '
'%(policy)s.' %
- {'rule': context['firewall_rule_id'],
- 'policy': self.initial['name']})
+ {'rule': remove_rule.name or remove_rule.id,
+ 'policy': policy_name_or_id})
LOG.debug(msg)
messages.success(request, msg)
return policy
diff --git a/openstack_dashboard/dashboards/project/firewalls/tables.py b/openstack_dashboard/dashboards/project/firewalls/tables.py
index 3708e683f9..948f1618e1 100644
--- a/openstack_dashboard/dashboards/project/firewalls/tables.py
+++ b/openstack_dashboard/dashboards/project/firewalls/tables.py
@@ -18,6 +18,7 @@
import logging
from django.core.urlresolvers import reverse # noqa
+from django.template import defaultfilters as filters
from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import tables
@@ -126,11 +127,28 @@ class RemoveRuleFromPolicyLink(tables.LinkAction):
return base_url
+def get_rules_name(datum):
+ return ', '.join([rule.name or rule.id[:13]
+ for rule in datum.rules])
+
+
+def get_policy_name(datum):
+ if datum.policy:
+ return datum.policy.name or datum.policy.id
+
+
+def get_policy_link(datum):
+ return reverse('horizon:project:firewalls:policydetails',
+ kwargs={'policy_id': datum.policy.id})
+
+
class RulesTable(tables.DataTable):
name = tables.Column("name",
verbose_name=_("Name"),
link="horizon:project:firewalls:ruledetails")
protocol = tables.Column("protocol",
+ filters=(lambda v: filters.default(v, _("ANY")),
+ filters.upper,),
verbose_name=_("Protocol"))
source_ip_address = tables.Column("source_ip_address",
verbose_name=_("Source IP"))
@@ -141,10 +159,12 @@ class RulesTable(tables.DataTable):
destination_port = tables.Column("destination_port",
verbose_name=_("Destination Port"))
action = tables.Column("action",
+ filters=(filters.upper,),
verbose_name=_("Action"))
enabled = tables.Column("enabled",
verbose_name=_("Enabled"))
- firewall_policy_id = tables.Column("firewall_policy_id",
+ firewall_policy_id = tables.Column(get_policy_name,
+ link=get_policy_link,
verbose_name=_("In Policy"))
class Meta:
@@ -158,7 +178,7 @@ class PoliciesTable(tables.DataTable):
name = tables.Column("name",
verbose_name=_("Name"),
link="horizon:project:firewalls:policydetails")
- firewall_rules = tables.Column("firewall_rules",
+ firewall_rules = tables.Column(get_rules_name,
verbose_name=_("Rules"))
audited = tables.Column("audited",
verbose_name=_("Audited"))
@@ -175,7 +195,8 @@ class FirewallsTable(tables.DataTable):
name = tables.Column("name",
verbose_name=_("Name"),
link="horizon:project:firewalls:firewalldetails")
- firewall_policy_id = tables.Column("firewall_policy_id",
+ firewall_policy_id = tables.Column(get_policy_name,
+ link=get_policy_link,
verbose_name=_("Policy"))
status = tables.Column("status",
verbose_name=_("Status"))
diff --git a/openstack_dashboard/dashboards/project/firewalls/tabs.py b/openstack_dashboard/dashboards/project/firewalls/tabs.py
index a04ce94f6a..db6ae687dd 100644
--- a/openstack_dashboard/dashboards/project/firewalls/tabs.py
+++ b/openstack_dashboard/dashboards/project/firewalls/tabs.py
@@ -15,6 +15,7 @@
#
# @author: KC Wang, Big Switch Networks
+from django.core.urlresolvers import reverse_lazy # noqa
from django.utils.translation import ugettext_lazy as _ # noqa
from horizon import exceptions
@@ -96,15 +97,16 @@ class RuleDetailsTab(tabs.Tab):
name = _("Firewall Rule Details")
slug = "ruledetails"
template_name = "project/firewalls/_rule_details.html"
+ failure_url = reverse_lazy('horizon:project:firewalls:index')
def get_context_data(self, request):
rid = self.tab_group.kwargs['rule_id']
try:
rule = api.fwaas.rule_get(request, rid)
except Exception:
- rule = []
exceptions.handle(request,
- _('Unable to retrieve rule details.'))
+ _('Unable to retrieve rule details.'),
+ redirect=self.failure_url)
return {'rule': rule}
@@ -112,15 +114,16 @@ class PolicyDetailsTab(tabs.Tab):
name = _("Firewall Policy Details")
slug = "policydetails"
template_name = "project/firewalls/_policy_details.html"
+ failure_url = reverse_lazy('horizon:project:firewalls:index')
def get_context_data(self, request):
pid = self.tab_group.kwargs['policy_id']
try:
policy = api.fwaas.policy_get(request, pid)
except Exception:
- policy = []
exceptions.handle(request,
- _('Unable to retrieve policy details.'))
+ _('Unable to retrieve policy details.'),
+ redirect=self.failure_url)
return {'policy': policy}
@@ -128,15 +131,16 @@ class FirewallDetailsTab(tabs.Tab):
name = _("Firewall Details")
slug = "firewalldetails"
template_name = "project/firewalls/_firewall_details.html"
+ failure_url = reverse_lazy('horizon:project:firewalls:index')
def get_context_data(self, request):
fid = self.tab_group.kwargs['firewall_id']
try:
firewall = api.fwaas.firewall_get(request, fid)
except Exception:
- firewall = []
- exceptions.handle(self.tab_group.request,
- _('Unable to retrieve firewall details.'))
+ exceptions.handle(request,
+ _('Unable to retrieve firewall details.'),
+ redirect=self.failure_url)
return {'firewall': firewall}
diff --git a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_firewall_details.html b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_firewall_details.html
index ce3a2d8716..d044e37b95 100644
--- a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_firewall_details.html
+++ b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_firewall_details.html
@@ -5,10 +5,10 @@
- {% trans "Name" %}
- - {{ firewall.name|default:_("None") }}
+ - {{ firewall.name|default:_("-") }}
- {% trans "Description" %}
- - {{ firewall.description|default:_("None") }}
+ - {{ firewall.description|default:_("-") }}
- {% trans "ID" %}
- {{ firewall.id }}
@@ -19,13 +19,13 @@
- {% trans "Policy ID" %}
-
{% url 'horizon:project:firewalls:policydetails' firewall.firewall_policy_id as policy_url%}
- {{ firewall.firewall_policy_id }}
+ {{ firewall.policy.name|default:firewall.policy.id }}
- {% trans "Status" %}
- {{ firewall.status }}
- {% trans "Admin State Up" %}
- - {{ firewall.admin_state_up }}
+ - {{ firewall.admin_state_up|yesno|capfirst }}
diff --git a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_policy_details.html b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_policy_details.html
index 619656e1af..3f29aac547 100644
--- a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_policy_details.html
+++ b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_policy_details.html
@@ -1,13 +1,14 @@
{% load i18n sizeformat parse_date %}
+{% load url from future %}
- {% trans "Name" %}
- - {{ policy.name|default:_("None") }}
+ - {{ policy.name|default:_("-") }}
- {% trans "Description" %}
- - {{ policy.description|default:_("None") }}
+ - {{ policy.description|default:_("-") }}
- {% trans "ID" %}
- {{ policy.id }}
@@ -16,12 +17,21 @@
- {{ policy.tenant_id }}
- {% trans "Rules" %}
- - {{ policy.firewall_rules }}
+ -
+ {% if policy.rules %}
+ {% for rule in policy.rules %}
+ {% url 'horizon:project:firewalls:ruledetails' rule.id as rule_url %}
+ {{ rule.position }} : {{ rule.name|default:rule.id }}
+ {% endfor %}
+ {% else %}
+ {% trans "-" %}
+ {% endif %}
+
- {% trans "Shared" %}
- - {{ policy.shared }}
+ - {{ policy.shared|yesno|capfirst }}
- {% trans "Audited" %}
- - {{ policy.audited }}
+ - {{ policy.audited|yesno|capfirst }}
diff --git a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_rule_details.html b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_rule_details.html
index b930e382a6..89858296d7 100644
--- a/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_rule_details.html
+++ b/openstack_dashboard/dashboards/project/firewalls/templates/firewalls/_rule_details.html
@@ -5,10 +5,10 @@
- {% trans "Name" %}
- - {{ rule.name|default:_("None") }}
+ - {{ rule.name|default:_("-") }}
- {% trans "Description" %}
- - {{ rule.description|default:_("None") }}
+ - {{ rule.description|default:_("-") }}
- {% trans "ID" %}
- {{ rule.id }}
@@ -17,36 +17,40 @@
- {{ rule.tenant_id }}
- {% trans "Action" %}
- - {{ rule.action }}
+ - {{ rule.action|upper }}
- {% trans "Protocol" %}
- - {{ rule.protocol }}
+ - {{ rule.protocol|default:_("ANY")|upper }}
- {% trans "Source IP Address" %}
- - {{ rule.source_ip_address }}
+ - {{ rule.source_ip_address|default:_("ANY") }}
- {% trans "Source Port" %}
- - {{ rule.source_port }}
+ - {{ rule.source_port|default:_("ANY") }}
- {% trans "Destination IP Address" %}
- - {{ rule.destination_ip_address }}
+ - {{ rule.destination_ip_address|default:_("ANY") }}
- {% trans "Destination Port"%}
- - {{ rule.destination_port }}
+ - {{ rule.destination_port|default:_("ANY") }}
- {% trans "Used in Policy" %}
-
- {% url 'horizon:project:firewalls:policydetails' rule.firewall_policy_id as policy_url%}
- {{ rule.firewall_policy_id }}
+ {% if rule.policy %}
+ {% url 'horizon:project:firewalls:policydetails' rule.policy.id as policy_url %}
+ {{ rule.policy.name|default:rule.policy.id }}
+ {% else %}
+ {% trans "-" %}
+ {% endif %}
- {% trans "Position in Policy" %}
- - {{ rule.position }}
+ - {{ rule.position|default:_("-") }}
- {% trans "Shared" %}
- - {{ rule.shared }}
+ - {{ rule.shared|yesno|capfirst }}
- {% trans "Enabled" %}
- - {{ rule.enabled }}
+ - {{ rule.enabled|yesno|capfirst }}
diff --git a/openstack_dashboard/dashboards/project/firewalls/tests.py b/openstack_dashboard/dashboards/project/firewalls/tests.py
index 4fca0cb190..2ec5bf537b 100644
--- a/openstack_dashboard/dashboards/project/firewalls/tests.py
+++ b/openstack_dashboard/dashboards/project/firewalls/tests.py
@@ -449,9 +449,8 @@ class FirewallTests(test.TestCase):
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
- @test.create_stubs({api.fwaas: ('policy_get',
- 'policy_insert_rule',
- 'rules_list')})
+ @test.create_stubs({api.fwaas: ('policy_get', 'policy_insert_rule',
+ 'rules_list', 'rule_get')})
def test_policy_insert_rule(self):
policy = self.fw_policies.first()
tenant_id = policy.tenant_id
@@ -472,6 +471,8 @@ class FirewallTests(test.TestCase):
api.fwaas.rules_list(
IsA(http.HttpRequest), tenant_id=tenant_id).AndReturn(rules)
+ api.fwaas.rule_get(
+ IsA(http.HttpRequest), new_rule_id).AndReturn(rules[2])
api.fwaas.policy_insert_rule(IsA(http.HttpRequest), policy.id, **data)\
.AndReturn(policy)
@@ -484,7 +485,7 @@ class FirewallTests(test.TestCase):
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
@test.create_stubs({api.fwaas: ('policy_get', 'policy_remove_rule',
- 'rules_list',)})
+ 'rules_list', 'rule_get')})
def test_policy_remove_rule(self):
policy = self.fw_policies.first()
tenant_id = policy.tenant_id
@@ -508,6 +509,8 @@ class FirewallTests(test.TestCase):
policy.id).AndReturn(policy)
api.fwaas.rules_list(
IsA(http.HttpRequest), tenant_id=tenant_id).AndReturn(rules)
+ api.fwaas.rule_get(
+ IsA(http.HttpRequest), remove_rule_id).AndReturn(rules[0])
api.fwaas.policy_remove_rule(IsA(http.HttpRequest), policy.id, **data)\
.AndReturn(after_remove_policy)
diff --git a/openstack_dashboard/test/api_tests/fwaas_tests.py b/openstack_dashboard/test/api_tests/fwaas_tests.py
index c9c57eb5a9..b326395c1a 100644
--- a/openstack_dashboard/test/api_tests/fwaas_tests.py
+++ b/openstack_dashboard/test/api_tests/fwaas_tests.py
@@ -49,32 +49,46 @@ class FwaasApiTests(test.APITestCase):
self.assertEqual(rule1.name, ret_val.name)
self.assertTrue(ret_val.id)
- @test.create_stubs({neutronclient: ('list_firewall_rules',)})
+ @test.create_stubs({neutronclient: ('list_firewall_rules',
+ 'list_firewall_policies')})
def test_rules_list(self):
- rules = {'firewall_rules': self.fw_rules.list()}
- rules_dict = {'firewall_rules': self.api_fw_rules.list()}
- neutronclient.list_firewall_rules().AndReturn(rules_dict)
+ exp_rules = self.fw_rules.list()
+ api_rules = {'firewall_rules': self.api_fw_rules.list()}
+ api_policies = {'firewall_policies': self.api_fw_policies.list()}
+
+ neutronclient.list_firewall_rules().AndReturn(api_rules)
+ neutronclient.list_firewall_policies().AndReturn(api_policies)
self.mox.ReplayAll()
ret_val = api.fwaas.rules_list(self.request)
- for (v, d) in zip(ret_val, rules['firewall_rules']):
+ for (v, d) in zip(ret_val, exp_rules):
self.assertIsInstance(v, api.fwaas.Rule)
- self.assertTrue(v.name, d.name)
+ self.assertEqual(v.name, d.name)
self.assertTrue(v.id)
+ if d.policy:
+ self.assertEqual(v.policy.id, d.firewall_policy_id)
+ self.assertEqual(v.policy.name, d.policy.name)
+ else:
+ self.assertIsNone(v.policy)
- @test.create_stubs({neutronclient: ('show_firewall_rule',)})
+ @test.create_stubs({neutronclient: ('show_firewall_rule',
+ 'show_firewall_policy')})
def test_rule_get(self):
- rule = self.fw_rules.first()
- rule_dict = self.api_fw_rules.first()
- ret_dict = {'firewall_rule': rule_dict}
+ exp_rule = self.fw_rules.first()
+ ret_dict = {'firewall_rule': self.api_fw_rules.first()}
+ policy_dict = {'firewall_policy': self.api_fw_policies.first()}
- neutronclient.show_firewall_rule(rule.id).AndReturn(ret_dict)
+ neutronclient.show_firewall_rule(exp_rule.id).AndReturn(ret_dict)
+ neutronclient.show_firewall_policy(
+ exp_rule.firewall_policy_id).AndReturn(policy_dict)
self.mox.ReplayAll()
- ret_val = api.fwaas.rule_get(self.request, rule.id)
+ ret_val = api.fwaas.rule_get(self.request, exp_rule.id)
self.assertIsInstance(ret_val, api.fwaas.Rule)
- self.assertEqual(rule.name, ret_val.name)
+ self.assertEqual(exp_rule.name, ret_val.name)
self.assertTrue(ret_val.id)
+ self.assertEqual(ret_val.policy.id, exp_rule.firewall_policy_id)
+ self.assertEqual(ret_val.policy.name, exp_rule.policy.name)
@test.create_stubs({neutronclient: ('update_firewall_rule',)})
def test_rule_update(self):
@@ -137,33 +151,65 @@ class FwaasApiTests(test.APITestCase):
self.assertEqual(policy1.name, ret_val.name)
self.assertTrue(ret_val.id)
- @test.create_stubs({neutronclient: ('list_firewall_policies',)})
+ @test.create_stubs({neutronclient: ('list_firewall_policies',
+ 'list_firewall_rules')})
def test_policies_list(self):
- policies = {'firewall_policies': self.fw_policies.list()}
+ exp_policies = self.fw_policies.list()
policies_dict = {'firewall_policies': self.api_fw_policies.list()}
+ rules_dict = {'firewall_rules': self.api_fw_rules.list()}
neutronclient.list_firewall_policies().AndReturn(policies_dict)
+ neutronclient.list_firewall_rules().AndReturn(rules_dict)
self.mox.ReplayAll()
ret_val = api.fwaas.policies_list(self.request)
- for (v, d) in zip(ret_val, policies['firewall_policies']):
+ for (v, d) in zip(ret_val, exp_policies):
self.assertIsInstance(v, api.fwaas.Policy)
- self.assertTrue(v.name, d.name)
+ self.assertEqual(v.name, d.name)
self.assertTrue(v.id)
+ self.assertEqual(len(d.firewall_rules), len(v.rules))
+ self.assertEqual(len(d.firewall_rules), len(v.firewall_rules))
+ for (r, exp_r) in zip(v.rules, d.rules):
+ self.assertEqual(r.id, exp_r.id)
- @test.create_stubs({neutronclient: ('show_firewall_policy',)})
+ @test.create_stubs({neutronclient: ('show_firewall_policy',
+ 'list_firewall_rules')})
def test_policy_get(self):
- policy = self.fw_policies.first()
+ exp_policy = self.fw_policies.first()
policy_dict = self.api_fw_policies.first()
+ # The first two rules are associated with the first policy.
+ api_rules = self.api_fw_rules.list()[:2]
ret_dict = {'firewall_policy': policy_dict}
- neutronclient.show_firewall_policy(policy.id).AndReturn(ret_dict)
+ neutronclient.show_firewall_policy(exp_policy.id).AndReturn(ret_dict)
+ filters = {'firewall_policy_id': exp_policy.id}
+ ret_dict = {'firewall_rules': api_rules}
+ neutronclient.list_firewall_rules(**filters).AndReturn(ret_dict)
self.mox.ReplayAll()
- ret_val = api.fwaas.policy_get(self.request, policy.id)
+ ret_val = api.fwaas.policy_get(self.request, exp_policy.id)
self.assertIsInstance(ret_val, api.fwaas.Policy)
- self.assertEqual(policy.name, ret_val.name)
+ self.assertEqual(exp_policy.name, ret_val.name)
self.assertTrue(ret_val.id)
+ self.assertEqual(len(exp_policy.rules), len(ret_val.rules))
+ for (exp, ret) in zip(exp_policy.rules, ret_val.rules):
+ self.assertEqual(exp.id, ret.id)
+
+ @test.create_stubs({neutronclient: ('show_firewall_policy',)})
+ def test_policy_get_no_rule(self):
+ # 2nd policy is not associated with any rules.
+ exp_policy = self.fw_policies.list()[1]
+ policy_dict = self.api_fw_policies.list()[1]
+
+ ret_dict = {'firewall_policy': policy_dict}
+ neutronclient.show_firewall_policy(exp_policy.id).AndReturn(ret_dict)
+ self.mox.ReplayAll()
+
+ ret_val = api.fwaas.policy_get(self.request, exp_policy.id)
+ self.assertIsInstance(ret_val, api.fwaas.Policy)
+ self.assertEqual(exp_policy.name, ret_val.name)
+ self.assertTrue(ret_val.id)
+ self.assertFalse(len(ret_val.rules))
@test.create_stubs({neutronclient: ('update_firewall_policy',)})
def test_policy_update(self):
@@ -218,7 +264,7 @@ class FwaasApiTests(test.APITestCase):
ret_val = api.fwaas.policy_insert_rule(self.request,
policy.id, **body)
- self.assertTrue(new_rule_id in ret_val.firewall_rules)
+ self.assertIn(new_rule_id, ret_val.firewall_rules)
@test.create_stubs({neutronclient: ('firewall_policy_remove_rule',)})
def test_policy_remove_rule(self):
@@ -226,7 +272,7 @@ class FwaasApiTests(test.APITestCase):
policy_dict = self.api_fw_policies.first()
remove_rule_id = policy.firewall_rules[0]
- policy.firewall_rules.remove(remove_rule_id)
+ policy_dict['firewall_rules'].remove(remove_rule_id)
body = {'firewall_rule_id': remove_rule_id}
@@ -236,7 +282,7 @@ class FwaasApiTests(test.APITestCase):
ret_val = api.fwaas.policy_remove_rule(self.request,
policy.id, **body)
- self.assertFalse(remove_rule_id in ret_val.firewall_rules)
+ self.assertNotIn(remove_rule_id, ret_val.firewall_rules)
@test.create_stubs({neutronclient: ('create_firewall', )})
def test_firewall_create(self):
@@ -260,34 +306,43 @@ class FwaasApiTests(test.APITestCase):
self.assertEqual(firewall.name, ret_val.name)
self.assertTrue(ret_val.id)
- @test.create_stubs({neutronclient: ('list_firewalls',)})
+ @test.create_stubs({neutronclient: ('list_firewalls',
+ 'list_firewall_policies')})
def test_firewalls_list(self):
- firewalls = {'firewalls': self.firewalls.list()}
+ exp_firewalls = self.firewalls.list()
firewalls_dict = {'firewalls': self.api_firewalls.list()}
+ policies_dict = {'firewall_policies': self.api_fw_policies.list()}
neutronclient.list_firewalls().AndReturn(firewalls_dict)
+ neutronclient.list_firewall_policies().AndReturn(policies_dict)
self.mox.ReplayAll()
ret_val = api.fwaas.firewalls_list(self.request)
- for (v, d) in zip(ret_val, firewalls['firewalls']):
+ for (v, d) in zip(ret_val, exp_firewalls):
self.assertIsInstance(v, api.fwaas.Firewall)
- self.assertTrue(v.name, d.name)
+ self.assertEqual(v.name, d.name)
self.assertTrue(v.id)
+ self.assertEqual(v.policy.id, d.firewall_policy_id)
+ self.assertEqual(v.policy.name, d.policy.name)
- @test.create_stubs({neutronclient: ('show_firewall',)})
+ @test.create_stubs({neutronclient: ('show_firewall',
+ 'show_firewall_policy')})
def test_firewall_get(self):
- firewall = self.firewalls.first()
- firewall_dict = self.api_firewalls.first()
+ exp_firewall = self.firewalls.first()
+ ret_dict = {'firewall': self.api_firewalls.first()}
+ policy_dict = {'firewall_policy': self.api_fw_policies.first()}
- ret_dict = {'firewall': firewall_dict}
-
- neutronclient.show_firewall(firewall.id).AndReturn(ret_dict)
+ neutronclient.show_firewall(exp_firewall.id).AndReturn(ret_dict)
+ neutronclient.show_firewall_policy(
+ exp_firewall.firewall_policy_id).AndReturn(policy_dict)
self.mox.ReplayAll()
- ret_val = api.fwaas.firewall_get(self.request, firewall.id)
+ ret_val = api.fwaas.firewall_get(self.request, exp_firewall.id)
self.assertIsInstance(ret_val, api.fwaas.Firewall)
- self.assertEqual(firewall.name, ret_val.name)
+ self.assertEqual(exp_firewall.name, ret_val.name)
self.assertTrue(ret_val.id)
+ self.assertEqual(ret_val.policy.id, exp_firewall.firewall_policy_id)
+ self.assertEqual(ret_val.policy.name, exp_firewall.policy.name)
@test.create_stubs({neutronclient: ('update_firewall',)})
def test_firewall_update(self):
diff --git a/openstack_dashboard/test/test_data/neutron_data.py b/openstack_dashboard/test/test_data/neutron_data.py
index de40fc398a..e166967ba9 100644
--- a/openstack_dashboard/test/test_data/neutron_data.py
+++ b/openstack_dashboard/test/test_data/neutron_data.py
@@ -721,7 +721,7 @@ def data(TEST):
# FWaaS
- # 1st rule
+ # 1st rule (used by 1st policy)
rule1_dict = {'id': 'f0881d38-c3eb-4fee-9763-12de3338041d',
'tenant_id': '1',
'name': 'rule1',
@@ -737,13 +737,16 @@ def data(TEST):
'shared': True,
'enabled': True}
TEST.api_fw_rules.add(rule1_dict)
- TEST.fw_rules.add(fwaas.Rule(rule1_dict))
- # 2nd rule
- rule2_dict = {'id': 'g0881d38-c3eb-4fee-9763-12de3338041d',
+ rule1 = fwaas.Rule(copy.deepcopy(rule1_dict))
+ # NOTE: rule1['policy'] is set below
+ TEST.fw_rules.add(rule1)
+
+ # 2nd rule (used by 2nd policy; no name)
+ rule2_dict = {'id': 'c6298a93-850f-4f64-b78a-959fd4f1e5df',
'tenant_id': '1',
- 'name': 'rule2',
- 'description': 'rule2 description',
+ 'name': '',
+ 'description': '',
'protocol': 'udp',
'action': 'deny',
'source_ip_address': '1.2.3.0/24',
@@ -755,9 +758,12 @@ def data(TEST):
'shared': True,
'enabled': True}
TEST.api_fw_rules.add(rule2_dict)
- TEST.fw_rules.add(fwaas.Rule(rule2_dict))
- # 3rd rule
+ rule2 = fwaas.Rule(copy.deepcopy(rule2_dict))
+ # NOTE: rule2['policy'] is set below
+ TEST.fw_rules.add(rule2)
+
+ # 3rd rule (not used by any policy)
rule3_dict = {'id': 'h0881d38-c3eb-4fee-9763-12de3338041d',
'tenant_id': '1',
'name': 'rule3',
@@ -773,28 +779,72 @@ def data(TEST):
'shared': True,
'enabled': True}
TEST.api_fw_rules.add(rule3_dict)
- TEST.fw_rules.add(fwaas.Rule(rule3_dict))
- # 1st policy
- policy_dict = {'id': 'abcdef-c3eb-4fee-9763-12de3338041e',
- 'tenant_id': '1',
- 'name': 'policy1',
- 'description': 'policy description',
- 'firewall_rules': [rule1_dict['id'], rule2_dict['id']],
- 'audited': True,
- 'shared': True}
- TEST.api_fw_policies.add(policy_dict)
- TEST.fw_policies.add(fwaas.Policy(policy_dict))
+ rule3 = fwaas.Rule(copy.deepcopy(rule3_dict))
+ # rule3 is not associated with any rules
+ rule3._apidict['policy'] = None
+ TEST.fw_rules.add(rule3)
+
+ # 1st policy (associated with 2 rules)
+ policy1_dict = {'id': 'abcdef-c3eb-4fee-9763-12de3338041e',
+ 'tenant_id': '1',
+ 'name': 'policy1',
+ 'description': 'policy with two rules',
+ 'firewall_rules': [rule1_dict['id'], rule2_dict['id']],
+ 'audited': True,
+ 'shared': True}
+ TEST.api_fw_policies.add(policy1_dict)
+
+ policy1 = fwaas.Policy(copy.deepcopy(policy1_dict))
+ policy1._apidict['rules'] = [rule1, rule2]
+ TEST.fw_policies.add(policy1)
+
+ # Reverse relations (rule -> policy)
+ rule1._apidict['policy'] = policy1
+ rule2._apidict['policy'] = policy1
+
+ # 2nd policy (associated with no rules; no name)
+ policy2_dict = {'id': 'cf50b331-787a-4623-825e-da794c918d6a',
+ 'tenant_id': '1',
+ 'name': '',
+ 'description': '',
+ 'firewall_rules': [],
+ 'audited': False,
+ 'shared': False}
+ TEST.api_fw_policies.add(policy2_dict)
+
+ policy2 = fwaas.Policy(copy.deepcopy(policy2_dict))
+ policy2._apidict['rules'] = []
+ TEST.fw_policies.add(policy2)
# 1st firewall
- firewall_dict = {'id': '8913dde8-4915-4b90-8d3e-b95eeedb0d49',
- 'tenant_id': '1',
- 'firewall_policy_id':
- 'abcdef-c3eb-4fee-9763-12de3338041e',
- 'name': 'firewall1',
- 'description': 'firewall description',
- 'status': 'PENDING_CREATE',
- 'shared': True,
- 'admin_state_up': True}
- TEST.api_firewalls.add(firewall_dict)
- TEST.firewalls.add(fwaas.Firewall(firewall_dict))
+ fw1_dict = {'id': '8913dde8-4915-4b90-8d3e-b95eeedb0d49',
+ 'tenant_id': '1',
+ 'firewall_policy_id':
+ 'abcdef-c3eb-4fee-9763-12de3338041e',
+ 'name': 'firewall1',
+ 'description': 'firewall description',
+ 'status': 'PENDING_CREATE',
+ 'shared': True,
+ 'admin_state_up': True}
+ TEST.api_firewalls.add(fw1_dict)
+
+ fw1 = fwaas.Firewall(copy.deepcopy(fw1_dict))
+ fw1._apidict['policy'] = policy1
+ TEST.firewalls.add(fw1)
+
+ # 2nd firewall (no name)
+ fw2_dict = {'id': '1aa75150-415f-458e-bae5-5a362a4fb1f7',
+ 'tenant_id': '1',
+ 'firewall_policy_id':
+ 'abcdef-c3eb-4fee-9763-12de3338041e',
+ 'name': '',
+ 'description': '',
+ 'status': 'PENDING_CREATE',
+ 'shared': True,
+ 'admin_state_up': True}
+ TEST.api_firewalls.add(fw1_dict)
+
+ fw2 = fwaas.Firewall(copy.deepcopy(fw2_dict))
+ fw2._apidict['policy'] = policy1
+ TEST.firewalls.add(fw1)