GBP UI - added policy targets UI

Change-Id: Ib2074e794db2f1a6e7ab02225ad9173d1c77cf06
This commit is contained in:
uday bhaskar 2014-11-24 21:15:08 +05:30
parent a1f2e4f8bd
commit b39c887100
63 changed files with 2299 additions and 216 deletions

View File

@ -1,6 +1,3 @@
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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

View File

@ -1,6 +1,3 @@
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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

View File

@ -1,6 +1,3 @@
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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

View File

@ -1,6 +1,3 @@
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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

View File

@ -1,6 +1,3 @@
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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

View File

@ -1,6 +1,3 @@
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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
@ -226,6 +223,13 @@ def policyrule_create(request, **kwargs):
return PolicyRule(policy_rule)
def policyrule_update(request, prid, **kwargs):
body = {'policy_rule': kwargs}
policy_rule = gbpclient(request).update_policy_rule(prid,
body).get('policy_rule')
return PolicyRule(policy_rule)
def policyrule_list(request, **kwargs):
policyrules = gbpclient(request).list_policy_rules(
**kwargs).get('policy_rules')
@ -268,6 +272,13 @@ def policyaction_get(request, pa_id):
return PolicyAction(policyaction)
def policyaction_update(request, pc_id, **kwargs):
body = {'policy_action': kwargs}
classifier = gbpclient(request).update_policy_action(pc_id,
body).get('policy_action')
return PolicyClassifier(classifier)
def policyrule_get(request, pr_id):
policyrule = gbpclient(request).show_policy_rule(
pr_id).get('policy_rule')
@ -278,10 +289,6 @@ def policyrule_delete(request, pr_id):
return gbpclient(request).delete_policy_rule(pr_id)
def policyrule_update(request, pr_id, **kwargs):
return gbpclient(request).update_policy_rule(pr_id, kwargs)
def policyclassifier_get(request, pc_id):
policyclassifier = gbpclient(request).show_policy_classifier(
pc_id).get('policy_classifier')
@ -295,7 +302,7 @@ def policyclassifier_delete(request, pc_id):
def policyclassifier_update(request, pc_id, **kwargs):
body = {'policy_classifier': kwargs}
classifier = gbpclient(request).update_policy_classifier(pc_id,
body).get('policy_classifier')
body).get('policy_classifier')
return PolicyClassifier(classifier)
@ -324,15 +331,34 @@ def create_networkservice_policy(request, **kwargs):
def update_networkservice_policy(request, policy_id, **kwargs):
body = {'network_service_policy': kwargs}
spolicy = gbpclient.update_network_service_policy(
spolicy = gbpclient(request).update_network_service_policy(
policy_id, body).get('network_service_policy')
return NetworkServicePolicy(spolicy)
def delete_networkservice_policy(request, policy_id, **kwargs):
gbpclient(request).delete_network_service_policy(policy_id)
def get_networkservice_policy(request, policy_id):
spolicy = gbpclient(request).show_network_service_policy(
policy_id).get('network_service_policy')
return NetworkServicePolicy(spolicy)
def l3policy_get(request, pc_id, **kwargs):
return gbpclient(request).show_l3_policy(pc_id).get('l3_policy')
def l3policy_create(request, **kwargs):
body = {'l3_policy': kwargs}
return gbpclient(request).create_l3_policy(body).get('l3_policy')
def l3policy_delete(request, policy_id):
gbpclient(request).delete_l3_policy(policy_id)
def l2policy_get(request, pc_id, **kwargs):
return L2Policy(gbpclient(request).show_l2_policy(pc_id).get('l2_policy'))
@ -349,9 +375,8 @@ def l2policy_update(request, pc_id, **kwargs):
return L2Policy(policy)
def l3policy_create(request, **kwargs):
body = {'l3_policy': kwargs}
return gbpclient(request).create_l3_policy(body).get('l3_policy')
def l2policy_delete(request, policy_id):
gbpclient(request).delete_l2_policy(policy_id)
def servicechainnode_list(request, **kwargs):
@ -392,6 +417,10 @@ def update_servicechain_node(request, scnode_id, **kwargs):
return ServiceChainNode(sc_node)
def delete_servicechain_node(request, scnode_id):
gbpclient(request).delete_servicechain_node(scnode_id)
def get_servicechain_spec(request, scspec_id):
sc_spec = gbpclient(request).show_servicechain_spec(
scspec_id).get('servicechain_spec')
@ -412,6 +441,10 @@ def update_servicechain_spec(request, scspec_id, **kwargs):
return ServiceChainSpec(sc_spec)
def delete_servicechain_spec(request, scspec_id):
gbpclient(request).delete_servicechain_spec(scspec_id)
def get_servicechain_instance(request, scinstance_id):
sc_instance = gbpclient(request).show_servicechain_instance(
scinstance_id).get('servicechain_instance')
@ -430,3 +463,7 @@ def update_servicechain_instance(request, scinstance_id, **kwargs):
sc_instance = gbpclient(request).update_servicechain_instance(
scinstance_id, body).get('servicechain_instance')
return ServiceChainInstance(sc_instance)
def delete_servicechain_instance(request, scinstance_id):
gbpclient(request).delete_servicechain_instance(scinstance_id)

View File

@ -1,6 +1,3 @@
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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
@ -45,6 +42,22 @@ def update_pruleset_attributes(request, prset):
return prset
def update_service_policy_attributes(policy):
np = policy.network_service_params
params = ""
if len(np) > 0:
tags = []
for item in np:
dl = ["<dl class='dl-horizontal'>"]
dl.extend(["<dt>%s<dt><dd>%s</dd>" %
(k, v) for k, v in item.items()])
dl.append("</dl>")
tags.append("".join(dl))
params = mark_safe("".join(tags))
setattr(policy, 'network_service_params', params)
return policy
def update_policy_target_attributes(request, pt):
url = "horizon:project:application_policy:policy_rule_set_details"
provided = pt.provided_policy_rule_sets
@ -70,7 +83,7 @@ def update_policy_target_attributes(request, pt):
l2url = "horizon:project:network_policy:l2policy_details"
if pt.l2_policy_id is not None:
policy = client.l2policy_get(request, pt.l2_policy_id)
u = reverse(l2url, {'l2policy_id': policy.id})
u = reverse(l2url, kwargs={'l2policy_id': policy.id})
atag = mark_safe(
"<a href='" + u + "'>" + policy.name + "</a>")
setattr(pt, 'l2_policy_id', atag)
@ -80,24 +93,52 @@ def update_policy_target_attributes(request, pt):
def update_policyrule_attributes(request, prule):
url = "horizon:project:application_policy:policyclassifierdetails"
classifier_id = prule.policy_classifier_id
classifier = client. policyclassifier_get(request, classifier_id)
classifier = client.policyclassifier_get(request, classifier_id)
u = reverse(url, kwargs={'policyclassifier_id': classifier.id})
tag = mark_safe("<a href='" + u + "'>" + classifier.name + "</a>")
setattr(prule, 'policy_classifier_id', tag)
actions = prule.policy_actions
action_url = "horizon:project:application_policy:policyactiondetails"
ul = ["<ul>"]
for a in actions:
action = client.policyaction_get(request, a)
u = reverse(action_url, kwargs={'policyaction_id': a})
if action.action_type == 'redirect':
spec = client.get_servicechain_spec(request, action.action_value)
spec_details = "%s:%s" % (spec.name, str(spec.id))
li = "<li><a href='%s'>%s</a></li>" % (u, spec_details)
else:
li = "<li><a href='%s'>%s</a></li>" % (u, action.name)
ul.append(li)
ul.append("</ul>")
ultag = "".join(ul)
setattr(prule, 'policy_actions', mark_safe(ultag))
return prule
def update_policyaction_attributes(request, paction):
if paction.action_type == 'redirect':
spec = client.get_servicechain_spec(request,
paction.action_value)
url = "horizon:project:network_services:sc_spec_details"
url = reverse(url, kwargs={'scspec_id': spec.id})
tag_content = (url, spec.name + ":" + spec.id)
tag = "<a href='%s'>%s</a>" % tag_content
setattr(paction, 'action_value', mark_safe(tag))
return paction
def update_sc_spec_attributes(request, scspec):
nodes = scspec.nodes
nodes = [client.get_servicechain_node(request, item) for item in nodes]
value = ["<table class='table table-condensed'> \
<tr><td><span class='glyphicon glyphicon-remove-circle'>< /span></td>"]
t = "<table class='table table-condensed'><tr><td>"
val = [t + "<span class='glyphicon glyphicon-remove-circle'></span></td>"]
for n in nodes:
value.append(
val.append(
"<td><span class='glyphicon glyphicon-arrow-right'></span></td>")
value.append("<td>" + n.name + "(" + n.service_type + ")</td>")
value.append("</tr></table>")
setattr(scspec, 'nodes', mark_safe("".join(value)))
val.append("<td>" + n.name + "(" + n.service_type + ")</td>")
val.append("</tr></table>")
setattr(scspec, 'nodes', mark_safe("".join(val)))
return scspec

View File

@ -1,6 +1,3 @@
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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
@ -63,3 +60,8 @@ class DynamicMultiChoiceField(fields.MultipleChoiceField):
super(DynamicMultiChoiceField, self).__init__(*args, **kwargs)
self.widget.add_item_link = add_item_link
self.widget.add_item_link_args = add_item_link_args
class CustomMultiChoiceField(DynamicMultiChoiceField):
def validate(self, *args, **kwargs):
return True

View File

@ -1,6 +1,3 @@
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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

View File

@ -1,6 +1,3 @@
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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
@ -98,14 +95,14 @@ class AddPolicyActionForm(forms.SelfHandlingForm):
'class': 'switchable',
'data-slug': 'source'
}))
action_value = forms.ChoiceField(label=_("Action Value"),
action_value = forms.ChoiceField(label=_("Service Chain Spec"),
required=False,
choices=[],
widget=forms.Select(attrs={
'class': 'switched',
'data-switch-on': 'source',
'data-source-redirect':
_('Action Value')
_('Service Chain Spec')
}))
def __init__(self, request, *args, **kwargs):
@ -137,9 +134,8 @@ class AddPolicyActionForm(forms.SelfHandlingForm):
class UpdatePolicyActionForm(forms.SelfHandlingForm):
name = forms.CharField(label=_("Name"))
description = forms.CharField(label=_("Description"), required=False)
action_type = forms.ChoiceField(label=_("Action"))
action_value = forms.CharField(label=_("Action Value"), required=False)
description = forms.CharField(label=_("Description"),
required=False)
def __init__(self, request, *args, **kwargs):
super(UpdatePolicyActionForm, self).__init__(request, *args, **kwargs)
@ -148,16 +144,15 @@ class UpdatePolicyActionForm(forms.SelfHandlingForm):
policyaction_id = self.initial['policyaction_id']
pa = client.policyaction_get(request, policyaction_id)
self.fields['name'].initial = pa.name
self.fields['action_value'].initial = pa.action_value
self.fields['action_type'].initial = pa.action_type
self.fields['description'].initial = pa.description
except Exception:
pass
self.fields['action_type'].choices = POLICY_ACTION_TYPES
def handle(self, request, context):
url = reverse('horizon:project:application_policy:index')
try:
# policyaction_id = self.initial['policyaction_id']
policyaction_id = self.initial['policyaction_id']
client.policyaction_update(request, policyaction_id, **context)
messages.success(request, _('Policy Action successfully updated.'))
return http.HttpResponseRedirect(url)
except Exception:
@ -167,15 +162,22 @@ class UpdatePolicyActionForm(forms.SelfHandlingForm):
class AddPolicyClassifierForm(forms.SelfHandlingForm):
name = forms.CharField(max_length=80, label=_("Name"), required=False)
protocol = forms.ChoiceField(
label=_("Protocol"),
choices=PROTOCOLS)
port_range = forms.CharField(
max_length=80,
label=_("Port/Range(min:max)"),
required=False)
direction = forms.ChoiceField(
label=_("Direction"),
protocol = forms.ChoiceField(label=_("Protocol"), choices=PROTOCOLS,
widget=forms.Select(attrs={'class': 'switchable',
'data-slug': 'source'}))
port_range = forms.CharField(max_length=80, label=_("Port/Range(min:max)"),
required=False,
widget=forms.TextInput(attrs={'class': 'switched',
'data-switch-on': 'source',
'data-source-tcp': _("Port/Range(min:max)"),
'data-source-udp': _("Port/Range(min:max)"),
'data-source-http': _("Port/Range(min:max)"),
'data-source-https': _("Port/Range(min:max)"),
'data-source-smtp': _("Port/Range(min:max)"),
'data-source-dns': _("Port/Range(min:max)"),
'data-source-ftp': _("Port/Range(min:max)"),
'data-source-any': _("Port/Range(min:max)")}))
direction = forms.ChoiceField(label=_("Direction"),
choices=[('in', _('IN')),
('out', _('OUT')),
('bi', _('BI'))])
@ -186,6 +188,8 @@ class AddPolicyClassifierForm(forms.SelfHandlingForm):
def handle(self, request, context):
url = reverse('horizon:project:application_policy:index')
try:
if not bool(context['port_range']):
context['port_range'] = None
classifier = client.policyclassifier_create(request, **context)
messages.success(
request, _('Policy Classifier successfully created.'))
@ -200,8 +204,8 @@ class UpdatePolicyClassifierForm(forms.SelfHandlingForm):
name = forms.CharField(max_length=80, label=_("Name"), required=False)
description = forms.CharField(label=_("Description"), required=False)
protocol = forms.ChoiceField(label=_("Protocol"), choices=PROTOCOLS)
port_range = forms.CharField(
max_length=80, label=_("Port/Range(min:max)"), required=False)
port_range = forms.CharField(max_length=80, label=_("Port/Range(min:max)"),
required=False)
direction = forms.ChoiceField(label=_("Direction"), choices=DIRECTIONS)
def __init__(self, request, *args, **kwargs):
@ -222,8 +226,10 @@ class UpdatePolicyClassifierForm(forms.SelfHandlingForm):
url = reverse('horizon:project:application_policy:index')
try:
policyclassifier_id = self.initial['policyclassifier_id']
if not bool(context['port_range']):
context['port_range'] = None
client.policyclassifier_update(self.request,
policyclassifier_id, context)
policyclassifier_id, **context)
messages.success(
request, _('Policy classifier successfully updated.'))
return http.HttpResponseRedirect(url)
@ -266,9 +272,10 @@ class UpdatePolicyRuleForm(forms.SelfHandlingForm):
def handle(self, request, context):
url = reverse('horizon:project:application_policy:index')
try:
self.initial['policyrule_id']
prid = self.initial['policyrule_id']
client.policyrule_update(request, prid, **context)
messages.success(request, _('Policy rule successfully updated.'))
return http.HttpResponseRedirect(url)
except Exception:
exceptions.handle(
request, _("Unable to update policy rule."), redirect=url)
except Exception as e:
msg = _("Unable to update policy rule. %s") % (str(e))
exceptions.handle(request, msg, redirect=url)

View File

@ -36,23 +36,23 @@ class UpdateAppPolicyLink(tables.LinkAction):
class DeleteAppPolicyLink(tables.DeleteAction):
name = "deletepolicy_rule_set"
name = "deletepolicyruleset"
action_present = _("Delete")
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("Policy Rule Set")
data_type_plural = _("Policy Rule Set")
data_type_plural = _("Policy Rule Sets")
class AddPolicyRuleLink(tables.LinkAction):
name = "addpolicyrules"
verbose_name = _("Create Policy-Rule")
verbose_name = _("Create Policy Rule")
url = "horizon:project:application_policy:addpolicyrule"
classes = ("ajax-modal", "btn-addpolicyrule",)
class UpdatePolicyRuleLink(tables.LinkAction):
name = "updatepolicyrule"
verbose_name = _("Edit PolicyRule")
verbose_name = _("Edit")
classes = ("ajax-modal", "btn-update",)
def get_link_url(self, policy_rule):
@ -66,13 +66,13 @@ class DeletePolicyRuleLink(tables.DeleteAction):
name = "deletepolicyrule"
action_present = _("Delete")
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("PolicyRule")
data_type_plural = _("PolicyRules")
data_type_singular = _("Policy Rule")
data_type_plural = _("Policy Rules")
class AddPolicyClassifierLink(tables.LinkAction):
name = "addpolicyclassifiers"
verbose_name = _("Create Policy-Classifier")
verbose_name = _("Create Policy Classifier")
url = "horizon:project:application_policy:addpolicyclassifier"
classes = ("ajax-modal", "btn-addpolicyclassifier",)
@ -93,20 +93,20 @@ class DeletePolicyClassifierLink(tables.DeleteAction):
name = "deletepolicyclassifier"
action_present = _("Delete")
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("PolicyClassifier")
data_type_plural = _("PolicyClassifiers")
data_type_singular = _("Policy Classifier")
data_type_plural = _("Policy Classifiers")
class AddPolicyActionLink(tables.LinkAction):
name = "addpolicyactions"
verbose_name = _("Create Policy-Action")
verbose_name = _("Create Policy Action")
url = "horizon:project:application_policy:addpolicyaction"
classes = ("ajax-modal", "btn-addpolicyaction",)
class UpdatePolicyActionLink(tables.LinkAction):
name = "updatepolicyaction"
verbose_name = _("Edit PolicyAction")
verbose_name = _("Edit")
classes = ("ajax-modal", "btn-update",)
def get_link_url(self, policy_action):
@ -120,8 +120,8 @@ class DeletePolicyActionLink(tables.DeleteAction):
name = "deletepolicyaction"
action_present = _("Delete")
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("PolicyAction")
data_type_plural = _("PolicyActions")
data_type_singular = _("Policy Action")
data_type_plural = _("Policy Actions")
class ApplicationPoliciesTable(tables.DataTable):
@ -151,6 +151,8 @@ class PolicyRulesTable(tables.DataTable):
verbose_name=_("Enabled"))
policy_classifier = tables.Column("policy_classifier_id",
verbose_name=_("Policy Classifier"))
policy_actions = tables.Column("policy_actions",
verbose_name=_("Policy Actions"))
class Meta:
name = "policyrulestable"

