Can't associated multiple ext-seg to L3policy
Added support to associate mulitple external segments during create & update. In L3Policy form, changed the external-segment widget to MultiSelect to remove/unset external-segment. Made external segment IP optional. Displaying all External segments in L3Policy. Closes-Bug: #1505348 Closes-Bug: #1506145 Closes-Bug: #1499935 Closes-Bug: #1499829 Closes-Bug: #1504884 Change-Id: I200e8d1fb4f354db3e8fa85c1458371628fe1dc2
This commit is contained in:
		@@ -247,17 +247,18 @@ def update_classifier_attributes(classifiers):
 | 
			
		||||
def update_l3_policy_attributes(request, l3_policy):
 | 
			
		||||
    url = "horizon:project:network_policy:external_connectivity_details"
 | 
			
		||||
    if bool(l3_policy.external_segments):
 | 
			
		||||
        external_connectivity_id = l3_policy.external_segments.keys()[0]
 | 
			
		||||
        try:
 | 
			
		||||
        value = ["<ul>"]
 | 
			
		||||
        li = \
 | 
			
		||||
            lambda x: "<li><a href='" + \
 | 
			
		||||
            reverse(url, kwargs={'external_connectivity_id': x.id}) + \
 | 
			
		||||
             "'>" + x.name + "</a>" + " : " + \
 | 
			
		||||
            l3_policy.external_segments[x.id][0] + "</li>"
 | 
			
		||||
        for ec in l3_policy.external_segments.keys():
 | 
			
		||||
            external_connectivity = client.get_externalconnectivity(request,
 | 
			
		||||
                external_connectivity_id)
 | 
			
		||||
            segment_name = external_connectivity.name
 | 
			
		||||
        except Exception:
 | 
			
		||||
            segment_name = external_connectivity_id
 | 
			
		||||
        u = reverse(url,
 | 
			
		||||
            kwargs={'external_connectivity_id': external_connectivity_id})
 | 
			
		||||
        tag = mark_safe("<a href='" + u + "'>" + segment_name + "</a>"
 | 
			
		||||
            + " : " + l3_policy.external_segments.values()[0][0])
 | 
			
		||||
                                                                    ec)
 | 
			
		||||
            value.append(li(external_connectivity))
 | 
			
		||||
        value.append("</ul>")
 | 
			
		||||
        tag = mark_safe("".join(value))
 | 
			
		||||
    else:
 | 
			
		||||
        tag = '-'
 | 
			
		||||
    setattr(l3_policy, 'external_segments', tag)
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ from gbpui import fields
 | 
			
		||||
 | 
			
		||||
LOG = logging.getLogger(__name__)
 | 
			
		||||
 | 
			
		||||
EXT_SEG_PARAM_URL = "horizon:project:network_policy:add_external_segment_param"
 | 
			
		||||
NETWORK_PARAM_URL = "horizon:project:network_policy:add_network_service_param"
 | 
			
		||||
ROUTE_URL = "horizon:project:network_policy:add_external_route_param"
 | 
			
		||||
 | 
			
		||||
@@ -62,21 +63,16 @@ class AddL3PolicyForm(forms.SelfHandlingForm):
 | 
			
		||||
                                           label=_("Subnet Prefix Length"),
 | 
			
		||||
                                           help_text=_("Between 2 - 30 for IP4"
 | 
			
		||||
                                                       "and 2-127 for IP6."),)
 | 
			
		||||
    external_segments = forms.ChoiceField(label=_("External Segment"),
 | 
			
		||||
                                          required=False)
 | 
			
		||||
    segment_ip = forms.IPField(label=_("External Segment IP"), initial="",
 | 
			
		||||
                               required=False)
 | 
			
		||||
    external_segments = \
 | 
			
		||||
        fields.CustomMultiChoiceField(label=_("External Segments"),
 | 
			
		||||
                                      add_item_link=EXT_SEG_PARAM_URL,
 | 
			
		||||
                                      required=False)
 | 
			
		||||
    shared = forms.BooleanField(label=_("Shared"),
 | 
			
		||||
                                initial=False,
 | 
			
		||||
                                required=False)
 | 
			
		||||
 | 
			
		||||
    def __init__(self, request, *args, **kwargs):
 | 
			
		||||
        super(AddL3PolicyForm, self).__init__(request, *args, **kwargs)
 | 
			
		||||
        ec_list = client.externalconnectivity_list(request,
 | 
			
		||||
            tenant_id=request.user.tenant_id)
 | 
			
		||||
        external_segments_options = [(ec.id, ec.name) for ec in ec_list]
 | 
			
		||||
        external_segments_options.insert(0, (None, "Select"))
 | 
			
		||||
        self.fields['external_segments'].choices = external_segments_options
 | 
			
		||||
 | 
			
		||||
    def clean(self):
 | 
			
		||||
        cleaned_data = super(AddL3PolicyForm, self).clean()
 | 
			
		||||
