372a9e55a7
Missing reverse call in a modal form refactor (https://review.openstack.org/#/c/156302/) has broken the N1k create view. This patch addresses the missing reverse. Change-Id: I3d0656893f37afb6e26d448bce7cd44d23fe8705 Closes-Bug: 1425008
172 lines
6.3 KiB
Python
172 lines
6.3 KiB
Python
# 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.core.urlresolvers import reverse_lazy
|
|
from django.utils import datastructures
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from horizon import exceptions
|
|
from horizon import forms
|
|
from horizon import tables
|
|
from horizon import tabs
|
|
from horizon.utils import memoized
|
|
|
|
from openstack_dashboard import api
|
|
|
|
from openstack_dashboard.dashboards.router.nexus1000v \
|
|
import forms as profileforms
|
|
from openstack_dashboard.dashboards.router.nexus1000v \
|
|
import tables as profiletables
|
|
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
def _get_tenant_list(request):
|
|
tenants = []
|
|
try:
|
|
tenants, has_more = api.keystone.tenant_list(request)
|
|
except Exception:
|
|
msg = _('Unable to retrieve project information.')
|
|
exceptions.handle(request, msg)
|
|
|
|
return datastructures.SortedDict([(t.id, t) for t in tenants])
|
|
|
|
|
|
def _get_profiles(request, type_p):
|
|
try:
|
|
profiles = api.neutron.profile_list(request, type_p)
|
|
except Exception:
|
|
profiles = []
|
|
msg = _('Network Profiles could not be retrieved.')
|
|
exceptions.handle(request, msg)
|
|
if profiles:
|
|
# Set project name
|
|
tenant_dict = _get_tenant_list(request)
|
|
bindings = api.neutron.profile_bindings_list(request, type_p)
|
|
bindings_dict = datastructures.SortedDict(
|
|
[(b.profile_id, b.tenant_id) for b in bindings])
|
|
for p in profiles:
|
|
project_id = bindings_dict.get(p.id)
|
|
project = tenant_dict.get(project_id)
|
|
p.project_name = getattr(project, 'name', None)
|
|
return profiles
|
|
|
|
|
|
class NetworkProfileIndexView(tables.DataTableView):
|
|
table_class = profiletables.NetworkProfile
|
|
template_name = 'router/nexus1000v/network_profile/index.html'
|
|
page_title = _("Cisco Nexus 1000V")
|
|
|
|
def get_data(self):
|
|
return _get_profiles(self.request, 'network')
|
|
|
|
|
|
class PolicyProfileIndexView(tables.DataTableView):
|
|
table_class = profiletables.PolicyProfile
|
|
template_name = 'router/nexus1000v/policy_profile/index.html'
|
|
page_title = _("Cisco Nexus 1000V")
|
|
|
|
def get_data(self):
|
|
return _get_profiles(self.request, 'policy')
|
|
|
|
|
|
class IndexTabGroup(tabs.TabGroup):
|
|
slug = "group"
|
|
tabs = (NetworkProfileIndexView, PolicyProfileIndexView,)
|
|
|
|
|
|
class IndexView(tables.MultiTableView):
|
|
table_classes = (profiletables.NetworkProfile,
|
|
profiletables.PolicyProfile,)
|
|
template_name = 'router/nexus1000v/index.html'
|
|
page_title = _("Cisco Nexus 1000V")
|
|
|
|
def get_network_profile_data(self):
|
|
return _get_profiles(self.request, 'network')
|
|
|
|
def get_policy_profile_data(self):
|
|
return _get_profiles(self.request, 'policy')
|
|
|
|
|
|
class CreateNetworkProfileView(forms.ModalFormView):
|
|
form_class = profileforms.CreateNetworkProfile
|
|
form_id = "create_network_profile_form"
|
|
modal_header = _("Create Network Profile")
|
|
template_name = 'router/nexus1000v/create_network_profile.html'
|
|
submit_label = _("Create Network Profile")
|
|
submit_url = reverse_lazy(
|
|
"horizon:router:nexus1000v:create_network_profile")
|
|
success_url = reverse_lazy('horizon:router:nexus1000v:index')
|
|
page_title = _("Create Network Profile")
|
|
|
|
|
|
class UpdateNetworkProfileView(forms.ModalFormView):
|
|
form_class = profileforms.UpdateNetworkProfile
|
|
form_id = "update_network_profile_form"
|
|
modal_header = _("Edit Network Profile")
|
|
template_name = 'router/nexus1000v/update_network_profile.html'
|
|
context_object_name = 'network_profile'
|
|
submit_label = _("Save Changes")
|
|
submit_url = "horizon:router:nexus1000v:update_network_profile"
|
|
success_url = reverse_lazy('horizon:router:nexus1000v:index')
|
|
page_title = _("Update Network Profile")
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super(UpdateNetworkProfileView,
|
|
self).get_context_data(**kwargs)
|
|
context["profile_id"] = self.kwargs['profile_id']
|
|
args = (self.kwargs['profile_id'],)
|
|
context['submit_url'] = reverse(self.submit_url, args=args)
|
|
return context
|
|
|
|
@memoized.memoized_method
|
|
def _get_object(self, *args, **kwargs):
|
|
profile_id = self.kwargs['profile_id']
|
|
try:
|
|
profile = api.neutron.profile_get(self.request,
|
|
profile_id)
|
|
LOG.debug("Network Profile object=%s", profile)
|
|
return profile
|
|
except Exception:
|
|
redirect = self.success_url
|
|
msg = _('Unable to retrieve network profile details.')
|
|
exceptions.handle(self.request, msg, redirect=redirect)
|
|
|
|
def get_initial(self):
|
|
profile = self._get_object()
|
|
# Set project name
|
|
tenant_dict = _get_tenant_list(self.request)
|
|
try:
|
|
bindings = api.neutron.profile_bindings_list(
|
|
self.request, 'network')
|
|
except Exception:
|
|
msg = _('Failed to obtain network profile binding')
|
|
redirect = self.success_url
|
|
exceptions.handle(self.request, msg, redirect=redirect)
|
|
bindings_dict = datastructures.SortedDict(
|
|
[(b.profile_id, b.tenant_id) for b in bindings])
|
|
project_id = bindings_dict.get(profile.id)
|
|
project = tenant_dict.get(project_id)
|
|
project_name = getattr(project, 'name', project_id)
|
|
return {'profile_id': profile['id'],
|
|
'name': profile['name'],
|
|
'segment_range': profile['segment_range'],
|
|
'segment_type': profile['segment_type'],
|
|
'physical_network': profile['physical_network'],
|
|
'sub_type': profile['sub_type'],
|
|
'multicast_ip_range': profile['multicast_ip_range'],
|
|
'project': project_name}
|