View File

@ -28,30 +28,28 @@ PolicyActionsTable = tables.PolicyActionsTable
class PolicyActionsTab(tabs.TableTab):
table_classes = (PolicyActionsTable,)
name = _("Policy-Actions")
name = _("Policy Actions")
slug = "policyactions"
template_name = "horizon/common/_detail_table.html"
def get_policyactionstable_data(self):
actions = []
try:
tenant_id = self.request.user.tenant_id
actions = client.policyaction_list(
self.tab_group.request,
tenant_id=tenant_id)
except Exception:
actions = []
exceptions.handle(self.tab_group.request,
_('Unable to retrieve actions list.'))
for action in actions:
action.set_id_as_name_if_empty()
a = lambda x, y: gfilters.update_policyaction_attributes(x, y)
actions = [a(self.request, item) for item in actions]
except Exception as e:
msg = _('Unable to retrieve actions list. %s') % (str(e))
exceptions.handle(self.tab_group.request, msg)
return actions
class PolicyClassifiersTab(tabs.TableTab):
table_classes = (PolicyClassifiersTable,)
name = _("Policy-Classifiers")
name = _("Policy Classifiers")
slug = "policyclassifiers"
template_name = "horizon/common/_detail_table.html"
@ -74,7 +72,7 @@ class PolicyClassifiersTab(tabs.TableTab):
class PolicyRulesTab(tabs.TableTab):
table_classes = (PolicyRulesTable,)
name = _("Policy-Rules")
name = _("Policy Rules")
slug = "policyrules"
template_name = "horizon/common/_detail_table.html"
@ -130,7 +128,7 @@ class ApplicationPoliciesTabs(tabs.TabGroup):
sticky = True
class ContractDetailsTab(tabs.Tab):
class PolicyRuleSetDetailsTab(tabs.Tab):
name = _("Policy Rule Set Details")
slug = "policy_rule_setdetails"
template_name = "project/application_policy/_policy_rule_set_details.html"
@ -153,31 +151,38 @@ class ContractDetailsTab(tabs.Tab):
action_list = []
for aid in rule.policy_actions:
action = client.policyaction_get(request, aid)
a = {'id': action.id}
if action.action_value:
action_list.append(
str(action.action_type) + ":"
+ str(action.action_value))
if action.action_type == 'redirect':
scspec = client.get_servicechain_spec(request,
action.action_value)
a['name'] = "Redirect:%s" % scspec.name
else:
values = (str(action.action_type),
str(action.action_value))
name = "%s:%s" % values
a['name'] = name
else:
action_list.append(str(action.action_type))
a['name'] = str(action.action_type)
action_list.append(a)
r['actions'] = action_list
r['classifier'] = client.policyclassifier_get(
request, rule.policy_classifier_id)
rules_with_details.append(r)
except Exception:
exceptions.handle(request,
_('Unable to retrieve policy_rule_set details.'),
redirect=self.failure_url)
except Exception as e:
msg = _('Unable to retrieve policy_rule_set details.') % (str(e))
exceptions.handle(request, msg, redirect=self.failure_url)
return {'policy_rule_set': policy_rule_set,
'rules_with_details': rules_with_details}
class ContractDetailsTabs(tabs.TabGroup):
class PolicyRuleSetDetailsTabs(tabs.TabGroup):
slug = "policy_rule_settabs"
tabs = (ContractDetailsTab,)
tabs = (PolicyRuleSetDetailsTab,)
class PolicyRulesDetailsTab(tabs.Tab):
name = _("PolicyRule Details")
name = _("Policy Rule Details")
slug = "policyruledetails"
template_name = "project/application_policy/_policyrules_details.html"
failure_url = reverse_lazy('horizon:project:policyrule:index')
@ -212,7 +217,7 @@ class PolicyRuleDetailsTabs(tabs.TabGroup):
class PolicyClassifierDetailsTab(tabs.Tab):
name = _("Policyclassifier Details")
name = _("Policy Classifier Details")
slug = "policyclassifierdetails"
template_name = "project/application_policy/_policyclassifier_details.html"
failure_url = reverse_lazy('horizon:project:policy_rule_set:index')
@ -234,7 +239,7 @@ class PolicyClassifierDetailsTabs(tabs.TabGroup):
class PolicyActionDetailsTab(tabs.Tab):
name = _("PolicyAction Details")
name = _("Policy Action Details")
slug = "policyactiondetails"
template_name = "project/application_policy/_policyaction_details.html"
failure_url = reverse_lazy('horizon:project:policy_rule_set:index')
@ -243,6 +248,8 @@ class PolicyActionDetailsTab(tabs.Tab):
paid = self.tab_group.kwargs['policyaction_id']
try:
policyaction = client.policyaction_get(request, paid)
policyaction = gfilters.update_policyaction_attributes(request,
policyaction)
except Exception:
exceptions.handle(request,
_('Unable to retrieve policyaction details.'),

View File

@ -4,19 +4,19 @@
<hr class="header_rule">
<dl>
<dt>{% trans "Name" %}</dt>
<dd>{{ contract.name|default:_("-") }}</dd>
<dd>{{ policy_rule_set.name|default:_("-") }}</dd>
<dt>{% trans "Description" %}</dt>
<dd>{{ contract.description|default:_("-") }}</dd>
<dd>{{ ppolicy_rule_set.description|default:_("-") }}</dd>
<dt>{% trans "ID" %}</dt>
<dd>{{ contract.id }} </dd>
<dd>{{ policy_rule_set.id }} </dd>
<dt>{% trans "Project ID" %}</dt>
<dd>{{ contract.tenant_id }}</dd>
<dd>{{ policy_rule_set.tenant_id }}</dd>
</dl>
</div>
{% if contract.policy_rules %}
{% if rules_with_details %}
<div class="panel panel-default">
<div class="panel-heading"> {% trans "Policy Rules" %} </div>
<div class="panel-body">
@ -39,7 +39,7 @@
<td>{{rule.classifier.direction}}</td>
<td>&nbsp;
{% for a in rule.actions %}
{{a}}</br>
<a href="{% url 'horizon:project:application_policy:policyactiondetails' policyaction_id=a.id %}">{{a.name}}</a>
{% endfor %}
</td>
</tr>

View File

@ -22,17 +22,16 @@
<dt>{% trans "Policy Actions" %}</dt>
<dd>
{% for action in actions%}
{{action.name}}
{% url 'horizon:project:application_policy:policyactiondetails' action as action_url %}
{{ action.position }} : <a href="{{ action_url }}">{{ action.id }}</a><br>
{% url 'horizon:project:application_policy:policyactiondetails' action.id as action_url %}
<a href="{{ action_url }}"> {{action.name}}:{{ action.id }}</a><br>
{% endfor %}
</dd>
<dt>{% trans "Policy Classifier" %}</dt>
<dd>
{% for classifier in classifiers %}
{{classifier.name}}:
{% url 'horizon:project:application_policy:policyclassifierdetails' classifier.id as classifier_url %}
<a href="{{ classifier_url }}">{{ classifier.id }}</a><br>
<a href="{{ classifier_url }}"> {{classifier.name}}:{{ classifier.id }}</a><br>
{% endfor %}
</dd>
</dl>

View File

@ -28,7 +28,7 @@ import tabs as policy_rule_set_tabs
import workflows as policy_rule_set_workflows
PolicyRuleSetTabs = policy_rule_set_tabs.ApplicationPoliciesTabs
PolicyRuleSetDetailsTabs = policy_rule_set_tabs.ContractDetailsTabs
PolicyRuleSetDetailsTabs = policy_rule_set_tabs.PolicyRuleSetDetailsTabs
PolicyRuleDetailsTabs = policy_rule_set_tabs.PolicyRuleDetailsTabs
PolicyClassifierDetailsTabs = policy_rule_set_tabs.PolicyClassifierDetailsTabs
PolicyActionDetailsTabs = policy_rule_set_tabs.PolicyActionDetailsTabs
@ -44,7 +44,7 @@ class IndexView(tabs.TabView):
def post(self, request, *args, **kwargs):
obj_ids = request.POST.getlist('object_ids')
action = request.POST['action']
obj_type = re.search('.delete([a-z]+)', action).group(1)
obj_type = re.search('delete([a-z]+)', action).group(1)
if not obj_ids:
obj_ids.append(re.search('([0-9a-z-]+)$', action).group(1))
if obj_type == 'policyaction':
@ -53,8 +53,8 @@ class IndexView(tabs.TabView):
client.policyaction_delete(request, obj_id)
messages.success(request, _('Deleted action %s') % obj_id)
except Exception as e:
exceptions.handle(request,
_('Unable to delete action. %s') % e)
msg = _('Unable to delete action. %s') % (str(e))
exceptions.handle(request, msg)
if obj_type == 'policyclassifier':
for obj_id in obj_ids:
try:
@ -62,8 +62,8 @@ class IndexView(tabs.TabView):
messages.success(
request, _('Deleted classifer %s') % obj_id)
except Exception as e:
exceptions.handle(request,
_('Unable to delete classifier. %s') % e)
msg = _('Unable to delete action. %s') % (str(e))
exceptions.handle(request, msg)
if obj_type == 'policyrule':
for obj_id in obj_ids:
try:
@ -71,17 +71,17 @@ class IndexView(tabs.TabView):
messages.success(request,
_('Deleted rule %s') % obj_id)
except Exception as e:
exceptions.handle(request,
_('Unable to delete rule. %s') % e)
if obj_type == 'policy_rule_set':
msg = _('Unable to delete action. %s') % (str(e))
exceptions.handle(request, msg)
if obj_type == 'policyruleset':
for obj_id in obj_ids:
try:
client.policy_rule_set_delete(request, obj_id)
messages.success(request,
_('Deleted rule %s') % obj_id)
except Exception as e:
exceptions.handle(request,
_('Unabled to delete policy_rule_set. %s') % e)
msg = _('Unable to delete action. %s') % (str(e))
exceptions.handle(request, msg)
return self.get(request, *args, **kwargs)

View File

@ -21,8 +21,8 @@ from gbpui import client
from gbpui import fields
ADD_POLICY_ACTION_URL = "horizon:project:application_policy:addpolicyaction"
ADD_POLICY_CLASSIFIER_URL = "horizon:project:application_policy:\
addpolicyclassifier"
ADD_POLICY_CLASSIFIER_URL = "horizon:project:application_policy:"
ADD_POLICY_CLASSIFIER_URL = ADD_POLICY_CLASSIFIER_URL + "addpolicyclassifier"
ADD_POLICY_RULE_URL = "horizon:project:application_policy:addpolicyrule"
@ -174,6 +174,8 @@ class SelectPolicyActionAction(workflows.Action):
actions = sorted(actions,
key=lambda action: action.name)
action_list = [(a.id, a.name) for a in actions]
if len(action_list) > 0:
self.fields['actions'].initial = action_list[0]
except Exception as e:
action_list = []
exceptions.handle(request,

View File

@ -9,8 +9,6 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# @author: Ronak Shah
import logging
@ -23,9 +21,12 @@ from horizon import exceptions
from horizon import forms
from gbpui import client
from gbpui import fields
LOG = logging.getLogger(__name__)
NETWORK_PARAM_URL = "horizon:project:network_policy:add_network_service_param"
class AddL3PolicyForm(forms.SelfHandlingForm):
name = forms.CharField(max_length=80, label=_("Name"))
@ -96,7 +97,7 @@ class UpdateL3PolicyForm(forms.SelfHandlingForm):
subnet_prefix_length = forms.CharField(max_length=80,
label=_("Subnet Prefix Length"),
help_text=_("Between 2-30 for IP4"
"and 2-127 for IP6."),)
"and 2-127 for IP6."),)
def __init__(self, request, *args, **kwargs):
super(UpdateL3PolicyForm, self).__init__(request, *args, **kwargs)
@ -204,18 +205,59 @@ class CreateServicePolicyForm(forms.SelfHandlingForm):
name = forms.CharField(max_length=80, label=_("Name"))
description = forms.CharField(
max_length=80, label=_("Description"), required=False)
network_service_params = fields.CustomMultiChoiceField(label=_(
"Network Service Parameters"), add_item_link=NETWORK_PARAM_URL,
required=False)
def handle(self, request, context):
url = reverse("horizon:project:network_policy:index")
try:
params = context['network_service_params']
p = []
if len(params) > 0:
for item in params:
values = [i.split(":")[1] for i in item.split(",")]
values = {'type': values[0],
'name': values[1],
'value': values[2]}
p.append(values)
context['network_service_params'] = p
client.create_networkservice_policy(request, **context)
msg = _("Service policy created successfully!")
LOG.debug(msg)
return http.HttpResponseRedirect(url)
except Exception:
msg = _("Failed to create service policy")
except Exception as e:
msg = _("Failed to create service policy. %s") % (str(e))
LOG.error(msg)
exceptions.handle(request, msg, redirect=shortcuts.redirect)
exceptions.handle(request, msg, redirect=url)
class NetworkServiceParam(object):
def __init__(self, context):
self.ptype = context['param_type']
self.pname = context['param_name']
self.pvalue = context['param_value']
self.name = "Type:%s,Name:%s,Value:%s" % (
self.ptype, self.pname, self.pvalue)
self.id = self.name
class CreateNetworkServiceParamForm(forms.SelfHandlingForm):
param_type = forms.ChoiceField(label=_("Type"),
choices=[('ip_single', 'ip_single'),
('ip_pool', 'ip_pool'),
('string', 'string')])
param_name = forms.CharField(max_length=80, label=_("Name"))
param_value = forms.CharField(max_length=80, label=_("Value"),
help_text=_("Enter a string. For Types 'ip_single' or 'ip_pool',"
"the Value is 'self_subnet' or 'external_subnet'."
"For Type 'string' the Value is a user-specified"
"string that matches the requirements published"
"by a Service Chain Spec."))
def handle(self, request, context):
return NetworkServiceParam(context)
class UpdateServicePolicyForm(forms.SelfHandlingForm):
@ -224,14 +266,15 @@ class UpdateServicePolicyForm(forms.SelfHandlingForm):
max_length=80, label=_("Description"), required=False)
def __init__(self, request, *args, **kwargs):
super(UpdateL3PolicyForm, self).__init__(request, *args, **kwargs)
super(UpdateServicePolicyForm, self).__init__(request, *args, **kwargs)
try:
policy_id = self.initial['service_policy_id']
policy = client.get_service_policy(request, policy_id)
policy = client.get_networkservice_policy(request, policy_id)
self.fields['name'].initial = policy.name
self.fields['description'].initial = policy.description
except Exception:
pass
except Exception as e:
msg = _("Failed to retrive service policy details. %s") % (str(e))
LOG.debug(msg)
def handle(self, request, context):
url = reverse("horizon:project:network_policy:index")
@ -239,10 +282,10 @@ class UpdateServicePolicyForm(forms.SelfHandlingForm):
policy_id = self.initial['service_policy_id']
client.update_networkservice_policy(
request, policy_id, **context)
msg = _("Service policy created successfully!")
msg = _("Service policy updatedsuccessfully!")
LOG.debug(msg)
return http.HttpResponseRedirect(url)
except Exception:
msg = _("Failed to create service policy")
msg = _("Failed to update service policy")
LOG.error(msg)
exceptions.handle(request, msg, redirect=shortcuts.redirect)