@@ -88,23 +84,22 @@ class AddL3PolicyForm(forms.SelfHandlingForm):
 | 
			
		||||
                raise forms.ValidationError(msg)
 | 
			
		||||
            if ipversion == 6 and subnet_prefix_length not in range(2, 128):
 | 
			
		||||
                raise forms.ValidationError(msg)
 | 
			
		||||
            if cleaned_data['external_segments'] != '':
 | 
			
		||||
                if cleaned_data['segment_ip'] == '':
 | 
			
		||||
                    self.add_error('segment_ip', 'This field is required')
 | 
			
		||||
        return cleaned_data
 | 
			
		||||
 | 
			
		||||
    def handle(self, request, context):
 | 
			
		||||
        url = reverse("horizon:project:network_policy:index")
 | 
			
		||||
        external_segment_dic = {}
 | 
			
		||||
        l = []
 | 
			
		||||
        try:
 | 
			
		||||
            if context['external_segments'] != '':
 | 
			
		||||
                l.append(context['segment_ip'])
 | 
			
		||||
                external_segment_dic[context['external_segments']] = l
 | 
			
		||||
            if context['external_segments']:
 | 
			
		||||
                dic = {}
 | 
			
		||||
                for external_segment in context['external_segments']:
 | 
			
		||||
                    values = [i.split(":")[1]
 | 
			
		||||
                        for i in external_segment.split(",")]
 | 
			
		||||
                    dic[values[0]] = [values[1]]
 | 
			
		||||
                    external_segment_dic.update(dic)
 | 
			
		||||
                context['external_segments'] = external_segment_dic
 | 
			
		||||
            else:
 | 
			
		||||
                del context['external_segments']
 | 
			
		||||
            del context['segment_ip']
 | 
			
		||||
                context['external_segments'] = {}
 | 
			
		||||
            if context.get('name'):
 | 
			
		||||
                context['name'] = html.escape(context['name'])
 | 
			
		||||
            if context.get('description'):
 | 
			
		||||
