~ubuntu-branches/ubuntu/saucy/horizon/saucy-updates

« back to all changes in this revision

Viewing changes to openstack_dashboard/dashboards/project/firewalls/workflows.py

  • Committer: Package Import Robot
  • Author(s): James Page, James Page, Chuck Short
  • Date: 2013-10-03 13:48:12 UTC
  • mfrom: (1.1.31)
  • Revision ID: package-import@ubuntu.com-20131003134812-2vkwosem4flwuk5y
Tags: 1:2013.2~rc1-0ubuntu1
[ James Page ]
* New upstream release candidate:
  - d/static: Refreshed static assets for 2013.2~rc1.
  - d/patches: Refreshed patches.

[ Chuck Short ]
* debian/control: Add python-lesscpy as a suggests to optionally
  support online compression of static assets (LP: #1226674).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
 
2
#    Copyright 2013, Big Switch Networks, Inc.
 
3
#
 
4
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
 
5
#    not use this file except in compliance with the License. You may obtain
 
6
#    a copy of the License at
 
7
#
 
8
#         http://www.apache.org/licenses/LICENSE-2.0
 
9
#
 
10
#    Unless required by applicable law or agreed to in writing, software
 
11
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 
12
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 
13
#    License for the specific language governing permissions and limitations
 
14
#    under the License.
 
15
#
 
16
# @author: KC Wang, Big Switch Networks
 
17
 
 
18
from django.utils.translation import ugettext_lazy as _  # noqa
 
19
 
 
20
from horizon import exceptions
 
21
from horizon import forms
 
22
from horizon.utils import fields
 
23
from horizon.utils import validators
 
24
from horizon import workflows
 
25
 
 
26
from openstack_dashboard import api
 
27
 
 
28
port_validator = validators.validate_port_or_colon_separated_port_range
 
29
 
 
30
 
 
31
class AddRuleAction(workflows.Action):
 
32
    name = forms.CharField(
 
33
        max_length=80,
 
34
        label=_("Name"),
 
35
        required=False)
 
36
    description = forms.CharField(
 
37
        max_length=80,
 
38
        label=_("Description"),
 
39
        required=False)
 
40
    protocol = forms.ChoiceField(
 
41
        label=_("Protocol"),
 
42
        choices=[('tcp', _('TCP')),
 
43
                 ('udp', _('UDP')),
 
44
                 ('icmp', _('ICMP')),
 
45
                 ('any', _('ANY'))],)
 
46
    action = forms.ChoiceField(
 
47
        label=_("Action"),
 
48
        choices=[('allow', _('ALLOW')),
 
49
                 ('deny', _('DENY'))],)
 
50
    source_ip_address = fields.IPField(
 
51
        label=_("Source IP Address/Subnet"),
 
52
        version=fields.IPv4 | fields.IPv6,
 
53
        required=False, mask=True)
 
54
    destination_ip_address = fields.IPField(
 
55
        label=_("Destination IP Address/Subnet"),
 
56
        version=fields.IPv4 | fields.IPv6,
 
57
        required=False, mask=True)
 
58
    source_port = forms.CharField(
 
59
        max_length=80,
 
60
        label=_("Source Port/Port Range"),
 
61
        required=False,
 
62
        validators=[port_validator])
 
63
    destination_port = forms.CharField(
 
64
        max_length=80,
 
65
        label=_("Destination Port/Port Range"),
 
66
        required=False,
 
67
        validators=[port_validator])
 
68
    shared = forms.BooleanField(
 
69
        label=_("Shared"), initial=False, required=False)
 
70
    enabled = forms.BooleanField(
 
71
        label=_("Enabled"), initial=True, required=False)
 
72
 
 
73
    def __init__(self, request, *args, **kwargs):
 
74
        super(AddRuleAction, self).__init__(request, *args, **kwargs)
 
75
 
 
76
    class Meta:
 
77
        name = _("AddRule")
 
78
        permissions = ('openstack.services.network',)
 
79
        help_text = _("Create a firewall rule.\n\n"
 
80
                      "Protocol and action must be specified. "
 
81
                      "Other fields are optional.")
 
82
 
 
83
 
 
84
class AddRuleStep(workflows.Step):
 
85
    action_class = AddRuleAction
 
86
    contributes = ("name", "description", "protocol", "action",
 
87
                   "source_ip_address", "source_port",
 
88
                   "destination_ip_address", "destination_port",
 
89
                   "enabled", "shared")
 
90
 
 
91
    def contribute(self, data, context):
 
92
        context = super(AddRuleStep, self).contribute(data, context)
 
93
        if data:
 
94
            if context['protocol'] == 'any':
 
95
                del context['protocol']
 
96
            for field in ['source_port',
 
97
                          'destination_port',
 
98
                          'source_ip_address',
 
99
                          'destination_ip_address']:
 
100
                if not context[field]:
 
101
                    del context[field]
 
102
            return context
 
103
 
 
104
 
 
105
class AddRule(workflows.Workflow):
 
106
    slug = "addrule"
 
107
    name = _("Add Rule")
 
108
    finalize_button_name = _("Add")
 
109
    success_message = _('Added Rule "%s".')
 
110
    failure_message = _('Unable to add Rule "%s".')
 
111
    success_url = "horizon:project:firewalls:index"
 
112
    # fwaas is designed to support a wide range of vendor
 
113
    # firewalls. Considering the multitude of vendor firewall
 
114
    # features in place today, firewall_rule definition can
 
115
    # involve more complex configuration over time. Hence,
 
116
    # a workflow instead of a single form is used for
 
117
    # firewall_rule add to be ready for future extension.
 
118
    default_steps = (AddRuleStep,)
 
119
 
 
120
    def format_status_message(self, message):
 
121
        return message % self.context.get('name')
 
122
 
 
123
    def handle(self, request, context):
 
124
        try:
 
125
            api.fwaas.rule_create(request, **context)
 
126
            return True
 
127
        except Exception as e:
 
128
            msg = self.format_status_message(self.failure_message) + str(e)
 
129
            exceptions.handle(request, msg)
 
130
            return False
 
131
 
 
132
 
 
133
class SelectRulesAction(workflows.Action):
 
134
    rule = forms.MultipleChoiceField(
 
135
        label=_("Rules"),
 
136
        required=False,
 
137
        widget=forms.CheckboxSelectMultiple(),
 
138
        help_text=_("Create a policy with selected rules."))
 
139
 
 
140
    class Meta:
 
141
        name = _("Rules")
 
142
        permissions = ('openstack.services.network',)
 
143
        help_text = _("Select rules for your policy.")
 
144
 
 
145
    def populate_rule_choices(self, request, context):
 
146
        try:
 
147
            tenant_id = self.request.user.tenant_id
 
148
            rules = api.fwaas.rules_list(request, tenant_id=tenant_id)
 
149
            for r in rules:
 
150
                r.set_id_as_name_if_empty()
 
151
            rules = sorted(rules,
 
152
                           key=lambda rule: rule.name)
 
153
            rule_list = [(rule.id, rule.name) for rule in rules
 
154
                         if not rule.firewall_policy_id]
 
155
        except Exception as e:
 
156
            rule_list = []
 
157
            exceptions.handle(request,
 
158
                              _('Unable to retrieve rules.') + str(e))
 
159
        return rule_list
 
160
 
 
161
 
 
162
class SelectRulesStep(workflows.Step):
 
163
    action_class = SelectRulesAction
 
164
    template_name = "project/firewalls/_update_rules.html"
 
165
    contributes = ("firewall_rules",)
 
166
 
 
167
    def contribute(self, data, context):
 
168
        if data:
 
169
            rules = self.workflow.request.POST.getlist("rule")
 
170
            if rules:
 
171
                rules = [r for r in rules if r != '']
 
172
                context['firewall_rules'] = rules
 
173
            return context
 
174
 
 
175
 
 
176
class AddPolicyAction(workflows.Action):
 
177
    name = forms.CharField(max_length=80,
 
178
                           label=_("Name"),
 
179
                           required=True)
 
180
    description = forms.CharField(max_length=80,
 
181
                                  label=_("Description"),
 
182
                                  required=False)
 
183
    shared = forms.BooleanField(label=_("Shared"),
 
184
                                initial=False,
 
185
                                required=False)
 
186
    audited = forms.BooleanField(label=_("Audited"),
 
187
                                 initial=False,
 
188
                                 required=False)
 
189
 
 
190
    def __init__(self, request, *args, **kwargs):
 
191
        super(AddPolicyAction, self).__init__(request, *args, **kwargs)
 
192
 
 
193
    class Meta:
 
194
        name = _("AddPolicy")
 
195
        permissions = ('openstack.services.network',)
 
196
        help_text = _("Create a firewall policy with an ordered list "
 
197
                      "of firewall rules.\n\n"
 
198
                      "A name must be given. Firewall rules are "
 
199
                      "added in the order placed under the Rules tab.")
 
200
 
 
201
 
 
202
class AddPolicyStep(workflows.Step):
 
203
    action_class = AddPolicyAction
 
204
    contributes = ("name", "description", "shared", "audited")
 
205
 
 
206
    def contribute(self, data, context):
 
207
        context = super(AddPolicyStep, self).contribute(data, context)
 
208
        if data:
 
209
            return context
 
210
 
 
211
 
 
212
class AddPolicy(workflows.Workflow):
 
213
    slug = "addpolicy"
 
214
    name = _("Add Policy")
 
215
    finalize_button_name = _("Add")
 
216
    success_message = _('Added Policy "%s".')
 
217
    failure_message = _('Unable to add Policy "%s".')
 
218
    success_url = "horizon:project:firewalls:index"
 
219
    default_steps = (AddPolicyStep, SelectRulesStep)
 
220
 
 
221
    def format_status_message(self, message):
 
222
        return message % self.context.get('name')
 
223
 
 
224
    def handle(self, request, context):
 
225
        try:
 
226
            api.fwaas.policy_create(request, **context)
 
227
            return True
 
228
        except Exception as e:
 
229
            msg = self.format_status_message(self.failure_message) + str(e)
 
230
            exceptions.handle(request, msg)
 
231
            return False
 
232
 
 
233
 
 
234
class AddFirewallAction(workflows.Action):
 
235
    name = forms.CharField(max_length=80,
 
236
                           label=_("Name"),
 
237
                           required=False)
 
238
    description = forms.CharField(max_length=80,
 
239
                                  label=_("Description"),
 
240
                                  required=False)
 
241
    firewall_policy_id = forms.ChoiceField(label=_("Policy"),
 
242
                                           required=True)
 
243
    shared = forms.BooleanField(label=_("Shared"),
 
244
                                initial=False,
 
245
                                required=False)
 
246
    admin_state_up = forms.BooleanField(label=_("Admin State"),
 
247
                                        initial=True,
 
248
                                        required=False)
 
249
 
 
250
    def __init__(self, request, *args, **kwargs):
 
251
        super(AddFirewallAction, self).__init__(request, *args, **kwargs)
 
252
 
 
253
        firewall_policy_id_choices = [('', _("Select a Policy"))]
 
254
        try:
 
255
            tenant_id = self.request.user.tenant_id
 
256
            policies = api.fwaas.policies_list(request, tenant_id=tenant_id)
 
257
            policies = sorted(policies, key=lambda policy: policy.name)
 
258
        except Exception as e:
 
259
            exceptions.handle(request,
 
260
                              _('Unable to retrieve policy list.') + str(e))
 
261
            policies = []
 
262
        for p in policies:
 
263
            p.set_id_as_name_if_empty()
 
264
            firewall_policy_id_choices.append((p.id, p.name))
 
265
        self.fields['firewall_policy_id'].choices = firewall_policy_id_choices
 
266
        # only admin can set 'shared' attribute to True
 
267
        if not request.user.is_superuser:
 
268
            self.fields['shared'].widget.attrs['disabled'] = 'disabled'
 
269
 
 
270
    class Meta:
 
271
        name = _("AddFirewall")
 
272
        permissions = ('openstack.services.network',)
 
273
        help_text = _("Create a firewall based on a policy.\n\n"
 
274
                      "A policy must be selected. "
 
275
                      "Other fields are optional.")
 
276
 
 
277
 
 
278
class AddFirewallStep(workflows.Step):
 
279
    action_class = AddFirewallAction
 
280
    contributes = ("name", "firewall_policy_id", "description",
 
281
                   "shared", "admin_state_up")
 
282
 
 
283
    def contribute(self, data, context):
 
284
        context = super(AddFirewallStep, self).contribute(data, context)
 
285
        return context
 
286
 
 
287
 
 
288
class AddFirewall(workflows.Workflow):
 
289
    slug = "addfirewall"
 
290
    name = _("Add Firewall")
 
291
    finalize_button_name = _("Add")
 
292
    success_message = _('Added Firewall "%s".')
 
293
    failure_message = _('Unable to add Firewall "%s".')
 
294
    success_url = "horizon:project:firewalls:index"
 
295
    # fwaas is designed to support a wide range of vendor
 
296
    # firewalls. Considering the multitude of vendor firewall
 
297
    # features in place today, firewall definition can
 
298
    # involve more complex configuration over time. Hence,
 
299
    # a workflow instead of a single form is used for
 
300
    # firewall_rule add to be ready for future extension.
 
301
    default_steps = (AddFirewallStep,)
 
302
 
 
303
    def format_status_message(self, message):
 
304
        return message % self.context.get('name')
 
305
 
 
306
    def handle(self, request, context):
 
307
        try:
 
308
            api.fwaas.firewall_create(request, **context)
 
309
            return True
 
310
        except Exception as e:
 
311
            msg = self.format_status_message(self.failure_message) + str(e)
 
312
            exceptions.handle(request, msg)
 
313
            return False