View File

@ -9,8 +9,6 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# @author: Ronak Shah
from django.utils.translation import ugettext_lazy as _

View File

@ -35,7 +35,7 @@ class EditL2PolicyLink(tables.LinkAction):
class DeleteL2PolicyLink(tables.DeleteAction):
name = "delete_l2policy"
name = "deletel2policy"
action_present = _("Delete")
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("L2Policy")
@ -77,11 +77,11 @@ class EditL3PolicyLink(tables.LinkAction):
class DeleteL3PolicyLink(tables.DeleteAction):
name = "delete_l3policy"
name = "deletel3policy"
action_present = _("Delete")
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("L3Policy")
data_type_plural = _("L3Policies")
data_type_singular = _("L3 Policy")
data_type_plural = _("L3 Policies")
class L3PolicyTable(tables.DataTable):
@ -121,7 +121,7 @@ class EditServicePolicyLink(tables.LinkAction):
class DeleteServicePolicyLink(tables.DeleteAction):
name = "delete_service_policy"
name = "deletespolicy"
action_present = _("Delete")
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("ServicePolicy")
@ -129,8 +129,11 @@ class DeleteServicePolicyLink(tables.DeleteAction):
class ServicePolicyTable(tables.DataTable):
name = tables.Column("name", verbose_name=_("Name"))
name = tables.Column("name", verbose_name=_("Name"),
link="horizon:project:network_policy:service_policy_details")
description = tables.Column("description", verbose_name=_("Description"))
network_service_params = tables.Column('network_service_params',
verbose_name=_("Network Service Params"))
class Meta:
name = "service_policy_table"