@@ -117,16 +112,39 @@ class AddL3PolicyForm(forms.SelfHandlingForm):
 | 
			
		||||
            exceptions.handle(request, str(e), redirect=url)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ExternalSegmentParam(object):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, context):
 | 
			
		||||
        self.external_segment = context['external_segment']
 | 
			
		||||
        self.segment_ip = context['segment_ip']
 | 
			
		||||
        self.name = "ES:%s,IP:%s" % (
 | 
			
		||||
            self.external_segment, self.segment_ip)
 | 
			
		||||
        self.id = self.name
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CreateExternalSegmentParamForm(forms.SelfHandlingForm):
 | 
			
		||||
    external_segment = forms.ChoiceField(label=_("External Segment"),
 | 
			
		||||
                                          required=False)
 | 
			
		||||
    segment_ip = forms.IPField(label=_("External Segment IP"), initial="",
 | 
			
		||||
                               required=False)
 | 
			
		||||
 | 
			
		||||
    def __init__(self, request, *args, **kwargs):
 | 
			
		||||
        super(CreateExternalSegmentParamForm, self).__init__(request,
 | 
			
		||||
                                                             *args,
 | 
			
		||||
                                                             **kwargs)
 | 
			
		||||
        ec_list = client.externalconnectivity_list(request,
 | 
			
		||||
            tenant_id=request.user.tenant_id)
 | 
			
		||||
        external_segments_options = [(ec.id, ec.name) for ec in ec_list]
 | 
			
		||||
        self.fields['external_segment'].choices = external_segments_options
 | 
			
		||||
 | 
			
		||||
    def handle(self, request, context):
 | 
			
		||||
        return ExternalSegmentParam(context)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UpdateL3PolicyForm(AddL3PolicyForm):
 | 
			
		||||
    def __init__(self, request, *args, **kwargs):
 | 
			
		||||
        super(UpdateL3PolicyForm, self).__init__(request, *args, **kwargs)
 | 
			
		||||
        try:
 | 
			
		||||
            ec_list = client.externalconnectivity_list(request,
 | 
			
		||||
                tenant_id=request.user.tenant_id)
 | 
			
		||||
            external_segments_options = [(ec.id, ec.name) for ec in ec_list]
 | 
			
		||||
            external_segments_options.insert(0, (None, "Select"))
 | 
			
		||||
            self.fields['external_segments'].choices = \
 | 
			
		||||
                external_segments_options
 | 
			
		||||
            l3policy_id = self.initial['l3policy_id']
 | 
			
		||||
            l3 = client.l3policy_get(request, l3policy_id)
 | 
			
		||||
            for item in ['name', 'description', 'ip_version',
 | 
			
		||||
@@ -134,13 +152,14 @@ class UpdateL3PolicyForm(AddL3PolicyForm):
 | 
			
		||||
                self.fields[item].initial = str(l3[item])
 | 
			
		||||
            self.fields['shared'].initial = l3['shared']
 | 
			
		||||
            if bool(l3['external_segments']):
 | 
			
		||||
                self.fields['external_segments'].initial = \
 | 
			
		||||
                    l3['external_segments'].keys()[0]
 | 
			
		||||
                self.fields['segment_ip'].initial = \
 | 
			
		||||
                    l3['external_segments'].values()[0][0]
 | 
			
		||||
            else:
 | 
			
		||||
                self.fields['external_segments'].initial = None
 | 
			
		||||
                self.fields['segment_ip'].initial = ''
 | 
			
		||||
                es_choices = []
 | 
			
		||||
                es_initial = []
 | 
			
		||||
                for key, value in l3['external_segments'].items():
 | 
			
		||||
                    val = 'ES:' + key + ',IP:' + value[0]
 | 
			
		||||
                    es_choices.append((val, val))
 | 
			
		||||
                    es_initial.append(val)
 | 
			
		||||
                self.fields['external_segments'].choices = es_choices
 | 
			
		||||
                self.fields['external_segments'].initial = es_initial
 | 
			
		||||
        except Exception:
 | 
			
		||||
            msg = _("Failed to get L3 policy")
 | 
			
		||||
            LOG.error(msg)
 | 
			
		||||
@@ -148,7 +167,6 @@ class UpdateL3PolicyForm(AddL3PolicyForm):
 | 
			
		||||
 | 
			
		||||
    def clean(self):
 | 
			
		||||
        external_segment_dict = {}
 | 
			
		||||
        l = []
 | 
			
		||||
        cleaned_data = super(UpdateL3PolicyForm, self).clean()
 | 
			
		||||
        if self.is_valid():
 | 
			
		||||
            ipversion = int(cleaned_data['ip_version'])
 | 
			
		||||
@@ -158,20 +176,16 @@ class UpdateL3PolicyForm(AddL3PolicyForm):
 | 
			
		||||
                raise forms.ValidationError(msg)
 | 
			
		||||
            if ipversion == 6 and subnet_prefix_length not in range(2, 128):
 | 
			
		||||
                raise forms.ValidationError(msg)
 | 
			
		||||
            if cleaned_data['external_segments'] != '':
 | 
			
		||||
                if cleaned_data['segment_ip'] == '':
 | 
			
		||||
                    self.add_error('segment_ip', 'This field is required')
 | 
			
		||||
            if 'external_segments' in self.changed_data or \
 | 
			
		||||
                    'segment_ip' in self.changed_data:
 | 
			
		||||
                if cleaned_data['external_segments'] != '':
 | 
			
		||||
                    l.append(cleaned_data['segment_ip'])
 | 
			
		||||
                    external_segment_dict[cleaned_data['external_segments']] = \
 | 
			
		||||
                      l
 | 
			
		||||
                    cleaned_data['external_segments'] = external_segment_dict
 | 
			
		||||
                else:
 | 
			
		||||
                    cleaned_data['external_segments'] = {}
 | 
			
		||||
                del cleaned_data['segment_ip']
 | 
			
		||||
                self.changed_data.append('external_segments')
 | 
			
		||||
            if cleaned_data['external_segments']:
 | 
			
		||||
                dic = {}
 | 
			
		||||
                for external_segment in cleaned_data['external_segments']:
 | 
			
		||||
                    values = [i.split(":")[1]
 | 
			
		||||
                        for i in external_segment.split(",")]
 | 
			
		||||
                    dic[values[0]] = [values[1]]
 | 
			
		||||
                    external_segment_dict.update(dic)
 | 
			
		||||
                cleaned_data['external_segments'] = external_segment_dict
 | 
			
		||||
            else:
 | 
			
		||||
                cleaned_data['external_segments'] = {}
 | 
			
		||||
            updated_data = {d: cleaned_data[d] for d in cleaned_data
 | 
			
		||||
                if d in self.changed_data}
 | 
			
		||||
            cleaned_data = updated_data
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ class CreateL2PolicyLink(tables.LinkAction):
 | 
			
		||||
 | 
			
		||||
class EditL2PolicyLink(tables.LinkAction):
 | 
			
		||||
    name = "update_l2policy"
 | 
			
		||||
    verbose_name = _("Edit L2Policy")
 | 
			
		||||
    verbose_name = _("Edit")
 | 
			
		||||
    classes = ("ajax-modal", "btn-update",)
 | 
			
		||||
 | 
			
		||||
    def get_link_url(self, l2policy):
 | 
			
		||||
@@ -67,7 +67,7 @@ class CreateL3PolicyLink(tables.LinkAction):
 | 
			
		||||
 | 
			
		||||
class EditL3PolicyLink(tables.LinkAction):
 | 
			
		||||
    name = "update_l3policy"
 | 
			
		||||
    verbose_name = _("Edit L3Policy")
 | 
			
		||||
    verbose_name = _("Edit")
 | 
			
		||||
    classes = ("ajax-modal", "btn-update",)
 | 
			
		||||
 | 
			
		||||
    def get_link_url(self, l3policy):
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
{% extends "horizon/common/_modal_form.html" %}
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
{% load url from future %}
 | 
			
		||||
 | 
			
		||||
{% block form_id %}add_external_segment_param_form{% endblock %}
 | 
			
		||||
{% block form_action %}{% url 'horizon:project:network_policy:add_external_segment_param' %}{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block modal-header %}{% trans "Add External Segment 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 %}
 | 
			
		||||
@@ -24,6 +24,9 @@ urlpatterns = patterns('',
 | 
			
		||||
                   url(r'^addservicepolicy$',
 | 
			
		||||
                          views.CreateServicePolicyView.as_view(),
 | 
			
		||||
                       name='create_servicepolicy'),
 | 
			
		||||
                   url(r'^addexternalsegmentparam$',
 | 
			
		||||
                          views.AddExternalSegmentParamView.as_view(),
 | 
			
		||||
                       name='add_external_segment_param'),
 | 
			
		||||
                   url(r'^addnetworkserviceparam$',
 | 
			
		||||
                          views.AddNetworkServiceParamView.as_view(),
 | 
			
		||||
                       name='add_network_service_param'),
 | 
			
		||||
 
 | 
			
		||||
@@ -171,6 +171,14 @@ class CreateServicePolicyView(forms.ModalFormView):
 | 
			
		||||
        return context
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AddExternalSegmentParamView(forms.ModalFormView):
 | 
			
		||||
    form_class = np_forms.CreateExternalSegmentParamForm
 | 
			
		||||
    template_name = "project/network_policy/create_external_segment_param.html"
 | 
			
		||||
 | 
			
		||||
    def get_object_id(self, params):
 | 
			
		||||
        return params.name
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AddNetworkServiceParamView(forms.ModalFormView):
 | 
			
		||||
    form_class = np_forms.CreateNetworkServiceParamForm
 | 
			
		||||
    template_name = "project/network_policy/create_network_service_param.html"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user