diff --git a/gbpui/column_filters.py b/gbpui/column_filters.py index 83f9421..4d3758b 100644 --- a/gbpui/column_filters.py +++ b/gbpui/column_filters.py @@ -252,17 +252,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 = ["") + tag = mark_safe("".join(value)) else: tag = '-' setattr(l3_policy, 'external_segments', tag) diff --git a/gbpui/panels/network_policy/forms.py b/gbpui/panels/network_policy/forms.py index 1694f85..390d4a3 100644 --- a/gbpui/panels/network_policy/forms.py +++ b/gbpui/panels/network_policy/forms.py @@ -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 diff --git a/gbpui/panels/network_policy/tables.py b/gbpui/panels/network_policy/tables.py index e9de49e..969c430 100644 --- a/gbpui/panels/network_policy/tables.py +++ b/gbpui/panels/network_policy/tables.py @@ -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): diff --git a/gbpui/panels/network_policy/templates/network_policy/_create_external_segment_param.html b/gbpui/panels/network_policy/templates/network_policy/_create_external_segment_param.html new file mode 100644 index 0000000..695db2c --- /dev/null +++ b/gbpui/panels/network_policy/templates/network_policy/_create_external_segment_param.html @@ -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 %} +
+
+ {% include "horizon/common/_form_fields.html" %} +
+
+
+

{% trans "Description:" %}

+
+{% endblock %} + +{% block modal-footer %} + + {% trans "Cancel" %} +{% endblock %} diff --git a/gbpui/panels/network_policy/urls.py b/gbpui/panels/network_policy/urls.py index 1e32b8e..b35f38e 100644 --- a/gbpui/panels/network_policy/urls.py +++ b/gbpui/panels/network_policy/urls.py @@ -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'), diff --git a/gbpui/panels/network_policy/views.py b/gbpui/panels/network_policy/views.py index e6d9361..744dec2 100644 --- a/gbpui/panels/network_policy/views.py +++ b/gbpui/panels/network_policy/views.py @@ -172,6 +172,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"