View File

@ -9,8 +9,6 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# @author: Ronak Shah
from django.core.urlresolvers import reverse_lazy
from django.utils.translation import ugettext_lazy as _
@ -19,6 +17,7 @@ from horizon import exceptions
from horizon import tabs
from gbpui import client
from gbpui import column_filters as gfilters
import tables
@ -27,7 +26,7 @@ class L3PolicyDetailsTab(tabs.Tab):
name = _("L3 Policy Details")
slug = "l3_policy_details"
template_name = "project/endpoint_groups/_l3_policy_details.html"
failure_url = reverse_lazy('horizon:project:endpoint_group:index')
failure_url = reverse_lazy('horizon:project:network_policy:index')
def get_context_data(self, request):
l3policy_id = self.tab_group.kwargs['l3policy_id']
@ -86,13 +85,37 @@ class ServicePolicyTab(tabs.TableTab):
policies = []
try:
policies = client.networkservicepolicy_list(self.request)
update = lambda x: gfilters.update_service_policy_attributes(x)
policies = [update(item) for item in policies]
except Exception:
policies = []
exceptions.handle(self.tab_group.request,
_('Unable to retrieve network service policy list.'))
return policies
class ServicePolicyDetailsTab(tabs.Tab):
name = _("Service Policy Details")
slug = "service_policy_details"
template_name = "project/network_policy/_service_policy_details.html"
failure_url = reverse_lazy('horizon:project:network_policy:index')
def get_context_data(self, request):
policy_id = self.tab_group.kwargs['service_policy_id']
try:
policy = client.get_networkservice_policy(request, policy_id)
except Exception:
exceptions.handle(
request, _('Unable to retrieve service policy details.'),
redirect=self.failure_url)
return {'policy': policy}
class ServicePolicyDetailsTabs(tabs.TabGroup):
slug = "service_policy_details_tab"
tabs = (ServicePolicyDetailsTab,)
sticky = True
class L3PolicyTabs(tabs.TabGroup):
slug = "l3policy_tab"
tabs = (L3PolicyTab, ServicePolicyTab,)
@ -109,6 +132,10 @@ class L2PolicyDetailsTab(tabs.Tab):
l2policy_id = self.tab_group.kwargs['l2policy_id']
try:
l2policy = client.l2policy_get(request, l2policy_id)
ptgs = []
for item in l2policy.policy_target_groups:
ptgs.append(client.policy_target_get(request, item))
setattr(l2policy, 'ptgs', ptgs)
except Exception:
exceptions.handle(
request, _('Unable to retrieve l2 policy details.'),

View File

@ -0,0 +1,24 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}add_network_service_param_form{% endblock %}
{% block form_action %}{% url 'horizon:project:network_policy:add_network_service_param' %}{% endblock %}
{% block modal-header %}{% trans "Add Network Service Parameter" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create" %}" />
<a href="{% url 'horizon:project:network_policy:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -13,5 +13,17 @@
<dt>{% trans "ID" %}</dt>
<dd>{{ l2policy.id }} </dd>
</dl>
{% if l2policy.ptgs %}
<div class="panel panel-default">
<div class="panel-heading"> Policy Target Groups </div>
<div class="panel-body">
<ul class='list-unstyled'>
{% for ptg in l2policy.ptgs %}
<li><a href="{% url 'horizon:project:policytargets:policy_targetdetails' policy_target_id=ptg.id %}">{{ptg.name}}:{{ptg.id}}</a></li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
</div>

View File

@ -0,0 +1,19 @@
{% load i18n sizeformat parse_date %}
{% load url from future %}
<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "Name" %}</dt>
<dd>{{ policy.name|default:_("-") }}</dd>
<dt>{% trans "Description" %}</dt>
<dd>{{ policy.description|default:_("-") }}</dd>
<dt>{% trans "ID" %}</dt>
<dd>{{ policy.id }} </dd>
<dt>{% trans "Network Service Params" %}</dt>
<dd>{{ policy.network_service_params }} </dd>
</dl>
</div>

View File

@ -20,6 +20,6 @@
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create" %}" />
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Update" %}" />
<a href="{% url 'horizon:project:network_policy:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -9,8 +9,6 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# @author: Ronak Shah
from django.conf.urls import patterns # noqa
@ -26,9 +24,15 @@ urlpatterns = patterns('',
url(r'^addserviceolicy$',
views.CreateServicePolicyView.as_view(),
name='create_servicepolicy'),
url(r'^addnetworkserviceparam$',
views.AddNetworkServiceParamView.as_view(),
name='add_network_service_param'),
url(r'^update_servicepolicy/(?P<service_policy_id>[^/]+)/$',
views.UpdateServicePolicyView.as_view(),
name='update_service_policy'),
url(r'^servicepolicy/(?P<service_policy_id>[^/]+)/$',
views.ServicePolicyDetailsView.as_view(),
name='service_policy_details'),
url(r'^addl2policy$',
views.AddL2policyView.as_view(),
name='addl2policy'),

View File

@ -9,8 +9,6 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# @author: Ronak Shah
import re
@ -36,16 +34,36 @@ class IndexView(tabs.TabView):
def post(self, request, *args, **kwargs):
obj_ids = request.POST.getlist('object_ids')
action = request.POST['action']
obj_type = re.search('delete([0-9a-z]+)', action).group(1)
if not obj_ids:
obj_ids.append(re.search('([0-9a-z-]+)$', action).group(1))
for obj_id in obj_ids:
try:
client.epg_delete(request, obj_id)
messages.success(request,
_('Deleted EPG %s') % obj_id)
except Exception as e:
exceptions.handle(request,
_('Unable to delete EPG. %s') % e)
if obj_type == 'spolicy':
for obj_id in obj_ids:
try:
client.delete_networkservice_policy(request, obj_id)
messages.success(request,
_('Deleted service policy %s') % obj_id)
except Exception as e:
msg = _('Unable to delete action. %s') % (str(e))
exceptions.handle(request, msg)
if obj_type == 'l3policy':
for obj_id in obj_ids:
try:
client.l3policy_delete(request, obj_id)
messages.success(request,
_('Deleted L3 policy %s') % obj_id)
except Exception as e:
msg = _('Unable to delete action. %s') % (str(e))
exceptions.handle(request, msg)
if obj_type == 'l2policy':
for obj_id in obj_ids:
try:
client.l2policy_delete(request, obj_id)
messages.success(request,
_('Deleted L2 policy %s') % obj_id)
except Exception as e:
msg = _('Unable to delete action. %s') % (str(e))
exceptions.handle(request, msg)
return self.get(request, *args, **kwargs)
@ -136,15 +154,28 @@ class CreateServicePolicyView(forms.ModalFormView):
return context
class AddNetworkServiceParamView(forms.ModalFormView):
form_class = np_forms.CreateNetworkServiceParamForm
template_name = "project/network_policy/create_network_service_param.html"
def get_object_id(self, params):
return params.name
class UpdateServicePolicyView(forms.ModalFormView):
form_class = np_forms.UpdateServicePolicyForm
template_name = "project/network_policy/update_service_policy.html"
def get_context_data(self, **kwargs):
context = super(
CreateServicePolicyView, self).get_context_data(**kwargs)
UpdateServicePolicyView, self).get_context_data(**kwargs)
context['service_policy_id'] = self.kwargs['service_policy_id']
return context
def get_initial(self):
return self.kwargs
class ServicePolicyDetailsView(tabs.TabView):
tab_group_class = (np_tabs.ServicePolicyDetailsTabs)
template_name = 'project/network_policy/details_tabs.html'

View File

