Merge "Create DataNetworks modelling in System Configuration"
This commit is contained in:
commit
9ae5eaeab4
|
@ -1935,7 +1935,7 @@ class Interface(base.APIResourceWrapper):
|
|||
|
||||
_attrs = ['id', 'uuid', 'ifname', 'ifclass', 'iftype', 'imtu', 'imac',
|
||||
'networktype', 'networks', 'aemode', 'txhashpolicy', 'vlan_id',
|
||||
'uses', 'used_by', 'ihost_uuid', 'providernetworks',
|
||||
'uses', 'used_by', 'ihost_uuid', 'datanetworks',
|
||||
'ipv4_mode', 'ipv6_mode', 'ipv4_pool', 'ipv6_pool',
|
||||
'sriov_numvfs']
|
||||
|
||||
|
@ -1944,6 +1944,10 @@ class Interface(base.APIResourceWrapper):
|
|||
if not self.ifname:
|
||||
self.ifname = '(' + str(self.uuid)[-8:] + ')'
|
||||
|
||||
@property
|
||||
def datanetworks_csv(self):
|
||||
return ",".join(self.datanetworks)
|
||||
|
||||
|
||||
def host_interface_list(request, host_id):
|
||||
interfaces = cgtsclient(request).iinterface.list(host_id)
|
||||
|
@ -2578,3 +2582,64 @@ def is_system_k8s_aio(request):
|
|||
def is_host_with_storage(request, host_id):
|
||||
host = host_get(request, host_id)
|
||||
return 'storage' in host.subfunctions or is_system_k8s_aio(request)
|
||||
|
||||
|
||||
class DataNetwork(base.APIResourceWrapper):
|
||||
"""..."""
|
||||
|
||||
_attrs = ['id', 'uuid', 'network_type', 'name', 'mtu', 'description',
|
||||
'multicast_group', 'port_num', 'ttl', 'mode']
|
||||
|
||||
def __init__(self, apiresource):
|
||||
super(DataNetwork, self).__init__(apiresource)
|
||||
|
||||
|
||||
DATANETWORK_TYPE_FLAT = "flat"
|
||||
DATANETWORK_TYPE_VLAN = "vlan"
|
||||
DATANETWORK_TYPE_VXLAN = "vxlan"
|
||||
|
||||
data_network_type_choices_list = [
|
||||
(DATANETWORK_TYPE_FLAT, DATANETWORK_TYPE_FLAT),
|
||||
(DATANETWORK_TYPE_VLAN, DATANETWORK_TYPE_VLAN),
|
||||
(DATANETWORK_TYPE_VXLAN, DATANETWORK_TYPE_VXLAN),
|
||||
]
|
||||
|
||||
|
||||
def data_network_type_choices():
|
||||
return data_network_type_choices_list
|
||||
|
||||
|
||||
def data_network_create(request, **kwargs):
|
||||
LOG.info("data_network_create(): kwargs=%s", kwargs)
|
||||
datanet = cgtsclient(request).datanetwork.create(**kwargs)
|
||||
return DataNetwork(datanet)
|
||||
|
||||
|
||||
def data_network_list(request):
|
||||
datanets = cgtsclient(request).datanetwork.list()
|
||||
return [DataNetwork(n) for n in datanets]
|
||||
|
||||
|
||||
def data_network_get(request, datanet_id):
|
||||
datanet = cgtsclient(request).datanetwork.get(datanet_id)
|
||||
if not datanet:
|
||||
raise ValueError('No match found for datanet_id "%s".' % datanet_id)
|
||||
return DataNetwork(datanet)
|
||||
|
||||
|
||||
def data_network_modify(request, datanet_id, **kwargs):
|
||||
LOG.info("data_network_modify(): datanet_id,=%s, kwargs=%s",
|
||||
datanet_id, kwargs)
|
||||
patch = []
|
||||
for key, value in kwargs.items():
|
||||
patch.append(dict(path='/' + key, value=value, op='replace'))
|
||||
|
||||
datanet = cgtsclient(request).datanetwork.update(datanet_id, patch)
|
||||
if not datanet:
|
||||
raise ValueError('No match found for datanet_id "%s".' % datanet_id)
|
||||
return DataNetwork(datanet)
|
||||
|
||||
|
||||
def data_network_delete(request, datanet_id):
|
||||
LOG.info("data_network_delete(): datanet_id=%s", datanet_id)
|
||||
return cgtsclient(request).datanetwork.delete(datanet_id)
|
||||
|
|
|
@ -0,0 +1,147 @@
|
|||
# Copyright 2012 NEC Corporation
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||
#
|
||||
|
||||
|
||||
import logging
|
||||
|
||||
from django.core.urlresolvers import reverse # noqa
|
||||
from django.utils.translation import ugettext_lazy as _ # noqa
|
||||
|
||||
from cgtsclient import exc as sysinv_exceptions
|
||||
|
||||
from horizon import exceptions
|
||||
from horizon import forms
|
||||
from horizon import messages
|
||||
|
||||
from starlingx_dashboard import api as stx_api
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class CreateDataNetwork(forms.SelfHandlingForm):
|
||||
name = forms.CharField(max_length=255,
|
||||
label=_("Name"),
|
||||
required=True)
|
||||
description = forms.CharField(max_length=255,
|
||||
label=_("Description"),
|
||||
required=False)
|
||||
network_type = forms.ChoiceField(label=_("Type"),
|
||||
required=True)
|
||||
mtu = forms.IntegerField(
|
||||
label=_("MTU"),
|
||||
required=True,
|
||||
initial=1500,
|
||||
min_value=576,
|
||||
max_value=9216,
|
||||
help_text=(
|
||||
_("Specifies the maximum MTU value of any associated tenant "
|
||||
"network. Worker node data interface MTU values must be large "
|
||||
"enough to support the tenant MTU plus any additional provider "
|
||||
"encapsulation headers. For example, VXLAN provider MTU of "
|
||||
"1500 requires a minimum data interface MTU of 1574 bytes (1600 "
|
||||
"bytes is recommended.")))
|
||||
|
||||
@classmethod
|
||||
def _instantiate(cls, request, *args, **kwargs):
|
||||
return cls(request, *args, **kwargs)
|
||||
|
||||
def __init__(self, request, *args, **kwargs):
|
||||
super(CreateDataNetwork, self).__init__(request, *args, **kwargs)
|
||||
|
||||
datanet_type_choices = [('', _("Select a network type"))]
|
||||
datanet_choices_list = stx_api.sysinv.data_network_type_choices()
|
||||
for datanet_choices_tuple in datanet_choices_list:
|
||||
datanet_type_choices.append(datanet_choices_tuple)
|
||||
|
||||
self.fields['network_type'].choices = datanet_type_choices
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super(CreateDataNetwork, self).clean()
|
||||
if len(cleaned_data['name'].lstrip()) == 0:
|
||||
raise forms.ValidationError('invalid data network name')
|
||||
|
||||
return cleaned_data
|
||||
|
||||
def handle(self, request, data):
|
||||
try:
|
||||
params = {'name': data['name'],
|
||||
'network_type': data['network_type'],
|
||||
'description': data['description'],
|
||||
'mtu': data['mtu']}
|
||||
|
||||
network = stx_api.sysinv.data_network_create(request,
|
||||
**params)
|
||||
msg = (_('Data network %s was successfully created.') %
|
||||
data['name'])
|
||||
LOG.info(msg)
|
||||
messages.success(request, msg)
|
||||
return network
|
||||
except sysinv_exceptions.CgtsclientException as e:
|
||||
redirect = reverse('horizon:admin:datanets:index')
|
||||
exceptions.handle(request, str(e), redirect=redirect)
|
||||
except Exception:
|
||||
redirect = reverse('horizon:admin:datanets:index')
|
||||
msg = _('Failed to create data network %s') % data['name']
|
||||
exceptions.handle(request, msg, redirect=redirect)
|
||||
|
||||
|
||||
class UpdateDataNetwork(forms.SelfHandlingForm):
|
||||
name = forms.CharField(label=_("Name"), required=False,
|
||||
widget=forms.TextInput(
|
||||
attrs={'readonly': 'readonly'}))
|
||||
network_type = forms.CharField(label=_("Type"), required=False,
|
||||
widget=forms.TextInput(
|
||||
attrs={'readonly': 'readonly'}))
|
||||
id = forms.CharField(widget=forms.HiddenInput)
|
||||
|
||||
# Mutable fields
|
||||
description = forms.CharField(label=_("Description"), required=False)
|
||||
mtu = forms.IntegerField(label=_("MTU"),
|
||||
required=True,
|
||||
initial=1500,
|
||||
min_value=576,
|
||||
max_value=9216,
|
||||
help_text=(_("Specifies the minimum interface "
|
||||
"MTU required to support this "
|
||||
"data network ")))
|
||||
|
||||
failure_url = 'horizon:admin:datanets:index'
|
||||
|
||||
def handle(self, request, data):
|
||||
try:
|
||||
if not data['description']:
|
||||
data['description'] = '_'
|
||||
params = {'description': data['description'],
|
||||
'mtu': data['mtu']}
|
||||
|
||||
providernet = stx_api.sysinv.data_network_modify(
|
||||
request, data['id'], **params)
|
||||
msg = (_('Data network %s was successfully updated.') %
|
||||
data['name'])
|
||||
LOG.info(msg)
|
||||
messages.success(request, msg)
|
||||
return providernet
|
||||
except sysinv_exceptions.CgtsclientException as e:
|
||||
msg = _('Failed to update data network %s') % data['name']
|
||||
LOG.info(msg)
|
||||
redirect = reverse(self.failure_url)
|
||||
exceptions.handle(request, str(e), redirect=redirect)
|
||||
except Exception:
|
||||
msg = _('Failed to update data network %s') % data['name']
|
||||
LOG.info(msg)
|
||||
redirect = reverse(self.failure_url)
|
||||
exceptions.handle(request, msg, redirect=redirect)
|
|
@ -12,7 +12,7 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# Copyright (c) 2013-2018 Wind River Systems, Inc.
|
||||
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||
#
|
||||
|
||||
|
||||
|
@ -146,7 +146,7 @@ class CreateProviderNetworkRange(forms.SelfHandlingForm):
|
|||
return providernet_range
|
||||
except neutron_exceptions.NeutronClientException as e:
|
||||
LOG.info(str(e))
|
||||
redirect = reverse('horizon:admin:providernets:providernets:'
|
||||
redirect = reverse('horizon:admin:datanets:datanets:'
|
||||
'detail',
|
||||
args=(data['providernet_id'],))
|
||||
exceptions.handle(request, str(e), redirect=redirect)
|
||||
|
@ -155,7 +155,7 @@ class CreateProviderNetworkRange(forms.SelfHandlingForm):
|
|||
' network range for network %s') \
|
||||
% data['providernet_id']
|
||||
LOG.info(msg)
|
||||
redirect = reverse('horizon:admin:providernets:providernets:'
|
||||
redirect = reverse('horizon:admin:datanets:datanets:'
|
||||
'detail',
|
||||
args=(data['providernet_id'],))
|
||||
exceptions.handle(request, msg, redirect=redirect)
|
||||
|
@ -170,7 +170,7 @@ class CreateProviderNetworkRange(forms.SelfHandlingForm):
|
|||
|
||||
|
||||
class UpdateProviderNetworkRange(forms.SelfHandlingForm):
|
||||
failure_url = 'horizon:admin:providernets:providernets:detail'
|
||||
failure_url = 'horizon:admin:datanets:datanets:detail'
|
||||
providernet_id = forms.CharField(widget=forms.HiddenInput())
|
||||
providernet_range_id = forms.CharField(widget=forms.HiddenInput())
|
||||
name = forms.CharField(max_length=255,
|
||||
|
@ -237,7 +237,7 @@ class UpdateProviderNetworkRange(forms.SelfHandlingForm):
|
|||
return providernet_range
|
||||
except neutron_exceptions.NeutronClientException as e:
|
||||
LOG.info(str(e))
|
||||
redirect = reverse('horizon:admin:providernets:providernets:'
|
||||
redirect = reverse('horizon:admin:datanets:datanets:'
|
||||
'detail',
|
||||
args=(data['providernet_id'],))
|
||||
exceptions.handle(request, str(e), redirect=redirect)
|
|
@ -12,7 +12,7 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# Copyright (c) 2013-2018 Wind River Systems, Inc.
|
||||
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||
#
|
||||
|
||||
|
||||
|
@ -52,7 +52,7 @@ class DeleteProviderNetworkRange(tables.DeleteAction):
|
|||
|
||||
def get_redirect_url(self):
|
||||
providernet_id = self.table.kwargs['providernet_id']
|
||||
return reverse('horizon:admin:providernets:providernets:detail',
|
||||
return reverse('horizon:admin:datanets:datanets:detail',
|
||||
args=(providernet_id,))
|
||||
|
||||
def delete(self, request, obj_id):
|
||||
|
@ -72,7 +72,7 @@ class DeleteProviderNetworkRange(tables.DeleteAction):
|
|||
class CreateProviderNetworkRange(tables.LinkAction):
|
||||
name = "create"
|
||||
verbose_name = _("Create Range")
|
||||
url = "horizon:admin:providernets:providernets:createrange"
|
||||
url = "horizon:admin:datanets:datanets:createrange"
|
||||
classes = ("ajax-modal", "btn-create")
|
||||
|
||||
def get_link_url(self, datum=None):
|
||||
|
@ -80,16 +80,14 @@ class CreateProviderNetworkRange(tables.LinkAction):
|
|||
return reverse(self.url, args=(providernet_id,))
|
||||
|
||||
def allowed(self, request, datum=None):
|
||||
providernet = self.table.kwargs.get('providernet')
|
||||
if providernet:
|
||||
return (providernet.type not in ('flat'))
|
||||
return True
|
||||
# TODO(datanetworks): depends on spec network-segment-range-management
|
||||
return False
|
||||
|
||||
|
||||
class EditProviderNetworkRange(tables.LinkAction):
|
||||
name = "update"
|
||||
verbose_name = _("Edit Range")
|
||||
url = "horizon:admin:providernets:providernets:editrange"
|
||||
url = "horizon:admin:datanets:datanets:editrange"
|
||||
classes = ("ajax-modal", "btn-edit")
|
||||
|
||||
def get_link_url(self, providernet_range):
|
||||
|
@ -113,7 +111,7 @@ class ProviderNetworkRangeTable(tables.DataTable):
|
|||
tenant = tables.Column("tenant_name", verbose_name=_("Project"))
|
||||
shared = tables.Column("shared", verbose_name=_("Shared"),
|
||||
filters=(filters.yesno, filters.capfirst))
|
||||
url = "horizon:admin:providernets:providernets:ranges:detail"
|
||||
url = "horizon:admin:datanets:datanets:ranges:detail"
|
||||
name = tables.Column("name", verbose_name=_("Name"), link=url)
|
||||
minimum = tables.Column("minimum", verbose_name=_("Minimum"))
|
||||
maximum = tables.Column("maximum", verbose_name=_("Maximum"))
|
|
@ -12,7 +12,7 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# Copyright (c) 2013-2018 Wind River Systems, Inc.
|
||||
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||
#
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _ # noqa
|
||||
|
@ -23,7 +23,7 @@ from horizon import tabs
|
|||
class OverviewTab(tabs.Tab):
|
||||
name = _("Overview")
|
||||
slug = "overview"
|
||||
template_name = "admin/providernets/providernets/ranges/" \
|
||||
template_name = "admin/datanets/datanets/ranges/" \
|
||||
"_detail_overview.html"
|
||||
|
||||
def get_context_data(self, request):
|
|
@ -12,13 +12,13 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# Copyright (c) 2013-2018 Wind River Systems, Inc.
|
||||
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||
#
|
||||
|
||||
|
||||
from django.conf.urls import url # noqa
|
||||
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets.ranges \
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets.ranges \
|
||||
import views
|
||||
|
||||
RANGES = r'^(?P<providernet_range_id>[^/]+)/%s$'
|
|
@ -12,7 +12,7 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# Copyright (c) 2013-2018 Wind River Systems, Inc.
|
||||
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||
#
|
||||
|
||||
|
||||
|
@ -25,17 +25,17 @@ from horizon import tabs
|
|||
from horizon.utils import memoized
|
||||
|
||||
from starlingx_dashboard import api as stx_api
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets.ranges \
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets.ranges \
|
||||
import forms as range_forms
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets.ranges \
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets.ranges \
|
||||
import tabs as range_tabs
|
||||
|
||||
|
||||
class CreateView(forms.ModalFormView):
|
||||
form_class = range_forms.CreateProviderNetworkRange
|
||||
template_name = 'admin/providernets/providernets/ranges/create.html'
|
||||
success_url = 'horizon:admin:providernets:providernets:detail'
|
||||
failure_url = 'horizon:admin:providernets:providernets:detail'
|
||||
template_name = 'admin/datanets/datanets/ranges/create.html'
|
||||
success_url = 'horizon:admin:datanets:datanets:detail'
|
||||
failure_url = 'horizon:admin:datanets:datanets:detail'
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse(self.success_url,
|
||||
|
@ -73,7 +73,7 @@ class CreateView(forms.ModalFormView):
|
|||
|
||||
class DetailView(tabs.TabView):
|
||||
tab_group_class = range_tabs.ProviderNetworkRangeDetailTabs
|
||||
template_name = 'admin/providernets/providernets/ranges/detail.html'
|
||||
template_name = 'admin/datanets/datanets/ranges/detail.html'
|
||||
page_title = '{{ providernet_range.name }}'
|
||||
|
||||
def _get_object(self):
|
||||
|
@ -85,7 +85,7 @@ class DetailView(tabs.TabView):
|
|||
self.request, providernet_range_id)
|
||||
except Exception:
|
||||
redirect = \
|
||||
reverse("horizon:admin:providernets:providernets:detail",
|
||||
reverse("horizon:admin:datanets:datanets:detail",
|
||||
args=(
|
||||
self.kwargs['providernet_id'],))
|
||||
msg = _('Unable to retrieve provider network range details')
|
||||
|
@ -99,7 +99,7 @@ class DetailView(tabs.TabView):
|
|||
pnet_name = self.get_providernet_name(providernet_range.providernet_id)
|
||||
breadcrumb = [
|
||||
(pnet_name,
|
||||
reverse('horizon:admin:providernets:providernets:detail',
|
||||
reverse('horizon:admin:datanets:datanets:detail',
|
||||
args=(providernet_range.providernet_id,))),
|
||||
(_("Segmentation Ranges"), None)
|
||||
]
|
||||
|
@ -128,9 +128,9 @@ class DetailView(tabs.TabView):
|
|||
|
||||
class UpdateView(forms.ModalFormView):
|
||||
form_class = range_forms.UpdateProviderNetworkRange
|
||||
template_name = 'admin/providernets/providernets/ranges/update.html'
|
||||
template_name = 'admin/datanets/datanets/ranges/update.html'
|
||||
context_object_name = 'providernet_range'
|
||||
success_url = 'horizon:admin:providernets:providernets:detail'
|
||||
success_url = 'horizon:admin:datanets:datanets:detail'
|
||||
|
||||
def get_success_url(self):
|
||||
value = reverse(self.success_url,
|
||||
|
@ -145,7 +145,7 @@ class UpdateView(forms.ModalFormView):
|
|||
self.request, providernet_range_id)
|
||||
except Exception:
|
||||
redirect = \
|
||||
reverse("horizon:admin:providernets:providernets:detail",
|
||||
reverse("horizon:admin:datanets:datanets:detail",
|
||||
args=(self.kwargs['providernet_id'],))
|
||||
msg = _('Unable to retrieve provider network range details')
|
||||
exceptions.handle(self.request, msg, redirect=redirect)
|
|
@ -12,12 +12,11 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# Copyright (c) 2013-2018 Wind River Systems, Inc.
|
||||
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||
#
|
||||
|
||||
|
||||
import logging
|
||||
from operator import itemgetter # noqa
|
||||
|
||||
from django.core.urlresolvers import reverse # noqa
|
||||
from django.utils.translation import ugettext_lazy as _ # noqa
|
||||
|
@ -26,120 +25,103 @@ from django.utils.translation import ungettext_lazy
|
|||
from horizon import exceptions
|
||||
from horizon import tables
|
||||
|
||||
from neutronclient.common import exceptions as neutron_exceptions
|
||||
from cgtsclient import exc as sysinv_exceptions
|
||||
|
||||
from starlingx_dashboard import api as stx_api
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class DeleteProviderNetwork(tables.DeleteAction):
|
||||
class DeleteDataNetwork(tables.DeleteAction):
|
||||
@staticmethod
|
||||
def action_present(count):
|
||||
return ungettext_lazy(
|
||||
"Delete Provider Network",
|
||||
"Delete Provider Networks",
|
||||
"Delete Data Network",
|
||||
"Delete Data Networks",
|
||||
count
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def action_past(count):
|
||||
return ungettext_lazy(
|
||||
"Deleted Provider Network",
|
||||
"Deleted Provider Networks",
|
||||
"Deleted Data Network",
|
||||
"Deleted Data Networks",
|
||||
count
|
||||
)
|
||||
|
||||
def delete(self, request, obj_id):
|
||||
try:
|
||||
stx_api.neutron.provider_network_delete(request, obj_id)
|
||||
except neutron_exceptions.NeutronClientException as e:
|
||||
stx_api.sysinv.data_network_delete(request, obj_id)
|
||||
except sysinv_exceptions.CgtsclientException as e:
|
||||
LOG.info(str(e))
|
||||
redirect = reverse('horizon:admin:providernets:index')
|
||||
redirect = reverse('horizon:admin:datanets:index')
|
||||
exceptions.handle(request, str(e), redirect=redirect)
|
||||
except Exception:
|
||||
msg = _('Failed to delete provider network %s') % obj_id
|
||||
msg = _('Failed to delete data network %s') % obj_id
|
||||
LOG.info(msg)
|
||||
redirect = reverse('horizon:admin:providernets:index')
|
||||
redirect = reverse('horizon:admin:datanets:index')
|
||||
exceptions.handle(request, msg, redirect=redirect)
|
||||
|
||||
|
||||
class CreateProviderNetwork(tables.LinkAction):
|
||||
class CreateDataNetwork(tables.LinkAction):
|
||||
name = "create"
|
||||
verbose_name = _("Create Provider Network")
|
||||
url = "horizon:admin:providernets:providernets:create"
|
||||
verbose_name = _("Create Data Network")
|
||||
url = "horizon:admin:datanets:datanets:create"
|
||||
classes = ("ajax-modal", "btn-create")
|
||||
|
||||
|
||||
class EditProviderNetwork(tables.LinkAction):
|
||||
class EditDataNetwork(tables.LinkAction):
|
||||
name = "update"
|
||||
verbose_name = _("Edit Provider Network")
|
||||
url = "horizon:admin:providernets:providernets:update"
|
||||
verbose_name = _("Edit Data Network")
|
||||
url = "horizon:admin:datanets:datanets:update"
|
||||
classes = ("ajax-modal", "btn-edit")
|
||||
|
||||
|
||||
class AddProviderNetworkRange(tables.LinkAction):
|
||||
class AddDataNetworkRange(tables.LinkAction):
|
||||
name = "addrange"
|
||||
verbose_name = _("Create Segmentation Range")
|
||||
url = "horizon:admin:providernets:providernets:addrange"
|
||||
url = "horizon:admin:datanets:datanets:addrange"
|
||||
classes = ("ajax-modal", "btn-edit")
|
||||
|
||||
def allowed(self, request, providernet):
|
||||
if providernet:
|
||||
return providernet.type not in ('flat')
|
||||
return super(AddProviderNetworkRange, self).allowed(request,
|
||||
providernet)
|
||||
return providernet.network_type not in ('flat')
|
||||
return super(AddDataNetworkRange, self).allowed(request,
|
||||
providernet)
|
||||
|
||||
|
||||
class ProviderNetworksFilterAction(tables.FilterAction):
|
||||
def filter(self, table, providernets, filter_string):
|
||||
class DataNetworksFilterAction(tables.FilterAction):
|
||||
def filter(self, table, datanets, filter_string):
|
||||
"""Naive case-insensitive search."""
|
||||
q = filter_string.lower()
|
||||
return [providernet for providernet in providernets
|
||||
return [providernet for providernet in datanets
|
||||
if q in providernet.name.lower()]
|
||||
|
||||
|
||||
def _format_providernet_ranges(data):
|
||||
ranges = data['ranges']
|
||||
if not ranges:
|
||||
return '-'
|
||||
return ", ".join(["{}-{}".format(r['minimum'], r['maximum'])
|
||||
if r['minimum'] != r['maximum']
|
||||
else "{}".format(r['minimum'])
|
||||
for r in sorted(ranges, key=itemgetter('minimum'))])
|
||||
# TODO(datanetworks): update ranges based upon Stein spec
|
||||
return '-'
|
||||
|
||||
|
||||
PROVIDERNET_STATUS_CHOICES = (
|
||||
('active', True),
|
||||
('down', False),
|
||||
('error', False),
|
||||
('unmanaged', True)
|
||||
)
|
||||
|
||||
|
||||
class ProviderNetworksTable(tables.DataTable):
|
||||
class DataNetworksTable(tables.DataTable):
|
||||
name = tables.Column("name", verbose_name=_("Network Name"),
|
||||
link='horizon:admin:providernets:providernets:detail')
|
||||
status = tables.Column("status",
|
||||
verbose_name=_("Status"),
|
||||
status=True,
|
||||
status_choices=PROVIDERNET_STATUS_CHOICES)
|
||||
type = tables.Column("type", verbose_name=_("Type"))
|
||||
link='horizon:admin:datanets:datanets:detail')
|
||||
type = tables.Column("network_type", verbose_name=_("Type"))
|
||||
mtu = tables.Column("mtu", verbose_name=_("MTU"))
|
||||
ranges = tables.Column(transform=_format_providernet_ranges,
|
||||
verbose_name=_("Segmentation Ranges"))
|
||||
vlan_transparent = tables.Column("vlan_transparent",
|
||||
verbose_name=_("VLAN Transparent"))
|
||||
|
||||
def get_object_id(self, datum):
|
||||
return str(datum.uuid)
|
||||
|
||||
class Meta(object):
|
||||
name = "provider_networks"
|
||||
verbose_name = _("Provider Networks")
|
||||
status_columns = ["status"]
|
||||
table_actions = (CreateProviderNetwork, DeleteProviderNetwork,
|
||||
ProviderNetworksFilterAction)
|
||||
row_actions = (EditProviderNetwork,
|
||||
DeleteProviderNetwork,
|
||||
AddProviderNetworkRange)
|
||||
verbose_name = _("Data Networks")
|
||||
table_actions = (CreateDataNetwork, DeleteDataNetwork,
|
||||
DataNetworksFilterAction)
|
||||
row_actions = (EditDataNetwork,
|
||||
DeleteDataNetwork,
|
||||
AddDataNetworkRange)
|
||||
|
||||
|
||||
def _get_link_url(datum):
|
|
@ -12,22 +12,22 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# Copyright (c) 2013-2015 Wind River Systems, Inc.
|
||||
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||
#
|
||||
|
||||
|
||||
from django.conf.urls import include # noqa
|
||||
from django.conf.urls import url # noqa
|
||||
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets.ranges \
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets.ranges \
|
||||
import urls as range_urls
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets.ranges \
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets.ranges \
|
||||
import views as range_views
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets import \
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets import \
|
||||
views
|
||||
|
||||
PROVIDERNETS = r'^(?P<providernet_id>[^/]+)/%s$'
|
||||
VIEW_MOD = 'starlingx_dashboard.dashboards.admin.providernets.providernets.' \
|
||||
VIEW_MOD = 'starlingx_dashboard.dashboards.admin.datanets.datanets.' \
|
||||
'views'
|
||||
|
||||
urlpatterns = [
|
|
@ -12,7 +12,7 @@
|
|||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
# Copyright (c) 2013-2014 Wind River Systems, Inc.
|
||||
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||
#
|
||||
|
||||
|
||||
|
@ -30,30 +30,30 @@ from horizon import tables
|
|||
from openstack_dashboard import api
|
||||
|
||||
from starlingx_dashboard import api as stx_api
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets import \
|
||||
forms as providernet_forms
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets.ranges \
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets import \
|
||||
forms as datanet_forms
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets.ranges \
|
||||
import tables as range_tables
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets.ranges \
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets.ranges \
|
||||
import views as range_views
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets import \
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets import \
|
||||
tables as providernet_tables
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class CreateView(forms.ModalFormView):
|
||||
form_class = providernet_forms.CreateProviderNetwork
|
||||
template_name = 'admin/providernets/providernets/create.html'
|
||||
success_url = reverse_lazy('horizon:admin:providernets:index')
|
||||
form_class = datanet_forms.CreateDataNetwork
|
||||
template_name = 'admin/datanets/datanets/create.html'
|
||||
success_url = reverse_lazy('horizon:admin:datanets:index')
|
||||
|
||||
|
||||
class DetailView(tables.MultiTableView):
|
||||
table_classes = (range_tables.ProviderNetworkRangeTable,
|
||||
providernet_tables.ProviderNetworkTenantNetworkTable)
|
||||
template_name = 'admin/providernets/providernets/detail.html'
|
||||
failure_url = reverse_lazy('horizon:admin:providernets:index')
|
||||
page_title = '{{ "Provider Network Detail: "|add:providernet.name }}'
|
||||
template_name = 'admin/datanets/datanets/detail.html'
|
||||
failure_url = reverse_lazy('horizon:admin:datanets:index')
|
||||
page_title = '{{ "Data Network Detail: "|add:providernet.name }}'
|
||||
|
||||
def _get_tenant_list(self):
|
||||
if not hasattr(self, "_tenants"):
|
||||
|
@ -69,10 +69,8 @@ class DetailView(tables.MultiTableView):
|
|||
|
||||
def get_tenant_networks_data(self):
|
||||
try:
|
||||
providernet_id = self.kwargs['providernet_id']
|
||||
# self.table.kwargs['providernet'] = self._get_data()
|
||||
networks = stx_api.neutron.provider_network_list_tenant_networks(
|
||||
self.request, providernet_id=providernet_id)
|
||||
# TODO(datanetworks): get tenant networks when in upstream neutron
|
||||
networks = []
|
||||
except Exception:
|
||||
networks = []
|
||||
msg = _('Tenant network list can not be retrieved.')
|
||||
|
@ -81,10 +79,8 @@ class DetailView(tables.MultiTableView):
|
|||
|
||||
def get_provider_network_ranges_data(self):
|
||||
try:
|
||||
providernet_id = self.kwargs['providernet_id']
|
||||
# self.table.kwargs['providernet'] = self._get_data()
|
||||
ranges = stx_api.neutron.provider_network_range_list(
|
||||
self.request, providernet_id=providernet_id)
|
||||
# TODO(datanetworks) force ranges to []
|
||||
ranges = []
|
||||
except Exception:
|
||||
ranges = []
|
||||
msg = _('Segmentation id range list can not be retrieved.')
|
||||
|
@ -101,9 +97,8 @@ class DetailView(tables.MultiTableView):
|
|||
if not hasattr(self, "_providernet"):
|
||||
try:
|
||||
providernet_id = self.kwargs['providernet_id']
|
||||
providernet = stx_api.neutron.provider_network_get(
|
||||
providernet = stx_api.sysinv.data_network_get(
|
||||
self.request, providernet_id)
|
||||
providernet.set_id_as_name_if_empty(length=0)
|
||||
except Exception:
|
||||
redirect = self.failure_url
|
||||
exceptions.handle(self.request,
|
||||
|
@ -115,20 +110,8 @@ class DetailView(tables.MultiTableView):
|
|||
|
||||
def _get_nova_data(self):
|
||||
if not hasattr(self, "_providernet_nova"):
|
||||
try:
|
||||
providernet_id = self.kwargs['providernet_id']
|
||||
providernet_nova = stx_api.nova.provider_network_get(
|
||||
self.request, providernet_id)
|
||||
except Exception as ex:
|
||||
# redirect = self.failure_url
|
||||
# exceptions.handle(self.request,
|
||||
# _('Unable to retrieve details for '
|
||||
# 'provider network "%s".') % providernet_id,
|
||||
# redirect=redirect)
|
||||
LOG.error(ex)
|
||||
providernet_nova = None
|
||||
|
||||
self._providernet_nova = providernet_nova
|
||||
# TODO(datanetworks): depends on upstream support
|
||||
self._providernet_nova = None
|
||||
return self._providernet_nova
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
|
@ -139,9 +122,9 @@ class DetailView(tables.MultiTableView):
|
|||
|
||||
|
||||
class UpdateView(forms.ModalFormView):
|
||||
form_class = providernet_forms.UpdateProviderNetwork
|
||||
template_name = 'admin/providernets/providernets/update.html'
|
||||
success_url = reverse_lazy('horizon:admin:providernets:index')
|
||||
form_class = datanet_forms.UpdateDataNetwork
|
||||
template_name = 'admin/datanets/datanets/update.html'
|
||||
success_url = reverse_lazy('horizon:admin:datanets:index')
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(UpdateView, self).get_context_data(**kwargs)
|
||||
|
@ -152,28 +135,28 @@ class UpdateView(forms.ModalFormView):
|
|||
if not hasattr(self, "_object"):
|
||||
providernet_id = self.kwargs['providernet_id']
|
||||
try:
|
||||
self._object = stx_api.neutron.provider_network_get(
|
||||
self._object = stx_api.sysinv.data_network_get(
|
||||
self.request, providernet_id)
|
||||
except Exception:
|
||||
redirect = self.success_url
|
||||
msg = _('Unable to retrieve provider network details.')
|
||||
msg = _('Unable to retrieve data network details.')
|
||||
exceptions.handle(self.request, msg, redirect=redirect)
|
||||
return self._object
|
||||
|
||||
def get_initial(self):
|
||||
providernet = self._get_object()
|
||||
return {'id': providernet['id'],
|
||||
'name': providernet['name'],
|
||||
'description': providernet['description'],
|
||||
'type': providernet['type'],
|
||||
'mtu': providernet['mtu'],
|
||||
'vlan_transparent': providernet['vlan_transparent']}
|
||||
return {'id': providernet.id,
|
||||
'name': providernet.name,
|
||||
'network_type': providernet.network_type,
|
||||
'mtu': providernet.mtu,
|
||||
'description': providernet.description,
|
||||
}
|
||||
|
||||
|
||||
class CreateRangeView(range_views.CreateView):
|
||||
template_name = 'admin/providernets/providernets/add_range.html'
|
||||
success_url = 'horizon:admin:providernets:index'
|
||||
failure_url = 'horizon:admin:providernets:index'
|
||||
template_name = 'admin/datanets/datanets/add_range.html'
|
||||
success_url = 'horizon:admin:datanets:index'
|
||||
failure_url = 'horizon:admin:datanets:index'
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse(self.success_url)
|
|
@ -11,9 +11,9 @@ from openstack_dashboard.api import base
|
|||
from openstack_dashboard.dashboards.admin import dashboard
|
||||
|
||||
|
||||
class Providernets(horizon.Panel):
|
||||
name = _("Provider Networks")
|
||||
slug = 'providernets'
|
||||
class Datanets(horizon.Panel):
|
||||
name = _("Data Networks")
|
||||
slug = 'datanets'
|
||||
permissions = ('openstack.services.platform', 'openstack.services.network')
|
||||
|
||||
def allowed(self, context):
|
||||
|
@ -22,7 +22,7 @@ class Providernets(horizon.Panel):
|
|||
if not base.is_service_enabled(context['request'], 'platform'):
|
||||
return False
|
||||
else:
|
||||
return super(Providernets, self).allowed(context)
|
||||
return super(Datanets, self).allowed(context)
|
||||
|
||||
def nav(self, context):
|
||||
if context['request'].user.services_region == 'SystemController':
|
||||
|
@ -33,4 +33,4 @@ class Providernets(horizon.Panel):
|
|||
return True
|
||||
|
||||
|
||||
dashboard.Admin.register(Providernets)
|
||||
dashboard.Admin.register(Datanets)
|
|
@ -1,47 +1,42 @@
|
|||
#
|
||||
# Copyright (c) 2013-2016 Wind River Systems, Inc.
|
||||
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
|
||||
import logging
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _ # noqa
|
||||
|
||||
from horizon import exceptions
|
||||
from horizon import tabs
|
||||
|
||||
from starlingx_dashboard.api import base as stx_base
|
||||
from starlingx_dashboard.api import neutron as stx_neutron
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets import \
|
||||
tables as providernets_tables
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
from starlingx_dashboard.api import sysinv as stx_sysinv
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets import \
|
||||
tables as datanets_tables
|
||||
|
||||
|
||||
class ProviderNetworkTab(tabs.TableTab):
|
||||
table_classes = (providernets_tables.ProviderNetworksTable,)
|
||||
name = _("Provider Networks")
|
||||
class DataNetworkTab(tabs.TableTab):
|
||||
table_classes = (datanets_tables.DataNetworksTable,)
|
||||
name = _("Data Networks")
|
||||
slug = "provider_networks"
|
||||
template_name = ("horizon/common/_detail_table.html")
|
||||
|
||||
def get_provider_networks_data(self):
|
||||
try:
|
||||
providernets = \
|
||||
stx_neutron.provider_network_list(self.tab_group.request)
|
||||
datanets = \
|
||||
stx_sysinv.data_network_list(self.tab_group.request)
|
||||
except Exception:
|
||||
providernets = []
|
||||
datanets = []
|
||||
msg = _('Unable to get provider network list.')
|
||||
exceptions.check_message(["Connection", "refused"], msg)
|
||||
raise
|
||||
return providernets
|
||||
return datanets
|
||||
|
||||
def allowed(self, request):
|
||||
return stx_base.is_stx_region(request)
|
||||
|
||||
|
||||
class NetworkTabs(tabs.TabGroup):
|
||||
slug = "providernets"
|
||||
tabs = (ProviderNetworkTab,)
|
||||
slug = "datanets"
|
||||
tabs = (DataNetworkTab,)
|
||||
sticky = True
|
|
@ -2,7 +2,7 @@
|
|||
{% load i18n %}
|
||||
|
||||
{% block form_id %}add_provider_network_range_form{% endblock %}
|
||||
{% block form_action %}{% url 'horizon:admin:providernets:providernets:addrange' providernet_id %}
|
||||
{% block form_action %}{% url 'horizon:admin:datanets:datanets:addrange' providernet_id %}
|
||||
{% endblock %}
|
||||
|
||||
{% block modal-header %}{% trans "Create Segmentation Range" %}{% endblock %}
|
|
@ -2,10 +2,10 @@
|
|||
{% load i18n %}
|
||||
|
||||
{% block form_id %}create_provider_network_form{% endblock %}
|
||||
{% block form_action %}{% url 'horizon:admin:providernets:providernets:create' %}
|
||||
{% block form_action %}{% url 'horizon:admin:datanets:datanets:create' %}
|
||||
{% endblock %}
|
||||
|
||||
{% block modal-header %}{% trans "Create Provider Network" %}{% endblock %}
|
||||
{% block modal-header %}{% trans "Create Data Network" %}{% endblock %}
|
||||
|
||||
{% block modal-body %}
|
||||
<div class="left">
|
||||
|
@ -21,5 +21,5 @@
|
|||
|
||||
{% block modal-footer %}
|
||||
<a class="btn btn-default cancel" data-dismiss="modal">{% trans "Cancel" %}</a>
|
||||
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Provider Network" %}" />
|
||||
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Create Data Network" %}" />
|
||||
{% endblock %}
|
|
@ -1,6 +1,6 @@
|
|||
{% load i18n sizeformat %}
|
||||
|
||||
<h3>{% trans "Provider Network Overview" %}</h3>
|
||||
<h3>{% trans "Data Network Overview" %}</h3>
|
||||
|
||||
<div class="info detail">
|
||||
<dl class="dl-horizontal">
|
||||
|
@ -14,8 +14,6 @@
|
|||
<dd>{{ providernet.mtu|default:_("-") }}</dd>
|
||||
<dt>{% trans "Description" %}</dt>
|
||||
<dd>{{ providernet.description|default:_("None") }}</dd>
|
||||
<dt>{% trans "VLAN Transparent" %}</dt>
|
||||
<dd>{{ providernet.vlan_transparent|yesno|capfirst }}</dd>
|
||||
{% if nova_providernet %}
|
||||
<dt>{% trans "PCI PFs Configured" %}</dt>
|
||||
<dd>{{ nova_providernet.pci_pfs_configured|default:_("0") }}</dd>
|
|
@ -2,9 +2,9 @@
|
|||
{% load i18n %}
|
||||
|
||||
{% block form_id %}update_provider_network_form{% endblock %}
|
||||
{% block form_action %}{% url 'horizon:admin:providernets:providernets:update' providernet_id %}{% endblock %}
|
||||
{% block form_action %}{% url 'horizon:admin:datanets:datanets:update' providernet_id %}{% endblock %}
|
||||
|
||||
{% block modal-header %}{% trans "Edit Provider Network" %}{% endblock %}
|
||||
{% block modal-header %}{% trans "Edit Data Network" %}{% endblock %}
|
||||
|
||||
{% block modal-body %}
|
||||
<div class="left">
|
||||
|
@ -19,7 +19,7 @@
|
|||
</div>
|
||||
<div class="right">
|
||||
<h3>{% trans "Description:" %}</h3>
|
||||
<p>{% trans "You may update the editable properties of your provider network here." %}</p>
|
||||
<p>{% trans "You may update the editable properties of your data network here." %}</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -7,5 +7,5 @@
|
|||
{% endblock page_header %}
|
||||
|
||||
{% block main %}
|
||||
{% include "admin/providernets/providernets/_add_range.html" %}
|
||||
{% include "admin/datanets/datanets/_add_range.html" %}
|
||||
{% endblock %}
|
|
@ -1,11 +1,11 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% block title %}{% trans "Create Provider Network" %}{% endblock %}
|
||||
{% block title %}{% trans "Create Data Network" %}{% endblock %}
|
||||
|
||||
{% block page_header %}
|
||||
{% include "horizon/common/_page_header.html" with title=_("Create Provider Network") %}
|
||||
{% include "horizon/common/_page_header.html" with title=_("Create Data Network") %}
|
||||
{% endblock page_header %}
|
||||
|
||||
{% block main %}
|
||||
{% include "admin/providernets/providernets/_create.html" %}
|
||||
{% include "admin/datanets/datanets/_create.html" %}
|
||||
{% endblock %}
|
|
@ -1,9 +1,9 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n breadcrumb_nav %}
|
||||
{% block title %}{% trans "Provider Network Detail"%}{% endblock %}
|
||||
{% block title %}{% trans "Data Network Detail"%}{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
{% include "admin/providernets/providernets/_detail_overview.html" %}
|
||||
{% include "admin/datanets/datanets/_detail_overview.html" %}
|
||||
<hr>
|
||||
<div id="ranges">
|
||||
{{ provider_network_ranges_table.render }}
|
|
@ -2,7 +2,7 @@
|
|||
{% load i18n %}
|
||||
|
||||
{% block form_id %}create_provider_network_range_form{% endblock %}
|
||||
{% block form_action %}{% url 'horizon:admin:providernets:providernets:createrange' providernet_id %}
|
||||
{% block form_action %}{% url 'horizon:admin:datanets:datanets:createrange' providernet_id %}
|
||||
{% endblock %}
|
||||
|
||||
{% block modal-header %}{% trans "Create Segmentation Range" %}{% endblock %}
|
|
@ -18,7 +18,7 @@
|
|||
<dd>{{ providernet_range.maximum|default:_("None") }}</dd>
|
||||
{% if providernet_range.vxlan %}
|
||||
<dt>{% trans "Provider Attributes" %}</dt>
|
||||
<dd>{% include "admin/providernets/providernets/ranges/_vxlan.html" with vxlan=providernet_range.vxlan %}</dd>
|
||||
<dd>{% include "admin/datanets/datanets/ranges/_vxlan.html" with vxlan=providernet_range.vxlan %}</dd>
|
||||
{% endif %}
|
||||
</dl>
|
||||
</div>
|
|
@ -2,7 +2,7 @@
|
|||
{% load i18n %}
|
||||
|
||||
{% block form_id %}update_provider_network_range_form{% endblock %}
|
||||
{% block form_action %}{% url 'horizon:admin:providernets:providernets:editrange' providernet_id providernet_range_id %}{% endblock %}
|
||||
{% block form_action %}{% url 'horizon:admin:datanets:datanets:editrange' providernet_id providernet_range_id %}{% endblock %}
|
||||
|
||||
{% block modal-header %}{% trans "Edit Segmentation Range" %}{% endblock %}
|
||||
|
|
@ -7,5 +7,5 @@
|
|||
{% endblock page_header %}
|
||||
|
||||
{% block main %}
|
||||
{% include "admin/providernets/providernets/ranges/_create.html" %}
|
||||
{% include "admin/datanets/datanets/ranges/_create.html" %}
|
||||
{% endblock %}
|
|
@ -1,11 +1,11 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% block title %}{% trans "Update Provider Network Range" %}{% endblock %}
|
||||
{% block title %}{% trans "Update Data Network Range" %}{% endblock %}
|
||||
|
||||
{% block page_header %}
|
||||
{% include "horizon/common/_page_header.html" with title=_("Update Provider Network Range") %}
|
||||
{% include "horizon/common/_page_header.html" with title=_("Update Data Network Range") %}
|
||||
{% endblock page_header %}
|
||||
|
||||
{% block main %}
|
||||
{% include 'admin/providernets/providernets/ranges/_update.html' %}
|
||||
{% include 'admin/datanets/datanets/ranges/_update.html' %}
|
||||
{% endblock %}
|
|
@ -1,11 +1,11 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% block title %}{% trans "Update Provider Network" %}{% endblock %}
|
||||
{% block title %}{% trans "Update Data Network" %}{% endblock %}
|
||||
|
||||
{% block page_header %}
|
||||
{% include "horizon/common/_page_header.html" with title=_("Update Provider Network") %}
|
||||
{% include "horizon/common/_page_header.html" with title=_("Update Data Network") %}
|
||||
{% endblock page_header %}
|
||||
|
||||
{% block main %}
|
||||
{% include 'admin/providernets/providernets/_update.html' %}
|
||||
{% include 'admin/datanets/datanets/_update.html' %}
|
||||
{% endblock %}
|
|
@ -1,9 +1,9 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% block title %}{% trans "Provider Networks" %}{% endblock %}
|
||||
{% block title %}{% trans "Data Networks" %}{% endblock %}
|
||||
|
||||
{% block page_header %}
|
||||
{% include "horizon/common/_page_header.html" with title=_("Provider Networks")%}
|
||||
{% include "horizon/common/_page_header.html" with title=_("Data Networks")%}
|
||||
{% endblock page_header %}
|
||||
|
||||
{% block main %}
|
|
@ -1,5 +1,5 @@
|
|||
#
|
||||
# Copyright (c) 2013-2016 Wind River Systems, Inc.
|
||||
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
@ -7,15 +7,15 @@
|
|||
from django.conf.urls import include
|
||||
from django.conf.urls import url
|
||||
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets \
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets \
|
||||
import urls as providernet_urls
|
||||
from starlingx_dashboard.dashboards.admin.providernets import views
|
||||
from starlingx_dashboard.dashboards.admin.datanets import views
|
||||
|
||||
|
||||
NETWORKS = r'^(?P<network_id>[^/]+)/%s$'
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.IndexViewTabbed.as_view(), name='index'),
|
||||
url(r'^providernets/',
|
||||
include(providernet_urls, namespace='providernets'))
|
||||
url(r'^datanets/',
|
||||
include(providernet_urls, namespace='datanets'))
|
||||
]
|
|
@ -1,5 +1,5 @@
|
|||
#
|
||||
# Copyright (c) 2016 Wind River Systems, Inc.
|
||||
# Copyright (c) 2016-2019 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
@ -8,11 +8,11 @@ from django.utils.translation import ugettext_lazy as _
|
|||
|
||||
from horizon import tabs
|
||||
|
||||
from starlingx_dashboard.dashboards.admin.providernets \
|
||||
from starlingx_dashboard.dashboards.admin.datanets \
|
||||
import tabs as project_tabs
|
||||
|
||||
|
||||
class IndexViewTabbed(tabs.TabbedTableView):
|
||||
tab_group_class = project_tabs.NetworkTabs
|
||||
template_name = 'admin/providernets/tabs.html'
|
||||
page_title = _("Provider Networks")
|
||||
template_name = 'admin/datanets/tabs.html'
|
||||
page_title = _("Data Networks")
|
|
@ -1,5 +1,5 @@
|
|||
#
|
||||
# Copyright (c) 2016-2018 Wind River Systems, Inc.
|
||||
# Copyright (c) 2016-2019 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
@ -14,7 +14,7 @@ from openstack_dashboard.dashboards.admin import dashboard
|
|||
|
||||
|
||||
class HostTopology(horizon.Panel):
|
||||
name = _("Provider Network Topology")
|
||||
name = _("Data Network Topology")
|
||||
slug = 'host_topology'
|
||||
permissions = ('openstack.services.platform', 'openstack.services.network')
|
||||
|
||||
|
|
|
@ -11,10 +11,10 @@ import logging
|
|||
from django.utils.translation import pgettext_lazy
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets.ranges \
|
||||
import tables as sr_tables
|
||||
from starlingx_dashboard.dashboards.admin.inventory.interfaces import \
|
||||
tables as if_tables
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets.ranges \
|
||||
import tables as sr_tables
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (c) 2016-2018 Wind River Systems, Inc.
|
||||
# Copyright (c) 2016-2019 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
@ -15,12 +15,12 @@ from horizon import tabs
|
|||
from openstack_dashboard import api as api
|
||||
|
||||
from starlingx_dashboard import api as stx_api
|
||||
from starlingx_dashboard.dashboards.admin.datanets.datanets import \
|
||||
tables as pn_tables
|
||||
from starlingx_dashboard.dashboards.admin.host_topology import \
|
||||
tables as tables
|
||||
from starlingx_dashboard.dashboards.admin.inventory import \
|
||||
tabs as i_tabs
|
||||
from starlingx_dashboard.dashboards.admin.providernets.providernets import \
|
||||
tables as pn_tables
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
@ -66,7 +66,7 @@ class OverviewTab(tabs.TableTab):
|
|||
table_classes = (tables.ProviderNetworkRangeTable,
|
||||
pn_tables.ProviderNetworkTenantNetworkTable)
|
||||
template_name = 'admin/host_topology/detail/providernet.html'
|
||||
name = "Provider Network Detail"
|
||||
name = "Data Network Detail"
|
||||
slug = 'providernet_details_overview'
|
||||
failure_url = reverse_lazy('horizon:admin:host_topology:index')
|
||||
|
||||
|
@ -83,14 +83,8 @@ class OverviewTab(tabs.TableTab):
|
|||
return self._tenants
|
||||
|
||||
def get_tenant_networks_data(self):
|
||||
try:
|
||||
providernet_id = self.tab_group.kwargs['providernet_id']
|
||||
networks = stx_api.neutron.provider_network_list_tenant_networks(
|
||||
self.request, providernet_id=providernet_id)
|
||||
except Exception:
|
||||
networks = []
|
||||
msg = _('Tenant network list can not be retrieved.')
|
||||
exceptions.handle(self.request, msg)
|
||||
# TODO(datanetworks): need to refactor for Stein
|
||||
networks = []
|
||||
return networks
|
||||
|
||||
def get_provider_network_ranges_data(self):
|
||||
|
|
|
@ -156,8 +156,8 @@ svg#topology_canvas g.loading .host .icon_bg {
|
|||
<input id="host_list_search" class="form-control" type="text" placeholder="Search Worker Hosts" />
|
||||
<div id="host_list" class="list-group">
|
||||
</div>
|
||||
<h4>Provider Networks</h4>
|
||||
<input id="network_list_search" class="form-control" type="text" placeholder="Search Provider Networks" />
|
||||
<h4>Data Networks</h4>
|
||||
<input id="network_list_search" class="form-control" type="text" placeholder="Search Data Networks" />
|
||||
<div id="network_list" class="list-group">
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{% load i18n sizeformat %}
|
||||
|
||||
<div class="info row-fluid detail">
|
||||
{% include "admin/providernets/providernets/_detail_overview.html" %}
|
||||
{% include "admin/datanets/datanets/_detail_overview.html" %}
|
||||
<hr>
|
||||
<div id="ranges">
|
||||
{{ provider_network_ranges_table.render }}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
{% if host %}
|
||||
<h4>Selected Entity: <a href="{% url 'horizon:admin:inventory:detail' host.id %}" >{{host.hostname}}</a></h4>
|
||||
{% else %}
|
||||
<h4>Selected Entity: <a href="{% url 'horizon:admin:providernets:providernets:detail' providernet.id %}" >{{providernet.name}}</a></h4>
|
||||
<h4>Selected Entity: <a href="{% url 'horizon:admin:datanets:datanets:detail' providernet.id %}" >{{providernet.name}}</a></h4>
|
||||
{% endif %}
|
||||
|
||||
{% block main %}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% block title %}{% trans "Provider Network Topology" %}{% endblock %}
|
||||
{% block title %}{% trans "Data Network Topology" %}{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#
|
||||
# Copyright (c) 2016-2018 Wind River Systems, Inc.
|
||||
# Copyright (c) 2016-2019 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
@ -73,9 +73,8 @@ class ProvidernetDetailView(tabs.TabbedTableView):
|
|||
if not hasattr(self, "_providernet"):
|
||||
try:
|
||||
providernet_id = self.kwargs['providernet_id']
|
||||
providernet = stx_api.neutron.provider_network_get(
|
||||
providernet = stx_api.sysinv.data_network_get(
|
||||
self.request, providernet_id)
|
||||
providernet.set_id_as_name_if_empty(length=0)
|
||||
|
||||
alarms = stx_api.fm.alarm_list(self.request)
|
||||
# Filter out unrelated alarms
|
||||
|
@ -98,18 +97,8 @@ class ProvidernetDetailView(tabs.TabbedTableView):
|
|||
|
||||
def get_nova_data(self):
|
||||
if not hasattr(self, "_providernet_nova"):
|
||||
try:
|
||||
providernet_id = self.kwargs['providernet_id']
|
||||
providernet_nova = stx_api.nova.provider_network_get(
|
||||
self.request, providernet_id)
|
||||
except Exception:
|
||||
redirect = self.failure_url
|
||||
exceptions.handle(self.request,
|
||||
_('Unable to retrieve details for '
|
||||
'provider network "%s".') % providernet_id,
|
||||
redirect=redirect)
|
||||
|
||||
self._providernet_nova = providernet_nova
|
||||
# TODO(datanetworks): depends on upstream support
|
||||
self._providernet_nova = None
|
||||
return self._providernet_nova
|
||||
|
||||
def get_tabs(self, request, *args, **kwargs):
|
||||
|
@ -122,7 +111,7 @@ class ProvidernetDetailView(tabs.TabbedTableView):
|
|||
|
||||
class HostTopologyView(views.HorizonTemplateView):
|
||||
template_name = 'admin/host_topology/index.html'
|
||||
page_title = _("Provider Network Topology")
|
||||
page_title = _("Data Network Topology")
|
||||
|
||||
def _has_permission(self, policy):
|
||||
has_permission = True
|
||||
|
@ -220,7 +209,7 @@ class JSONView(View):
|
|||
def _get_pnets(self, request):
|
||||
pnets = []
|
||||
try:
|
||||
pnets = stx_api.neutron.provider_network_list(request)
|
||||
pnets = stx_api.sysinv.data_network_list(request)
|
||||
except Exception as ex:
|
||||
exceptions.handle(ex)
|
||||
data = [p.to_dict() for p in pnets]
|
||||
|
|
|
@ -23,7 +23,6 @@ from horizon import exceptions
|
|||
from horizon import forms
|
||||
from horizon import messages
|
||||
|
||||
from starlingx_dashboard.api import neutron
|
||||
from starlingx_dashboard.api import sysinv
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
@ -280,37 +279,37 @@ class AddInterface(forms.SelfHandlingForm):
|
|||
'data-switch-on': 'ifclass',
|
||||
'data-ifclass-platform': 'Platform Network(s)'}))
|
||||
|
||||
providernetworks_data = MultipleChoiceField(
|
||||
label=_("Provider Network(s)"),
|
||||
datanetworks_data = MultipleChoiceField(
|
||||
label=_("Data Network(s)"),
|
||||
required=False,
|
||||
widget=CheckboxSelectMultiple(
|
||||
attrs={
|
||||
'class': 'switched',
|
||||
'data-switch-on': 'ifclass',
|
||||
'data-ifclass-data': ''},
|
||||
empty_value=_("No provider networks available "
|
||||
empty_value=_("No data networks available "
|
||||
"for this interface class.")))
|
||||
|
||||
providernetworks_pci = MultipleChoiceField(
|
||||
label=_("Provider Network(s)"),
|
||||
datanetworks_pci = MultipleChoiceField(
|
||||
label=_("Data Network(s)"),
|
||||
required=False,
|
||||
widget=CheckboxSelectMultiple(
|
||||
attrs={
|
||||
'class': 'switched',
|
||||
'data-switch-on': 'ifclass',
|
||||
'data-ifclass-pci-passthrough': ''},
|
||||
empty_value=_("No provider networks available "
|
||||
empty_value=_("No data networks available "
|
||||
"for this interface class.")))
|
||||
|
||||
providernetworks_sriov = MultipleChoiceField(
|
||||
label=_("Provider Network(s)"),
|
||||
datanetworks_sriov = MultipleChoiceField(
|
||||
label=_("Data Network(s)"),
|
||||
required=False,
|
||||
widget=CheckboxSelectMultiple(
|
||||
attrs={
|
||||
'class': 'switched',
|
||||
'data-switch-on': 'ifclass',
|
||||
'data-ifclass-pci-sriov': ''},
|
||||
empty_value=_("No provider networks available "
|
||||
empty_value=_("No data networks available "
|
||||
"for this interface class.")))
|
||||
|
||||
imtu = forms.IntegerField(
|
||||
|
@ -383,9 +382,9 @@ class AddInterface(forms.SelfHandlingForm):
|
|||
current_interface = sysinv.host_interface_get(
|
||||
self.request, this_interface_id)
|
||||
else:
|
||||
self.fields['providernetworks_sriov'].widget = \
|
||||
self.fields['datanetworks_sriov'].widget = \
|
||||
forms.widgets.HiddenInput()
|
||||
self.fields['providernetworks_pci'].widget = \
|
||||
self.fields['datanetworks_pci'].widget = \
|
||||
forms.widgets.HiddenInput()
|
||||
|
||||
host_uuid = kwargs['initial']['ihost_uuid']
|
||||
|
@ -400,38 +399,38 @@ class AddInterface(forms.SelfHandlingForm):
|
|||
network_choices = _get_network_choices(networks)
|
||||
self.fields['networks'].choices = network_choices
|
||||
|
||||
# Populate Provider Network Choices by querying Neutron
|
||||
# Populate Data Network Choices by querying SysInv
|
||||
self.extras = {}
|
||||
interfaces = sysinv.host_interface_list(self.request, host_uuid)
|
||||
|
||||
used_providernets = []
|
||||
used_datanets = []
|
||||
for i in interfaces:
|
||||
if i.ifclass == 'data' and \
|
||||
i.providernetworks and \
|
||||
i.datanetworks_csv and \
|
||||
i.uuid != this_interface_id:
|
||||
used_providernets = used_providernets + \
|
||||
i.providernetworks.split(",")
|
||||
used_datanets = used_datanets + \
|
||||
i.datanetworks_csv.split(",")
|
||||
|
||||
providernet_choices = []
|
||||
providernet_filtered = []
|
||||
datanet_choices = []
|
||||
datanet_filtered = []
|
||||
if getattr(self.request.user, 'services_region', None) == 'RegionOne' \
|
||||
and getattr(settings, 'DC_MODE', False):
|
||||
nt_choices = self.fields['ifclass'].choices
|
||||
self.fields['ifclass'].choices = [i for i in nt_choices if
|
||||
i[0] != 'data']
|
||||
else:
|
||||
providernets = neutron.provider_network_list(self.request)
|
||||
for provider in providernets:
|
||||
label = "{} (mtu={})".format(provider.name, provider.mtu)
|
||||
providernet = (str(provider.name), label)
|
||||
providernet_choices.append(providernet)
|
||||
if provider.name not in used_providernets:
|
||||
providernet_filtered.append(providernet)
|
||||
datanets = sysinv.data_network_list(self.request)
|
||||
for dn in datanets:
|
||||
label = "{} (mtu={})".format(dn.name, dn.mtu)
|
||||
datanet = (str(dn.name), label)
|
||||
datanet_choices.append(datanet)
|
||||
if dn.name not in used_datanets:
|
||||
datanet_filtered.append(datanet)
|
||||
|
||||
self.fields['providernetworks_data'].choices = providernet_filtered
|
||||
self.fields['datanetworks_data'].choices = datanet_filtered
|
||||
if (type(self) is UpdateInterface):
|
||||
self.fields['providernetworks_pci'].choices = providernet_choices
|
||||
self.fields['providernetworks_sriov'].choices = providernet_choices
|
||||
self.fields['datanetworks_pci'].choices = datanet_choices
|
||||
self.fields['datanetworks_sriov'].choices = datanet_choices
|
||||
|
||||
if current_interface:
|
||||
# update operation
|
||||
|
@ -493,35 +492,35 @@ class AddInterface(forms.SelfHandlingForm):
|
|||
cleaned_data.pop('ipv6_pool', None)
|
||||
|
||||
if ifclass == 'data':
|
||||
providernetworks = [_f for _f in cleaned_data.get(
|
||||
'providernetworks_data', []) if _f]
|
||||
datanetworks = [_f for _f in cleaned_data.get(
|
||||
'datanetworks_data', []) if _f]
|
||||
elif ifclass == 'pci-passthrough':
|
||||
providernetworks = [_f for _f in cleaned_data.get(
|
||||
'providernetworks_pci', []) if _f]
|
||||
datanetworks = [_f for _f in cleaned_data.get(
|
||||
'datanetworks_pci', []) if _f]
|
||||
elif ifclass == 'pci-sriov':
|
||||
providernetworks = [_f for _f in cleaned_data.get(
|
||||
'providernetworks_sriov', []) if _f]
|
||||
datanetworks = [_f for _f in cleaned_data.get(
|
||||
'datanetworks_sriov', []) if _f]
|
||||
else:
|
||||
providernetworks = []
|
||||
datanetworks = []
|
||||
|
||||
# providernetwork selection is required for 'data', 'pci-passthrough'
|
||||
# datanetwork selection is required for 'data', 'pci-passthrough'
|
||||
# and 'pci-sriov'. It is NOT required for any other interface class
|
||||
if not providernetworks:
|
||||
if not datanetworks:
|
||||
|
||||
# Note that 1 of 3 different controls may be used to select
|
||||
# provider network, make sure to set the error on the appropriate
|
||||
# data network, make sure to set the error on the appropriate
|
||||
# control
|
||||
if ifclass in ['data', 'pci-passthrough', 'pci-sriov']:
|
||||
raise forms.ValidationError(_(
|
||||
"You must specify a Provider Network"))
|
||||
"You must specify a Data Network"))
|
||||
|
||||
cleaned_data['providernetworks'] = ",".join(providernetworks)
|
||||
if 'providernetworks_data' in cleaned_data:
|
||||
del cleaned_data['providernetworks_data']
|
||||
if 'providernetworks_pci' in cleaned_data:
|
||||
del cleaned_data['providernetworks_pci']
|
||||
if 'providernetworks_sriov' in cleaned_data:
|
||||
del cleaned_data['providernetworks_sriov']
|
||||
cleaned_data['datanetworks'] = ",".join(datanetworks)
|
||||
if 'datanetworks_data' in cleaned_data:
|
||||
del cleaned_data['datanetworks_data']
|
||||
if 'datanetworks_pci' in cleaned_data:
|
||||
del cleaned_data['datanetworks_pci']
|
||||
if 'datanetworks_sriov' in cleaned_data:
|
||||
del cleaned_data['datanetworks_sriov']
|
||||
|
||||
return cleaned_data
|
||||
|
||||
|
@ -538,8 +537,8 @@ class AddInterface(forms.SelfHandlingForm):
|
|||
data['uses'] = uses
|
||||
del data['ports']
|
||||
|
||||
if not data['providernetworks']:
|
||||
del data['providernetworks']
|
||||
if not data['datanetworks']:
|
||||
del data['datanetworks']
|
||||
|
||||
if not data['vlan_id'] or data['iftype'] != 'vlan':
|
||||
del data['vlan_id']
|
||||
|
@ -813,10 +812,10 @@ class UpdateInterface(AddInterface):
|
|||
break
|
||||
|
||||
if current_interface.ifclass == 'data':
|
||||
data['providernetworks'] = 'none'
|
||||
data['datanetworks'] = 'none'
|
||||
|
||||
if not data['providernetworks']:
|
||||
del data['providernetworks']
|
||||
if not data['datanetworks']:
|
||||
del data['datanetworks']
|
||||
|
||||
if 'sriov_numvfs' in data:
|
||||
data['sriov_numvfs'] = str(data['sriov_numvfs'])
|
||||
|
|
|
@ -194,8 +194,8 @@ class InterfacesTable(tables.DataTable):
|
|||
platform_networks = tables.Column(get_platform_networks,
|
||||
verbose_name=_('Platform Network(s)'))
|
||||
|
||||
providernetworks = tables.Column('providernetworks',
|
||||
verbose_name=_('Provider Network(s)'))
|
||||
datanetworks_csv = tables.Column('datanetworks_csv',
|
||||
verbose_name=_('Data Network(s)'))
|
||||
attributes = tables.Column(get_attributes,
|
||||
verbose_name=_('Attributes'))
|
||||
|
||||
|
|
|
@ -260,10 +260,10 @@ class UpdateView(forms.ModalFormView):
|
|||
|
||||
def get_initial(self):
|
||||
interface = self._get_object()
|
||||
providernetworks = []
|
||||
if interface.providernetworks:
|
||||
for pn in interface.providernetworks.split(","):
|
||||
providernetworks.append(str(pn))
|
||||
datanetworks_csv = []
|
||||
if interface.datanetworks_csv:
|
||||
for pn in interface.datanetworks_csv.split(","):
|
||||
datanetworks_csv.append(str(pn))
|
||||
try:
|
||||
host = stx_api.sysinv.host_get(self.request, interface.host_id)
|
||||
except Exception:
|
||||
|
@ -290,10 +290,10 @@ class UpdateView(forms.ModalFormView):
|
|||
# 'uses': interface.uses,
|
||||
'ifclass': interface.ifclass,
|
||||
'networktype': interface.networktype,
|
||||
'providernetworks_data': providernetworks,
|
||||
'providernetworks_data-external': providernetworks,
|
||||
'providernetworks_pci': providernetworks,
|
||||
'providernetworks_sriov': providernetworks,
|
||||
'datanetworks_csv_data': datanetworks_csv,
|
||||
'datanetworks_csv_data-external': datanetworks_csv,
|
||||
'datanetworks_csv_pci': datanetworks_csv,
|
||||
'datanetworks_csv_sriov': datanetworks_csv,
|
||||
'sriov_numvfs': interface.sriov_numvfs,
|
||||
'imtu': interface.imtu,
|
||||
'ipv4_mode': getattr(interface, 'ipv4_mode', 'disabled'),
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<li>
|
||||
<strong>{{ interfaces.ifname }}</strong> {{": "}} {{ interfaces.ifclass }}
|
||||
{% if interfaces.ifclass == 'data' %}
|
||||
{{"("}} {{ interfaces.providernetworks }} {{")"}}
|
||||
{{"("}} {{ interfaces.datanetworks_csv }} {{")"}}
|
||||
{% endif %}
|
||||
{{ " | " }} {{ interfaces.iftype }}
|
||||
{% if interfaces.iftype != 'ae' and interfaces.iftype != 'vlan' %}
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
<li>
|
||||
<strong>{{ interfaces.ifname }}</strong> {{": "}} {{ interfaces.ifclass }}
|
||||
{% if interfaces.ifclass == 'data' %}
|
||||
{{"("}} {{ interfaces.providernetworks }} {{")"}}
|
||||
{{"("}} {{ interfaces.datanetworks_csv }} {{")"}}
|
||||
{% endif %}
|
||||
{{ " | " }} {{ interfaces.iftype }}
|
||||
{% if interfaces.iftype != 'ae' and interfaces.iftype != 'vlan' %}
|
||||
|
|
|
@ -19,8 +19,8 @@
|
|||
<dt>{% trans "Interface Class" %}</dt>
|
||||
<dd>{{ interface.ifclass|default:_("None") }}</dd>
|
||||
{% if interface.ifclass == "data" %}
|
||||
<dt>{% trans "Provider Networks" %}</dt>
|
||||
<dd>{{ interface.providernetworks|default:_("None") }}</dd>
|
||||
<dt>{% trans "Data Networks" %}</dt>
|
||||
<dd>{{ interface.datanetworks_csv|default:_("None") }}</dd>
|
||||
<dt>{% trans "IPv4 Mode" %}</dt>
|
||||
<dd>{{ interface.ipv4_mode|default:_("Disabled") }}</dd>
|
||||
{% if interface.ipv4_mode == "pool" %}
|
||||
|
|
|
@ -1,157 +0,0 @@
|
|||
# Copyright 2012 NEC Corporation
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# Copyright (c) 2013-2018 Wind River Systems, Inc.
|
||||
#
|
||||
|
||||
|
||||
import logging
|
||||
|
||||
from django.core.urlresolvers import reverse # noqa
|
||||
from django.utils.translation import ugettext_lazy as _ # noqa
|
||||
|
||||
from neutronclient.common import exceptions as neutron_exceptions
|
||||
|
||||
from horizon import exceptions
|
||||
from horizon import forms
|
||||
from horizon import messages
|
||||
|
||||
from starlingx_dashboard import api as stx_api
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class CreateProviderNetwork(forms.SelfHandlingForm):
|
||||
name = forms.CharField(max_length=255,
|
||||
label=_("Name"),
|
||||
required=True)
|
||||
description = forms.CharField(max_length=255,
|
||||
label=_("Description"),
|
||||
required=False)
|
||||
type = forms.ChoiceField(label=_("Type"),
|
||||
required=True)
|
||||
mtu = forms.IntegerField(label=_("MTU"),
|
||||
required=True,
|
||||
initial=1500,
|
||||
min_value=576,
|
||||
max_value=9216,
|
||||
help_text=(
|
||||
_("Specifies the maximum MTU value of any associated tenant "
|
||||
"network. Worker node data interface MTU values must be large "
|
||||
"enough to support the tenant MTU plus any additional provider "
|
||||
"encapsulation headers. For example, VXLAN provider MTU of "
|
||||
"1500 requires a minimum data interface MTU of 1574 bytes (1600 "
|
||||
"bytes is recommended.")))
|
||||
vlan_transparent = forms.BooleanField(
|
||||
label=_("VLAN Transparent"),
|
||||
initial=False, required=False,
|
||||
help_text=_("Allow tenant networks to be created that require "
|
||||
"VLAN tagged packets to be transparently passed through "
|
||||
"the provider network."))
|
||||
|
||||
@classmethod
|
||||
def _instantiate(cls, request, *args, **kwargs):
|
||||
return cls(request, *args, **kwargs)
|
||||
|
||||
def __init__(self, request, *args, **kwargs):
|
||||
super(CreateProviderNetwork, self).__init__(request, *args, **kwargs)
|
||||
|
||||
providernet_type_choices = [('', _("Select a network type"))]
|
||||
providernet_types = stx_api.neutron.provider_network_type_list(request)
|
||||
for providernet_type in providernet_types:
|
||||
providernet_type_choices.append((providernet_type.type,
|
||||
providernet_type.type))
|
||||
self.fields['type'].choices = providernet_type_choices
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super(CreateProviderNetwork, self).clean()
|
||||
if len(cleaned_data['name'].lstrip()) == 0:
|
||||
raise forms.ValidationError('invalid provider name')
|
||||
|
||||
return cleaned_data
|
||||
|
||||
def handle(self, request, data):
|
||||
try:
|
||||
params = {'name': data['name'],
|
||||
'type': data['type'],
|
||||
'description': data['description'],
|
||||
'mtu': data['mtu'],
|
||||
'vlan_transparent': data['vlan_transparent']}
|
||||
|
||||
network = stx_api.neutron.provider_network_create(request,
|
||||
**params)
|
||||
msg = (_('Provider network %s was successfully created.') %
|
||||
data['name'])
|
||||
LOG.debug(msg)
|
||||
messages.success(request, msg)
|
||||
return network
|
||||
except neutron_exceptions.NeutronClientException as e:
|
||||
redirect = reverse('horizon:admin:providernets:index')
|
||||
exceptions.handle(request, str(e), redirect=redirect)
|
||||
except Exception:
|
||||
redirect = reverse('horizon:admin:providernets:index')
|
||||
msg = _('Failed to create provider network %s') % data['name']
|
||||
exceptions.handle(request, msg, redirect=redirect)
|
||||
|
||||
|
||||
class UpdateProviderNetwork(forms.SelfHandlingForm):
|
||||
name = forms.CharField(label=_("Name"), required=False,
|
||||
widget=forms.TextInput(
|
||||
attrs={'readonly': 'readonly'}))
|
||||
type = forms.CharField(label=_("Type"), required=False,
|
||||
widget=forms.TextInput(
|
||||
attrs={'readonly': 'readonly'}))
|
||||
id = forms.CharField(widget=forms.HiddenInput)
|
||||
# Mutable fields
|
||||
description = forms.CharField(label=_("Description"), required=False)
|
||||
mtu = forms.IntegerField(label=_("MTU"),
|
||||
required=True,
|
||||
initial=1500,
|
||||
min_value=576,
|
||||
max_value=9216,
|
||||
help_text=(_("Specifies the minimum interface"
|
||||
" MTU required to support this"
|
||||
" provider network")))
|
||||
vlan_transparent = forms.BooleanField(
|
||||
label=_("VLAN Transparent"),
|
||||
initial=False, required=False,
|
||||
help_text=_("Allow tenant networks to be created that require "
|
||||
"VLAN tagged packets to be transparently passed through "
|
||||
"the provider network. "
|
||||
"Changes will not impact existing networks."))
|
||||
failure_url = 'horizon:admin:providernets:index'
|
||||
|
||||
def handle(self, request, data):
|
||||
try:
|
||||
params = {'description': data['description'],
|
||||
'mtu': data['mtu'],
|
||||
'vlan_transparent': data['vlan_transparent']}
|
||||
|
||||
providernet = stx_api.neutron.provider_network_modify(
|
||||
request, data['id'], **params)
|
||||
msg = (_('Provider network %s was successfully updated.') %
|
||||
data['name'])
|
||||
LOG.debug(msg)
|
||||
messages.success(request, msg)
|
||||
return providernet
|
||||
except neutron_exceptions.NeutronClientException as e:
|
||||
msg = _('Failed to update provider network %s') % data['name']
|
||||
LOG.info(msg)
|
||||
redirect = reverse(self.failure_url)
|
||||
exceptions.handle(request, str(e), redirect=redirect)
|
||||
except Exception:
|
||||
msg = _('Failed to update provider network %s') % data['name']
|
||||
LOG.info(msg)
|
||||
redirect = reverse(self.failure_url)
|
||||
exceptions.handle(request, msg, redirect=redirect)
|
|
@ -1,5 +1,5 @@
|
|||
# The slug of the panel to be added to HORIZON_CONFIG. Required.
|
||||
PANEL = 'providernets'
|
||||
PANEL = 'datanets'
|
||||
# The slug of the dashboard the PANEL associated with. Required.
|
||||
PANEL_DASHBOARD = 'admin'
|
||||
# The slug of the panel group the PANEL is associated with.
|
||||
|
@ -7,4 +7,4 @@ PANEL_GROUP = 'platform'
|
|||
|
||||
# Python panel class of the PANEL to be added.
|
||||
ADD_PANEL = ('starlingx_dashboard.dashboards.admin.'
|
||||
'providernets.panel.Providernets')
|
||||
'datanets.panel.Datanets')
|
||||
|
|
|
@ -186,8 +186,8 @@ horizon.host_topology = {
|
|||
// 'expand' a single IF connected to many pnets into multiple 'connections'
|
||||
$.each(host.interfaces, function(index, interface) {
|
||||
var if_connections = []
|
||||
if (interface.providernetworks) {
|
||||
$.each(interface.providernetworks.split(','), function(index, providernet_name) {
|
||||
if (interface.datanetworks_csv) {
|
||||
$.each(interface.datanetworks_csv.split(','), function(index, providernet_name) {
|
||||
var connection = {}
|
||||
// Attach the interface to the connection
|
||||
connection.interface = interface;
|
||||
|
|
Loading…
Reference in New Issue