GBP UI - added policy targets UI
Change-Id: Ib2074e794db2f1a6e7ab02225ad9173d1c77cf06
This commit is contained in:
		@@ -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
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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"
 | 
			
		||||
 
 | 
			
		||||
@@ -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.'),
 | 
			
		||||
 
 | 
			
		||||
@@ -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> 
 | 
			
		||||
					{% 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>
 | 
			
		||||
 
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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 _
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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"
 | 
			
		||||
 
 | 
			
		||||
@@ -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.'),
 | 
			
		||||
 
 | 
			
		||||
@@ -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 %} 
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -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>
 | 
			
		||||
   
 | 
			
		||||
@@ -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 %}    
 | 
			
		||||
 
 | 
			
		||||
@@ -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'),
 | 
			
		||||
 
 | 
			
		||||
@@ -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'
 | 
			
		||||
 
 | 
			
		||||
@@ -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):
 | 
			
		||||
 
 | 
			
		||||
@@ -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 _
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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")
 | 
			
		||||
 
 | 
			
		||||
@@ -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.'),
 | 
			
		||||
 
 | 
			
		||||
@@ -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>                   
 | 
			
		||||
 
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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(
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										305
									
								
								gbpui/panels/policytargets/forms.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										305
									
								
								gbpui/panels/policytargets/forms.py
									
									
									
									
									
										Normal 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)
 | 
			
		||||
							
								
								
									
										20
									
								
								gbpui/panels/policytargets/panel.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								gbpui/panels/policytargets/panel.py
									
									
									
									
									
										Normal 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"
 | 
			
		||||
							
								
								
									
										224
									
								
								gbpui/panels/policytargets/tables.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								gbpui/panels/policytargets/tables.py
									
									
									
									
									
										Normal 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,)
 | 
			
		||||
							
								
								
									
										176
									
								
								gbpui/panels/policytargets/tabs.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								gbpui/panels/policytargets/tabs.py
									
									
									
									
									
										Normal 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
 | 
			
		||||
@@ -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 %} 
 | 
			
		||||
@@ -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 %} 
 | 
			
		||||
@@ -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 %}
 | 
			
		||||
@@ -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 %}   
 | 
			
		||||
@@ -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 %}
 | 
			
		||||
@@ -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 %}
 | 
			
		||||
@@ -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 %}
 | 
			
		||||
@@ -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 %}
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
@@ -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>
 | 
			
		||||
 | 
			
		||||
@@ -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 %} 
 | 
			
		||||
@@ -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 %} 
 | 
			
		||||
@@ -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 %} 
 | 
			
		||||
@@ -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 %} 
 | 
			
		||||
@@ -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 %}  
 | 
			
		||||
@@ -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 %}
 | 
			
		||||
@@ -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 %}
 | 
			
		||||
@@ -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 %}
 | 
			
		||||
@@ -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 %}
 | 
			
		||||
@@ -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 %} 
 | 
			
		||||
@@ -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 %}
 | 
			
		||||
							
								
								
									
										49
									
								
								gbpui/panels/policytargets/urls.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								gbpui/panels/policytargets/urls.py
									
									
									
									
									
										Normal 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'),
 | 
			
		||||
                       )
 | 
			
		||||
							
								
								
									
										166
									
								
								gbpui/panels/policytargets/views.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								gbpui/panels/policytargets/views.py
									
									
									
									
									
										Normal 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
 | 
			
		||||
							
								
								
									
										332
									
								
								gbpui/panels/policytargets/workflows.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										332
									
								
								gbpui/panels/policytargets/workflows.py
									
									
									
									
									
										Normal 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
 | 
			
		||||
		Reference in New Issue
	
	Block a user