@ -1,6 +1,3 @@
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# 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
@ -40,12 +37,25 @@ class CreateServiceChainNodeForm(forms.SelfHandlingForm):
max_length=80, label=_("Description"), required=False)
service_type = forms.ChoiceField(
label=_("Service Type"), choices=SERVICE_TYPES)
template_file = forms.FileField(label=_('Template File'),
help_text=_(
'A local template file to upload.'),
required=False)
template_string = forms.CharField(label=_("Template String"),
widget=forms.Textarea, required=False)
config_type = forms.ChoiceField(label=_("Config Type"),
choices=[('file', 'Heat Template'),
('string', 'Config String')],
widget=forms.Select(attrs={'class':
'switchable',
'data-slug': 'source'}))
template_file = forms.FileField(label=_('Configuration File'),
help_text=_('A local Heat template file to upload.'),
required=False,
widget=forms.FileInput(attrs={'class': 'switched',
'data-switch-on': 'source',
'data-source-file': _("Configuration File")}))
template_string = forms.CharField(label=_("Configuration String"),
help_text=_('A local Heat template string.'),
widget=forms.Textarea(attrs={'class': 'switched',
'data-switch-on': 'source',
'data-source-string':
_("Configuration String")}),
required=False)
def clean(self):
cleaned_data = super(CreateServiceChainNodeForm, self).clean()
@ -79,6 +89,7 @@ class CreateServiceChainNodeForm(forms.SelfHandlingForm):
try:
del context['template_string']
del context['template_file']
del context['config_type']
except KeyError:
pass
context['config'] = json.dumps(context['config'])
@ -121,7 +132,7 @@ class UpdateServiceChainNodeForm(forms.SelfHandlingForm):
except Exception as e:
msg = _("Failed to create Service Chain Node. %s") % (str(e))
LOG.error(msg)
exceptions.handle(request, msg, redirect=shortcuts.redirect)
exceptions.handle(request, msg, redirect=url)
class CreateServiceChainSpecForm(forms.SelfHandlingForm):
@ -153,7 +164,7 @@ class CreateServiceChainSpecForm(forms.SelfHandlingForm):
except Exception as e:
msg = _("Failed to create Service Chain Spec. %s") % (str(e))
LOG.error(msg)
exceptions.handle(request, msg, redirect=shortcuts.redirect)
exceptions.handle(request, msg, redirect=url)
class UpdateServiceChainSpecForm(CreateServiceChainSpecForm):

View File

@ -9,8 +9,6 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# @author: Ronak Shah
from django.utils.translation import ugettext_lazy as _

View File

@ -9,8 +9,6 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# @author: Ronak Shah
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
@ -37,11 +35,11 @@ class EditServiceChainSpecLink(tables.LinkAction):
class DeleteServiceChainSpecLink(tables.DeleteAction):
name = "delete_servicechain_spec"
name = "deletescspec"
action_present = _("Delete")
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("ServiceChainSpec")
data_type_plural = _("ServiceChainSpecs")
data_type_singular = _("Service Chain Spec")
data_type_plural = _("Service Chain Specs")
class ServiceChainSpecTable(tables.DataTable):
@ -55,8 +53,10 @@ class ServiceChainSpecTable(tables.DataTable):
class Meta:
name = "service_chain_spec_table"
verbose_name = _("Service Chain Specs")
table_actions = (CreateServiceChainSpecLink,)
row_actions = (EditServiceChainSpecLink, DeleteServiceChainSpecLink,)
table_actions = (CreateServiceChainSpecLink,
DeleteServiceChainSpecLink,)
row_actions = (EditServiceChainSpecLink,
DeleteServiceChainSpecLink,)
class CreateServiceChainNodeLink(tables.LinkAction):
@ -78,11 +78,11 @@ class EditServiceChainNodeLink(tables.LinkAction):
class DeleteServiceChainNodeLink(tables.DeleteAction):
name = "delete_servicechain_node"
name = "deletescnode"
action_present = _("Delete")
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("ServiceChainNode")
data_type_plural = _("ServiceChainNodes")
data_type_singular = _("Service Chain Node")
data_type_plural = _("Service Chain Nodes")
class ServiceChainNodeTable(tables.DataTable):
@ -97,8 +97,10 @@ class ServiceChainNodeTable(tables.DataTable):
class Meta:
name = "service_chain_node_table"
verbose_name = _("Service Chain Node")
table_actions = (CreateServiceChainNodeLink,)
row_actions = (EditServiceChainNodeLink, DeleteServiceChainNodeLink,)
table_actions = (CreateServiceChainNodeLink,
DeleteServiceChainNodeLink,)
row_actions = (EditServiceChainNodeLink,
DeleteServiceChainNodeLink,)
class CreateServiceChainInstanceLink(tables.LinkAction):
@ -120,7 +122,7 @@ class EditServiceChainInstanceLink(tables.LinkAction):
class DeleteServiceChainInstanceLink(tables.DeleteAction):
name = "delete_servicechain_instance"
name = "deletescinstance"
action_present = _("Delete")
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("ServiceChainInstance")

View File

