group-based-policy-ui/gbpui/panels/policytargets/forms.py

637 lines
29 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import logging
from django.core.urlresolvers import reverse
from django import http
from django.utils import html
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from gbpui import client
from gbpui import fields
LOG = logging.getLogger(__name__)
class UpdatePolicyTargetForm(forms.SelfHandlingForm):
name = forms.CharField(max_length=80,
label=_("Name"), required=False)
description = forms.CharField(max_length=80,
label=_("Description"), required=False)
provided_policy_rule_sets = fields.TransferTableField(
label=_("Provided Policy Rule Set"), required=False
)
consumed_policy_rule_sets = fields.TransferTableField(
label=_("Consumed Policy Rule Set"), required=False
)
l2_policy_id = forms.ChoiceField(
label=_("Network Policy"),
required=False,
help_text=_("Select network policy for Group."))
network_service_policy_id = forms.ChoiceField(
label=_("Network Services Policy"),
required=False,
help_text=_("Select network services policy for Group."))
shared = forms.BooleanField(label=_("Shared"), required=False)
failure_url = 'horizon:project:policytargets:index'
def __init__(self, request, *args, **kwargs):
super(UpdatePolicyTargetForm, self).__init__(request, *args, **kwargs)
try:
policy_target_id = self.initial['policy_target_id']
policy_target = client.policy_target_get(request, policy_target_id)
policy_rule_sets = client.policy_rule_set_list(request,
tenant_id=request.user.tenant_id)
for c in policy_rule_sets:
c.set_id_as_name_if_empty()
policy_rule_sets = sorted(
policy_rule_sets, key=lambda rule: rule.name)
policy_rule_set_list = [(c.id, c.name) for c in policy_rule_sets]
self.fields[
'provided_policy_rule_sets'].choices = policy_rule_set_list
self.fields[
'consumed_policy_rule_sets'].choices = policy_rule_set_list
provided_init = []
consumed_init = []
for item in policy_rule_set_list:
if item[0] in policy_target.provided_policy_rule_sets:
provided_init.append(item[0])
if item[0] in policy_target.consumed_policy_rule_sets:
consumed_init.append(item[0])
self.fields['provided_policy_rule_sets'].initial = provided_init
self.fields['consumed_policy_rule_sets'].initial = consumed_init
n_policies = client.l2policy_list(request,
tenant_id=request.user.tenant_id)
ns_policies = client.networkservicepolicy_list(request,
tenant_id=request.user.tenant_id)
n_policies = [(item.id, item.name) for item in n_policies]
ns_policies = [(item.id, item.name) for item in ns_policies]
ns_policies.insert(0, ('None', 'None'))
self.fields['l2_policy_id'].choices = n_policies
self.fields['network_service_policy_id'].choices = ns_policies
for i in ['name',
'description',
'l2_policy_id',
'network_service_policy_id',
'shared']:
self.fields[i].initial = getattr(policy_target, i)
except Exception as e:
msg = _('Unable to retrieve policy_rule_set details. %s') % (
str(e))
exceptions.handle(request, msg)
pass
def clean(self):
cleaned_data = super(UpdatePolicyTargetForm, self).clean()
updated_data = {d: cleaned_data[d] for d in cleaned_data
if d in self.changed_data}
return updated_data
def handle(self, request, context):
policy_target_id = self.initial['policy_target_id']
name_or_id = context.get('name') or policy_target_id
try:
if 'provided_policy_rule_sets' in context:
if context.get('provided_policy_rule_sets'):
context['provided_policy_rule_sets'] = dict(
[(i, 'string')
for i in context['provided_policy_rule_sets']])
else:
context['provided_policy_rule_sets'] = None
if 'consumed_policy_rule_sets' in context:
if context.get('consumed_policy_rule_sets'):
context['consumed_policy_rule_sets'] = dict(
[(i, 'string')
for i in context['consumed_policy_rule_sets']])
else:
context['consumed_policy_rule_sets'] = None
if context.get('network_service_policy_id') == 'None':
context['network_service_policy_id'] = None
if context.get('name'):
context['name'] = html.escape(context['name'])
if context.get('description'):
context['description'] = html.escape(context['description'])
policy_target = client.policy_target_update(
request, policy_target_id, **context)
msg = _('Group %s was successfully updated.') % name_or_id
LOG.debug(msg)
messages.success(request, msg)
return policy_target
except Exception as e:
msg = _('Failed to update Group %(name)s. %(reason)s') % {'name':
name_or_id, 'reason': str(e)}
LOG.error(msg)
redirect = reverse(self.failure_url)
exceptions.handle(request, msg, redirect=redirect)
class UpdateExternalPolicyTargetForm(forms.SelfHandlingForm):
name = forms.CharField(max_length=80,
label=_("Name"), required=False)
description = forms.CharField(max_length=80,
label=_("Description"), required=False)
provided_policy_rule_sets = fields.TransferTableField(
label=_("Provided Policy Rule Set"), required=False)
consumed_policy_rule_sets = fields.TransferTableField(
label=_("Consumed Policy Rule Set"), required=False)
external_segments = forms.MultipleChoiceField(
label=_("External Connectivity"), required=True,
help_text=_("Select external segment(s) for Group."))
shared = forms.BooleanField(label=_("Shared"), required=False)
failure_url = 'horizon:project:policytargets:index'
def __init__(self, request, *args, **kwargs):
super(UpdateExternalPolicyTargetForm, self).__init__(request,
*args, **kwargs)
try:
ext_policy_target_id = self.initial['ext_policy_target_id']
ext_policy_target = client.ext_policy_target_get(request,
ext_policy_target_id)
policy_rule_sets = client.policy_rule_set_list(
request, tenant_id=request.user.tenant_id)
external_connectivities = client.externalconnectivity_list(
request, tenant_id=request.user.tenant_id)
for c in policy_rule_sets:
c.set_id_as_name_if_empty()
ext_conn_list = [(e.id, e.name)for e in external_connectivities]
policy_rule_sets = sorted(
policy_rule_sets, key=lambda rule: rule.name)
policy_rule_set_list = [(c.id, c.name) for c in policy_rule_sets]
self.fields[
'provided_policy_rule_sets'].choices = policy_rule_set_list
self.fields[
'consumed_policy_rule_sets'].choices = policy_rule_set_list
self.fields[
'external_segments'].choices = ext_conn_list
provided_init = []
consumed_init = []
for item in policy_rule_set_list:
if item[0] in ext_policy_target.provided_policy_rule_sets:
provided_init.append(item[0])
if item[0] in ext_policy_target.consumed_policy_rule_sets:
consumed_init.append(item[0])
self.fields['provided_policy_rule_sets'].initial = provided_init
self.fields['consumed_policy_rule_sets'].initial = consumed_init
for attr in ['name', 'description', 'shared', 'external_segments']:
self.fields[attr].initial = getattr(ext_policy_target, attr)
except Exception as e:
msg = _('Unable to retrieve policy_rule_set details. %s') % (
str(e))
exceptions.handle(request, msg)
pass
def clean(self):
cleaned_data = super(UpdateExternalPolicyTargetForm, self).clean()
updated_data = {d: cleaned_data[d] for d in cleaned_data
if d in self.changed_data}
return updated_data
def handle(self, request, context):
ext_policy_target_id = self.initial['ext_policy_target_id']
name_or_id = context.get('name') or ext_policy_target_id
try:
if 'provided_policy_rule_sets' in context:
if context.get('provided_policy_rule_sets'):
context['provided_policy_rule_sets'] = dict(
[(i, 'string')
for i in context['provided_policy_rule_sets']])
else:
context['provided_policy_rule_sets'] = None
if 'consumed_policy_rule_sets' in context:
if context.get('consumed_policy_rule_sets'):
context['consumed_policy_rule_sets'] = dict(
[(i, 'string')
for i in context['consumed_policy_rule_sets']])
else:
context['consumed_policy_rule_sets'] = None
if context.get('name'):
context['name'] = html.escape(context['name'])
if context.get('description'):
context['description'] = html.escape(context['description'])
ext_policy_target = client.ext_policy_target_update(
request, ext_policy_target_id, **context)
msg = _('External Group %s was successfully updated.') % name_or_id
LOG.debug(msg)
messages.success(request, msg)
return ext_policy_target
except Exception as e:
msg = _('Failed to update Group %(name)s. %(reason)s') % {'name':
name_or_id, 'reason': str(e)}
LOG.error(msg)
redirect = reverse(self.failure_url)
exceptions.handle(request, msg, redirect=redirect)
class AddProvidedPRSForm(forms.SelfHandlingForm):
policy_rule_set = forms.MultipleChoiceField(
label=_("Provided Policy Rule Sets"),)
def __init__(self, request, *args, **kwargs):
super(AddProvidedPRSForm, self).__init__(request, *args, **kwargs)
policy_rule_sets = []
try:
policy_target_id = kwargs['initial']['policy_target_id']
policy_target = client.policy_target_get(request,
policy_target_id)
providedpolicy_rule_sets = policy_target.get(
"provided_policy_rule_sets")
items = client.policy_rule_set_list(request,
tenant_id=request.user.tenant_id)
policy_rule_sets = [
(p.id, p.name) for p in items
if p.id not in providedpolicy_rule_sets]
except Exception as e:
msg = _('Unable to retrieve policy rule set list.') % (str(e))
LOG.debug(msg)
self.fields['policy_rule_set'].choices = policy_rule_sets
def handle(self, request, context):
policy_target_id = self.initial['policy_target_id']
policy_target = client.policy_target_get(request, policy_target_id)
url = reverse("horizon:project:policytargets:policy_targetdetails",
kwargs={'policy_target_id': policy_target_id})
try:
for policy_rule_set in policy_target.get(
"provided_policy_rule_sets"):
context['policy_rule_set'].append(policy_rule_set)
policy_rule_sets = dict([(item, 'string')
for item in context['policy_rule_set']])
client.policy_target_update(
request, policy_target_id,
provided_policy_rule_sets=policy_rule_sets)
msg = _('Policy Rule Set added successfully!')
messages.success(request, msg)
LOG.debug(msg)
return http.HttpResponseRedirect(url)
except Exception:
u = "horizon:project:policytargets:policy_targetdetails"
msg = _('Failed to add policy_rule_set!')
redirect = reverse(u, kwargs={'policy_target_id':
policy_target_id})
LOG.error(msg)
exceptions.handle(request, msg, redirect=redirect)
class ExtAddProvidedPRSForm(forms.SelfHandlingForm):
policy_rule_set = forms.MultipleChoiceField(
label=_("Provided Policy Rule Sets"),)
def __init__(self, request, *args, **kwargs):
super(ExtAddProvidedPRSForm, self).__init__(request, *args, **kwargs)
policy_rule_sets = []
try:
ext_policy_target_id = kwargs['initial']['ext_policy_target_id']
ext_policy_target = client.ext_policy_target_get(request,
ext_policy_target_id)
providedpolicy_rule_sets = ext_policy_target.get(
"provided_policy_rule_sets")
items = client.policy_rule_set_list(request,
tenant_id=request.user.tenant_id)
policy_rule_sets = [
(p.id, p.name) for p in items
if p.id not in providedpolicy_rule_sets]
except Exception as e:
msg = _('Unable to retrieve policy rule set list.') % (str(e))
LOG.debug(msg)
self.fields['policy_rule_set'].choices = policy_rule_sets
def handle(self, request, context):
ext_policy_target_id = self.initial['ext_policy_target_id']
ext_policy_target = client.ext_policy_target_get(request,
ext_policy_target_id)
url = reverse("horizon:project:policytargets:ext_policy_targetdetails",
kwargs={'ext_policy_target_id': ext_policy_target_id})
try:
for policy_rule_set in ext_policy_target.get(
"provided_policy_rule_sets"):
context['policy_rule_set'].append(policy_rule_set)
policy_rule_sets = dict([(item, 'string')
for item in context['policy_rule_set']])
client.ext_policy_target_update(
request, ext_policy_target_id,
provided_policy_rule_sets=policy_rule_sets)
msg = _('Policy Rule Set added successfully!')
messages.success(request, msg)
LOG.debug(msg)
return http.HttpResponseRedirect(url)
except Exception:
u = "horizon:project:policytargets:ext_policy_targetdetails"
msg = _('Failed to add policy_rule_set!')
redirect = reverse(u, kwargs={'ext_policy_target_id':
ext_policy_target_id})
LOG.error(msg)
exceptions.handle(request, msg, redirect=redirect)
class RemoveProvidedPRSForm(forms.SelfHandlingForm):
policy_rule_set = forms.MultipleChoiceField(
label=_("Provided Policy Rule Sets"),)
def __init__(self, request, *args, **kwargs):
super(RemoveProvidedPRSForm, self).__init__(request, *args, **kwargs)
policy_rule_sets = []
try:
policy_target_id = kwargs['initial']['policy_target_id']
policy_target = client.policy_target_get(request,
policy_target_id)
providedpolicy_rule_sets = policy_target.get(
"provided_policy_rule_sets")
items = client.policy_rule_set_list(request,
tenant_id=request.user.tenant_id)
policy_rule_sets = [(p.id, p.name)
for p in items if p.id in
providedpolicy_rule_sets]
except Exception as e:
msg = _('Unable to retrieve policy rule set list.') % (str(e))
LOG.debug(msg)
self.fields['policy_rule_set'].choices = policy_rule_sets
def handle(self, request, context):
policy_target_id = self.initial['policy_target_id']
url = reverse("horizon:project:policytargets:policy_targetdetails",
kwargs={'policy_target_id': policy_target_id})
try:
policy_target = client.policy_target_get(request, policy_target_id)
old_policy_rule_sets = policy_target.get(
"provided_policy_rule_sets")
for policy_rule_set in context['policy_rule_set']:
old_policy_rule_sets.remove(policy_rule_set)
policy_rule_sets = dict([(item, 'string')
for item in old_policy_rule_sets])
client.policy_target_update(
request, policy_target_id,
provided_policy_rule_sets=policy_rule_sets)
msg = _('Policy Rule Set removed successfully!')
messages.success(request, msg)
LOG.debug(msg)
return http.HttpResponseRedirect(url)
except Exception:
msg = _('Failed to remove policy_rule_set!')
u = "horizon:project:policytargets:policy_targetdetails"
redirect = reverse(u,
kwargs={'policy_target_id': policy_target_id})
LOG.error(msg)
exceptions.handle(request, msg, redirect=redirect)
class ExtRemoveProvidedPRSForm(forms.SelfHandlingForm):
policy_rule_set = forms.MultipleChoiceField(
label=_("Provided Policy Rule Sets"),)
def __init__(self, request, *args, **kwargs):
super(ExtRemoveProvidedPRSForm, self).__init__(request,
*args, **kwargs)
policy_rule_sets = []
try:
ext_policy_target_id = kwargs['initial']['ext_policy_target_id']
ext_policy_target = client.ext_policy_target_get(request,
ext_policy_target_id)
providedpolicy_rule_sets = ext_policy_target.get(
"provided_policy_rule_sets")
items = client.policy_rule_set_list(request,
tenant_id=request.user.tenant_id)
policy_rule_sets = [(p.id, p.name)
for p in items if p.id in
providedpolicy_rule_sets]
except Exception as e:
msg = _('Unable to retrieve policy rule set list.') % (str(e))
LOG.debug(msg)
self.fields['policy_rule_set'].choices = policy_rule_sets
def handle(self, request, context):
ext_policy_target_id = self.initial['ext_policy_target_id']
url = reverse(
"horizon:project:policytargets:ext_policy_targetdetails",
kwargs={'ext_policy_target_id': ext_policy_target_id})
try:
ext_policy_target = client.ext_policy_target_get(request,
ext_policy_target_id)
old_policy_rule_sets = ext_policy_target.get(
"provided_policy_rule_sets")
for policy_rule_set in context['policy_rule_set']:
old_policy_rule_sets.remove(policy_rule_set)
policy_rule_sets = dict([(item, 'string')
for item in old_policy_rule_sets])
client.ext_policy_target_update(
request, ext_policy_target_id,
provided_policy_rule_sets=policy_rule_sets)
msg = _('Policy Rule Set removed successfully!')
messages.success(request, msg)
LOG.debug(msg)
return http.HttpResponseRedirect(url)
except Exception:
msg = _('Failed to remove policy_rule_set!')
u = "horizon:project:policytargets:ext_policy_targetdetails"
redirect = reverse(u,
kwargs={'ext_policy_target_id': ext_policy_target_id})
LOG.error(msg)
exceptions.handle(request, msg, redirect=redirect)
class AddConsumedPRSForm(forms.SelfHandlingForm):
policy_rule_set = forms.MultipleChoiceField(
label=_("Consumed Policy Rule Sets"),)
def __init__(self, request, *args, **kwargs):
super(AddConsumedPRSForm, self).__init__(request, *args, **kwargs)
policy_rule_sets = []
try:
policy_target_id = kwargs['initial']['policy_target_id']
policy_target = client.policy_target_get(request,
policy_target_id)
consumedpolicy_rule_sets = policy_target.get(
"consumed_policy_rule_sets")
items = client.policy_rule_set_list(request,
tenant_id=request.user.tenant_id)
policy_rule_sets = [
(p.id, p.name) for p in items
if p.id not in consumedpolicy_rule_sets]
except Exception:
pass
self.fields['policy_rule_set'].choices = policy_rule_sets
def handle(self, request, context):
policy_target_id = self.initial['policy_target_id']
url = reverse("horizon:project:policytargets:policy_targetdetails",
kwargs={'policy_target_id': policy_target_id})
try:
policy_target = client.policy_target_get(request, policy_target_id)
for policy_rule_set in policy_target.get(
"consumed_policy_rule_sets"):
context['policy_rule_set'].append(policy_rule_set)
consumed = dict([(item, 'string')
for item in context['policy_rule_set']])
client.policy_target_update(
request, policy_target_id, consumed_policy_rule_sets=consumed)
msg = _('Policy Rule Set Added successfully!')
messages.success(request, msg)
LOG.debug(msg)
return http.HttpResponseRedirect(url)
except Exception:
msg = _('Failed to add policy_rule_set!')
u = "horizon:project:policytargets:policy_targetdetails"
redirect = reverse(u,
kwargs={'policy_target_id': policy_target_id})
LOG.error(msg)
exceptions.handle(request, msg, redirect=redirect)
class ExtAddConsumedPRSForm(forms.SelfHandlingForm):
policy_rule_set = forms.MultipleChoiceField(
label=_("Consumed Policy Rule Sets"),)
def __init__(self, request, *args, **kwargs):
super(ExtAddConsumedPRSForm, self).__init__(request, *args, **kwargs)
policy_rule_sets = []
try:
ext_policy_target_id = kwargs['initial']['ext_policy_target_id']
ext_policy_target = client.ext_policy_target_get(request,
ext_policy_target_id)
consumedpolicy_rule_sets = ext_policy_target.get(
"consumed_policy_rule_sets")
items = items = client.policy_rule_set_list(request,
tenant_id=request.user.tenant_id)
policy_rule_sets = [
(p.id, p.name) for p in items
if p.id not in consumedpolicy_rule_sets]
except Exception:
pass
self.fields['policy_rule_set'].choices = policy_rule_sets
def handle(self, request, context):
ext_policy_target_id = self.initial['ext_policy_target_id']
url = reverse("horizon:project:policytargets:ext_policy_targetdetails",
kwargs={'ext_policy_target_id': ext_policy_target_id})
try:
ext_policy_target = client.ext_policy_target_get(request,
ext_policy_target_id)
for policy_rule_set in ext_policy_target.get(
"consumed_policy_rule_sets"):
context['policy_rule_set'].append(policy_rule_set)
consumed = dict([(item, 'string')
for item in context['policy_rule_set']])
client.ext_policy_target_update(
request,
ext_policy_target_id, consumed_policy_rule_sets=consumed)
msg = _('Policy Rule Set Added successfully!')
messages.success(request, msg)
LOG.debug(msg)
return http.HttpResponseRedirect(url)
except Exception:
msg = _('Failed to add policy_rule_set!')
u = "horizon:project:policytargets:ext_policy_targetdetails"
redirect = reverse(u,
kwargs={'ext_policy_target_id': ext_policy_target_id})
LOG.error(msg)
exceptions.handle(request, msg, redirect=redirect)
class RemoveConsumedPRSForm(forms.SelfHandlingForm):
policy_rule_set = forms.MultipleChoiceField(
label=_("Consumed Policy Rule Sets"),)
def __init__(self, request, *args, **kwargs):
super(RemoveConsumedPRSForm, self).__init__(request, *args, **kwargs)
policy_rule_sets = []
try:
policy_target_id = kwargs['initial']['policy_target_id']
policy_target = client.policy_target_get(request, policy_target_id)
consumedpolicy_rule_sets = policy_target.get(
"consumed_policy_rule_sets")
items = client.policy_rule_set_list(request,
tenant_id=request.user.tenant_id)
policy_rule_sets = [(p.id, p.name)
for p in items if p.id
in consumedpolicy_rule_sets]
except Exception:
pass
self.fields['policy_rule_set'].choices = policy_rule_sets
def handle(self, request, context):
policy_target_id = self.initial['policy_target_id']
url = reverse("horizon:project:policytargets:policy_targetdetails",
kwargs={'policy_target_id': policy_target_id})
try:
policy_target = client.policy_target_get(request, policy_target_id)
old_policy_rule_sets = policy_target.get(
"consumed_policy_rule_sets")
for policy_rule_set in context['policy_rule_set']:
old_policy_rule_sets.remove(policy_rule_set)
consumed = dict([(item, 'string')
for item in old_policy_rule_sets])
client.policy_target_update(
request, policy_target_id, consumed_policy_rule_sets=consumed)
msg = _('Policy Rule Set removed successfully!')
messages.success(request, msg)
LOG.debug(msg)
return http.HttpResponseRedirect(url)
except Exception:
msg = _('Failed to remove policy_rule_set!')
redirect = url
LOG.error(msg)
exceptions.handle(request, msg, redirect=redirect)
class ExtRemoveConsumedPRSForm(forms.SelfHandlingForm):
policy_rule_set = forms.MultipleChoiceField(
label=_("Consumed Policy Rule Sets"),)
def __init__(self, request, *args, **kwargs):
super(ExtRemoveConsumedPRSForm, self).__init__(request,
*args, **kwargs)
policy_rule_sets = []
try:
ext_policy_target_id = kwargs['initial']['ext_policy_target_id']
ext_policy_target = client.ext_policy_target_get(request,
ext_policy_target_id)
consumedpolicy_rule_sets = ext_policy_target.get(
"consumed_policy_rule_sets")
items = client.policy_rule_set_list(request,
tenant_id=request.user.tenant_id)
policy_rule_sets = [(p.id, p.name)
for p in items if p.id
in consumedpolicy_rule_sets]
except Exception:
pass
self.fields['policy_rule_set'].choices = policy_rule_sets
def handle(self, request, context):
ext_policy_target_id = self.initial['ext_policy_target_id']
url = reverse("horizon:project:policytargets:ext_policy_targetdetails",
kwargs={'ext_policy_target_id': ext_policy_target_id})
try:
ext_policy_target = client.ext_policy_target_get(request,
ext_policy_target_id)
old_policy_rule_sets = ext_policy_target.get(
"consumed_policy_rule_sets")
for policy_rule_set in context['policy_rule_set']:
old_policy_rule_sets.remove(policy_rule_set)
consumed = dict([(item, 'string')
for item in old_policy_rule_sets])
client.ext_policy_target_update(
request, ext_policy_target_id,
consumed_policy_rule_sets=consumed)
msg = _('Policy Rule Set removed successfully!')
messages.success(request, msg)
LOG.debug(msg)
return http.HttpResponseRedirect(url)
except Exception:
msg = _('Failed to remove policy_rule_set!')
redirect = url
LOG.error(msg)
exceptions.handle(request, msg, redirect=redirect)