From faa77b0218b0205ba96aec5d48ff2a9dac9e7a22 Mon Sep 17 00:00:00 2001 From: sriharshabarkuru Date: Tue, 27 Oct 2015 11:28:51 +0530 Subject: [PATCH] can't associate multiple ext-seg to an ext-group Added support to associate multiple ext-segments to external group while creation and also made subnetID as optional field in ext-segment creation. Change-Id: I3cd591caede3a513e95c670235db47ed72249353 Closes-Bug: #1505416 --- gbpui/column_filters.py | 17 +++++++++++------ gbpui/panels/network_policy/forms.py | 20 ++++++++++++-------- gbpui/panels/network_policy/views.py | 7 +++++++ gbpui/panels/policytargets/forms.py | 14 ++++---------- gbpui/panels/policytargets/workflows.py | 12 +++++++----- 5 files changed, 41 insertions(+), 29 deletions(-) diff --git a/gbpui/column_filters.py b/gbpui/column_filters.py index b02c8f8..83f9421 100644 --- a/gbpui/column_filters.py +++ b/gbpui/column_filters.py @@ -90,12 +90,17 @@ def update_policy_target_attributes(request, pt): setattr(pt, 'l2_policy_id', atag) if hasattr(pt, 'external_segments'): exturl = "horizon:project:network_policy:external_connectivity_details" - ext_policy = client.get_externalconnectivity(request, - pt.external_segments[0]) - u = reverse(exturl, kwargs={'external_connectivity_id': ext_policy.id}) - exttag = mark_safe( - "" + ext_policy.name + "") - setattr(pt, 'external_segments', exttag) + value = ["") + value = "".join(value) + setattr(pt, 'external_segments', mark_safe(value)) return pt diff --git a/gbpui/panels/network_policy/forms.py b/gbpui/panels/network_policy/forms.py index e950d63..1694f85 100644 --- a/gbpui/panels/network_policy/forms.py +++ b/gbpui/panels/network_policy/forms.py @@ -412,8 +412,9 @@ class UpdateExternalConnectivityForm(forms.SelfHandlingForm): msg = _("External Connectivity updated successfully!") LOG.debug(msg) return http.HttpResponseRedirect(url) - except Exception: - msg = _("Failed to update External Connectivity") + except Exception as e: + msg = _("Failed to update External Connectivity.%s") % \ + (str(e)) LOG.error(msg) exceptions.handle(request, msg, redirect=shortcuts.redirect) @@ -453,15 +454,17 @@ class CreateExternalConnectivityForm(forms.SelfHandlingForm): net_list = api.neutron.network_list(request, **dic) subnet_list = api.neutron.subnet_list(request) net_id_list = [net.id for net in net_list] - self.fields['subnet_id'].choices = [(subnet.id, subnet.name) - for subnet in subnet_list if subnet.network_id in net_id_list] + self.fields['subnet_id'].choices = [('', 'Select')] + \ + [(subnet.id, subnet.name) for subnet in subnet_list + if subnet.network_id in net_id_list] except Exception: msg = _("Failed to get Subnet ID list.") exceptions.handle(request, msg) def handle(self, request, context): - url = reverse("horizon:project:network_policy:index") try: + if context['subnet_id'] == '': + del context['subnet_id'] if context['cidr'] == '': del context['cidr'] routes = context['external_routes'] @@ -473,11 +476,12 @@ class CreateExternalConnectivityForm(forms.SelfHandlingForm): 'nexthop': values[1]} p.append(values) context['external_routes'] = p - client.create_externalconnectivity( + external_segment = client.create_externalconnectivity( request, **context) - msg = _("External Connectivity updatedsuccessfully!") + msg = _('External Connectivity successfully created.') LOG.debug(msg) - return http.HttpResponseRedirect(url) + messages.success(request, msg) + return external_segment except Exception as e: msg = str(e) LOG.error(msg) diff --git a/gbpui/panels/network_policy/views.py b/gbpui/panels/network_policy/views.py index d230f31..e6d9361 100644 --- a/gbpui/panels/network_policy/views.py +++ b/gbpui/panels/network_policy/views.py @@ -12,6 +12,7 @@ import re +from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy as _ from horizon import exceptions @@ -230,6 +231,12 @@ class CreateExternalConnectivityView(forms.ModalFormView): CreateExternalConnectivityView, self).get_context_data(**kwargs) return context + def get_success_url(self): + return reverse('horizon:project:network_policy:index') + + def get_object_id(self, external_segment): + return [external_segment.id] + class ExternalConnectivityDetailsView(tabs.TabView): tab_group_class = (np_tabs.ExternalConnectivityDetailsTabs) diff --git a/gbpui/panels/policytargets/forms.py b/gbpui/panels/policytargets/forms.py index c781830..c4a3ced 100644 --- a/gbpui/panels/policytargets/forms.py +++ b/gbpui/panels/policytargets/forms.py @@ -145,9 +145,9 @@ class UpdateExternalPolicyTargetForm(forms.SelfHandlingForm): label=_("Provided Policy Rule Set"), required=False) consumed_policy_rule_sets = forms.MultipleChoiceField( label=_("Consumed Policy Rule Set"), required=False) - external_segments = forms.ChoiceField( - label=_("External Connectivity"), - help_text=_("Select external segment for Group.")) + external_segments = forms.MultipleChoiceField( + label=_("External Connectivity"), required=True, + help_text=_("Select external segment(s) for Group.")) shared = forms.BooleanField(label=_("Shared"), required=False) failure_url = 'horizon:project:policytargets:index' @@ -183,10 +183,8 @@ class UpdateExternalPolicyTargetForm(forms.SelfHandlingForm): consumed_init.append(item[0]) self.fields['provided_policy_rule_sets'].initial = provided_init self.fields['consumed_policy_rule_sets'].initial = consumed_init - for attr in ['name', 'description', 'shared']: + for attr in ['name', 'description', 'shared', 'external_segments']: self.fields[attr].initial = getattr(ext_policy_target, attr) - self.fields['external_segments'].initial = \ - ext_policy_target.external_segments[0] except Exception as e: msg = _('Unable to retrieve policy_rule_set details. %s') % ( str(e)) @@ -202,7 +200,6 @@ class UpdateExternalPolicyTargetForm(forms.SelfHandlingForm): def handle(self, request, context): ext_policy_target_id = self.initial['ext_policy_target_id'] name_or_id = context.get('name') or ext_policy_target_id - external_segment_list = [] try: if 'provided_policy_rule_sets' in context: if context.get('provided_policy_rule_sets'): @@ -218,9 +215,6 @@ class UpdateExternalPolicyTargetForm(forms.SelfHandlingForm): for i in context['consumed_policy_rule_sets']]) else: context['consumed_policy_rule_sets'] = None - if 'external_segments' in context: - external_segment_list.append(context['external_segments']) - context['external_segments'] = external_segment_list if context.get('name'): context['name'] = html.escape(context['name']) if context.get('description'): diff --git a/gbpui/panels/policytargets/workflows.py b/gbpui/panels/policytargets/workflows.py index 4426e0f..3c9e126 100644 --- a/gbpui/panels/policytargets/workflows.py +++ b/gbpui/panels/policytargets/workflows.py @@ -36,6 +36,8 @@ from gbpui import fields LOG = logging.getLogger(__name__) POLICY_RULE_SET_URL = "horizon:project:application_policy:addpolicy_rule_set" +ADD_EXTERNAL_CONNECTIVITY = \ + "horizon:project:network_policy:create_external_connectivity" class SelectPolicyRuleSetAction(workflows.Action): @@ -230,9 +232,11 @@ class AddPTG(workflows.Workflow): class ExternalConnectivityAction(workflows.Action): - external_segments = forms.ChoiceField( + external_segments = fields.DynamicMultiChoiceField( label=_("External Connectivity"), - help_text=_("Select external segment for Group.")) + required=True, + add_item_link=ADD_EXTERNAL_CONNECTIVITY, + help_text=_("Select external segment(s) for Group.")) class Meta(object): name = _("External Connectivity") @@ -263,9 +267,7 @@ class ExternalConnectivityStep(workflows.Step): contributes = ("external_segments",) def contribute(self, data, context): - ext_seg_list = [] - ext_seg_list.append(data['external_segments']) - context['external_segments'] = ext_seg_list + context['external_segments'] = data.get('external_segments', []) return context