@ -9,8 +9,8 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# @author: Ronak Shah
import json
from django.core.urlresolvers import reverse_lazy
from django.utils.translation import ugettext_lazy as _
@ -76,9 +76,7 @@ class ServiceChainInstanceTab(tabs.TableTab):
class ServiceChainTabs(tabs.TabGroup):
slug = "service_chain_spec_tabs"
tabs = (ServiceChainSpecTab,
ServiceChainNodeTab,
ServiceChainInstanceTab,)
tabs = (ServiceChainSpecTab, ServiceChainNodeTab,)
sticky = True
@ -114,6 +112,13 @@ class ServiceChainSpecDetailsTab(tabs.Tab):
scspec_id = self.tab_group.kwargs['scspec_id']
try:
scspec = client.get_servicechain_spec(request, scspec_id)
nodes = []
gn = lambda x, y: client.get_servicechain_node(x, y)
for node in scspec.nodes:
n = gn(self.request, node)
setattr(n, 'config', json.loads(n.config))
nodes.append(n)
setattr(scspec, 'nodes', nodes)
except Exception:
exceptions.handle(request, _(
'Unable to retrieve service chain spec details.'),

View File

@ -12,5 +12,13 @@
<dt>{% trans "ID" %}</dt>
<dd>{{ scnode.id }} </dd>
<dt>{% trans "Service Type" %}</dt>
<dd>{{ scnode.service_type }} </dd>
<dt>{% trans "Config" %}</dt>
<dd>
{{ scnode.config }}
</dd>
</dl>
</div>

View File

@ -12,14 +12,33 @@
<dt>{% trans "ID" %}</dt>
<dd>{{ scspec.id }} </dd>
<dt>{% trans "Nodes" %}</dt>
<dd>
<ul class="list-unstyled">
{% for node in scspec.nodes %}
<li>{{ node}}</li>
{% endfor %}
</ul>
</dd>
</dl>
{% if scspec.nodes %}
<div class="panel panel-default">
<div class="panel-heading">Nodes</div>
<div class="panel-body">
<table class="table">
<thead>
<tr>
<th>Name</th>
<th>Service Type</th>
<th>Config</th>
</tr>
</thead>
{% for node in scspec.nodes %}
<tr>
<td>
<a href="{% url 'horizon:project:network_services:sc_node_details' scnode_id=node.id %}">
{{node.name}}:{{node.id}}</a>
</td>
<td>{{node.service_type}}</td>
<td>
{{node.config}}
</td>
</tr>
{% endfor %}
</table>
</div>
</div>
{% endif %}
</div>

View File

@ -9,8 +9,6 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# @author: Ronak Shah
from django.conf.urls import patterns # noqa

View File

@ -9,18 +9,59 @@
# 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 re
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from horizon import tabs
import forms as ns_forms
import tabs as ns_tabs
from gbpui import client
class IndexView(tabs.TabView):
tab_group_class = (ns_tabs.ServiceChainTabs)
template_name = 'project/network_services/details_tabs.html'
def post(self, request, *args, **kwargs):
obj_ids = request.POST.getlist('object_ids')
action = request.POST['action']
obj_type = re.search('delete([a-z]+)', action).group(1)
if not obj_ids:
obj_ids.append(re.search('([0-9a-z-]+)$', action).group(1))
if obj_type == 'scnode':
for obj_id in obj_ids:
try:
client.delete_servicechain_node(request, obj_id)
messages.success(request, _('Deleted %s') % obj_id)
except Exception as e:
exceptions.handle(request,
_('Unable to delete . %s') % e)
if obj_type == 'scinstance':
for obj_id in obj_ids:
try:
client.delete_servicechain_instance(request, obj_id)
messages.success(
request, _('Deleted %s') % obj_id)
except Exception as e:
exceptions.handle(request,
_('Unable to delete . %s') % e)
if obj_type == 'scspec':
for obj_id in obj_ids:
try:
client.delete_servicechain_spec(request, obj_id)
messages.success(request,
_('Deleted %s') % obj_id)
except Exception as e:
exceptions.handle(request,
_('Unable to delete . %s') % e)
return self.get(request, *args, **kwargs)
class CreateServiceChainNodeView(forms.ModalFormView):
form_class = ns_forms.CreateServiceChainNodeForm
@ -82,8 +123,8 @@ class ServiceChainSpecDetailsView(tabs.TabView):
class CreateServiceChainInstanceView(forms.ModalFormView):
form_class = ns_forms.CreateServiceChainInstanceForm
template_name = "project / network_services/"\
"ceate_service_chain_instance.html"
template_name = "project/network_services/"\
"create_service_chain_instance.html"
def get_context_data(self, **kwargs):
context = super(

View File

@ -0,0 +1,305 @@
# 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.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from gbpui import client
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 = forms.MultipleChoiceField(
label=_("Provided Policy Rule Set"), required=False)
consumed_policy_rule_sets = forms.MultipleChoiceField(
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."))
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)
tenant_id = self.request.user.tenant_id
policy_rule_sets = client.policy_rule_set_list(
request, tenant_id=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)
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']:
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 handle(self, request, context):
policy_target_id = self.initial['policy_target_id']
name_or_id = context.get('name') or policy_target_id
try:
context['provided_policy_rule_sets'] = dict(
[(i, 'string') for i in context['provided_policy_rule_sets']])
context['consumed_policy_rule_sets'] = dict(
[(i, 'string') for i in context['consumed_policy_rule_sets']])
if context['network_service_policy_id'] == 'None':
context['network_service_policy_id'] = None
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 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:
tenant_id = self.request.user.tenant_id
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=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 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:
tenant_id = self.request.user.tenant_id
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=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 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:
tenant_id = self.request.user.tenant_id
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=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 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:
tenant_id = self.request.user.tenant_id
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=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)

View File

@ -0,0 +1,20 @@
# 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.
from django.utils.translation import ugettext_lazy as _
import horizon
class PolicyTargetGroup(horizon.Panel):
name = _("Groups")
slug = "policytargets"

View File

@ -0,0 +1,224 @@
# 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 import shortcuts
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import tables
from openstack_dashboard import api
from openstack_dashboard.dashboards.project.instances import tables as itables
from openstack_dashboard.dashboards.project.instances import tabs
LOG = logging.getLogger(__name__)
class UpdatePTGLink(tables.LinkAction):
name = "updatepolicy_target"
verbose_name = _("Edit")
classes = ("ajax-modal", "btn-update",)
def get_link_url(self, policy_target):
u = "horizon:project:policytargets:updatepolicy_target"
base_url = reverse(u, kwargs={'policy_target_id': policy_target.id})
return base_url
class DeletePTGLink(tables.DeleteAction):
name = "deletepolicy_target"
action_present = _("Delete")
action_past = _("Scheduled deletion of %(data_type)s")
data_type_singular = _("Group")
data_type_plural = _("Groups")
class AddPTGLink(tables.LinkAction):
name = "addpolicy_target"
verbose_name = _("Create Group")
url = "horizon:project:policytargets:addpolicy_target"
classes = ("ajax-modal", "btn-addpolicy_target",)
class PTGsTable(tables.DataTable):
name = tables.Column("name",
verbose_name=_("Name"),
link="horizon:project:policytargets:policy_targetdetails")
description = tables.Column("description", verbose_name=_("Description"))
provided_policy_rule_sets = tables.Column("provided_policy_rule_sets",
sortable=False,
verbose_name=_("Provided Rule Sets"))
consumed_policy_rule_sets = tables.Column("consumed_policy_rule_sets",
sortable=False,
verbose_name=_("Consumed Rule Sets"))
l2_policy_id = tables.Column("l2_policy_id",
verbose_name=_("L2 Policy"))
class Meta:
name = "policy_targetstable"
verbose_name = _("Groups")
table_actions = (AddPTGLink, DeletePTGLink)
row_actions = (UpdatePTGLink, DeletePTGLink)
class LaunchVMLink(tables.LinkAction):
name = "launch_vm"
verbose_name = _("Create Member")
classes = ("ajax-modal", "btn-addvm",)
def get_link_url(self):
return reverse("horizon:project:policytargets:addvm",
kwargs={'policy_target_id':
self.table.kwargs['policy_target_id']})
class RemoveVMLink(tables.DeleteAction):
data_type_singular = _("Instance")
data_type_plural = _("Instances")
def delete(self, request, instance_id):
url = reverse("horizon:project:policytargets:policy_targetdetails",
kwargs={'policy_target_id':
self.table.kwargs['policy_target_id']})
try:
api.nova.server_delete(request, instance_id)
LOG.debug('Deleted instance %s successfully' % instance_id)
return http.HttpResponseRedirect(url)
except Exception:
msg = _('Failed to delete instance %s') % instance_id
LOG.info(msg)
exceptions.handle(request, msg, redirect=shortcuts.redirect)
class ConsoleLink(tables.LinkAction):
name = "console"
verbose_name = _("Console")
url = "horizon:project:instances:detail"
classes = ("btn-console",)
policy_rules = (("compute", "compute_extension:consoles"),)
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, 'tenant_id', None)
return {"project_id": project_id}
def allowed(self, request, instance=None):
# We check if ConsoleLink is allowed only if settings.CONSOLE_TYPE is
# not set at all, or if it's set to any value other than None or False.
# return bool(getattr(settings, 'CONSOLE_TYPE', True)) and
# instance.status in ACTIVE_STATES and not is_deleting(instance)
return True
def get_link_url(self, datum):
base_url = super(ConsoleLink, self).get_link_url(datum)
tab_query_string = tabs.ConsoleTab(
tabs.InstanceDetailTabs).get_query_string()
return "?".join([base_url, tab_query_string])
class InstancesTable(tables.DataTable):
name = tables.Column("name",
link="horizon:project:instances:detail",
verbose_name=_("Instance Name"))
image_name = tables.Column("image_name", verbose_name=_("Image Name"))
status = tables.Column("status", verbose_name=_("Status"))
ip = tables.Column(
itables.get_ips, verbose_name=_("IP Address"),
attrs={'data-type': "ip"})
def get_empty_message(self, *args, **kwargs):
return "No members in this group, create one"
class Meta:
name = "instances"
verbose_name = _("Members")
table_actions = (LaunchVMLink,)
row_actions = (ConsoleLink, RemoveVMLink,)
class AddProvidedLink(tables.LinkAction):
name = "add_policy_rule_set"
verbose_name = _("Add Policy Rule Set")
classes = ("ajax-modal", "btn-addvm",)
def get_link_url(self):
return reverse("horizon:project:policytargets:add_provided_prs",
kwargs={'policy_target_id':
self.table.kwargs['policy_target_id']})
class RemoveProvidedLink(tables.LinkAction):
name = "remove_policy_rule_set"
verbose_name = _("Remove Policy Rule Set")
classes = ("ajax-modal", "btn-addvm",)
def get_link_url(self):
return reverse("horizon:project:policytargets:remove_provided_prs",
kwargs={'policy_target_id':
self.table.kwargs['policy_target_id']})
class ProvidedContractsTable(tables.DataTable):
name = tables.Column("name",
link="horizon:project:application_policy:policy_rule_set_details",
verbose_name=_("Name"))
description = tables.Column("description", verbose_name=_("Description"))
policy_rules = tables.Column("policy_rules",
sortable=False,
verbose_name=_("Policy Rules"))
class Meta:
name = 'provided_policy_rule_sets'
verbose_name = _("Provided Policy Rule Set")
table_actions = (AddProvidedLink, RemoveProvidedLink,)
class AddConsumedLink(tables.LinkAction):
name = "add_consumed"
verbose_name = _("Add Consumed Policy Rule Set")
classes = ("ajax-modal", "btn-addvm",)
def get_link_url(self):
return reverse("horizon:project:policytargets:add_consumed_prs",
kwargs={'policy_target_id':
self.table.kwargs['policy_target_id']})
class RemoveConsumedLink(tables.LinkAction):
name = "remove_consumed"
verbose_name = _("Remove Consumed Policy Rule Set")
classes = ("ajax-modal", "btn-addvm",)
def get_link_url(self):
return reverse("horizon:project:policytargets:remove_consumed_prs",
kwargs={'policy_target_id':
self.table.kwargs['policy_target_id']})
class ConsumedContractsTable(tables.DataTable):
name = tables.Column("name",
link="horizon:project:application_policy:policy_rule_set_details",
verbose_name=_("Name"))
description = tables.Column("description",
verbose_name=_("Description"))
policy_rules = tables.Column("policy_rules",
sortable=False,
verbose_name=_("Policy Rules"))
class Meta:
name = 'consumed_policy_rule_sets'
verbose_name = _("Consumed Policy Rule Set")
table_actions = (AddConsumedLink, RemoveConsumedLink,)

View File

@ -0,0 +1,176 @@
# 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.
from django.core.urlresolvers import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import tabs
from openstack_dashboard import api
from openstack_dashboard.dashboards.project.instances import tables as itables
from gbpui import client
from gbpui import column_filters as gfilters
import tables
PTGsTable = tables.PTGsTable
class PTGsTab(tabs.TableTab):
table_classes = (PTGsTable,)
name = _("Groups")
slug = "policytargets"
template_name = "horizon/common/_detail_table.html"
def get_policy_targetstable_data(self):
policy_targets = []
try:
tenant_id = self.request.user.tenant_id
policy_targets = client.policy_target_list(self.tab_group.request,
tenant_id=tenant_id)
a = lambda x, y: gfilters.update_policy_target_attributes(x, y)
policy_targets = [a(self.request, item) for item in policy_targets]
except Exception as e:
msg = _('Unable to retrieve policy_target list. %s') % (str(e))
exceptions.handle(self.tab_group.request, msg)
for policy_target in policy_targets:
policy_target.set_id_as_name_if_empty()
return policy_targets
class PTGTabs(tabs.TabGroup):
slug = "policy_targettabs"
tabs = (PTGsTab,)
sticky = True
class PTGDetailsTab(tabs.Tab):
name = _("Group Details")
slug = "policy_targetdetails"
template_name = "project/policytargets/_policy_target_details.html"
failure_url = reverse_lazy('horizon:project:policy_target_group:index')
def get_context_data(self, request):
policy_targetid = self.tab_group.kwargs['policy_target_id']
try:
policy_target = client.policy_target_get(request, policy_targetid)
l3list = client.l3policy_list(request)
l2list = client.l2policy_list(request)
l2list = [
item for item in l2list
if item.id == policy_target.l2_policy_id]
except Exception:
exceptions.handle(
request, _('Unable to retrieve group details.'),
redirect=self.failure_url)
return {'policy_target': policy_target,
'l3list': l3list,
'l2list': l2list}
class PTGDetailsTabs(tabs.TabGroup):
slug = "policy_targettabs"
tabs = (PTGDetailsTab,)
class InstancesTab(tabs.TableTab):
name = _("Members")
slug = "members_tab"
table_classes = (tables.InstancesTable,)
template_name = ("horizon/common/_detail_table.html")
preload = True
def get_instances_data(self):
policy_targetid = self.tab_group.kwargs['policy_target_id']
filtered_instances = []
try:
policytargets = client.pt_list(self.request,
policy_target_group_id=policy_targetid)
policy_target_ports = [x.port_id for x in policytargets]
marker = self.request.GET.get(
tables.InstancesTable._meta.pagination_param, None)
instances, self._has_more = api.nova.server_list(
self.request, search_opts={'marker': marker, 'paginate': True})
instances = [item for item in instances
if not itables.is_deleting(item)]
for item in instances:
for port in api.neutron.port_list(self.request,
device_id=item.id):
if port.id in policy_target_ports:
filtered_instances.append(item)
break
except Exception:
self._has_more = False
error_message = _('Unable to get instances')
exceptions.handle(self.request, error_message)
filtered_instances = []
return filtered_instances
class ConsumedTab(tabs.TableTab):
name = _('Consumed Policy Rule Set')
slug = 'consumed_policy_rule_sets_tab'
table_classes = (tables.ConsumedContractsTable,)
template_name = ("horizon/common/_detail_table.html")
def get_consumed_policy_rule_sets_data(self):
try:
policy_targetid = self.tab_group.kwargs['policy_target_id']
policy_target = client.policy_target_get(
self.request, policy_targetid)
consumed_policy_rule_set_ids = policy_target.get(
'consumed_policy_rule_sets')
consumed_policy_rule_sets = []
for _id in consumed_policy_rule_set_ids:
consumed_policy_rule_sets.append(
client.policy_rule_set_get(self.request, _id))
consumed_policy_rule_sets = [gfilters.update_pruleset_attributes(
self.request, item) for item in consumed_policy_rule_sets]
return consumed_policy_rule_sets
except Exception:
error_message = _('Unable to get consumed rule sets')
exceptions.handle(self.request, error_message)
return []
class ProvidedTab(tabs.TableTab):
name = _('Provided Policy Rule Set')
slug = 'provided_policy_rule_sets_tab'
table_classes = (tables.ProvidedContractsTable,)
template_name = ("horizon/common/_detail_table.html")
def get_provided_policy_rule_sets_data(self):
try:
policy_targetid = self.tab_group.kwargs['policy_target_id']
policy_target = client.policy_target_get(
self.request, policy_targetid)
provided_policy_rule_set_ids = policy_target.get(
'provided_policy_rule_sets')
provided_policy_rule_sets = []
for _id in provided_policy_rule_set_ids:
provided_policy_rule_sets.append(
client.policy_rule_set_get(self.request, _id))
provided_policy_rule_sets = [gfilters.update_pruleset_attributes(
self.request, item) for item in provided_policy_rule_sets]
return provided_policy_rule_sets
except Exception:
error_message = _('Unable to get provided rule sets')
exceptions.handle(self.request, error_message)
return []
class PTGMemberTabs(tabs.TabGroup):
slug = 'member_tabs'
tabs = (InstancesTab, ProvidedTab, ConsumedTab, PTGDetailsTab,)
stiky = True

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}add_consumed_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:add_consumed' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Add " %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Add Consumed Policy Rule Set. Press Ctrl to select multiple items." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}add_consumed_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:add_consumed_prs' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Add " %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Add Consumed Policy Rule Set. Press Ctrl to select multiple items." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}add_contract_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:add_contract' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Add Policy Rule Set" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Add Policy Rule Set. Press Ctrl to select multiple items." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}add_l3policy_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:addl3policy' %}{% endblock %}
{% block modal-header %}{% trans "Add L3Policy" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Add L3 Policy." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}add_contract_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:add_policy_rule_set' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Add Policy Rule Set" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Add Policy Rule Set. Press Ctrl to select multiple items." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}add_consumed_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:add_provided_prs' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Add Provided PRS" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Add Consumed Policy Rule Set. Press Ctrl to select multiple items." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}add_vm_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:addvm' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Launch Instance" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Launch instance here." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Launch" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}add_vm_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:addvm' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Launch Instance" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Launch instance here." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Launch" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,17 @@
{% load i18n sizeformat parse_date %}
{% load url from future %}
<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "Name" %}</dt>
<dd>{{ l3policy.name|default:_("-") }}</dd>
<dt>{% trans "Description" %}</dt>
<dd>{{ l3policy.description|default:_("-") }}</dd>
<dt>{% trans "ID" %}</dt>
<dd>{{ l3policy.id }} </dd>
</dl>
</div>

View File

@ -0,0 +1,45 @@
{% load i18n sizeformat parse_date %}
{% load url from future %}
<div class="info row detail">
<hr class="header_rule">
<dl>
<dt>{% trans "Name" %}</dt>
<dd>{{ policy_target.name|default:_("-") }}</dd>
<dt>{% trans "Description" %}</dt>
<dd>{{ policy_target.description|default:_("-") }}</dd>
<dt>{% trans "ID" %}</dt>
<dd>{{ policy_target.id }} </dd>
<dt>{% trans "Project ID" %}</dt>
<dd>{{ policy_target.tenant_id }}</dd>
</dl>
{% if l3list %}
<div class='panel panel-default'>
<div class='panel-heading'>{% trans "L3 Policies" %}</div>
<div class='panel-body'>
<ul class="unstyled">
{% for l3 in l3list %}
<li><a href="{% url 'horizon:project:network_policy:l3policy_details' l3.id %}">{{l3.name}}:{{l3.id}}</a></li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
{% if l2list %}
<div class='panel panel-default'>
<div class='panel-heading'>{% trans "L2 Policies" %}</div>
<div class='panel-body'>
<ul class="unstyled">
{% for l2 in l2list %}
<li><a href="{% url 'horizon:project:network_policy:l2policy_details' l2.id %}">{{l2.name}}:{{l2.id}}</a></li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
</div>

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}remove_contract_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:remove_consumed' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Remove Policy Rule Set" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Remove Consumed Policy Rule Set. Press Ctrl to select multiple items." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}remove_contract_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:remove_consumed_prs' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Remove Policy Rule Set" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Remove Consumed Policy Rule Set. Press Ctrl to select multiple items." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}remove_contract_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:remove_contract' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Remove Policy Rule Set" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Remove Policy Rule Set. Press Ctrl to select multiple items." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}add_consumed_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:remove_provided_prs' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Remove Provided PRS" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Remove Consumed Policy Rule Set. Press Ctrl to select multiple items." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}update_l3policy_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:update_l3policy' l3policy_id %}{% endblock %}
{% block modal-header %}{% trans "Update L3Policy" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Update L3 Policy." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}update_policy_target_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:updatepolicy_target' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Edit Group" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "You may update policy_target details here." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,25 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}update_policy_target_form{% endblock %}
{% block form_action %}{% url 'horizon:project:policytargets:updatepolicy_target' policy_target_id %}{% endblock %}
{% block modal-header %}{% trans "Edit Group" %}{% endblock %}
{% block modal-body %}
<div class="left">
<fieldset>
{% include "horizon/common/_form_fields.html" %}
</fieldset>
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "You may update policy_target details here." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Save Changes" %}" />
<a href="{% url 'horizon:project:policytargets:index' %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Create New Group" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Create New Group") %}
{% endblock page_header %}
{% block main %}
{% include 'horizon/common/_workflow.html' %}
{% endblock %}

View File

@ -0,0 +1,15 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Groups" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Groups") %}
{% endblock page_header %}
{% block main %}
<div class="row">
<div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,15 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Groups Details" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Group : ")|add:policy_target.name %}
{% endblock page_header %}
{% block main %}
<div class="row">
<div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Edit Endpoint Group" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Edit Group ")|add:name %}
{% endblock page_header %}
{% block main %}
{% include 'project/policy_target_groups/_updatepolicy_target.html' %}
{% endblock %}

View File

@ -0,0 +1,49 @@
# 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.
from django.conf.urls import patterns # noqa
from django.conf.urls import url # noqa
import views
urlpatterns = patterns('',
url(r'^$',
views.IndexView.as_view(),
name='index'),
url(r'^addpolicy_target$',
views.AddPTGView.as_view(),
name='addpolicy_target'),
url(r'^updatepolicy_target/'
'(?P<policy_target_id>[^/]+)/$',
views.UpdatePTGView.as_view(),
name='updatepolicy_target'),
url(r'^policy_target/(?P<policy_target_id>[^/]+)/$',
views.PTGDetailsView.as_view(),
name='policy_targetdetails'),
url(r'^addvm/(?P<policy_target_id>[^/]+)/$',
views.LaunchVMView.as_view(), name='addvm'),
url(r'^add_policy_rule_set/'
'(?P<policy_target_id>[^/]+)/$',
views.AddProvidedPRSView.as_view(),
name='add_provided_prs'),
url(r'^remove_policy_rule_set/'
'(?P<policy_target_id>[^/]+)/$',
views.RemoveProvidedPRSView.as_view(),
name='remove_provided_prs'),
url(r'^add_consumed/(?P<policy_target_id>[^/]+)/$',
views.AddConsumedPRSView.as_view(),
name='add_consumed_prs'),
url(r'^remove_consumed/(?P<policy_target_id>[^/]+)/$',
views.RemoveConsumedPRSView.as_view(),
name='remove_consumed_prs'),
)

View File

@ -0,0 +1,166 @@
# 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 re
from django.core.urlresolvers import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from horizon import tabs
from horizon.utils import memoized
from horizon import workflows
from gbpui import client
import forms as policy_target_forms
import tabs as policy_target_tabs
import workflows as policy_target_workflows
PTGTabs = policy_target_tabs.PTGTabs
PTGDetailsTabs = policy_target_tabs.PTGDetailsTabs
AddPTG = policy_target_workflows.AddPTG
LaunchVM = policy_target_workflows.CreateVM
class IndexView(tabs.TabView):
tab_group_class = (PTGTabs)
template_name = 'project/policytargets/details_tabs.html'
def post(self, request, *args, **kwargs):
obj_ids = request.POST.getlist('object_ids')
action = request.POST['action']
if not obj_ids:
obj_ids.append(re.search('([0-9a-z-]+)$', action).group(1))
for obj_id in obj_ids:
try:
client.policy_target_delete(request, obj_id)
messages.success(request,
_('Deleted Group %s') % obj_id)
except Exception as e:
exceptions.handle(request,
_('Unable to delete Group. %s') % e)
return self.get(request, *args, **kwargs)
class AddPTGView(workflows.WorkflowView):
workflow_class = AddPTG
template_name = "project/policytargets/addpolicy_target.html"
class PTGDetailsView(tabs.TabbedTableView):
tab_group_class = (policy_target_tabs.PTGMemberTabs)
template_name = 'project/policytargets/group_details.html'
def get_context_data(self, **kwargs):
context = super(PTGDetailsView, self).get_context_data(**kwargs)
try:
policy_target = client.policy_target_get(
self.request, context['policy_target_id'])
context['policy_target'] = policy_target
except Exception:
pass
return context
class LaunchVMView(workflows.WorkflowView):
workflow_class = LaunchVM
template_name = "project/policytargets/add_vm.html"
def get_initial(self):
return self.kwargs
class UpdatePTGView(forms.ModalFormView):
form_class = policy_target_forms.UpdatePolicyTargetForm
template_name = "project/policytargets/update_policy_target.html"
context_object_name = 'policy_target'
success_url = reverse_lazy("horizon:project:policytargets:index")
def get_context_data(self, **kwargs):
context = super(UpdatePTGView, self).get_context_data(**kwargs)
context["policy_target_id"] = self.kwargs['policy_target_id']
obj = self._get_object()
if obj:
context['name'] = obj.name
return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs):
policy_target_id = self.kwargs['policy_target_id']
try:
policy_target = client.policy_target_get(
self.request, policy_target_id)
policy_target.set_id_as_name_if_empty()
return policy_target
except Exception:
redirect = self.success_url
msg = _('Unable to retrieve policy_target details.')
exceptions.handle(self.request, msg, redirect=redirect)
def get_initial(self):
return self.kwargs
class AddProvidedPRSView(forms.ModalFormView):
form_class = policy_target_forms.AddProvidedPRSForm
template_name = "project/policytargets/add_provided_prs.html"
def get_context_data(self, **kwargs):
context = super(AddProvidedPRSView, self).get_context_data(**kwargs)
context["policy_target_id"] = self.kwargs['policy_target_id']
return context
def get_initial(self):
return self.kwargs
class RemoveProvidedPRSView(forms.ModalFormView):
form_class = policy_target_forms.RemoveProvidedPRSForm
template_name = "project/policytargets/remove_provided_prs.html"
def get_context_data(self, **kwargs):
context = super(RemoveProvidedPRSView, self).get_context_data(**kwargs)
context["policy_target_id"] = self.kwargs['policy_target_id']
return context
def get_initial(self):
return self.kwargs
class AddConsumedPRSView(forms.ModalFormView):
form_class = policy_target_forms.AddConsumedPRSForm
template_name = "project/policytargets/add_consumed_prs.html"
def get_context_data(self, **kwargs):
context = super(AddConsumedPRSView, self).get_context_data(**kwargs)
context["policy_target_id"] = self.kwargs['policy_target_id']
return context
def get_initial(self):
return self.kwargs
class RemoveConsumedPRSView(forms.ModalFormView):
form_class = policy_target_forms.RemoveConsumedPRSForm
template_name = "project/policytargets/remove_consumed_prs.html"
def get_context_data(self, **kwargs):
context = super(RemoveConsumedPRSView, self).get_context_data(**kwargs)
context["policy_target_id"] = self.kwargs['policy_target_id']
return context
def get_initial(self):
return self.kwargs

View File

@ -0,0 +1,332 @@
# 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.template.defaultfilters import filesizeformat # noqa
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from horizon import workflows
from openstack_dashboard import api
from openstack_dashboard.dashboards.project.images import utils as imageutils
from openstack_dashboard.dashboards.project.instances import utils
from gbpui import client
from gbpui import fields
LOG = logging.getLogger(__name__)
POLICY_RULE_SET_URL = "horizon:project:application_policy:addpolicy_rule_set"
class SelectPolicyRuleSetAction(workflows.Action):
provided_policy_rule_set = fields.DynamicMultiChoiceField(
label=_("Provided Policy Rule Set"),
help_text=_("Choose a policy rule set for an Group."),
add_item_link=POLICY_RULE_SET_URL,
required=False)
consumed_policy_rule_set = fields.DynamicMultiChoiceField(
label=_("Consumed Policy Rule Set"),
help_text=_("Select consumed policy rule set for Group."),
add_item_link=POLICY_RULE_SET_URL,
required=False)
class Meta:
name = _("Application Policy")
help_text = _("Select Policy Rule Set for Group.")
def _policy_rule_set_list(self, request, tenant_id):
policy_rule_sets = client.policy_rule_set_list(request,
tenant_id=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)
return [(c.id, c.name) for c in policy_rule_sets]
def populate_provided_policy_rule_set_choices(self, request, context):
policy_rule_set_list = []
try:
tenant_id = self.request.user.tenant_id
rsets = self._policy_rule_set_list(request, tenant_id)
if len(rsets) == 0:
rsets.extend([('None', 'No Provided Policy Rule Sets')])
policy_rule_set_list = rsets
except Exception as e:
policy_rule_set_list = []
msg = _('Unable to retrieve policy rule set. %s.') % (str(e))
exceptions.handle(request, msg)
return policy_rule_set_list
def populate_consumed_policy_rule_set_choices(self, request, context):
policy_rule_set_list = []
try:
tenant_id = self.request.user.tenant_id
policy_rule_set_list = [('None', 'No Consumed Policy Rule Sets')]
policy_rule_set_list =\
self._policy_rule_set_list(request, tenant_id)
except Exception as e:
msg = _('Unable to retrieve policy rule set. %s.') % (str(e))
exceptions.handle(request, msg)
return policy_rule_set_list
class SelectL2policyAction(workflows.Action):
l2policy_id = forms.ChoiceField(
label=_("Network Policy"),
help_text=_("Select network policy for Group."))
network_service_policy_id = forms.ChoiceField(
label=_("Network Services Policy"),
help_text=_("Select network services policy for Group."),
required=False)
class Meta:
name = _("Network Policy")
help_text = _(
"Select network policy for Group."
"Selecting default will create an Network Policy implicitly.")
def populate_l2policy_id_choices(self, request, context):
policies = []
try:
policies = client.l2policy_list(request)
for p in policies:
p.set_id_as_name_if_empty()
policies = sorted(policies, key=lambda rule: rule.name)
policies = [(p.id, p.name + ":" + p.id) for p in policies]
policies.insert(0, ('default', 'Default'))
except Exception as e:
exceptions.handle(request,
_("Unable to retrieve policies (%(error)s).")
% {'error': str(e)})
return policies
def populate_network_service_policy_id_choices(self, request, context):
policies = []
try:
policies = client.networkservicepolicy_list(
request, tenant_id=request.user.tenant_id)
for p in policies:
p.set_id_as_name_if_empty()
policies = [(p.id, p.name + ":" + p.id) for p in policies]
policies.insert(0, ('None', 'No Network Service Policy'))
except Exception as e:
msg = _("Unable to retrieve service policies. %s).") % (str(e))
exceptions.handle(request, msg)
return policies
class SelectL2policyStep(workflows.Step):
action_class = SelectL2policyAction
name = _("L2 Policy")
contributes = ("l2policy_id", "network_services_policy_id",)
def contribute(self, data, context):
if data['l2policy_id'] != 'default':
context['l2_policy_id'] = data['l2policy_id']
if data['network_service_policy_id'] != 'None':
context['network_service_policy_id'] = \
data['network_service_policy_id']
return context
class SelectPolicyRuleSetStep(workflows.Step):
action_class = SelectPolicyRuleSetAction
name = _("Provided Policy Rule Set")
contributes = ("provided_policy_rule_sets", "consumed_policy_rule_sets",)
def contribute(self, data, context):
if data:
policy_rule_sets = self.workflow.request.POST.getlist(
"provided_policy_rule_set")
if policy_rule_sets:
policy_rule_set_dict = {}
for policy_rule_set in policy_rule_sets:
if policy_rule_set != 'None':
policy_rule_set_dict[policy_rule_set] = None
context['provided_policy_rule_sets'] = policy_rule_set_dict
policy_rule_sets = self.workflow.request.POST.getlist(
"consumed_policy_rule_set")
if policy_rule_sets:
policy_rule_set_dict = {}
for policy_rule_set in policy_rule_sets:
if policy_rule_set != 'None':
policy_rule_set_dict[policy_rule_set] = None
context['consumed_policy_rule_sets'] = policy_rule_set_dict
return context
class AddPTGAction(workflows.Action):
name = forms.CharField(max_length=80,
label=_("Name"))
description = forms.CharField(max_length=80,
label=_("Description"),
required=False)
def __init__(self, request, *args, **kwargs):
super(AddPTGAction, self).__init__(request, *args, **kwargs)
class Meta:
name = _("Create Group")
help_text = _("Create a new Group")
class AddPTGStep(workflows.Step):
action_class = AddPTGAction
contributes = ("name", "description")
def contribute(self, data, context):
context = super(AddPTGStep, self).contribute(data, context)
return context
class AddPTG(workflows.Workflow):
slug = "addpolicy_target"
name = _("Create Group")
finalize_button_name = _("Create")
success_message = _('Create Group "%s".')
failure_message = _('Unable to create Group "%s".')
success_url = "horizon:project:policytargets:index"
default_steps = (AddPTGStep,
SelectPolicyRuleSetStep,
SelectL2policyStep,)
wizard = True
def format_status_message(self, message):
return message % self.context.get('name')
def handle(self, request, context):
try:
group = client.policy_target_create(request, **context)
return group
except Exception as e:
msg = self.format_status_message(self.failure_message) + str(e)
exceptions.handle(request, msg)
return False
def _image_choice_title(img):
gb = filesizeformat(img.size)
return '%s (%s)' % (img.name or img.id, gb)
class LaunchInstance(workflows.Action):
availability_zone = forms.ChoiceField(
label=_("Availability Zone"), required=False)
name = forms.CharField(label=_("Instance Name"), max_length=255)
flavor = forms.ChoiceField(
label=_("Flavor"), help_text=_("Size of image to launch."))
count = forms.IntegerField(label=_(
"Instance Count"),
min_value=1,
initial=1,
help_text=_("Number of instances to launch."))
image = forms.ChoiceField(label=_("Select Image"),
widget=forms.SelectWidget(
attrs={'class': 'image-selector'},
data_attrs=('size', 'display-name'),
transform=_image_choice_title))
def __init__(self, request, *args, **kwargs):
super(LaunchInstance, self).__init__(request, *args, **kwargs)
images = imageutils.get_available_images(
request, request.user.tenant_id)
choices = [(image.id, image) for image in images]
if choices:
choices.insert(0, ("", _("Select Image")))
else:
choices.insert(0, ("", _("No images available")))
zones = self._availability_zone_choices(request)
self.fields['image'].choices = choices
self.fields['availability_zone'].choices = zones
self.fields['flavor'].choices = self._flavor_choices(request)
def _flavor_choices(self, request):
flavors = utils.flavor_list(request)
if flavors:
return utils.sort_flavor_list(request, flavors)
return []
def _availability_zone_choices(self, request):
try:
zones = api.nova.availability_zone_list(request)
except Exception:
zones = []
exceptions.handle(
request, _('Unable to retrieve availability zones.'))
zone_list = [(zone.zoneName, zone.zoneName)
for zone in zones if zone.zoneState['available']]
zone_list.sort()
if not zone_list:
zone_list.insert(0, ("", _("No availability zones found")))
elif len(zone_list) > 1:
zone_list.insert(0, ("", _("Any Availability Zone")))
return zone_list
def handle(self, request, context):
policy_target_id = self.request.path.split("/")[-2]
try:
msg = _('Member was successfully created.')
ep = client.pt_create(
request, policy_target_group_id=policy_target_id)
api.nova.server_create(request,
context['name'],
context['image'],
context['flavor'],
key_name=None,
user_data=None,
security_groups=None,
instance_count=context['count'],
nics=[{'port-id': ep.port_id}])
LOG.debug(msg)
messages.success(request, msg)
except Exception:
msg = _('Failed to launch VM')
LOG.error(msg)
u = "horizon:project:policytargets:policy_targetdetails"
redirect = reverse(u, kwargs={'policy_target_id':
policy_target_id})
exceptions.handle(request, msg, redirect=redirect)
class LaunchVMStep(workflows.Step):
action_class = LaunchInstance
contributes = ("name", "availability_zone", "flavor", "count", "image")
def contribute(self, data, context):
context = super(LaunchVMStep, self).contribute(data, context)
return context
class CreateVM(workflows.Workflow):
slug = "launch VM"
name = _("Create Member")
finalize_button_name = _("Launch")
success_message = _('Create Member "%s".')
failure_message = _('Unable to create Member "%s".')
default_steps = (LaunchVMStep,)
wizard = True
def format_status_message(self, message):
return message % self.context.get('name')
def get_success_url(self):
policy_targetid = self.request.path.split("/")[-2]
u = "horizon:project:policytargets:policy_targetdetails"
success_url = reverse(u, kwargs={'policy_target_id': policy_targetid})
return success_url