Rename bay and baymodel for 'Soft StringFreeze' milestone
"bay" and "baymodel" is not common term. This patch renames "bay" to "cluster", and "baymodel" to "cluster template" for 'Soft StringFreeze'[1] in Newton Release Schedule[2]. [1] Soft StringFreeze: Aug 29 - Sep 02 [2] https://releases.openstack.org/newton/schedule.html For translation work, this patch should focus to changing strings to be translated and should be merged soon. So, until "cluster" and "cluster template" is implemented into Magnum API, Magnum-UI uses bay and baymodel of magnumclient. Change-Id: I0db5472c4f19638cc57116101b552ad21fe34651 Implements: blueprint rename-bay-to-cluster
This commit is contained in:
parent
df2d57124b
commit
04c6e4433a
@ -48,9 +48,9 @@ Install Magnum UI with all dependencies in your virtual environment::
|
|||||||
|
|
||||||
And enable it in Horizon::
|
And enable it in Horizon::
|
||||||
|
|
||||||
cp ../magnum-ui/magnum_ui/enabled/_1370_project_container-infra_panelgroup.py openstack_dashboard/local/enabled
|
cp ../magnum-ui/magnum_ui/enabled/_1370_project_container_infra_panel_group.py openstack_dashboard/local/enabled
|
||||||
cp ../magnum-ui/magnum_ui/enabled/_1371_project_container-infra_bays_panel.py openstack_dashboard/local/enabled
|
cp ../magnum-ui/magnum_ui/enabled/_1371_project_container_infra_clusters_panel.py openstack_dashboard/local/enabled
|
||||||
cp ../magnum-ui/magnum_ui/enabled/_1372_project_container-infra_baymodels_panel.py openstack_dashboard/local/enabled
|
cp ../magnum-ui/magnum_ui/enabled/_1372_project_container_infra_cluster_templates_panel.py openstack_dashboard/local/enabled
|
||||||
|
|
||||||
To run horizon with the newly enabled Magnum UI plugin run::
|
To run horizon with the newly enabled Magnum UI plugin run::
|
||||||
|
|
||||||
|
@ -48,9 +48,9 @@ Install Magnum UI with all dependencies in your virtual environment::
|
|||||||
|
|
||||||
And enable it in Horizon::
|
And enable it in Horizon::
|
||||||
|
|
||||||
cp ../magnum-ui/magnum_ui/enabled/_1370_project_containers-infra_panelgroup.py openstack_dashboard/local/enabled
|
cp ../magnum-ui/magnum_ui/enabled/_1370_project_container_infra_panelgroup.py openstack_dashboard/local/enabled
|
||||||
cp ../magnum-ui/magnum_ui/enabled/_1371_project_containers-infra_bays_panel.py openstack_dashboard/local/enabled
|
cp ../magnum-ui/magnum_ui/enabled/_1371_project_container_infra_clusters_panel.py openstack_dashboard/local/enabled
|
||||||
cp ../magnum-ui/magnum_ui/enabled/_1372_project_containers-infra_baymodels_panel.py openstack_dashboard/local/enabled
|
cp ../magnum-ui/magnum_ui/enabled/_1372_project_container_infra_cluster_templates_panel.py openstack_dashboard/local/enabled
|
||||||
|
|
||||||
To run horizon with the newly enabled Magnum UI plugin run::
|
To run horizon with the newly enabled Magnum UI plugin run::
|
||||||
|
|
||||||
|
@ -25,16 +25,17 @@ from openstack_dashboard.api import base
|
|||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
BAYMODEL_CREATE_ATTRS = ['name', 'image_id', 'flavor_id', 'master_flavor_id',
|
CLUSTER_TEMPLATE_CREATE_ATTRS = ['name', 'image_id', 'flavor_id',
|
||||||
'keypair_id', 'external_network_id', 'fixed_network',
|
'master_flavor_id', 'keypair_id',
|
||||||
'dns_nameserver', 'docker_volume_size', 'labels',
|
'external_network_id', 'fixed_network',
|
||||||
'coe', 'http_proxy',
|
'dns_nameserver', 'docker_volume_size',
|
||||||
'https_proxy', 'no_proxy', 'network_driver',
|
'labels', 'coe', 'http_proxy', 'https_proxy',
|
||||||
'volume_driver',
|
'no_proxy', 'network_driver', 'volume_driver',
|
||||||
'public', 'registry_enabled', 'tls_disabled']
|
'public', 'registry_enabled', 'tls_disabled']
|
||||||
|
|
||||||
BAY_CREATE_ATTRS = ['name', 'baymodel_id', 'node_count', 'discovery_url',
|
CLUSTER_CREATE_ATTRS = ['name', 'baymodel_id', 'node_count',
|
||||||
'bay_create_timeout', 'master_count']
|
'discovery_url', 'cluster_create_timeout',
|
||||||
|
'master_count']
|
||||||
|
|
||||||
|
|
||||||
@memoized
|
@memoized
|
||||||
@ -62,14 +63,14 @@ def magnumclient(request):
|
|||||||
return c
|
return c
|
||||||
|
|
||||||
|
|
||||||
def baymodel_create(request, **kwargs):
|
def cluster_template_create(request, **kwargs):
|
||||||
args = {}
|
args = {}
|
||||||
for (key, value) in kwargs.items():
|
for (key, value) in kwargs.items():
|
||||||
if key in BAYMODEL_CREATE_ATTRS:
|
if key in CLUSTER_TEMPLATE_CREATE_ATTRS:
|
||||||
args[str(key)] = str(value)
|
args[str(key)] = str(value)
|
||||||
else:
|
else:
|
||||||
raise exceptions.InvalidAttribute(
|
raise exceptions.InvalidAttribute(
|
||||||
"Key must be in %s" % ",".join(BAYMODEL_CREATE_ATTRS))
|
"Key must be in %s" % ",".join(CLUSTER_TEMPLATE_CREATE_ATTRS))
|
||||||
if key == "labels":
|
if key == "labels":
|
||||||
labels = {}
|
labels = {}
|
||||||
vals = value.split(",")
|
vals = value.split(",")
|
||||||
@ -80,44 +81,44 @@ def baymodel_create(request, **kwargs):
|
|||||||
return magnumclient(request).baymodels.create(**args)
|
return magnumclient(request).baymodels.create(**args)
|
||||||
|
|
||||||
|
|
||||||
def baymodel_delete(request, id):
|
def cluster_template_delete(request, id):
|
||||||
return magnumclient(request).baymodels.delete(id)
|
return magnumclient(request).baymodels.delete(id)
|
||||||
|
|
||||||
|
|
||||||
def baymodel_list(request, limit=None, marker=None, sort_key=None,
|
def cluster_template_list(request, limit=None, marker=None, sort_key=None,
|
||||||
sort_dir=None, detail=True):
|
sort_dir=None, detail=True):
|
||||||
return magnumclient(request).baymodels.list(limit, marker, sort_key,
|
return magnumclient(request).baymodels.list(limit, marker, sort_key,
|
||||||
sort_dir, detail)
|
sort_dir, detail)
|
||||||
|
|
||||||
|
|
||||||
def baymodel_show(request, id):
|
def cluster_template_show(request, id):
|
||||||
return magnumclient(request).baymodels.get(id)
|
return magnumclient(request).baymodels.get(id)
|
||||||
|
|
||||||
|
|
||||||
def bay_create(request, **kwargs):
|
def cluster_create(request, **kwargs):
|
||||||
args = {}
|
args = {}
|
||||||
for (key, value) in kwargs.items():
|
for (key, value) in kwargs.items():
|
||||||
if key in BAY_CREATE_ATTRS:
|
if key in CLUSTER_CREATE_ATTRS:
|
||||||
args[key] = value
|
args[key] = value
|
||||||
else:
|
else:
|
||||||
raise exceptions.InvalidAttribute(
|
raise exceptions.InvalidAttribute(
|
||||||
"Key must be in %s" % ",".join(BAY_CREATE_ATTRS))
|
"Key must be in %s" % ",".join(CLUSTER_CREATE_ATTRS))
|
||||||
return magnumclient(request).bays.create(**args)
|
return magnumclient(request).bays.create(**args)
|
||||||
|
|
||||||
|
|
||||||
def bay_update(request, id, patch):
|
def cluster_update(request, id, patch):
|
||||||
return magnumclient(request).bays.update(id, patch)
|
return magnumclient(request).bays.update(id, patch)
|
||||||
|
|
||||||
|
|
||||||
def bay_delete(request, id):
|
def cluster_delete(request, id):
|
||||||
return magnumclient(request).bays.delete(id)
|
return magnumclient(request).bays.delete(id)
|
||||||
|
|
||||||
|
|
||||||
def bay_list(request, limit=None, marker=None, sort_key=None,
|
def cluster_list(request, limit=None, marker=None, sort_key=None,
|
||||||
sort_dir=None, detail=True):
|
sort_dir=None, detail=True):
|
||||||
return magnumclient(request).bays.list(limit, marker, sort_key,
|
return magnumclient(request).bays.list(limit, marker, sort_key,
|
||||||
sort_dir, detail)
|
sort_dir, detail)
|
||||||
|
|
||||||
|
|
||||||
def bay_show(request, id):
|
def cluster_show(request, id):
|
||||||
return magnumclient(request).bays.get(id)
|
return magnumclient(request).bays.get(id)
|
||||||
|
@ -31,95 +31,95 @@ def change_to_id(obj):
|
|||||||
|
|
||||||
|
|
||||||
@urls.register
|
@urls.register
|
||||||
class Baymodel(generic.View):
|
class ClusterTemplate(generic.View):
|
||||||
"""API for retrieving a single baymodel"""
|
"""API for retrieving a single cluster template"""
|
||||||
url_regex = r'container-infra/baymodels/(?P<baymodel_id>[^/]+)$'
|
url_regex = r'container_infra/cluster_templates/(?P<template_id>[^/]+)$'
|
||||||
|
|
||||||
@rest_utils.ajax()
|
@rest_utils.ajax()
|
||||||
def get(self, request, baymodel_id):
|
def get(self, request, template_id):
|
||||||
"""Get a specific baymodel"""
|
"""Get a specific cluster template"""
|
||||||
return change_to_id(magnum.baymodel_show(request, baymodel_id)
|
return change_to_id(magnum.cluster_template_show(request, template_id)
|
||||||
.to_dict())
|
.to_dict())
|
||||||
|
|
||||||
|
|
||||||
@urls.register
|
@urls.register
|
||||||
class Baymodels(generic.View):
|
class ClusterTemplates(generic.View):
|
||||||
"""API for Magnum Baymodels"""
|
"""API for Magnum Cluster Templates"""
|
||||||
url_regex = r'container-infra/baymodels/$'
|
url_regex = r'container_infra/cluster_templates/$'
|
||||||
|
|
||||||
@rest_utils.ajax()
|
@rest_utils.ajax()
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
"""Get a list of the Baymodels for a project.
|
"""Get a list of the Cluster Templates for a project.
|
||||||
|
|
||||||
The returned result is an object with property 'items' and each
|
The returned result is an object with property 'items' and each
|
||||||
item under this is a Baymodel.
|
item under this is a Cluster Template.
|
||||||
"""
|
"""
|
||||||
result = magnum.baymodel_list(request)
|
result = magnum.cluster_template_list(request)
|
||||||
return {'items': [change_to_id(n.to_dict()) for n in result]}
|
return {'items': [change_to_id(n.to_dict()) for n in result]}
|
||||||
|
|
||||||
@rest_utils.ajax(data_required=True)
|
@rest_utils.ajax(data_required=True)
|
||||||
def delete(self, request):
|
def delete(self, request):
|
||||||
"""Delete one or more Baymodels by id.
|
"""Delete one or more Cluster Templates by id.
|
||||||
|
|
||||||
Returns HTTP 204 (no content) on successful deletion.
|
Returns HTTP 204 (no content) on successful deletion.
|
||||||
"""
|
"""
|
||||||
for baymodel_id in request.DATA:
|
for template_id in request.DATA:
|
||||||
magnum.baymodel_delete(request, baymodel_id)
|
magnum.cluster_template_delete(request, template_id)
|
||||||
|
|
||||||
@rest_utils.ajax(data_required=True)
|
@rest_utils.ajax(data_required=True)
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
"""Create a new Baymodel.
|
"""Create a new Cluster Template.
|
||||||
|
|
||||||
Returns the new Baymodel object on success.
|
Returns the new ClusterTemplate object on success.
|
||||||
"""
|
"""
|
||||||
new_baymodel = magnum.baymodel_create(request, **request.DATA)
|
new_template = magnum.cluster_template_create(request, **request.DATA)
|
||||||
return rest_utils.CreatedResponse(
|
return rest_utils.CreatedResponse(
|
||||||
'/api/container-infra/baymodel/%s' % new_baymodel.uuid,
|
'/api/container_infra/cluster_template/%s' % new_template.uuid,
|
||||||
new_baymodel.to_dict())
|
new_template.to_dict())
|
||||||
|
|
||||||
|
|
||||||
@urls.register
|
@urls.register
|
||||||
class Bay(generic.View):
|
class Cluster(generic.View):
|
||||||
"""API for retrieving a single bay"""
|
"""API for retrieving a single cluster"""
|
||||||
url_regex = r'container-infra/bays/(?P<bay_id>[^/]+)$'
|
url_regex = r'container_infra/clusters/(?P<cluster_id>[^/]+)$'
|
||||||
|
|
||||||
@rest_utils.ajax()
|
@rest_utils.ajax()
|
||||||
def get(self, request, bay_id):
|
def get(self, request, cluster_id):
|
||||||
"""Get a specific bay"""
|
"""Get a specific cluster"""
|
||||||
return change_to_id(magnum.bay_show(request, bay_id).to_dict())
|
return change_to_id(magnum.cluster_show(request, cluster_id).to_dict())
|
||||||
|
|
||||||
|
|
||||||
@urls.register
|
@urls.register
|
||||||
class Bays(generic.View):
|
class Clusters(generic.View):
|
||||||
"""API for Magnum Bays"""
|
"""API for Magnum Clusters"""
|
||||||
url_regex = r'container-infra/bays/$'
|
url_regex = r'container_infra/clusters/$'
|
||||||
|
|
||||||
@rest_utils.ajax()
|
@rest_utils.ajax()
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
"""Get a list of the Bays for a project.
|
"""Get a list of the Clusters for a project.
|
||||||
|
|
||||||
The returned result is an object with property 'items' and each
|
The returned result is an object with property 'items' and each
|
||||||
item under this is a Bay.
|
item under this is a Cluster.
|
||||||
"""
|
"""
|
||||||
result = magnum.bay_list(request)
|
result = magnum.cluster_list(request)
|
||||||
return {'items': [change_to_id(n.to_dict()) for n in result]}
|
return {'items': [change_to_id(n.to_dict()) for n in result]}
|
||||||
|
|
||||||
@rest_utils.ajax(data_required=True)
|
@rest_utils.ajax(data_required=True)
|
||||||
def delete(self, request):
|
def delete(self, request):
|
||||||
"""Delete one or more Bays by id.
|
"""Delete one or more Clusters by id.
|
||||||
|
|
||||||
Returns HTTP 204 (no content) on successful deletion.
|
Returns HTTP 204 (no content) on successful deletion.
|
||||||
"""
|
"""
|
||||||
for bay_id in request.DATA:
|
for cluster_id in request.DATA:
|
||||||
magnum.bay_delete(request, bay_id)
|
magnum.cluster_delete(request, cluster_id)
|
||||||
|
|
||||||
@rest_utils.ajax(data_required=True)
|
@rest_utils.ajax(data_required=True)
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
"""Create a new Bay.
|
"""Create a new Cluster.
|
||||||
|
|
||||||
Returns the new Bay object on success.
|
Returns the new Cluster object on success.
|
||||||
"""
|
"""
|
||||||
new_bay = magnum.bay_create(request, **request.DATA)
|
new_cluster = magnum.cluster_create(request, **request.DATA)
|
||||||
return rest_utils.CreatedResponse(
|
return rest_utils.CreatedResponse(
|
||||||
'/api/container-infra/bay/%s' % new_bay.uuid,
|
'/api/container_infra/cluster/%s' % new_cluster.uuid,
|
||||||
new_bay.to_dict())
|
new_cluster.to_dict())
|
||||||
|
@ -16,6 +16,6 @@ from django.utils.translation import ugettext_lazy as _
|
|||||||
import horizon
|
import horizon
|
||||||
|
|
||||||
|
|
||||||
class Baymodels(horizon.Panel):
|
class ClusterTemplates(horizon.Panel):
|
||||||
name = _("Baymodels")
|
name = _("Cluster Templates")
|
||||||
slug = "baymodels"
|
slug = "cluster_templates"
|
@ -15,7 +15,7 @@
|
|||||||
from openstack_dashboard.test import helpers as test
|
from openstack_dashboard.test import helpers as test
|
||||||
|
|
||||||
|
|
||||||
class BayModelTests(test.TestCase):
|
class ClusterTemplateTests(test.TestCase):
|
||||||
# Unit tests for bay model.
|
# Unit tests for cluster template.
|
||||||
def test_me(self):
|
def test_me(self):
|
||||||
self.assertTrue(1 + 1 == 2)
|
self.assertTrue(1 + 1 == 2)
|
@ -13,7 +13,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from django.conf.urls import url
|
from django.conf.urls import url
|
||||||
from magnum_ui.content.baymodels.views import IndexView
|
from magnum_ui.content.cluster_templates.views import IndexView
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
@ -16,6 +16,6 @@ from django.utils.translation import ugettext_lazy as _
|
|||||||
import horizon
|
import horizon
|
||||||
|
|
||||||
|
|
||||||
class Bays(horizon.Panel):
|
class Clusters(horizon.Panel):
|
||||||
name = _("Bays")
|
name = _("Clusters")
|
||||||
slug = "bays"
|
slug = "clusters"
|
@ -15,7 +15,7 @@
|
|||||||
from openstack_dashboard.test import helpers as test
|
from openstack_dashboard.test import helpers as test
|
||||||
|
|
||||||
|
|
||||||
class BayTests(test.TestCase):
|
class ClusterTests(test.TestCase):
|
||||||
# Unit tests for bay.
|
# Unit tests for cluster.
|
||||||
def test_me(self):
|
def test_me(self):
|
||||||
self.assertTrue(1 + 1 == 2)
|
self.assertTrue(1 + 1 == 2)
|
@ -13,7 +13,7 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from django.conf.urls import url
|
from django.conf.urls import url
|
||||||
from magnum_ui.content.bays.views import IndexView
|
from magnum_ui.content.clusters.views import IndexView
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
@ -14,7 +14,7 @@
|
|||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
# The slug of the panel group to be added to HORIZON_CONFIG. Required.
|
# The slug of the panel group to be added to HORIZON_CONFIG. Required.
|
||||||
PANEL_GROUP = 'container-infra'
|
PANEL_GROUP = 'container_infra'
|
||||||
# The display name of the PANEL_GROUP. Required.
|
# The display name of the PANEL_GROUP. Required.
|
||||||
PANEL_GROUP_NAME = _('Container Infrastructure')
|
PANEL_GROUP_NAME = _('Container Infrastructure')
|
||||||
# The slug of the dashboard the PANEL_GROUP associated with. Required.
|
# The slug of the dashboard the PANEL_GROUP associated with. Required.
|
@ -13,11 +13,11 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
# The slug of the panel to be added to HORIZON_CONFIG. Required.
|
# The slug of the panel to be added to HORIZON_CONFIG. Required.
|
||||||
PANEL = 'bays'
|
PANEL = 'clusters'
|
||||||
# The slug of the panel group the PANEL is associated with.
|
# The slug of the panel group the PANEL is associated with.
|
||||||
PANEL_GROUP = 'container-infra'
|
PANEL_GROUP = 'container_infra'
|
||||||
# The slug of the dashboard the PANEL associated with. Required.
|
# The slug of the dashboard the PANEL associated with. Required.
|
||||||
PANEL_DASHBOARD = 'project'
|
PANEL_DASHBOARD = 'project'
|
||||||
|
|
||||||
# Python panel class of the PANEL to be added.
|
# Python panel class of the PANEL to be added.
|
||||||
ADD_PANEL = 'magnum_ui.content.bays.panel.Bays'
|
ADD_PANEL = 'magnum_ui.content.clusters.panel.Clusters'
|
@ -13,11 +13,11 @@
|
|||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
# The slug of the panel to be added to HORIZON_CONFIG. Required.
|
# The slug of the panel to be added to HORIZON_CONFIG. Required.
|
||||||
PANEL = 'baymodels'
|
PANEL = 'cluster_templates'
|
||||||
# The slug of the panel group the PANEL is associated with.
|
# The slug of the panel group the PANEL is associated with.
|
||||||
PANEL_GROUP = 'container-infra'
|
PANEL_GROUP = 'container_infra'
|
||||||
# The slug of the dashboard the PANEL associated with. Required.
|
# The slug of the dashboard the PANEL associated with. Required.
|
||||||
PANEL_DASHBOARD = 'project'
|
PANEL_DASHBOARD = 'project'
|
||||||
|
|
||||||
# Python panel class of the PANEL to be added.
|
# Python panel class of the PANEL to be added.
|
||||||
ADD_PANEL = 'magnum_ui.content.baymodels.panel.Baymodels'
|
ADD_PANEL = 'magnum_ui.content.cluster_templates.panel.ClusterTemplates'
|
@ -1,82 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ngdoc overview
|
|
||||||
* @ngname horizon.dashboard.container-infra.baymodels.actions
|
|
||||||
*
|
|
||||||
* @description
|
|
||||||
* Provides all of the actions for baymodels.
|
|
||||||
*/
|
|
||||||
angular.module('horizon.dashboard.container-infra.baymodels.actions', ['horizon.framework', 'horizon.dashboard.container-infra'])
|
|
||||||
.run(registerBaymodelActions);
|
|
||||||
|
|
||||||
registerBaymodelActions.$inject = [
|
|
||||||
'horizon.framework.conf.resource-type-registry.service',
|
|
||||||
'horizon.framework.util.i18n.gettext',
|
|
||||||
'horizon.dashboard.container-infra.baymodels.create.service',
|
|
||||||
'horizon.dashboard.container-infra.baymodels.delete.service',
|
|
||||||
'horizon.dashboard.container-infra.bays.create.service',
|
|
||||||
'horizon.dashboard.container-infra.baymodels.resourceType',
|
|
||||||
];
|
|
||||||
|
|
||||||
function registerBaymodelActions(
|
|
||||||
registry,
|
|
||||||
gettext,
|
|
||||||
createBaymodelService,
|
|
||||||
deleteBaymodelService,
|
|
||||||
createBayService,
|
|
||||||
resourceType)
|
|
||||||
{
|
|
||||||
var baymodelResourceType = registry.getResourceType(resourceType);
|
|
||||||
baymodelResourceType.itemActions
|
|
||||||
.append({
|
|
||||||
id: 'createBayAction',
|
|
||||||
service: createBayService,
|
|
||||||
template: {
|
|
||||||
text: gettext('Create Bay')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.append({
|
|
||||||
id: 'deleteBaymodelAction',
|
|
||||||
service: deleteBaymodelService,
|
|
||||||
template: {
|
|
||||||
type: 'delete',
|
|
||||||
text: gettext('Delete Baymodel')
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
baymodelResourceType.batchActions
|
|
||||||
.append({
|
|
||||||
id: 'createBaymodelAction',
|
|
||||||
service: createBaymodelService,
|
|
||||||
template: {
|
|
||||||
type: 'create',
|
|
||||||
text: gettext('Create Baymodel')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.append({
|
|
||||||
id: 'batchDeleteBaymodelAction',
|
|
||||||
service: deleteBaymodelService,
|
|
||||||
template: {
|
|
||||||
type: 'delete-selected',
|
|
||||||
text: gettext('Delete Baymodels')
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
})();
|
|
@ -1,45 +0,0 @@
|
|||||||
<div ng-controller="createBaymodelInfoController as ctrl">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-xs-12">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-name" translate>Baymodel Name</label>
|
|
||||||
<input name="baymodel-name" type="text" class="form-control" id="baymodel-name"
|
|
||||||
ng-model="model.newBaymodelSpec.name"
|
|
||||||
placeholder="{$ 'Name of the baymodel to create.'|translate $}">
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-coe">
|
|
||||||
<translate>Container Orchestration Engine</translate>
|
|
||||||
<span class="hz-icon-required fa fa-asterisk"></span>
|
|
||||||
</label>
|
|
||||||
<select class="form-control" name="baymodel-coe" id="baymodel-coe"
|
|
||||||
ng-model="model.newBaymodelSpec.coe"
|
|
||||||
ng-required="true"
|
|
||||||
ng-options="coe.name as coe.label for coe in ctrl.coes"
|
|
||||||
ng-change="changeCoes()">
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<div class="themable-checkbox">
|
|
||||||
<input name="baymodel-public" type="checkbox" id="baymodel-public"
|
|
||||||
ng-model="model.newBaymodelSpec.public">
|
|
||||||
<label for="baymodel-public" translate>Public</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<div class="themable-checkbox">
|
|
||||||
<input name="baymodel-registry-enabled" type="checkbox" id="baymodel-registry-enabled"
|
|
||||||
ng-model="model.newBaymodelSpec.registry_enabled">
|
|
||||||
<label for="baymodel-registry-enabled" translate>Enable Registry</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<div class="themable-checkbox">
|
|
||||||
<input name="baymodel-tls-disabled" type="checkbox" id="baymodel-tls-disabled"
|
|
||||||
ng-model="model.newBaymodelSpec.tls_disabled">
|
|
||||||
<label for="baymodel-tls-disabled" translate>Disable TLS</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1 +0,0 @@
|
|||||||
<p translate>Arbitrary labels in the form of key=value pairs to associate with a baymodel. May be used multiple times.</p>
|
|
@ -1,11 +0,0 @@
|
|||||||
<div ng-controller="createBaymodelLabelsController as ctrl">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-xs-12">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-labels" translate>Labels</label>
|
|
||||||
<textarea name="baymodel-labels" class="form-control" id="baymodel-labels"
|
|
||||||
rows="4" ng-model="model.newBaymodelSpec.labels"
|
|
||||||
placeholder="{$ 'KEY1=VALUE1,KEY2=VALUE2...'|translate $}"></textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1,60 +0,0 @@
|
|||||||
<div ng-controller="createBaymodelNetworkController as ctrl">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-xs-12">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-network-driver" translate>Network Driver</label>
|
|
||||||
<select name="baymodel-network-driver" type="text" class="form-control"
|
|
||||||
id="baymodel-network-driver"
|
|
||||||
ng-model="model.newBaymodelSpec.network_driver"
|
|
||||||
placeholder="{$ 'The network driver name for instantiating container networks'|translate $}"
|
|
||||||
ng-options="driver.name as driver.label for driver in model.newBaymodelSpec.network_drivers">
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-http-proxy" translate>HTTP Proxy</label>
|
|
||||||
<input name="baymodel-http-proxy" type="text" class="form-control"
|
|
||||||
id="baymodel-http-proxy"
|
|
||||||
ng-model="model.newBaymodelSpec.http_proxy"
|
|
||||||
placeholder="{$ 'The http_proxy address to use for nodes in bay'|translate $}">
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-https-proxy" translate>HTTPS Proxy</label>
|
|
||||||
<input name="baymodel-https-proxy" type="text" class="form-control"
|
|
||||||
id="baymodel-https-proxy"
|
|
||||||
ng-model="model.newBaymodelSpec.https_proxy"
|
|
||||||
placeholder="{$ 'The https_proxy address to use for nodes in bay'|translate $}">
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-no-proxy" translate>No Proxy</label>
|
|
||||||
<input name="baymodel-no-proxy" type="text" class="form-control"
|
|
||||||
id="baymodel-no-proxy"
|
|
||||||
ng-model="model.newBaymodelSpec.no_proxy"
|
|
||||||
placeholder="{$ 'The no_proxy address to use for nodes in bay'|translate $}">
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-external-network-id">
|
|
||||||
<translate>External Network ID</translate>
|
|
||||||
<span class="hz-icon-required fa fa-asterisk"></span>
|
|
||||||
</label>
|
|
||||||
<input name="baymodel-external-network-id" type="text" class="form-control"
|
|
||||||
id="baymodel-external-network-id"
|
|
||||||
ng-model="model.newBaymodelSpec.external_network_id" ng-required="true"
|
|
||||||
placeholder="{$ 'The external Neutron network ID to connect to this bay model'|translate $}">
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-fixed-network" translate>Fixed Network</label>
|
|
||||||
<input name="baymodel-fixed-network" type="text" class="form-control"
|
|
||||||
id="baymodel-fixed-network"
|
|
||||||
ng-model="model.newBaymodelSpec.fixed_network"
|
|
||||||
placeholder="{$ 'The private Neutron network name to connect to this bay model'|translate $}">
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-dns-nameserver" translate>DNS</label>
|
|
||||||
<input name="baymodel-dns-nameserver" type="text" class="form-control"
|
|
||||||
id="baymodel-dns-nameserver"
|
|
||||||
ng-model="model.newBaymodelSpec.dns_nameserver"
|
|
||||||
placeholder="{$ 'The DNS nameserver to use for this Bay'|translate $}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1,67 +0,0 @@
|
|||||||
<div ng-controller="createBaymodelSpecController as ctrl">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-xs-12">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-image-id">
|
|
||||||
<translate>Image</translate>
|
|
||||||
<span class="hz-icon-required fa fa-asterisk"></span>
|
|
||||||
</label>
|
|
||||||
<select name="baymodel-image-id" type="text" class="form-control" id="baymodel-image-id"
|
|
||||||
ng-model="model.newBaymodelSpec.image_id" ng-required="true"
|
|
||||||
ng-options="image.id as image.name for image in ctrl.images">
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-xs-6">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-flavor-id" translate>Flavor</label>
|
|
||||||
<select name="baymodel-flavor-id" type="text" class="form-control" id="baymodel-flavor-id"
|
|
||||||
ng-model="model.newBaymodelSpec.flavor_id"
|
|
||||||
ng-options="nflavor.id as nflavor.name for nflavor in ctrl.nflavors">
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-xs-6">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-master-flavor-id" translate>Master Flavor</label>
|
|
||||||
<select name="baymodel-master-flavor-id" type="text" class="form-control" id="baymodel-master-flavor-id"
|
|
||||||
ng-model="model.newBaymodelSpec.master_flavor_id"
|
|
||||||
ng-options="mflavor.id as mflavor.name for mflavor in ctrl.mflavors">
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-xs-6">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-volume-driver" translate>Volume Driver</label>
|
|
||||||
<select name="baymodel-volume-driver" type="text" class="form-control" id="baymodel-volume-driver"
|
|
||||||
ng-model="model.newBaymodelSpec.volume_driver"
|
|
||||||
placeholder="{$ 'The volume driver name for instantiating container volume.'|translate $}"
|
|
||||||
ng-options="driver.name as driver.label for driver in model.newBaymodelSpec.volume_drivers">
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-xs-6">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-docker-volume-size" translate>
|
|
||||||
Docker Volume Size (GB)
|
|
||||||
</label>
|
|
||||||
<input name="baymodel-docker-volume-size" type="number"
|
|
||||||
class="form-control" id="baymodel-docker-volume-size"
|
|
||||||
ng-model="model.newBaymodelSpec.docker_volume_size" min="1"
|
|
||||||
placeholder="{$ 'Specify the size in GB for the docker volume'|translate $}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-xs-6">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="baymodel-keypair-id">
|
|
||||||
<translate>Keypair</translate>
|
|
||||||
<span class="hz-icon-required fa fa-asterisk"></span>
|
|
||||||
</label>
|
|
||||||
<select name="baymodel-keypair-id" type="text" class="form-control" id="baymodel-keypair-id"
|
|
||||||
ng-model="model.newBaymodelSpec.keypair_id" ng-required="true"
|
|
||||||
ng-options="keypair.id as keypair.name for keypair in ctrl.keypairs">
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1,4 +0,0 @@
|
|||||||
<hz-resource-panel resource-type-name="OS::Magnum::Baymodel">
|
|
||||||
<hz-resource-table resource-type-name="OS::Magnum::Baymodel"
|
|
||||||
track-by="trackBy"></hz-resource-table>
|
|
||||||
</hz-resource-panel>
|
|
@ -1,73 +0,0 @@
|
|||||||
/**
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ngdoc overview
|
|
||||||
* @ngname horizon.dashboard.container-infra.bays.actions
|
|
||||||
*
|
|
||||||
* @description
|
|
||||||
* Provides all of the actions for bays.
|
|
||||||
*/
|
|
||||||
angular.module('horizon.dashboard.container-infra.bays.actions', ['horizon.framework', 'horizon.dashboard.container-infra'])
|
|
||||||
.run(registerBayActions);
|
|
||||||
|
|
||||||
registerBayActions.$inject = [
|
|
||||||
'horizon.framework.conf.resource-type-registry.service',
|
|
||||||
'horizon.framework.util.i18n.gettext',
|
|
||||||
'horizon.dashboard.container-infra.bays.create.service',
|
|
||||||
'horizon.dashboard.container-infra.bays.delete.service',
|
|
||||||
'horizon.dashboard.container-infra.bays.resourceType',
|
|
||||||
];
|
|
||||||
|
|
||||||
function registerBayActions(
|
|
||||||
registry,
|
|
||||||
gettext,
|
|
||||||
createBayService,
|
|
||||||
deleteBayService,
|
|
||||||
resourceType)
|
|
||||||
{
|
|
||||||
var bayResourceType = registry.getResourceType(resourceType);
|
|
||||||
bayResourceType.itemActions
|
|
||||||
.append({
|
|
||||||
id: 'deleteBayAction',
|
|
||||||
service: deleteBayService,
|
|
||||||
template: {
|
|
||||||
type: 'delete',
|
|
||||||
text: gettext('Delete Bay')
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
bayResourceType.batchActions
|
|
||||||
.append({
|
|
||||||
id: 'createBayAction',
|
|
||||||
service: createBayService,
|
|
||||||
template: {
|
|
||||||
type: 'create',
|
|
||||||
text: gettext('Create Bay')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.append({
|
|
||||||
id: 'batchDeleteBayAction',
|
|
||||||
service: deleteBayService,
|
|
||||||
template: {
|
|
||||||
type: 'delete-selected',
|
|
||||||
text: gettext('Delete Bays')
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
})();
|
|
@ -1,85 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright 2015 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ngdoc controller
|
|
||||||
* @name createBayInfoController
|
|
||||||
* @ngController
|
|
||||||
*
|
|
||||||
* @description
|
|
||||||
* Controller for the container-infra bay info step in create workflow
|
|
||||||
*/
|
|
||||||
angular
|
|
||||||
.module('horizon.dashboard.container-infra.bays')
|
|
||||||
.controller('createBayInfoController', createBayInfoController);
|
|
||||||
|
|
||||||
createBayInfoController.$inject = [
|
|
||||||
'$q',
|
|
||||||
'$scope',
|
|
||||||
'horizon.dashboard.container-infra.basePath',
|
|
||||||
'horizon.app.core.openstack-service-api.magnum'
|
|
||||||
];
|
|
||||||
|
|
||||||
function createBayInfoController($q, $scope, basePath, magnum) {
|
|
||||||
var ctrl = this;
|
|
||||||
ctrl.baymodels = [{id:"", name: gettext("Choose a Baymodel")}];
|
|
||||||
$scope.model.newBaySpec.baymodel_id = "";
|
|
||||||
$scope.baymodeldetail = {
|
|
||||||
name: "",
|
|
||||||
id: "",
|
|
||||||
coe: "",
|
|
||||||
image_id: "",
|
|
||||||
public: "",
|
|
||||||
registry_enabled: "",
|
|
||||||
tls_disabled: "",
|
|
||||||
apiserver_port: ""
|
|
||||||
};
|
|
||||||
|
|
||||||
$scope.changeBaymodel = function(){
|
|
||||||
angular.forEach(ctrl.baymodels, function(model, idx){
|
|
||||||
if($scope.model.newBaySpec.baymodel_id === model.id){
|
|
||||||
$scope.baymodeldetail.name = model.name;
|
|
||||||
$scope.baymodeldetail.id = model.id;
|
|
||||||
$scope.baymodeldetail.coe = model.coe;
|
|
||||||
$scope.baymodeldetail.image_id = model.image_id;
|
|
||||||
$scope.baymodeldetail.public = model.public;
|
|
||||||
$scope.baymodeldetail.registry_enabled = model.registry_enabled;
|
|
||||||
$scope.baymodeldetail.tls_disabled = model.tls_disabled;
|
|
||||||
$scope.baymodeldetail.apiserver_port = model.apiserver_port;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
init();
|
|
||||||
|
|
||||||
function init() {
|
|
||||||
magnum.getBaymodels({paginate: false}).success(onGetBaymodels);
|
|
||||||
}
|
|
||||||
|
|
||||||
function onGetBaymodels(response) {
|
|
||||||
Array.prototype.push.apply(ctrl.baymodels, response.items);
|
|
||||||
if($scope.selected instanceof Object){
|
|
||||||
$scope.model.newBaySpec.baymodel_id = $scope.selected.id;
|
|
||||||
$scope.changeBaymodel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
})();
|
|
@ -1 +0,0 @@
|
|||||||
<p translate>Specify bay name and choose baymodel</p>
|
|
@ -1,50 +0,0 @@
|
|||||||
<div ng-controller="createBayInfoController as ctrl">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-xs-12">
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="bay-name" translate>Bay Name</label>
|
|
||||||
<input name="bay-name" type="text" class="form-control" id="bay-name"
|
|
||||||
ng-model="model.newBaySpec.name"
|
|
||||||
placeholder="{$ 'Name of the bay to create.'|translate $}">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="bay-model">
|
|
||||||
<translate>Baymodel</translate>
|
|
||||||
<span class="hz-icon-required fa fa-asterisk"></span>
|
|
||||||
</label>
|
|
||||||
<select class="form-control" name="bay-model" id="bay-model"
|
|
||||||
ng-model="model.newBaySpec.baymodel_id"
|
|
||||||
ng-required="true"
|
|
||||||
ng-options="baymodel.id as baymodel.name|noName for baymodel in ctrl.baymodels"
|
|
||||||
ng-change="changeBaymodel()">
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="detail" ng-show="model.newBaySpec.baymodel_id">
|
|
||||||
<span translate class="h4">Baymodel Detail</span>
|
|
||||||
<dl class="dl-horizontal">
|
|
||||||
<dt translate>Name</dt>
|
|
||||||
<dd><a ng-href="project/ngdetails/OS::Magnum::Baymodel/{$ baymodeldetail.id $}" ng-click="cancel()">
|
|
||||||
{$ baymodeldetail.name|noName $}
|
|
||||||
</a></dd>
|
|
||||||
<dt translate>ID</dt>
|
|
||||||
<dd>{$ baymodeldetail.id $}</dd>
|
|
||||||
<dt translate>COE</dt>
|
|
||||||
<dd>{$ baymodeldetail.coe $}</dd>
|
|
||||||
<dt translate>Image ID</dt>
|
|
||||||
<dd>{$ baymodeldetail.image_id $}</dd>
|
|
||||||
<dt translate>Public</dt>
|
|
||||||
<dd>{$ baymodeldetail.public $}</dd>
|
|
||||||
<dt translate>Registry Enabled</dt>
|
|
||||||
<dd>{$ baymodeldetail.registry_enabled $}</dd>
|
|
||||||
<dt translate>TLS Disabled</dt>
|
|
||||||
<dd>{$ baymodeldetail.tls_disabled $}</dd>
|
|
||||||
<dt translate>API Server Port</dt>
|
|
||||||
<dd>{$ baymodeldetail.apiserver_port $}</dd>
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1 +0,0 @@
|
|||||||
<p translate>Specify conditions for bay creation.</p>
|
|
@ -1,17 +0,0 @@
|
|||||||
<div ng-controller="createBayMiscController as ctrl">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-xs-12">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="bay-discovery-url" translate>Discovery URL</label>
|
|
||||||
<input name="bay-discovery-url" type="text" class="form-control"
|
|
||||||
ng-model="model.newBaySpec.discovery_url" id="bay-discovery-url"
|
|
||||||
placeholder="{$ 'Specifies custom discovery url for node discovery.'|translate $}">
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="bay-timeout" translate>Timeout</label>
|
|
||||||
<input name="bay-timeout" type="number" min="0" class="form-control"
|
|
||||||
ng-model="model.newBaySpec.bay_create_timeout" id="bay-timeout"
|
|
||||||
placeholder="{$ 'The timeout for bay creation in minutes. Set to 0 for no timeout. The default is no timeout.'|translate $}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1 +0,0 @@
|
|||||||
<p translate>Specify the number of master nodes and bay nodes for the bay.</p>
|
|
@ -1,20 +0,0 @@
|
|||||||
<div ng-controller="createBaySizeController as ctrl">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-xs-12 col-sm-6">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="bay-master-count" translate>Master Count</label>
|
|
||||||
<input name="bay-master-count" type="number" min="1" id="bay-master-count"
|
|
||||||
class="form-control" ng-model="model.newBaySpec.master_count"
|
|
||||||
placeholder="{$ 'The number of master nodes for the bay.'|translate $}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-xs-12 col-sm-6">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label" for="bay-node-count" translate>Node Count</label>
|
|
||||||
<input name="bay-node-count" type="number" min="1" id="bay-node-count"
|
|
||||||
class="form-control" ng-model="model.newBaySpec.node_count"
|
|
||||||
placeholder="{$ 'The bay node count.'|translate $}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1,77 +0,0 @@
|
|||||||
<div ng-controller="BayOverviewController as ctrl">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6 detail">
|
|
||||||
<h3 translate>Baymodel</h3>
|
|
||||||
<hr>
|
|
||||||
<dl class="dl-horizontal">
|
|
||||||
<dt translate>Name</dt>
|
|
||||||
<dd><a ng-href="project/ngdetails/OS::Magnum::Baymodel/{$ ctrl.baymodel.id $}">{$ ctrl.baymodel.name|noName $}</a></dd>
|
|
||||||
<dt translate>ID</dt>
|
|
||||||
<dd>{$ ctrl.baymodel.id $}</dd>
|
|
||||||
<dt translate>COE</dt>
|
|
||||||
<dd>{$ ctrl.baymodel.coe $}</dd>
|
|
||||||
<dt translate>Image ID</dt>
|
|
||||||
<dd>{$ ctrl.baymodel.image_id $}</dd>
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6 detail">
|
|
||||||
<h3 translate>Nodes</h3>
|
|
||||||
<hr>
|
|
||||||
<dl class="dl-horizontal">
|
|
||||||
<dt translate>Master Count</dt>
|
|
||||||
<dd>{$ ctrl.bay.master_count $}</dd>
|
|
||||||
<dt translate>Node Count</dt>
|
|
||||||
<dd>{$ ctrl.bay.node_count $}</dd>
|
|
||||||
<dt translate>API Address</dt>
|
|
||||||
<dd>{$ ctrl.bay.api_address $}</dd>
|
|
||||||
<dt translate>Master Addresses</dt>
|
|
||||||
<dd>
|
|
||||||
<div ng-repeat="addr in ctrl.bay.master_addresses">{$ addr $}</div>
|
|
||||||
</dd>
|
|
||||||
<dt translate>Node Addresses</dt>
|
|
||||||
<dd>
|
|
||||||
<div ng-repeat="addr in ctrl.bay.node_addresses">{$ addr $}</div>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6 detail">
|
|
||||||
<h3 translate>Miscellaneous</h3>
|
|
||||||
<hr>
|
|
||||||
<dl class="dl-horizontal">
|
|
||||||
<dt translate>Stack ID</dt>
|
|
||||||
<dd><a ng-href="project/stacks/stack/{$ ctrl.bay.stack_id $}" target="_self">
|
|
||||||
{$ ctrl.bay.stack_id $}
|
|
||||||
</a></dd>
|
|
||||||
<dt translate>Discovery URL</dt>
|
|
||||||
<dd>{$ ctrl.bay.discovery_url $}</dd>
|
|
||||||
<dt translate>Bay Create Timeout</dt>
|
|
||||||
<dd>
|
|
||||||
<div ng-switch on="ctrl.bay.bay_create_timeout === 0 || ctrl.bay.bay_create_timeout === null">
|
|
||||||
<div ng-switch-when="true" translate>Infinite</div>
|
|
||||||
<div ng-switch-default translate
|
|
||||||
translate-n="ctrl.bay.bay_create_timeout"
|
|
||||||
translate-plural="{$ ctrl.bay.bay_create_timeout $} minutes">
|
|
||||||
{$ ctrl.bay.bay_create_timeout $} minute
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6 detail">
|
|
||||||
<h3 translate>Record Properties</h3>
|
|
||||||
<hr>
|
|
||||||
<dl class="dl-horizontal">
|
|
||||||
<dt translate>Created</dt>
|
|
||||||
<dd>{$ ctrl.bay.created_at | date:'short' $}</dd>
|
|
||||||
<dt translate>Updated</dt>
|
|
||||||
<dd>{$ ctrl.bay.updated_at | date:'short' $}</dd>
|
|
||||||
<dt translate>ID</dt>
|
|
||||||
<dd>{$ ctrl.bay.id $}</dd>
|
|
||||||
<dt translate>Status</dt>
|
|
||||||
<dd>{$ ctrl.bay.status $}</dd>
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1,4 +0,0 @@
|
|||||||
<hz-resource-panel resource-type-name="OS::Magnum::Bay">
|
|
||||||
<hz-resource-table resource-type-name="OS::Magnum::Bay"
|
|
||||||
track-by="trackBy"></hz-resource-table>
|
|
||||||
</hz-resource-panel>
|
|
@ -0,0 +1,82 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc overview
|
||||||
|
* @ngname horizon.dashboard.container-infra.cluster-templates.actions
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Provides all of the actions for cluster templates.
|
||||||
|
*/
|
||||||
|
angular.module('horizon.dashboard.container-infra.cluster-templates.actions', ['horizon.framework', 'horizon.dashboard.container-infra'])
|
||||||
|
.run(registerClusterTemplateActions);
|
||||||
|
|
||||||
|
registerClusterTemplateActions.$inject = [
|
||||||
|
'horizon.framework.conf.resource-type-registry.service',
|
||||||
|
'horizon.framework.util.i18n.gettext',
|
||||||
|
'horizon.dashboard.container-infra.cluster-templates.create.service',
|
||||||
|
'horizon.dashboard.container-infra.cluster-templates.delete.service',
|
||||||
|
'horizon.dashboard.container-infra.clusters.create.service',
|
||||||
|
'horizon.dashboard.container-infra.cluster-templates.resourceType',
|
||||||
|
];
|
||||||
|
|
||||||
|
function registerClusterTemplateActions(
|
||||||
|
registry,
|
||||||
|
gettext,
|
||||||
|
createClusterTemplateService,
|
||||||
|
deleteClusterTemplateService,
|
||||||
|
createClusterService,
|
||||||
|
resourceType)
|
||||||
|
{
|
||||||
|
var templateResourceType = registry.getResourceType(resourceType);
|
||||||
|
templateResourceType.itemActions
|
||||||
|
.append({
|
||||||
|
id: 'createClusterAction',
|
||||||
|
service: createClusterService,
|
||||||
|
template: {
|
||||||
|
text: gettext('Create Cluster')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'deleteClusterTemplateAction',
|
||||||
|
service: deleteClusterTemplateService,
|
||||||
|
template: {
|
||||||
|
type: 'delete',
|
||||||
|
text: gettext('Delete Cluster Template')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
templateResourceType.batchActions
|
||||||
|
.append({
|
||||||
|
id: 'createClusterTemplateAction',
|
||||||
|
service: createClusterTemplateService,
|
||||||
|
template: {
|
||||||
|
type: 'create',
|
||||||
|
text: gettext('Create Cluster Template')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'batchDeleteClusterTemplateAction',
|
||||||
|
service: deleteClusterTemplateService,
|
||||||
|
template: {
|
||||||
|
type: 'delete-selected',
|
||||||
|
text: gettext('Delete Cluster Templates')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
})();
|
@ -19,46 +19,46 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc overview
|
* @ngdoc overview
|
||||||
* @name horizon.dashboard.container-infra.baymodels
|
* @name horizon.dashboard.container-infra.cluster-templates
|
||||||
* @ngModule
|
* @ngModule
|
||||||
*
|
*
|
||||||
* @description
|
* @description
|
||||||
* Provides all the services and widgets require to display the baymodel
|
* Provides all the services and widgets require to display the cluster template
|
||||||
* panel
|
* panel
|
||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.baymodels', [
|
.module('horizon.dashboard.container-infra.cluster-templates', [
|
||||||
'ngRoute',
|
'ngRoute',
|
||||||
'horizon.dashboard.container-infra.baymodels.actions',
|
'horizon.dashboard.container-infra.cluster-templates.actions',
|
||||||
'horizon.dashboard.container-infra.baymodels.details'
|
'horizon.dashboard.container-infra.cluster-templates.details'
|
||||||
])
|
])
|
||||||
.constant('horizon.dashboard.container-infra.baymodels.events', events())
|
.constant('horizon.dashboard.container-infra.cluster-templates.events', events())
|
||||||
.constant('horizon.dashboard.container-infra.baymodels.resourceType', 'OS::Magnum::Baymodel')
|
.constant('horizon.dashboard.container-infra.cluster-templates.resourceType', 'OS::Magnum::ClusterTemplate')
|
||||||
.run(run)
|
.run(run)
|
||||||
.config(config);
|
.config(config);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc constant
|
* @ngdoc constant
|
||||||
* @name horizon.dashboard.container-infra.baymodels.events
|
* @name horizon.dashboard.container-infra.cluster-templates.events
|
||||||
* @description A list of events used by Baymodels
|
* @description A list of events used by cluster templates
|
||||||
*/
|
*/
|
||||||
function events() {
|
function events() {
|
||||||
return {
|
return {
|
||||||
CREATE_SUCCESS: 'horizon.dashboard.container-infra.baymodels.CREATE_SUCCESS',
|
CREATE_SUCCESS: 'horizon.dashboard.container-infra.cluster-templates.CREATE_SUCCESS',
|
||||||
DELETE_SUCCESS: 'horizon.dashboard.container-infra.baymodels.DELETE_SUCCESS'
|
DELETE_SUCCESS: 'horizon.dashboard.container-infra.cluster-templates.DELETE_SUCCESS'
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
run.$inject = [
|
run.$inject = [
|
||||||
'horizon.framework.conf.resource-type-registry.service',
|
'horizon.framework.conf.resource-type-registry.service',
|
||||||
'horizon.app.core.openstack-service-api.magnum',
|
'horizon.app.core.openstack-service-api.magnum',
|
||||||
'horizon.dashboard.container-infra.baymodels.basePath',
|
'horizon.dashboard.container-infra.cluster-templates.basePath',
|
||||||
'horizon.dashboard.container-infra.baymodels.resourceType'
|
'horizon.dashboard.container-infra.cluster-templates.resourceType'
|
||||||
];
|
];
|
||||||
|
|
||||||
function run(registry, magnum, basePath, resourceType) {
|
function run(registry, magnum, basePath, resourceType) {
|
||||||
registry.getResourceType(resourceType)
|
registry.getResourceType(resourceType)
|
||||||
.setNames(gettext('Baymodel'), gettext('Baymodels'))
|
.setNames(gettext('Cluster Template'), gettext('Cluster Templates'))
|
||||||
|
|
||||||
// for detail summary view on table row
|
// for detail summary view on table row
|
||||||
.setSummaryTemplateUrl(basePath + 'details/drawer.html')
|
.setSummaryTemplateUrl(basePath + 'details/drawer.html')
|
||||||
@ -121,20 +121,20 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
function listFunction(params) {
|
function listFunction(params) {
|
||||||
return magnum.getBaymodels(params).then(modifyResponse);
|
return magnum.getClusterTemplates(params).then(modifyResponse);
|
||||||
|
|
||||||
function modifyResponse(response) {
|
function modifyResponse(response) {
|
||||||
return {data: {items: response.data.items.map(addTrackBy)}};
|
return {data: {items: response.data.items.map(addTrackBy)}};
|
||||||
|
|
||||||
function addTrackBy(baymodel) {
|
function addTrackBy(cluster_template) {
|
||||||
baymodel.trackBy = baymodel.id;
|
cluster_template.trackBy = cluster_template.id;
|
||||||
return baymodel;
|
return cluster_template;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function urlFunction(item) {
|
function urlFunction(item) {
|
||||||
return 'project/ngdetails/OS::Magnum::Baymodel/' + item.id;
|
return 'project/ngdetails/OS::Magnum::ClusterTemplate/' + item.id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,9 +153,9 @@
|
|||||||
* @returns {undefined} Returns nothing
|
* @returns {undefined} Returns nothing
|
||||||
*/
|
*/
|
||||||
function config($provide, $windowProvider, $routeProvider) {
|
function config($provide, $windowProvider, $routeProvider) {
|
||||||
var path = $windowProvider.$get().STATIC_URL + 'dashboard/container-infra/baymodels/';
|
var path = $windowProvider.$get().STATIC_URL + 'dashboard/container-infra/cluster-templates/';
|
||||||
$provide.constant('horizon.dashboard.container-infra.baymodels.basePath', path);
|
$provide.constant('horizon.dashboard.container-infra.cluster-templates.basePath', path);
|
||||||
$routeProvider.when('/project/baymodels/', {
|
$routeProvider.when('/project/cluster_templates/', {
|
||||||
templateUrl: path + 'panel.html'
|
templateUrl: path + 'panel.html'
|
||||||
});
|
});
|
||||||
}
|
}
|
@ -16,9 +16,9 @@
|
|||||||
(function() {
|
(function() {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
describe('horizon.dashboard.container-infra.baymodels', function() {
|
describe('horizon.dashboard.container-infra.cluster-templates', function() {
|
||||||
it('should exist', function() {
|
it('should exist', function() {
|
||||||
expect(angular.module('horizon.dashboard.container-infra.baymodels')).toBeDefined();
|
expect(angular.module('horizon.dashboard.container-infra.cluster-templates')).toBeDefined();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
@ -18,24 +18,24 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.baymodels')
|
.module('horizon.dashboard.container-infra.cluster-templates')
|
||||||
.factory('horizon.dashboard.container-infra.baymodels.baymodelModel', baymodelModel);
|
.factory('horizon.dashboard.container-infra.cluster-templates.model', ClusterTemplateModel);
|
||||||
|
|
||||||
baymodelModel.$inject = [
|
ClusterTemplateModel.$inject = [
|
||||||
'horizon.app.core.openstack-service-api.magnum'
|
'horizon.app.core.openstack-service-api.magnum'
|
||||||
];
|
];
|
||||||
|
|
||||||
function baymodelModel(magnum) {
|
function ClusterTemplateModel(magnum) {
|
||||||
var model = {
|
var model = {
|
||||||
newBaymodelSpec: {},
|
newClusterTemplateSpec: {},
|
||||||
|
|
||||||
// API methods
|
// API methods
|
||||||
init: init,
|
init: init,
|
||||||
createBaymodel: createBaymodel
|
createClusterTemplate: createClusterTemplate
|
||||||
};
|
};
|
||||||
|
|
||||||
function initNewBaymodelSpec() {
|
function initNewClusterTemplateSpec() {
|
||||||
model.newBaymodelSpec = {
|
model.newClusterTemplateSpec = {
|
||||||
name: null,
|
name: null,
|
||||||
coe: "",
|
coe: "",
|
||||||
public: null,
|
public: null,
|
||||||
@ -64,16 +64,16 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
// Reset the new Baymodel spec
|
// Reset the new cluster template spec
|
||||||
initNewBaymodelSpec();
|
initNewClusterTemplateSpec();
|
||||||
}
|
}
|
||||||
|
|
||||||
function createBaymodel() {
|
function createClusterTemplate() {
|
||||||
var finalSpec = angular.copy(model.newBaymodelSpec);
|
var finalSpec = angular.copy(model.newClusterTemplateSpec);
|
||||||
|
|
||||||
cleanNullProperties(finalSpec);
|
cleanNullProperties(finalSpec);
|
||||||
|
|
||||||
return magnum.createBaymodel(finalSpec);
|
return magnum.createClusterTemplate(finalSpec);
|
||||||
}
|
}
|
||||||
|
|
||||||
function cleanNullProperties(finalSpec) {
|
function cleanNullProperties(finalSpec) {
|
@ -18,42 +18,42 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.baymodels')
|
.module('horizon.dashboard.container-infra.cluster-templates')
|
||||||
.factory('horizon.dashboard.container-infra.baymodels.workflow', baymodelWorkflow);
|
.factory('horizon.dashboard.container-infra.cluster-templates.workflow', ClusterTemplateWorkflow);
|
||||||
|
|
||||||
baymodelWorkflow.$inject = [
|
ClusterTemplateWorkflow.$inject = [
|
||||||
'horizon.dashboard.container-infra.basePath',
|
'horizon.dashboard.container-infra.basePath',
|
||||||
'horizon.app.core.workflow.factory',
|
'horizon.app.core.workflow.factory',
|
||||||
'horizon.framework.util.i18n.gettext'
|
'horizon.framework.util.i18n.gettext'
|
||||||
];
|
];
|
||||||
|
|
||||||
function baymodelWorkflow(basePath, workflowService, gettext) {
|
function ClusterTemplateWorkflow(basePath, workflowService, gettext) {
|
||||||
return workflowService({
|
return workflowService({
|
||||||
title: gettext('Create Baymodel'),
|
title: gettext('Create Cluster Template'),
|
||||||
steps: [
|
steps: [
|
||||||
{
|
{
|
||||||
title: gettext('Info'),
|
title: gettext('Info'),
|
||||||
templateUrl: basePath + 'baymodels/create/info/info.html',
|
templateUrl: basePath + 'cluster-templates/create/info/info.html',
|
||||||
helpUrl: basePath + 'baymodels/create/info/info.help.html',
|
helpUrl: basePath + 'cluster-templates/create/info/info.help.html',
|
||||||
formName: 'baymodelInfoForm'
|
formName: 'ClusterTemplateInfoForm'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: gettext('Node Spec'),
|
title: gettext('Node Spec'),
|
||||||
templateUrl: basePath + 'baymodels/create/spec/spec.html',
|
templateUrl: basePath + 'cluster-templates/create/spec/spec.html',
|
||||||
helpUrl: basePath + 'baymodels/create/spec/spec.help.html',
|
helpUrl: basePath + 'cluster-templates/create/spec/spec.help.html',
|
||||||
formName: 'baymodelSpecForm'
|
formName: 'ClusterTemplateSpecForm'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: gettext('Network'),
|
title: gettext('Network'),
|
||||||
templateUrl: basePath + 'baymodels/create/network/network.html',
|
templateUrl: basePath + 'cluster-templates/create/network/network.html',
|
||||||
helpUrl: basePath + 'baymodels/create/network/network.help.html',
|
helpUrl: basePath + 'cluster-templates/create/network/network.help.html',
|
||||||
formName: 'baymodelNetworkForm'
|
formName: 'ClusterTemplateNetworkForm'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: gettext('Labels'),
|
title: gettext('Labels'),
|
||||||
templateUrl: basePath + 'baymodels/create/labels/labels.html',
|
templateUrl: basePath + 'cluster-templates/create/labels/labels.html',
|
||||||
helpUrl: basePath + 'baymodels/create/labels/labels.help.html',
|
helpUrl: basePath + 'cluster-templates/create/labels/labels.help.html',
|
||||||
formName: 'baymodelLabelsForm'
|
formName: 'ClusterTemplateLabelsForm'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
@ -19,12 +19,12 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc overview
|
* @ngdoc overview
|
||||||
* @name horizon.dashboard.container-infra.baymodels.create.service
|
* @name horizon.dashboard.container-infra.cluster-templates.create.service
|
||||||
* @description Service for the container-infra bay model create modal
|
* @description Service for the container-infra cluster template create modal
|
||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.baymodels')
|
.module('horizon.dashboard.container-infra.cluster-templates')
|
||||||
.factory('horizon.dashboard.container-infra.baymodels.create.service', createService);
|
.factory('horizon.dashboard.container-infra.cluster-templates.create.service', createService);
|
||||||
|
|
||||||
createService.$inject = [
|
createService.$inject = [
|
||||||
'horizon.app.core.openstack-service-api.policy',
|
'horizon.app.core.openstack-service-api.policy',
|
||||||
@ -33,10 +33,10 @@
|
|||||||
'horizon.framework.util.q.extensions',
|
'horizon.framework.util.q.extensions',
|
||||||
'horizon.framework.widgets.modal.wizard-modal.service',
|
'horizon.framework.widgets.modal.wizard-modal.service',
|
||||||
'horizon.framework.widgets.toast.service',
|
'horizon.framework.widgets.toast.service',
|
||||||
'horizon.dashboard.container-infra.baymodels.baymodelModel',
|
'horizon.dashboard.container-infra.cluster-templates.model',
|
||||||
'horizon.dashboard.container-infra.baymodels.events',
|
'horizon.dashboard.container-infra.cluster-templates.events',
|
||||||
'horizon.dashboard.container-infra.baymodels.resourceType',
|
'horizon.dashboard.container-infra.cluster-templates.resourceType',
|
||||||
'horizon.dashboard.container-infra.baymodels.workflow'
|
'horizon.dashboard.container-infra.cluster-templates.workflow'
|
||||||
];
|
];
|
||||||
|
|
||||||
function createService(
|
function createService(
|
||||||
@ -45,7 +45,7 @@
|
|||||||
|
|
||||||
var scope;
|
var scope;
|
||||||
var message = {
|
var message = {
|
||||||
success: gettext('Baymodel %s was successfully created.')
|
success: gettext('Cluster template %s was successfully created.')
|
||||||
};
|
};
|
||||||
|
|
||||||
var service = {
|
var service = {
|
||||||
@ -80,7 +80,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function submit(){
|
function submit(){
|
||||||
return model.createBaymodel().then(success);
|
return model.createClusterTemplate().then(success);
|
||||||
}
|
}
|
||||||
|
|
||||||
function success(response) {
|
function success(response) {
|
@ -19,17 +19,17 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc controller
|
* @ngdoc controller
|
||||||
* @name createBaymodelInfoController
|
* @name createClusterTemplateInfoController
|
||||||
* @ngController
|
* @ngController
|
||||||
*
|
*
|
||||||
* @description
|
* @description
|
||||||
* Controller for the bay model info step in create workflow
|
* Controller for the cluster template info step in create workflow
|
||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.baymodels')
|
.module('horizon.dashboard.container-infra.cluster-templates')
|
||||||
.controller('createBaymodelInfoController', createBaymodelInfoController);
|
.controller('createClusterTemplateInfoController', createClusterTemplateInfoController);
|
||||||
|
|
||||||
createBaymodelInfoController.$inject = [
|
createClusterTemplateInfoController.$inject = [
|
||||||
'$q',
|
'$q',
|
||||||
'$scope',
|
'$scope',
|
||||||
'horizon.dashboard.container-infra.basePath',
|
'horizon.dashboard.container-infra.basePath',
|
||||||
@ -37,7 +37,7 @@
|
|||||||
'horizon.framework.util.i18n.gettext'
|
'horizon.framework.util.i18n.gettext'
|
||||||
];
|
];
|
||||||
|
|
||||||
function createBaymodelInfoController($q, $scope, basePath, magnum, gettext) {
|
function createClusterTemplateInfoController($q, $scope, basePath, magnum, gettext) {
|
||||||
var ctrl = this;
|
var ctrl = this;
|
||||||
ctrl.coes = [{name: "", label: gettext("Choose a Container Orchestration Engine")},
|
ctrl.coes = [{name: "", label: gettext("Choose a Container Orchestration Engine")},
|
||||||
{name: "swarm", label: gettext("Docker Swarm")},
|
{name: "swarm", label: gettext("Docker Swarm")},
|
||||||
@ -64,16 +64,16 @@
|
|||||||
{name:"rexray", label: gettext("Rexray")}]};
|
{name:"rexray", label: gettext("Rexray")}]};
|
||||||
|
|
||||||
$scope.changeCoes = function(){
|
$scope.changeCoes = function(){
|
||||||
if($scope.model.newBaymodelSpec.coe){
|
if($scope.model.newClusterTemplateSpec.coe){
|
||||||
$scope.model.newBaymodelSpec.network_drivers = ctrl.supportedNetworkDrivers[$scope.model.newBaymodelSpec.coe];
|
$scope.model.newClusterTemplateSpec.network_drivers = ctrl.supportedNetworkDrivers[$scope.model.newClusterTemplateSpec.coe];
|
||||||
$scope.model.newBaymodelSpec.network_driver = ctrl.supportedNetworkDrivers[$scope.model.newBaymodelSpec.coe][0].name;
|
$scope.model.newClusterTemplateSpec.network_driver = ctrl.supportedNetworkDrivers[$scope.model.newClusterTemplateSpec.coe][0].name;
|
||||||
$scope.model.newBaymodelSpec.volume_drivers = ctrl.supportedVolumeDrivers[$scope.model.newBaymodelSpec.coe];
|
$scope.model.newClusterTemplateSpec.volume_drivers = ctrl.supportedVolumeDrivers[$scope.model.newClusterTemplateSpec.coe];
|
||||||
$scope.model.newBaymodelSpec.volume_driver = ctrl.supportedVolumeDrivers[$scope.model.newBaymodelSpec.coe][0].name;
|
$scope.model.newClusterTemplateSpec.volume_driver = ctrl.supportedVolumeDrivers[$scope.model.newClusterTemplateSpec.coe][0].name;
|
||||||
}else{
|
}else{
|
||||||
$scope.model.newBaymodelSpec.network_drivers = ctrl.supportedNetworkDrivers.initial;
|
$scope.model.newClusterTemplateSpec.network_drivers = ctrl.supportedNetworkDrivers.initial;
|
||||||
$scope.model.newBaymodelSpec.network_driver = ctrl.supportedNetworkDrivers.initial[0].name;
|
$scope.model.newClusterTemplateSpec.network_driver = ctrl.supportedNetworkDrivers.initial[0].name;
|
||||||
$scope.model.newBaymodelSpec.volume_drivers = ctrl.supportedVolumeDrivers.initial;
|
$scope.model.newClusterTemplateSpec.volume_drivers = ctrl.supportedVolumeDrivers.initial;
|
||||||
$scope.model.newBaymodelSpec.volume_driver = ctrl.supportedVolumeDrivers.initial[0].name;
|
$scope.model.newClusterTemplateSpec.volume_driver = ctrl.supportedVolumeDrivers.initial[0].name;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -1,12 +1,12 @@
|
|||||||
<dl>
|
<dl>
|
||||||
<dt translate>Baymodel Name</dt>
|
<dt translate>Cluster Template Name</dt>
|
||||||
<dd translate>An arbitrary human-readable name</dd>
|
<dd translate>An arbitrary human-readable name</dd>
|
||||||
<dt translate>Container Orchestration Engine</dt>
|
<dt translate>Container Orchestration Engine</dt>
|
||||||
<dd translate>Specify the Container Orchestration Engine to use.</dd>
|
<dd translate>Specify the Container Orchestration Engine to use.</dd>
|
||||||
<dt translate>Public</dt>
|
<dt translate>Public</dt>
|
||||||
<dd translate>Make baymodel public. Default: False</dd>
|
<dd translate>Make cluster template public. Default: False</dd>
|
||||||
<dt translate>Enable Registry</dt>
|
<dt translate>Enable Registry</dt>
|
||||||
<dd translate>Enable docker registry in the Bay. Default: False</dd>
|
<dd translate>Enable docker registry in the cluster temlate. Default: False</dd>
|
||||||
<dt translate>Disable TLS</dt>
|
<dt translate>Disable TLS</dt>
|
||||||
<dd translate>Disable TLS in the Bay. Default: False</dd>
|
<dd translate>Disable TLS in the cluster template. Default: False</dd>
|
||||||
</dl>
|
</dl>
|
@ -0,0 +1,45 @@
|
|||||||
|
<div ng-controller="createClusterTemplateInfoController as ctrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-name" translate>Cluster template Name</label>
|
||||||
|
<input name="cluster-template-name" type="text" class="form-control" id="cluster-template-name"
|
||||||
|
ng-model="model.newClusterTemplateSpec.name"
|
||||||
|
placeholder="{$ 'Name of the cluster template to create.'|translate $}">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-coe">
|
||||||
|
<translate>Container Orchestration Engine</translate>
|
||||||
|
<span class="hz-icon-required fa fa-asterisk"></span>
|
||||||
|
</label>
|
||||||
|
<select class="form-control" name="cluster-template-coe" id="cluster-template-coe"
|
||||||
|
ng-model="model.newClusterTemplateSpec.coe"
|
||||||
|
ng-required="true"
|
||||||
|
ng-options="coe.name as coe.label for coe in ctrl.coes"
|
||||||
|
ng-change="changeCoes()">
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="themable-checkbox">
|
||||||
|
<input name="cluster-template-public" type="checkbox" id="cluster-template-public"
|
||||||
|
ng-model="model.newClusterTemplateSpec.public">
|
||||||
|
<label for="cluster-template-public" translate>Public</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="themable-checkbox">
|
||||||
|
<input name="cluster-template-registry-enabled" type="checkbox" id="cluster-template-registry-enabled"
|
||||||
|
ng-model="model.newClusterTemplateSpec.registry_enabled">
|
||||||
|
<label for="cluster-template-registry-enabled" translate>Enable Registry</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="themable-checkbox">
|
||||||
|
<input name="cluster-template-tls-disabled" type="checkbox" id="cluster-template-tls-disabled"
|
||||||
|
ng-model="model.newClusterTemplateSpec.tls_disabled">
|
||||||
|
<label for="cluster-template-tls-disabled" translate>Disable TLS</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -19,24 +19,24 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc controller
|
* @ngdoc controller
|
||||||
* @name createBaymodelLabelsController
|
* @name createClusterTemplateLabelsController
|
||||||
* @ngController
|
* @ngController
|
||||||
*
|
*
|
||||||
* @description
|
* @description
|
||||||
* Controller for the bay model labels step in create workflow
|
* Controller for the cluster template labels step in create workflow
|
||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.baymodels')
|
.module('horizon.dashboard.container-infra.cluster-templates')
|
||||||
.controller('createBaymodelLabelsController', createBaymodelLabelsController);
|
.controller('createClusterTemplateLabelsController', createClusterTemplateLabelsController);
|
||||||
|
|
||||||
createBaymodelLabelsController.$inject = [
|
createClusterTemplateLabelsController.$inject = [
|
||||||
'$q',
|
'$q',
|
||||||
'$scope',
|
'$scope',
|
||||||
'horizon.dashboard.container-infra.basePath',
|
'horizon.dashboard.container-infra.basePath',
|
||||||
'horizon.app.core.openstack-service-api.magnum'
|
'horizon.app.core.openstack-service-api.magnum'
|
||||||
];
|
];
|
||||||
|
|
||||||
function createBaymodelLabelsController($q, $scope, basePath, magnum) {
|
function createClusterTemplateLabelsController($q, $scope, basePath, magnum) {
|
||||||
var ctrl = this;
|
var ctrl = this;
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
|||||||
|
<p translate>Arbitrary labels in the form of key=value pairs to associate with a cluster templates. May be used multiple times.</p>
|
@ -0,0 +1,11 @@
|
|||||||
|
<div ng-controller="createClusterTemplateLabelsController as ctrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-labels" translate>Labels</label>
|
||||||
|
<textarea name="cluster-template-labels" class="form-control" id="cluster-template-labels"
|
||||||
|
rows="4" ng-model="model.newClusterTemplateSpec.labels"
|
||||||
|
placeholder="{$ 'KEY1=VALUE1,KEY2=VALUE2...'|translate $}"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -19,24 +19,24 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc controller
|
* @ngdoc controller
|
||||||
* @name createBaymodelNetworkController
|
* @name createClusterTemplateNetworkController
|
||||||
* @ngController
|
* @ngController
|
||||||
*
|
*
|
||||||
* @description
|
* @description
|
||||||
* Controller for the bay model network step in create workflow
|
* Controller for the cluster template network step in create workflow
|
||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.baymodels')
|
.module('horizon.dashboard.container-infra.cluster-templates')
|
||||||
.controller('createBaymodelNetworkController', createBaymodelNetworkController);
|
.controller('createClusterTemplateNetworkController', createClusterTemplateNetworkController);
|
||||||
|
|
||||||
createBaymodelNetworkController.$inject = [
|
createClusterTemplateNetworkController.$inject = [
|
||||||
'$q',
|
'$q',
|
||||||
'$scope',
|
'$scope',
|
||||||
'horizon.dashboard.container-infra.basePath',
|
'horizon.dashboard.container-infra.basePath',
|
||||||
'horizon.app.core.openstack-service-api.magnum'
|
'horizon.app.core.openstack-service-api.magnum'
|
||||||
];
|
];
|
||||||
|
|
||||||
function createBaymodelNetworkController($q, $scope, basePath, magnum) {
|
function createClusterTemplateNetworkController($q, $scope, basePath, magnum) {
|
||||||
var ctrl = this;
|
var ctrl = this;
|
||||||
};
|
};
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
<dt translate>Fixed Network</dt>
|
<dt translate>Fixed Network</dt>
|
||||||
<dd translate>This should really be named fixed-network-cidr. Default: 10.0.0.0/24</dd>
|
<dd translate>This should really be named fixed-network-cidr. Default: 10.0.0.0/24</dd>
|
||||||
<dt translate>DNS</dt>
|
<dt translate>DNS</dt>
|
||||||
<dd translate>Specify the nameserver to use for the Bay. Default: 8.8.8.8</dd>
|
<dd translate>Specify the nameserver to use for the cluster template. Default: 8.8.8.8</dd>
|
@ -0,0 +1,60 @@
|
|||||||
|
<div ng-controller="createClusterTemplateNetworkController as ctrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-network-driver" translate>Network Driver</label>
|
||||||
|
<select name="cluster-template-network-driver" type="text" class="form-control"
|
||||||
|
id="cluster-template-network-driver"
|
||||||
|
ng-model="model.newClusterTemplateSpec.network_driver"
|
||||||
|
placeholder="{$ 'The network driver name for instantiating container networks'|translate $}"
|
||||||
|
ng-options="driver.name as driver.label for driver in model.newClusterTemplateSpec.network_drivers">
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-http-proxy" translate>HTTP Proxy</label>
|
||||||
|
<input name="cluster-template-http-proxy" type="text" class="form-control"
|
||||||
|
id="cluster-template-http-proxy"
|
||||||
|
ng-model="model.newClusterTemplateSpec.http_proxy"
|
||||||
|
placeholder="{$ 'The http_proxy address to use for nodes in cluster'|translate $}">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-https-proxy" translate>HTTPS Proxy</label>
|
||||||
|
<input name="cluster-template-https-proxy" type="text" class="form-control"
|
||||||
|
id="cluster-template-https-proxy"
|
||||||
|
ng-model="model.newClusterTemplateSpec.https_proxy"
|
||||||
|
placeholder="{$ 'The https_proxy address to use for nodes in cluster'|translate $}">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-no-proxy" translate>No Proxy</label>
|
||||||
|
<input name="cluster-template-no-proxy" type="text" class="form-control"
|
||||||
|
id="cluster-template-no-proxy"
|
||||||
|
ng-model="model.newClusterTemplateSpec.no_proxy"
|
||||||
|
placeholder="{$ 'The no_proxy address to use for nodes in cluster'|translate $}">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-external-network-id">
|
||||||
|
<translate>External Network ID</translate>
|
||||||
|
<span class="hz-icon-required fa fa-asterisk"></span>
|
||||||
|
</label>
|
||||||
|
<input name="cluster-template-external-network-id" type="text" class="form-control"
|
||||||
|
id="cluster-template-external-network-id"
|
||||||
|
ng-model="model.newClusterTemplateSpec.external_network_id" ng-required="true"
|
||||||
|
placeholder="{$ 'The external Neutron network ID to connect to this cluster template'|translate $}">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-fixed-network" translate>Fixed Network</label>
|
||||||
|
<input name="cluster-template-fixed-network" type="text" class="form-control"
|
||||||
|
id="cluster-template-fixed-network"
|
||||||
|
ng-model="model.newClusterTemplateSpec.fixed_network"
|
||||||
|
placeholder="{$ 'The private Neutron network name to connect to this cluster template'|translate $}">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-dns-nameserver" translate>DNS</label>
|
||||||
|
<input name="cluster-template-dns-nameserver" type="text" class="form-control"
|
||||||
|
id="cluster-template-dns-nameserver"
|
||||||
|
ng-model="model.newClusterTemplateSpec.dns_nameserver"
|
||||||
|
placeholder="{$ 'The DNS nameserver to use for this cluster template'|translate $}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -19,17 +19,17 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc controller
|
* @ngdoc controller
|
||||||
* @name createBaymodelSpecController
|
* @name createClusterTemplateSpecController
|
||||||
* @ngController
|
* @ngController
|
||||||
*
|
*
|
||||||
* @description
|
* @description
|
||||||
* Controller for the bay model spec step in create workflow
|
* Controller for the cluster template spec step in create workflow
|
||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.baymodels')
|
.module('horizon.dashboard.container-infra.cluster-templates')
|
||||||
.controller('createBaymodelSpecController', createBaymodelSpecController);
|
.controller('createClusterTemplateSpecController', createClusterTemplateSpecController);
|
||||||
|
|
||||||
createBaymodelSpecController.$inject = [
|
createClusterTemplateSpecController.$inject = [
|
||||||
'$q',
|
'$q',
|
||||||
'$scope',
|
'$scope',
|
||||||
'horizon.dashboard.container-infra.basePath',
|
'horizon.dashboard.container-infra.basePath',
|
||||||
@ -38,7 +38,7 @@
|
|||||||
'horizon.app.core.openstack-service-api.glance'
|
'horizon.app.core.openstack-service-api.glance'
|
||||||
];
|
];
|
||||||
|
|
||||||
function createBaymodelSpecController($q, $scope, basePath, magnum, nova, glance) {
|
function createClusterTemplateSpecController($q, $scope, basePath, magnum, nova, glance) {
|
||||||
var ctrl = this;
|
var ctrl = this;
|
||||||
ctrl.images = [{id:"", name: gettext("Choose an Image")}];
|
ctrl.images = [{id:"", name: gettext("Choose an Image")}];
|
||||||
ctrl.nflavors = [{id:"", name: gettext("Choose a Flavor for the Node")}];
|
ctrl.nflavors = [{id:"", name: gettext("Choose a Flavor for the Node")}];
|
@ -1,12 +1,12 @@
|
|||||||
<dl>
|
<dl>
|
||||||
<dt translate>Image</dt>
|
<dt translate>Image</dt>
|
||||||
<dd translate>The name or UUID of the base image to customize for the bay.</dd>
|
<dd translate>The name or UUID of the base image to customize for the cluster.</dd>
|
||||||
<dt translate>Flavor</dt>
|
<dt translate>Flavor</dt>
|
||||||
<dd translate>The nova flavor id to use when launching the bay. Default: m1.small</dd>
|
<dd translate>The nova flavor id to use when launching the cluster. Default: m1.small</dd>
|
||||||
<dt translate>Master Flavor</dt>
|
<dt translate>Master Flavor</dt>
|
||||||
<dd translate>The nova flavor id to use when launching the master node of the bay. Default: m1.small</dd>
|
<dd translate>The nova flavor id to use when launching the master node of the cluster. Default: m1.small</dd>
|
||||||
<dt translate>Docker Volume Size</dt>
|
<dt translate>Docker Volume Size</dt>
|
||||||
<dd translate>The size in GB for Docker Volume. Default: 25</dd>
|
<dd translate>The size in GB for Docker Volume. Default: 25</dd>
|
||||||
<dt translate>Keypair</dt>
|
<dt translate>Keypair</dt>
|
||||||
<dd translate>The name or UUID of the SSH keypair to load into the Bay nodes.</dd>
|
<dd translate>The name or UUID of the SSH keypair to load into the cluster nodes.</dd>
|
||||||
</dl>
|
</dl>
|
@ -0,0 +1,67 @@
|
|||||||
|
<div ng-controller="createClusterTemplateSpecController as ctrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-image-id">
|
||||||
|
<translate>Image</translate>
|
||||||
|
<span class="hz-icon-required fa fa-asterisk"></span>
|
||||||
|
</label>
|
||||||
|
<select name="cluster-template-image-id" type="text" class="form-control" id="cluster-template-image-id"
|
||||||
|
ng-model="model.newClusterTemplateSpec.image_id" ng-required="true"
|
||||||
|
ng-options="image.id as image.name for image in ctrl.images">
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-flavor-id" translate>Flavor</label>
|
||||||
|
<select name="cluster-template-flavor-id" type="text" class="form-control" id="cluster-template-flavor-id"
|
||||||
|
ng-model="model.newClusterTemplateSpec.flavor_id"
|
||||||
|
ng-options="nflavor.id as nflavor.name for nflavor in ctrl.nflavors">
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-master-flavor-id" translate>Master Flavor</label>
|
||||||
|
<select name="cluster-template-master-flavor-id" type="text" class="form-control" id="cluster-template-master-flavor-id"
|
||||||
|
ng-model="model.newClusterTemplateSpec.master_flavor_id"
|
||||||
|
ng-options="mflavor.id as mflavor.name for mflavor in ctrl.mflavors">
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-volume-driver" translate>Volume Driver</label>
|
||||||
|
<select name="cluster-template-volume-driver" type="text" class="form-control" id="cluster-template-volume-driver"
|
||||||
|
ng-model="model.newClusterTemplateSpec.volume_driver"
|
||||||
|
placeholder="{$ 'The volume driver name for instantiating container volume.'|translate $}"
|
||||||
|
ng-options="driver.name as driver.label for driver in model.newClusterTemplateSpec.volume_drivers">
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-docker-volume-size" translate>
|
||||||
|
Docker Volume Size (GB)
|
||||||
|
</label>
|
||||||
|
<input name="cluster-template-docker-volume-size" type="number"
|
||||||
|
class="form-control" id="cluster-template-docker-volume-size"
|
||||||
|
ng-model="model.newClusterTemplateSpec.docker_volume_size" min="1"
|
||||||
|
placeholder="{$ 'Specify the size in GB for the docker volume'|translate $}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-template-keypair-id">
|
||||||
|
<translate>Keypair</translate>
|
||||||
|
<span class="hz-icon-required fa fa-asterisk"></span>
|
||||||
|
</label>
|
||||||
|
<select name="cluster-template-keypair-id" type="text" class="form-control" id="cluster-template-keypair-id"
|
||||||
|
ng-model="model.newClusterTemplateSpec.keypair_id" ng-required="true"
|
||||||
|
ng-options="keypair.id as keypair.name for keypair in ctrl.keypairs">
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -16,8 +16,8 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.baymodels')
|
.module('horizon.dashboard.container-infra.cluster-templates')
|
||||||
.factory('horizon.dashboard.container-infra.baymodels.delete.service', deleteService);
|
.factory('horizon.dashboard.container-infra.cluster-templates.delete.service', deleteService);
|
||||||
|
|
||||||
deleteService.$inject = [
|
deleteService.$inject = [
|
||||||
'$location',
|
'$location',
|
||||||
@ -29,16 +29,16 @@
|
|||||||
'horizon.framework.util.q.extensions',
|
'horizon.framework.util.q.extensions',
|
||||||
'horizon.framework.widgets.modal.deleteModalService',
|
'horizon.framework.widgets.modal.deleteModalService',
|
||||||
'horizon.framework.widgets.toast.service',
|
'horizon.framework.widgets.toast.service',
|
||||||
'horizon.dashboard.container-infra.baymodels.resourceType',
|
'horizon.dashboard.container-infra.cluster-templates.resourceType',
|
||||||
'horizon.dashboard.container-infra.baymodels.events'
|
'horizon.dashboard.container-infra.cluster-templates.events'
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngDoc factory
|
* @ngDoc factory
|
||||||
* @name horizon.dashboard.container-infra.baymodels.delete.service
|
* @name horizon.dashboard.container-infra.cluster-templates.delete.service
|
||||||
*
|
*
|
||||||
* @Description
|
* @Description
|
||||||
* Brings up the delete baymodels confirmation modal dialog.
|
* Brings up the delete cluster templates confirmation modal dialog.
|
||||||
* On submit, delete selected resources.
|
* On submit, delete selected resources.
|
||||||
* On cancel, do nothing.
|
* On cancel, do nothing.
|
||||||
*/
|
*/
|
||||||
@ -56,7 +56,7 @@
|
|||||||
allowed: allowed,
|
allowed: allowed,
|
||||||
perform: perform
|
perform: perform
|
||||||
};
|
};
|
||||||
var notAllowedMessage = gettext("You are not allowed to delete baymodels: %s");
|
var notAllowedMessage = gettext("You are not allowed to delete cluster templates: %s");
|
||||||
|
|
||||||
return service;
|
return service;
|
||||||
|
|
||||||
@ -81,18 +81,18 @@
|
|||||||
|
|
||||||
function labelize(count){
|
function labelize(count){
|
||||||
return {
|
return {
|
||||||
title: ngettext('Confirm Delete Baymodel',
|
title: ngettext('Confirm Delete Cluster Template',
|
||||||
'Confirm Delete Baymodels', count),
|
'Confirm Delete Cluster Templates', count),
|
||||||
/* eslint-disable max-len */
|
/* eslint-disable max-len */
|
||||||
message: ngettext('You have selected "%s". Please confirm your selection. Deleted baymodel is not recoverable.',
|
message: ngettext('You have selected "%s". Please confirm your selection. Deleted cluster template is not recoverable.',
|
||||||
'You have selected "%s". Please confirm your selection. Deleted baymodels are not recoverable.', count),
|
'You have selected "%s". Please confirm your selection. Deleted cluster templates are not recoverable.', count),
|
||||||
/* eslint-enable max-len */
|
/* eslint-enable max-len */
|
||||||
submit: ngettext('Delete Baymodel',
|
submit: ngettext('Delete Cluster Template',
|
||||||
'Delete Baymodels', count),
|
'Delete Cluster Templates', count),
|
||||||
success: ngettext('Deleted Baymodel: %s.',
|
success: ngettext('Deleted cluster template: %s.',
|
||||||
'Deleted Baymodels: %s.', count),
|
'Deleted cluster templates: %s.', count),
|
||||||
error: ngettext('Unable to delete Baymodel: %s.',
|
error: ngettext('Unable to delete cluster template: %s.',
|
||||||
'Unable to delete Baymodels: %s.', count)
|
'Unable to delete cluster templates: %s.', count)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +125,7 @@
|
|||||||
result.failed(resourceType, getEntity(item).id);
|
result.failed(resourceType, getEntity(item).id);
|
||||||
});
|
});
|
||||||
if(result.result.failed.length == 0 && result.result.deleted.length > 0){
|
if(result.result.failed.length == 0 && result.result.deleted.length > 0){
|
||||||
$location.path("/project/baymodels");
|
$location.path("/project/cluster_templates");
|
||||||
}else{
|
}else{
|
||||||
return result.result;
|
return result.result;
|
||||||
}
|
}
|
||||||
@ -146,7 +146,7 @@
|
|||||||
|
|
||||||
// call delete REST API
|
// call delete REST API
|
||||||
function deleteEntity(id){
|
function deleteEntity(id){
|
||||||
return magnum.deleteBaymodel(id, true);
|
return magnum.deleteClusterTemplate(id, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})();
|
})();
|
@ -17,23 +17,23 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc overview
|
* @ngdoc overview
|
||||||
* @ngname horizon.dashboard.container-infra.baymodels.details
|
* @ngname horizon.dashboard.container-infra.cluster-templates.details
|
||||||
*
|
*
|
||||||
* @description
|
* @description
|
||||||
* Provides details features for baymodels.
|
* Provides details features for cluster templates.
|
||||||
*/
|
*/
|
||||||
angular.module('horizon.dashboard.container-infra.baymodels.details',
|
angular.module('horizon.dashboard.container-infra.cluster-templates.details',
|
||||||
['horizon.framework.conf', 'horizon.app.core'])
|
['horizon.framework.conf', 'horizon.app.core'])
|
||||||
.run(registerBaymodelDetails);
|
.run(registerClusterTemplateDetails);
|
||||||
|
|
||||||
registerBaymodelDetails.$inject = [
|
registerClusterTemplateDetails.$inject = [
|
||||||
'horizon.dashboard.container-infra.baymodels.basePath',
|
'horizon.dashboard.container-infra.cluster-templates.basePath',
|
||||||
'horizon.dashboard.container-infra.baymodels.resourceType',
|
'horizon.dashboard.container-infra.cluster-templates.resourceType',
|
||||||
'horizon.app.core.openstack-service-api.magnum',
|
'horizon.app.core.openstack-service-api.magnum',
|
||||||
'horizon.framework.conf.resource-type-registry.service'
|
'horizon.framework.conf.resource-type-registry.service'
|
||||||
];
|
];
|
||||||
|
|
||||||
function registerBaymodelDetails(
|
function registerClusterTemplateDetails(
|
||||||
basePath,
|
basePath,
|
||||||
resourceType,
|
resourceType,
|
||||||
magnum,
|
magnum,
|
||||||
@ -42,13 +42,13 @@
|
|||||||
registry.getResourceType(resourceType)
|
registry.getResourceType(resourceType)
|
||||||
.setLoadFunction(loadFunction)
|
.setLoadFunction(loadFunction)
|
||||||
.detailsViews.append({
|
.detailsViews.append({
|
||||||
id: 'baymodelDetailsOverview',
|
id: 'templateDetailsOverview',
|
||||||
name: gettext('Overview'),
|
name: gettext('Overview'),
|
||||||
template: basePath + 'details/overview.html'
|
template: basePath + 'details/overview.html'
|
||||||
});
|
});
|
||||||
|
|
||||||
function loadFunction(identifier) {
|
function loadFunction(identifier) {
|
||||||
return magnum.getBaymodel(identifier);
|
return magnum.getClusterTemplate(identifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -17,19 +17,19 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc controller
|
* @ngdoc controller
|
||||||
* @name horizon.dashboard.container-infra.baymodels.DrawerController
|
* @name horizon.dashboard.container-infra.cluster-templates.DrawerController
|
||||||
* @description
|
* @description
|
||||||
* This is the controller for the baymodel drawer (summary) view.
|
* This is the controller for the cluster templates drawer (summary) view.
|
||||||
* Its primary purpose is to provide the metadata definitions to
|
* Its primary purpose is to provide the metadata definitions to
|
||||||
* the template via the ctrl.metadataDefs member.
|
* the template via the ctrl.metadataDefs member.
|
||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.baymodels')
|
.module('horizon.dashboard.container-infra.cluster-templates')
|
||||||
.controller('horizon.dashboard.container-infra.baymodels.DrawerController', controller);
|
.controller('horizon.dashboard.container-infra.cluster-templates.DrawerController', controller);
|
||||||
|
|
||||||
controller.$inject = [
|
controller.$inject = [
|
||||||
'horizon.app.core.openstack-service-api.magnum',
|
'horizon.app.core.openstack-service-api.magnum',
|
||||||
'horizon.dashboard.container-infra.baymodels.resourceType'
|
'horizon.dashboard.container-infra.cluster-templates.resourceType'
|
||||||
];
|
];
|
||||||
|
|
||||||
function controller(magnum, resourceType) {
|
function controller(magnum, resourceType) {
|
@ -1,4 +1,4 @@
|
|||||||
<div ng-controller="horizon.dashboard.container-infra.baymodels.DrawerController as drawerCtrl">
|
<div ng-controller="horizon.dashboard.container-infra.cluster-templates.DrawerController as drawerCtrl">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<span class="rsp-alt-p2">
|
<span class="rsp-alt-p2">
|
||||||
<dl class="col-md-5">
|
<dl class="col-md-5">
|
@ -15,40 +15,40 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.baymodels')
|
.module('horizon.dashboard.container-infra.cluster-templates')
|
||||||
.controller('BaymodelOverviewController', BaymodelOverviewController);
|
.controller('ClusterTemplateOverviewController', ClusterTemplateOverviewController);
|
||||||
|
|
||||||
BaymodelOverviewController.$inject = [
|
ClusterTemplateOverviewController.$inject = [
|
||||||
'$scope',
|
'$scope',
|
||||||
'horizon.app.core.openstack-service-api.glance',
|
'horizon.app.core.openstack-service-api.glance',
|
||||||
'horizon.dashboard.container-infra.baymodels.resourceType',
|
'horizon.dashboard.container-infra.cluster-templates.resourceType',
|
||||||
'horizon.dashboard.container-infra.baymodels.events',
|
'horizon.dashboard.container-infra.cluster-templates.events',
|
||||||
'horizon.dashboard.container-infra.bays.events',
|
'horizon.dashboard.container-infra.clusters.events',
|
||||||
'horizon.framework.conf.resource-type-registry.service'
|
'horizon.framework.conf.resource-type-registry.service'
|
||||||
];
|
];
|
||||||
|
|
||||||
function BaymodelOverviewController(
|
function ClusterTemplateOverviewController(
|
||||||
$scope,
|
$scope,
|
||||||
glance,
|
glance,
|
||||||
resourceType,
|
resourceType,
|
||||||
events,
|
events,
|
||||||
bayEvents,
|
clusterEvents,
|
||||||
registry
|
registry
|
||||||
) {
|
) {
|
||||||
var ctrl = this;
|
var ctrl = this;
|
||||||
ctrl.baymodel = {};
|
ctrl.cluster_template = {};
|
||||||
ctrl.image_uuid;
|
ctrl.image_uuid;
|
||||||
|
|
||||||
$scope.context.loadPromise.then(onGetBaymodel);
|
$scope.context.loadPromise.then(onGetClusterTemplate);
|
||||||
|
|
||||||
function onGetBaymodel(baymodel) {
|
function onGetClusterTemplate(template) {
|
||||||
ctrl.baymodel = baymodel.data;
|
ctrl.cluster_template = template.data;
|
||||||
glance.getImages().success(onGetImages);
|
glance.getImages().success(onGetImages);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onGetImages(images) {
|
function onGetImages(images) {
|
||||||
angular.forEach(images.items, function(image) {
|
angular.forEach(images.items, function(image) {
|
||||||
if (image.name === ctrl.baymodel.image_id) {
|
if (image.name === ctrl.cluster_template.image_id) {
|
||||||
ctrl.image_uuid = image.id;
|
ctrl.image_uuid = image.id;
|
||||||
}
|
}
|
||||||
});
|
});
|
@ -1,21 +1,21 @@
|
|||||||
<div ng-controller="BaymodelOverviewController as ctrl">
|
<div ng-controller="ClusterTemplateOverviewController as ctrl">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6 detail">
|
<div class="col-md-6 detail">
|
||||||
<h3 translate>Cluster Type</h3>
|
<h3 translate>Cluster Type</h3>
|
||||||
<hr>
|
<hr>
|
||||||
<dl class="dl-horizontal">
|
<dl class="dl-horizontal">
|
||||||
<dt translate>COE</dt>
|
<dt translate>COE</dt>
|
||||||
<dd>{$ ctrl.baymodel.coe $}</dd>
|
<dd>{$ ctrl.cluster_template.coe $}</dd>
|
||||||
<dt translate>Cluster Distro</dt>
|
<dt translate>Cluster Distro</dt>
|
||||||
<dd>{$ ctrl.baymodel.cluster_distro $}</dd>
|
<dd>{$ ctrl.cluster_template.cluster_distro $}</dd>
|
||||||
<dt translate>Server Type</dt>
|
<dt translate>Server Type</dt>
|
||||||
<dd>{$ ctrl.baymodel.server_type | uppercase $}</dd>
|
<dd>{$ ctrl.cluster_template.server_type | uppercase $}</dd>
|
||||||
<dt translate>Public</dt>
|
<dt translate>Public</dt>
|
||||||
<dd>{$ ctrl.baymodel.public | yesno $}</dd>
|
<dd>{$ ctrl.cluster_template.public | yesno $}</dd>
|
||||||
<dt translate>Registry Enabled</dt>
|
<dt translate>Registry Enabled</dt>
|
||||||
<dd>{$ ctrl.baymodel.registry_enabled | yesno $}</dd>
|
<dd>{$ ctrl.cluster_template.registry_enabled | yesno $}</dd>
|
||||||
<dt translate>TLS Disabled</dt>
|
<dt translate>TLS Disabled</dt>
|
||||||
<dd>{$ ctrl.baymodel.tls_disabled | yesno $}</dd>
|
<dd>{$ ctrl.cluster_template.tls_disabled | yesno $}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6 detail">
|
<div class="col-md-6 detail">
|
||||||
@ -23,17 +23,17 @@
|
|||||||
<hr>
|
<hr>
|
||||||
<dl class="dl-horizontal">
|
<dl class="dl-horizontal">
|
||||||
<dt translate>Image ID</dt>
|
<dt translate>Image ID</dt>
|
||||||
<dd><a href="project/images/{$ ctrl.image_uuid $}/" target="_self">{$ ctrl.baymodel.image_id $}</a></dd>
|
<dd><a href="project/images/{$ ctrl.image_uuid $}/" target="_self">{$ ctrl.cluster_template.image_id $}</a></dd>
|
||||||
<dt translate>Flavor ID</dt>
|
<dt translate>Flavor ID</dt>
|
||||||
<dd>{$ ctrl.baymodel.flavor_id $}</dd>
|
<dd>{$ ctrl.cluster_template.flavor_id $}</dd>
|
||||||
<dt translate>Master Flavor ID</dt>
|
<dt translate>Master Flavor ID</dt>
|
||||||
<dd>{$ ctrl.baymodel.master_flavor_id $}</dd>
|
<dd>{$ ctrl.cluster_template.master_flavor_id $}</dd>
|
||||||
<dt translate>Volume Driver</dt>
|
<dt translate>Volume Driver</dt>
|
||||||
<dd>{$ ctrl.baymodel.volume_driver $}</dd>
|
<dd>{$ ctrl.cluster_template.volume_driver $}</dd>
|
||||||
<dt translate>Docker Volume Size</dt>
|
<dt translate>Docker Volume Size</dt>
|
||||||
<dd>{$ ctrl.baymodel.docker_volume_size | gb $}</dd>
|
<dd>{$ ctrl.cluster_template.docker_volume_size | gb $}</dd>
|
||||||
<dt translate>Keypair ID</dt>
|
<dt translate>Keypair ID</dt>
|
||||||
<dd><a href="project/access_and_security/keypairs/{$ ctrl.baymodel.keypair_id $}/" target="_self">{$ ctrl.baymodel.keypair_id $}</a></dd>
|
<dd><a href="project/access_and_security/keypairs/{$ ctrl.cluster_template.keypair_id $}/" target="_self">{$ ctrl.cluster_template.keypair_id $}</a></dd>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -43,26 +43,26 @@
|
|||||||
<hr>
|
<hr>
|
||||||
<dl class="dl-horizontal">
|
<dl class="dl-horizontal">
|
||||||
<dt translate>Network Driver</dt>
|
<dt translate>Network Driver</dt>
|
||||||
<dd>{$ ctrl.baymodel.network_driver $}</dd>
|
<dd>{$ ctrl.cluster_template.network_driver $}</dd>
|
||||||
<dt translate>HTTP Proxy</dt>
|
<dt translate>HTTP Proxy</dt>
|
||||||
<dd>{$ ctrl.baymodel.http_proxy $}</dd>
|
<dd>{$ ctrl.cluster_template.http_proxy $}</dd>
|
||||||
<dt translate>HTTPS Proxy</dt>
|
<dt translate>HTTPS Proxy</dt>
|
||||||
<dd>{$ ctrl.baymodel.https_proxy $}</dd>
|
<dd>{$ ctrl.cluster_template.https_proxy $}</dd>
|
||||||
<dt translate>No Proxy</dt>
|
<dt translate>No Proxy</dt>
|
||||||
<dd>{$ ctrl.baymodel.no_proxy $}</dd>
|
<dd>{$ ctrl.cluster_template.no_proxy $}</dd>
|
||||||
<dt translate>External Network ID</dt>
|
<dt translate>External Network ID</dt>
|
||||||
<dd>{$ ctrl.baymodel.external_network_id $}</dd>
|
<dd>{$ ctrl.cluster_template.external_network_id $}</dd>
|
||||||
<dt translate>Fixed Network</dt>
|
<dt translate>Fixed Network</dt>
|
||||||
<dd>{$ ctrl.baymodel.fixed_network $}</dd>
|
<dd>{$ ctrl.cluster_template.fixed_network $}</dd>
|
||||||
<dt translate>DNS</dt>
|
<dt translate>DNS</dt>
|
||||||
<dd>{$ ctrl.baymodel.dns_nameserver $}</dd>
|
<dd>{$ ctrl.cluster_template.dns_nameserver $}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6 detail">
|
<div class="col-md-6 detail">
|
||||||
<h3 translate>Labels</h3>
|
<h3 translate>Labels</h3>
|
||||||
<hr>
|
<hr>
|
||||||
<dl class="dl-horizontal">
|
<dl class="dl-horizontal">
|
||||||
<div ng-repeat="(key, value) in ctrl.baymodel.labels">
|
<div ng-repeat="(key, value) in ctrl.cluster_template.labels">
|
||||||
<dt>{$ key $}</dt>
|
<dt>{$ key $}</dt>
|
||||||
<dd>{$ value $}</dd>
|
<dd>{$ value $}</dd>
|
||||||
</div>
|
</div>
|
||||||
@ -75,11 +75,11 @@
|
|||||||
<hr>
|
<hr>
|
||||||
<dl class="dl-horizontal">
|
<dl class="dl-horizontal">
|
||||||
<dt translate>Created</dt>
|
<dt translate>Created</dt>
|
||||||
<dd>{$ ctrl.baymodel.created_at | date:'short' $}</dd>
|
<dd>{$ ctrl.cluster_template.created_at | date:'short' $}</dd>
|
||||||
<dt translate>Updated</dt>
|
<dt translate>Updated</dt>
|
||||||
<dd>{$ ctrl.baymodel.updated_at | date:'short' $}</dd>
|
<dd>{$ ctrl.cluster_template.updated_at | date:'short' $}</dd>
|
||||||
<dt translate>ID</dt>
|
<dt translate>ID</dt>
|
||||||
<dd>{$ ctrl.baymodel.id $}</dd>
|
<dd>{$ ctrl.cluster_template.id $}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
@ -0,0 +1,4 @@
|
|||||||
|
<hz-resource-panel resource-type-name="OS::Magnum::ClusterTemplate">
|
||||||
|
<hz-resource-table resource-type-name="OS::Magnum::ClusterTemplate"
|
||||||
|
track-by="trackBy"></hz-resource-table>
|
||||||
|
</hz-resource-panel>
|
@ -0,0 +1,73 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc overview
|
||||||
|
* @ngname horizon.dashboard.container-infra.clusters.actions
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Provides all of the actions for clusters.
|
||||||
|
*/
|
||||||
|
angular.module('horizon.dashboard.container-infra.clusters.actions', ['horizon.framework', 'horizon.dashboard.container-infra'])
|
||||||
|
.run(registerClusterActions);
|
||||||
|
|
||||||
|
registerClusterActions.$inject = [
|
||||||
|
'horizon.framework.conf.resource-type-registry.service',
|
||||||
|
'horizon.framework.util.i18n.gettext',
|
||||||
|
'horizon.dashboard.container-infra.clusters.create.service',
|
||||||
|
'horizon.dashboard.container-infra.clusters.delete.service',
|
||||||
|
'horizon.dashboard.container-infra.clusters.resourceType',
|
||||||
|
];
|
||||||
|
|
||||||
|
function registerClusterActions(
|
||||||
|
registry,
|
||||||
|
gettext,
|
||||||
|
createClusterService,
|
||||||
|
deleteClusterService,
|
||||||
|
resourceType)
|
||||||
|
{
|
||||||
|
var clusterResourceType = registry.getResourceType(resourceType);
|
||||||
|
clusterResourceType.itemActions
|
||||||
|
.append({
|
||||||
|
id: 'deleteClusterAction',
|
||||||
|
service: deleteClusterService,
|
||||||
|
template: {
|
||||||
|
type: 'delete',
|
||||||
|
text: gettext('Delete Cluster')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
clusterResourceType.batchActions
|
||||||
|
.append({
|
||||||
|
id: 'createClusterAction',
|
||||||
|
service: createClusterService,
|
||||||
|
template: {
|
||||||
|
type: 'create',
|
||||||
|
text: gettext('Create Cluster')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'batchDeleteClusterAction',
|
||||||
|
service: deleteClusterService,
|
||||||
|
template: {
|
||||||
|
type: 'delete-selected',
|
||||||
|
text: gettext('Delete Clusters')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
})();
|
@ -19,46 +19,46 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc overview
|
* @ngdoc overview
|
||||||
* @name horizon.dashboard.container-infra.bays
|
* @name horizon.dashboard.container-infra.clusters
|
||||||
* @ngModule
|
* @ngModule
|
||||||
*
|
*
|
||||||
* @description
|
* @description
|
||||||
* Provides all the services and widgets require to display the bay
|
* Provides all the services and widgets require to display the cluster
|
||||||
* panel
|
* panel
|
||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.bays', [
|
.module('horizon.dashboard.container-infra.clusters', [
|
||||||
'ngRoute',
|
'ngRoute',
|
||||||
'horizon.dashboard.container-infra.bays.actions',
|
'horizon.dashboard.container-infra.clusters.actions',
|
||||||
'horizon.dashboard.container-infra.bays.details'
|
'horizon.dashboard.container-infra.clusters.details'
|
||||||
])
|
])
|
||||||
.constant('horizon.dashboard.container-infra.bays.events', events())
|
.constant('horizon.dashboard.container-infra.clusters.events', events())
|
||||||
.constant('horizon.dashboard.container-infra.bays.resourceType', 'OS::Magnum::Bay')
|
.constant('horizon.dashboard.container-infra.clusters.resourceType', 'OS::Magnum::Cluster')
|
||||||
.run(run)
|
.run(run)
|
||||||
.config(config);
|
.config(config);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc constant
|
* @ngdoc constant
|
||||||
* @name horizon.dashboard.container-infra.bays.events
|
* @name horizon.dashboard.container-infra.clusters.events
|
||||||
* @description A list of events used by Bays
|
* @description A list of events used by Clusters
|
||||||
*/
|
*/
|
||||||
function events() {
|
function events() {
|
||||||
return {
|
return {
|
||||||
CREATE_SUCCESS: 'horizon.dashboard.container-infra.bays.CREATE_SUCCESS',
|
CREATE_SUCCESS: 'horizon.dashboard.container-infra.clusters.CREATE_SUCCESS',
|
||||||
DELETE_SUCCESS: 'horizon.dashboard.container-infra.bays.DELETE_SUCCESS'
|
DELETE_SUCCESS: 'horizon.dashboard.container-infra.clusters.DELETE_SUCCESS'
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
run.$inject = [
|
run.$inject = [
|
||||||
'horizon.framework.conf.resource-type-registry.service',
|
'horizon.framework.conf.resource-type-registry.service',
|
||||||
'horizon.app.core.openstack-service-api.magnum',
|
'horizon.app.core.openstack-service-api.magnum',
|
||||||
'horizon.dashboard.container-infra.bays.basePath',
|
'horizon.dashboard.container-infra.clusters.basePath',
|
||||||
'horizon.dashboard.container-infra.bays.resourceType'
|
'horizon.dashboard.container-infra.clusters.resourceType'
|
||||||
];
|
];
|
||||||
|
|
||||||
function run(registry, magnum, basePath, resourceType) {
|
function run(registry, magnum, basePath, resourceType) {
|
||||||
registry.getResourceType(resourceType)
|
registry.getResourceType(resourceType)
|
||||||
.setNames(gettext('Bay'), gettext('Bays'))
|
.setNames(gettext('Cluster'), gettext('Clusters'))
|
||||||
|
|
||||||
// for detail summary view on table row
|
// for detail summary view on table row
|
||||||
.setSummaryTemplateUrl(basePath + 'details/drawer.html')
|
.setSummaryTemplateUrl(basePath + 'details/drawer.html')
|
||||||
@ -141,20 +141,20 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
function listFunction(params) {
|
function listFunction(params) {
|
||||||
return magnum.getBays(params).then(modifyResponse);
|
return magnum.getClusters(params).then(modifyResponse);
|
||||||
|
|
||||||
function modifyResponse(response) {
|
function modifyResponse(response) {
|
||||||
return {data: {items: response.data.items.map(addTrackBy)}};
|
return {data: {items: response.data.items.map(addTrackBy)}};
|
||||||
|
|
||||||
function addTrackBy(bay) {
|
function addTrackBy(cluster) {
|
||||||
bay.trackBy = bay.id;
|
cluster.trackBy = cluster.id;
|
||||||
return bay;
|
return cluster;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function urlFunction(item) {
|
function urlFunction(item) {
|
||||||
return 'project/ngdetails/OS::Magnum::Bay/' + item.id;
|
return 'project/ngdetails/OS::Magnum::Cluster/' + item.id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,9 +173,9 @@
|
|||||||
* @returns {undefined} Returns nothing
|
* @returns {undefined} Returns nothing
|
||||||
*/
|
*/
|
||||||
function config($provide, $windowProvider, $routeProvider) {
|
function config($provide, $windowProvider, $routeProvider) {
|
||||||
var path = $windowProvider.$get().STATIC_URL + 'dashboard/container-infra/bays/';
|
var path = $windowProvider.$get().STATIC_URL + 'dashboard/container-infra/clusters/';
|
||||||
$provide.constant('horizon.dashboard.container-infra.bays.basePath', path);
|
$provide.constant('horizon.dashboard.container-infra.clusters.basePath', path);
|
||||||
$routeProvider.when('/project/bays/', {
|
$routeProvider.when('/project/clusters/', {
|
||||||
templateUrl: path + 'panel.html'
|
templateUrl: path + 'panel.html'
|
||||||
});
|
});
|
||||||
}
|
}
|
@ -16,9 +16,9 @@
|
|||||||
(function() {
|
(function() {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
describe('horizon.dashboard.container-infra.bays', function() {
|
describe('horizon.dashboard.container-infra.clusters', function() {
|
||||||
it('should exist', function() {
|
it('should exist', function() {
|
||||||
expect(angular.module('horizon.dashboard.container-infra.bays')).toBeDefined();
|
expect(angular.module('horizon.dashboard.container-infra.clusters')).toBeDefined();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
@ -18,24 +18,24 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.bays')
|
.module('horizon.dashboard.container-infra.clusters')
|
||||||
.factory('horizon.dashboard.container-infra.bays.bayModel', bayModel);
|
.factory('horizon.dashboard.container-infra.clusters.model', ClusterModel);
|
||||||
|
|
||||||
bayModel.$inject = [
|
ClusterModel.$inject = [
|
||||||
'horizon.app.core.openstack-service-api.magnum'
|
'horizon.app.core.openstack-service-api.magnum'
|
||||||
];
|
];
|
||||||
|
|
||||||
function bayModel(magnum) {
|
function ClusterModel(magnum) {
|
||||||
var model = {
|
var model = {
|
||||||
newBaySpec: {},
|
newClusterSpec: {},
|
||||||
|
|
||||||
// API methods
|
// API methods
|
||||||
init: init,
|
init: init,
|
||||||
createBay: createBay
|
createCluster: createCluster
|
||||||
};
|
};
|
||||||
|
|
||||||
function initNewBaySpec() {
|
function initNewClusterSpec() {
|
||||||
model.newBaySpec = {
|
model.newClusterSpec = {
|
||||||
name: null,
|
name: null,
|
||||||
baymodel_id: null,
|
baymodel_id: null,
|
||||||
master_count: null,
|
master_count: null,
|
||||||
@ -46,16 +46,16 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
// Reset the new Bay spec
|
// Reset the new Cluster spec
|
||||||
initNewBaySpec();
|
initNewClusterSpec();
|
||||||
}
|
}
|
||||||
|
|
||||||
function createBay() {
|
function createCluster() {
|
||||||
var finalSpec = angular.copy(model.newBaySpec);
|
var finalSpec = angular.copy(model.newClusterSpec);
|
||||||
|
|
||||||
cleanNullProperties(finalSpec);
|
cleanNullProperties(finalSpec);
|
||||||
|
|
||||||
return magnum.createBay(finalSpec);
|
return magnum.createCluster(finalSpec);
|
||||||
}
|
}
|
||||||
|
|
||||||
function cleanNullProperties(finalSpec) {
|
function cleanNullProperties(finalSpec) {
|
@ -18,36 +18,36 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.bays')
|
.module('horizon.dashboard.container-infra.clusters')
|
||||||
.factory('horizon.dashboard.container-infra.bays.workflow', bayWorkflow);
|
.factory('horizon.dashboard.container-infra.clusters.workflow', ClusterWorkflow);
|
||||||
|
|
||||||
bayWorkflow.$inject = [
|
ClusterWorkflow.$inject = [
|
||||||
'horizon.dashboard.container-infra.basePath',
|
'horizon.dashboard.container-infra.basePath',
|
||||||
'horizon.app.core.workflow.factory',
|
'horizon.app.core.workflow.factory',
|
||||||
'horizon.framework.util.i18n.gettext'
|
'horizon.framework.util.i18n.gettext'
|
||||||
];
|
];
|
||||||
|
|
||||||
function bayWorkflow(basePath, workflowService, gettext) {
|
function ClusterWorkflow(basePath, workflowService, gettext) {
|
||||||
return workflowService({
|
return workflowService({
|
||||||
title: gettext('Create Bay'),
|
title: gettext('Create Cluster'),
|
||||||
steps: [
|
steps: [
|
||||||
{
|
{
|
||||||
title: gettext('Info'),
|
title: gettext('Info'),
|
||||||
templateUrl: basePath + 'bays/create/info/info.html',
|
templateUrl: basePath + 'clusters/create/info/info.html',
|
||||||
helpUrl: basePath + 'bays/create/info/info.help.html',
|
helpUrl: basePath + 'clusters/create/info/info.help.html',
|
||||||
formName: 'bayInfoForm'
|
formName: 'clusterInfoForm'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: gettext('Size'),
|
title: gettext('Size'),
|
||||||
templateUrl: basePath + 'bays/create/size/size.html',
|
templateUrl: basePath + 'clusters/create/size/size.html',
|
||||||
helpUrl: basePath + 'bays/create/size/size.help.html',
|
helpUrl: basePath + 'clusters/create/size/size.help.html',
|
||||||
formName: 'baySizeForm'
|
formName: 'clusterSizeForm'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: gettext('Misc'),
|
title: gettext('Misc'),
|
||||||
templateUrl: basePath + 'bays/create/misc/misc.html',
|
templateUrl: basePath + 'clusters/create/misc/misc.html',
|
||||||
helpUrl: basePath + 'bays/create/misc/misc.help.html',
|
helpUrl: basePath + 'clusters/create/misc/misc.help.html',
|
||||||
formName: 'bayMiscForm'
|
formName: 'clusterMiscForm'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
@ -17,12 +17,12 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc overview
|
* @ngdoc overview
|
||||||
* @name horizon.dashboard.container-infra.bays.create.service
|
* @name horizon.dashboard.container-infra.clusters.create.service
|
||||||
* @description Service for the container-infra bay create modal
|
* @description Service for the container-infra cluster create modal
|
||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.bays')
|
.module('horizon.dashboard.container-infra.clusters')
|
||||||
.factory('horizon.dashboard.container-infra.bays.create.service', createService);
|
.factory('horizon.dashboard.container-infra.clusters.create.service', createService);
|
||||||
|
|
||||||
createService.$inject = [
|
createService.$inject = [
|
||||||
'$location',
|
'$location',
|
||||||
@ -32,10 +32,10 @@
|
|||||||
'horizon.framework.util.q.extensions',
|
'horizon.framework.util.q.extensions',
|
||||||
'horizon.framework.widgets.modal.wizard-modal.service',
|
'horizon.framework.widgets.modal.wizard-modal.service',
|
||||||
'horizon.framework.widgets.toast.service',
|
'horizon.framework.widgets.toast.service',
|
||||||
'horizon.dashboard.container-infra.bays.bayModel',
|
'horizon.dashboard.container-infra.clusters.model',
|
||||||
'horizon.dashboard.container-infra.bays.events',
|
'horizon.dashboard.container-infra.clusters.events',
|
||||||
'horizon.dashboard.container-infra.bays.resourceType',
|
'horizon.dashboard.container-infra.clusters.resourceType',
|
||||||
'horizon.dashboard.container-infra.bays.workflow'
|
'horizon.dashboard.container-infra.clusters.workflow'
|
||||||
];
|
];
|
||||||
|
|
||||||
function createService(
|
function createService(
|
||||||
@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
var scope;
|
var scope;
|
||||||
var message = {
|
var message = {
|
||||||
success: gettext('Bay %s was successfully created.')
|
success: gettext('Cluster %s was successfully created.')
|
||||||
};
|
};
|
||||||
|
|
||||||
var service = {
|
var service = {
|
||||||
@ -80,7 +80,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function submit(){
|
function submit(){
|
||||||
return model.createBay().then(success);
|
return model.createCluster().then(success);
|
||||||
}
|
}
|
||||||
|
|
||||||
function success(response) {
|
function success(response) {
|
||||||
@ -89,7 +89,7 @@
|
|||||||
var result = actionResult.getActionResult()
|
var result = actionResult.getActionResult()
|
||||||
.created(resourceType, response.data.id);
|
.created(resourceType, response.data.id);
|
||||||
if(result.result.failed.length == 0 && result.result.created.length > 0){
|
if(result.result.failed.length == 0 && result.result.created.length > 0){
|
||||||
$location.path("/project/bays");
|
$location.path("/project/clusters");
|
||||||
}else{
|
}else{
|
||||||
return result.result;
|
return result.result;
|
||||||
}
|
}
|
@ -0,0 +1,85 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2015 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc controller
|
||||||
|
* @name createClusterInfoController
|
||||||
|
* @ngController
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Controller for the container-infra cluster info step in create workflow
|
||||||
|
*/
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.container-infra.clusters')
|
||||||
|
.controller('createClusterInfoController', createClusterInfoController);
|
||||||
|
|
||||||
|
createClusterInfoController.$inject = [
|
||||||
|
'$q',
|
||||||
|
'$scope',
|
||||||
|
'horizon.dashboard.container-infra.basePath',
|
||||||
|
'horizon.app.core.openstack-service-api.magnum'
|
||||||
|
];
|
||||||
|
|
||||||
|
function createClusterInfoController($q, $scope, basePath, magnum) {
|
||||||
|
var ctrl = this;
|
||||||
|
ctrl.cluster_templates = [{id:"", name: gettext("Choose a Cluster Template")}];
|
||||||
|
$scope.model.newClusterSpec.baymodel_id = "";
|
||||||
|
$scope.cluster_template_detail = {
|
||||||
|
name: "",
|
||||||
|
id: "",
|
||||||
|
coe: "",
|
||||||
|
image_id: "",
|
||||||
|
public: "",
|
||||||
|
registry_enabled: "",
|
||||||
|
tls_disabled: "",
|
||||||
|
apiserver_port: ""
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.changeClusterTemplate = function(){
|
||||||
|
angular.forEach(ctrl.cluster_templates, function(model, idx){
|
||||||
|
if($scope.model.newClusterSpec.baymodel_id === model.id){
|
||||||
|
$scope.cluster_template_detail.name = model.name;
|
||||||
|
$scope.cluster_template_detail.id = model.id;
|
||||||
|
$scope.cluster_template_detail.coe = model.coe;
|
||||||
|
$scope.cluster_template_detail.image_id = model.image_id;
|
||||||
|
$scope.cluster_template_detail.public = model.public;
|
||||||
|
$scope.cluster_template_detail.registry_enabled = model.registry_enabled;
|
||||||
|
$scope.cluster_template_detail.tls_disabled = model.tls_disabled;
|
||||||
|
$scope.cluster_template_detail.apiserver_port = model.apiserver_port;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
init();
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
magnum.getClusterTemplates({paginate: false}).success(onGetClusterTemplates);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onGetClusterTemplates(response) {
|
||||||
|
Array.prototype.push.apply(ctrl.cluster_templates, response.items);
|
||||||
|
if($scope.selected instanceof Object){
|
||||||
|
$scope.model.newClusterSpec.baymodel_id = $scope.selected.id;
|
||||||
|
$scope.changeClusterTemplate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
})();
|
@ -0,0 +1 @@
|
|||||||
|
<p translate>Specify cluster name and choose cluster template</p>
|
@ -0,0 +1,50 @@
|
|||||||
|
<div ng-controller="createClusterInfoController as ctrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-name" translate>Cluster Name</label>
|
||||||
|
<input name="cluster-name" type="text" class="form-control" id="cluster-name"
|
||||||
|
ng-model="model.newClusterSpec.name"
|
||||||
|
placeholder="{$ 'Name of the cluster to create.'|translate $}">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-model">
|
||||||
|
<translate>Cluster Template</translate>
|
||||||
|
<span class="hz-icon-required fa fa-asterisk"></span>
|
||||||
|
</label>
|
||||||
|
<select class="form-control" name="cluster-model" id="cluster-model"
|
||||||
|
ng-model="model.newClusterSpec.baymodel_id"
|
||||||
|
ng-required="true"
|
||||||
|
ng-options="cluster_template.id as cluster_template.name|noName for cluster_template in ctrl.cluster_templates"
|
||||||
|
ng-change="changeClusterTemplate()">
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="detail" ng-show="model.newClusterSpec.baymodel_id">
|
||||||
|
<span translate class="h4">Cluster Template Detail</span>
|
||||||
|
<dl class="dl-horizontal">
|
||||||
|
<dt translate>Name</dt>
|
||||||
|
<dd><a ng-href="project/ngdetails/OS::Magnum::ClusterTemplate/{$ cluster_template_detail.id $}" ng-click="cancel()">
|
||||||
|
{$ cluster_template_detail.name|noName $}
|
||||||
|
</a></dd>
|
||||||
|
<dt translate>ID</dt>
|
||||||
|
<dd>{$ cluster_template_detail.id $}</dd>
|
||||||
|
<dt translate>COE</dt>
|
||||||
|
<dd>{$ cluster_template_detail.coe $}</dd>
|
||||||
|
<dt translate>Image ID</dt>
|
||||||
|
<dd>{$ cluster_template_detail.image_id $}</dd>
|
||||||
|
<dt translate>Public</dt>
|
||||||
|
<dd>{$ cluster_template_detail.public $}</dd>
|
||||||
|
<dt translate>Registry Enabled</dt>
|
||||||
|
<dd>{$ cluster_template_detail.registry_enabled $}</dd>
|
||||||
|
<dt translate>TLS Disabled</dt>
|
||||||
|
<dd>{$ cluster_template_detail.tls_disabled $}</dd>
|
||||||
|
<dt translate>API Server Port</dt>
|
||||||
|
<dd>{$ cluster_template_detail.apiserver_port $}</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -19,23 +19,23 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc controller
|
* @ngdoc controller
|
||||||
* @name createBayMiscController
|
* @name createClusterMiscController
|
||||||
* @ngController
|
* @ngController
|
||||||
*
|
*
|
||||||
* @description
|
* @description
|
||||||
* Controller for the container-infra bay misc step in create workflow
|
* Controller for the container-infra cluster misc step in create workflow
|
||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.bays')
|
.module('horizon.dashboard.container-infra.clusters')
|
||||||
.controller('createBayMiscController', createBayMiscController);
|
.controller('createClusterMiscController', createClusterMiscController);
|
||||||
|
|
||||||
createBayMiscController.$inject = [
|
createClusterMiscController.$inject = [
|
||||||
'$scope',
|
'$scope',
|
||||||
'horizon.dashboard.container-infra.basePath',
|
'horizon.dashboard.container-infra.basePath',
|
||||||
'horizon.app.core.openstack-service-api.magnum'
|
'horizon.app.core.openstack-service-api.magnum'
|
||||||
];
|
];
|
||||||
|
|
||||||
function createBayMiscController($scope, basePath, magnum) {
|
function createClusterMiscController($scope, basePath, magnum) {
|
||||||
var ctrl = this;
|
var ctrl = this;
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1 @@
|
|||||||
|
<p translate>Specify conditions for cluster creation.</p>
|
@ -0,0 +1,17 @@
|
|||||||
|
<div ng-controller="createClusterMiscController as ctrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-discovery-url" translate>Discovery URL</label>
|
||||||
|
<input name="cluster-discovery-url" type="text" class="form-control"
|
||||||
|
ng-model="model.newClusterSpec.discovery_url" id="cluster-discovery-url"
|
||||||
|
placeholder="{$ 'Specifies custom discovery url for node discovery.'|translate $}">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-timeout" translate>Timeout</label>
|
||||||
|
<input name="cluster-timeout" type="number" min="0" class="form-control"
|
||||||
|
ng-model="model.newClusterSpec.bay_create_timeout" id="cluster-timeout"
|
||||||
|
placeholder="{$ 'The timeout for cluster creation in minutes. Set to 0 for no timeout. The default is no timeout.'|translate $}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -19,23 +19,23 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc controller
|
* @ngdoc controller
|
||||||
* @name createBaySizeController
|
* @name createClusterSizeController
|
||||||
* @ngController
|
* @ngController
|
||||||
*
|
*
|
||||||
* @description
|
* @description
|
||||||
* Controller for the container-infra bay size step in create workflow
|
* Controller for the container-infra cluster size step in create workflow
|
||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.bays')
|
.module('horizon.dashboard.container-infra.clusters')
|
||||||
.controller('createBaySizeController', createBaySizeController);
|
.controller('createClusterSizeController', createClusterSizeController);
|
||||||
|
|
||||||
createBaySizeController.$inject = [
|
createClusterSizeController.$inject = [
|
||||||
'$scope',
|
'$scope',
|
||||||
'horizon.dashboard.container-infra.basePath',
|
'horizon.dashboard.container-infra.basePath',
|
||||||
'horizon.app.core.openstack-service-api.magnum'
|
'horizon.app.core.openstack-service-api.magnum'
|
||||||
];
|
];
|
||||||
|
|
||||||
function createBaySizeController($scope, basePath, magnum) {
|
function createClusterSizeController($scope, basePath, magnum) {
|
||||||
var ctrl = this;
|
var ctrl = this;
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1 @@
|
|||||||
|
<p translate>Specify the number of master nodes and cluster nodes for the cluster.</p>
|
@ -0,0 +1,20 @@
|
|||||||
|
<div ng-controller="createClusterSizeController as ctrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12 col-sm-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-master-count" translate>Master Count</label>
|
||||||
|
<input name="cluster-master-count" type="number" min="1" id="cluster-master-count"
|
||||||
|
class="form-control" ng-model="model.newClusterSpec.master_count"
|
||||||
|
placeholder="{$ 'The number of master nodes for the cluster.'|translate $}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-xs-12 col-sm-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label" for="cluster-node-count" translate>Node Count</label>
|
||||||
|
<input name="cluster-node-count" type="number" min="1" id="cluster-node-count"
|
||||||
|
class="form-control" ng-model="model.newClusterSpec.node_count"
|
||||||
|
placeholder="{$ 'The cluster node count.'|translate $}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -16,8 +16,8 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.bays')
|
.module('horizon.dashboard.container-infra.clusters')
|
||||||
.factory('horizon.dashboard.container-infra.bays.delete.service', deleteService);
|
.factory('horizon.dashboard.container-infra.clusters.delete.service', deleteService);
|
||||||
|
|
||||||
deleteService.$inject = [
|
deleteService.$inject = [
|
||||||
'$location',
|
'$location',
|
||||||
@ -29,16 +29,16 @@
|
|||||||
'horizon.framework.util.q.extensions',
|
'horizon.framework.util.q.extensions',
|
||||||
'horizon.framework.widgets.modal.deleteModalService',
|
'horizon.framework.widgets.modal.deleteModalService',
|
||||||
'horizon.framework.widgets.toast.service',
|
'horizon.framework.widgets.toast.service',
|
||||||
'horizon.dashboard.container-infra.bays.resourceType',
|
'horizon.dashboard.container-infra.clusters.resourceType',
|
||||||
'horizon.dashboard.container-infra.bays.events'
|
'horizon.dashboard.container-infra.clusters.events'
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngDoc factory
|
* @ngDoc factory
|
||||||
* @name horizon.dashboard.container-infra.bays.delete.service
|
* @name horizon.dashboard.container-infra.clusters.delete.service
|
||||||
*
|
*
|
||||||
* @Description
|
* @Description
|
||||||
* Brings up the delete bays confirmation modal dialog.
|
* Brings up the delete clusters confirmation modal dialog.
|
||||||
* On submit, delete selected resources.
|
* On submit, delete selected resources.
|
||||||
* On cancel, do nothing.
|
* On cancel, do nothing.
|
||||||
*/
|
*/
|
||||||
@ -56,7 +56,7 @@
|
|||||||
allowed: allowed,
|
allowed: allowed,
|
||||||
perform: perform
|
perform: perform
|
||||||
};
|
};
|
||||||
var notAllowedMessage = gettext("You are not allowed to delete bays: %s");
|
var notAllowedMessage = gettext("You are not allowed to delete clusters: %s");
|
||||||
|
|
||||||
return service;
|
return service;
|
||||||
|
|
||||||
@ -81,18 +81,18 @@
|
|||||||
|
|
||||||
function labelize(count){
|
function labelize(count){
|
||||||
return {
|
return {
|
||||||
title: ngettext('Confirm Delete Bay',
|
title: ngettext('Confirm Delete Cluster',
|
||||||
'Confirm Delete Bays', count),
|
'Confirm Delete Clusters', count),
|
||||||
/* eslint-disable max-len */
|
/* eslint-disable max-len */
|
||||||
message: ngettext('You have selected "%s". Please confirm your selection. Deleted bay is not recoverable.',
|
message: ngettext('You have selected "%s". Please confirm your selection. Deleted cluster is not recoverable.',
|
||||||
'You have selected "%s". Please confirm your selection. Deleted bays are not recoverable.', count),
|
'You have selected "%s". Please confirm your selection. Deleted clusters are not recoverable.', count),
|
||||||
/* eslint-enable max-len */
|
/* eslint-enable max-len */
|
||||||
submit: ngettext('Delete Bay',
|
submit: ngettext('Delete Cluster',
|
||||||
'Delete Bays', count),
|
'Delete Clusters', count),
|
||||||
success: ngettext('Deleted Bay: %s.',
|
success: ngettext('Deleted cluster: %s.',
|
||||||
'Deleted Bays: %s.', count),
|
'Deleted clusters: %s.', count),
|
||||||
error: ngettext('Unable to delete Bay: %s.',
|
error: ngettext('Unable to delete cluster: %s.',
|
||||||
'Unable to delete Bays: %s.', count)
|
'Unable to delete clusters: %s.', count)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +125,7 @@
|
|||||||
result.failed(resourceType, getEntity(item).id);
|
result.failed(resourceType, getEntity(item).id);
|
||||||
});
|
});
|
||||||
if(result.result.failed.length == 0 && result.result.deleted.length > 0){
|
if(result.result.failed.length == 0 && result.result.deleted.length > 0){
|
||||||
$location.path("/project/bays");
|
$location.path("/project/clusters");
|
||||||
}else{
|
}else{
|
||||||
return result.result;
|
return result.result;
|
||||||
}
|
}
|
||||||
@ -146,7 +146,7 @@
|
|||||||
|
|
||||||
// call delete REST API
|
// call delete REST API
|
||||||
function deleteEntity(id){
|
function deleteEntity(id){
|
||||||
return magnum.deleteBay(id, true);
|
return magnum.deleteCluster(id, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})();
|
})();
|
@ -17,23 +17,23 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc overview
|
* @ngdoc overview
|
||||||
* @ngname horizon.dashboard.container-infra.bays.details
|
* @ngname horizon.dashboard.container-infra.clusters.details
|
||||||
*
|
*
|
||||||
* @description
|
* @description
|
||||||
* Provides details features for bays.
|
* Provides details features for clusters.
|
||||||
*/
|
*/
|
||||||
angular.module('horizon.dashboard.container-infra.bays.details',
|
angular.module('horizon.dashboard.container-infra.clusters.details',
|
||||||
['horizon.framework.conf', 'horizon.app.core'])
|
['horizon.framework.conf', 'horizon.app.core'])
|
||||||
.run(registerBayDetails);
|
.run(registerClusterDetails);
|
||||||
|
|
||||||
registerBayDetails.$inject = [
|
registerClusterDetails.$inject = [
|
||||||
'horizon.dashboard.container-infra.bays.basePath',
|
'horizon.dashboard.container-infra.clusters.basePath',
|
||||||
'horizon.dashboard.container-infra.bays.resourceType',
|
'horizon.dashboard.container-infra.clusters.resourceType',
|
||||||
'horizon.app.core.openstack-service-api.magnum',
|
'horizon.app.core.openstack-service-api.magnum',
|
||||||
'horizon.framework.conf.resource-type-registry.service'
|
'horizon.framework.conf.resource-type-registry.service'
|
||||||
];
|
];
|
||||||
|
|
||||||
function registerBayDetails(
|
function registerClusterDetails(
|
||||||
basePath,
|
basePath,
|
||||||
resourceType,
|
resourceType,
|
||||||
magnum,
|
magnum,
|
||||||
@ -42,13 +42,13 @@
|
|||||||
registry.getResourceType(resourceType)
|
registry.getResourceType(resourceType)
|
||||||
.setLoadFunction(loadFunction)
|
.setLoadFunction(loadFunction)
|
||||||
.detailsViews.append({
|
.detailsViews.append({
|
||||||
id: 'bayDetailsOverview',
|
id: 'clusterDetailsOverview',
|
||||||
name: gettext('Overview'),
|
name: gettext('Overview'),
|
||||||
template: basePath + 'details/overview.html'
|
template: basePath + 'details/overview.html'
|
||||||
});
|
});
|
||||||
|
|
||||||
function loadFunction(identifier) {
|
function loadFunction(identifier) {
|
||||||
return magnum.getBay(identifier);
|
return magnum.getCluster(identifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -17,19 +17,19 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ngdoc controller
|
* @ngdoc controller
|
||||||
* @name horizon.dashboard.container-infra.bays.DrawerController
|
* @name horizon.dashboard.container-infra.clusters.DrawerController
|
||||||
* @description
|
* @description
|
||||||
* This is the controller for the bay drawer (summary) view.
|
* This is the controller for the cluster drawer (summary) view.
|
||||||
* Its primary purpose is to provide the metadata definitions to
|
* Its primary purpose is to provide the metadata definitions to
|
||||||
* the template via the ctrl.metadataDefs member.
|
* the template via the ctrl.metadataDefs member.
|
||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.bays')
|
.module('horizon.dashboard.container-infra.clusters')
|
||||||
.controller('horizon.dashboard.container-infra.bays.DrawerController', controller);
|
.controller('horizon.dashboard.container-infra.clusters.DrawerController', controller);
|
||||||
|
|
||||||
controller.$inject = [
|
controller.$inject = [
|
||||||
'horizon.app.core.openstack-service-api.magnum',
|
'horizon.app.core.openstack-service-api.magnum',
|
||||||
'horizon.dashboard.container-infra.bays.resourceType'
|
'horizon.dashboard.container-infra.clusters.resourceType'
|
||||||
];
|
];
|
||||||
|
|
||||||
function controller(magnum, resourceType) {
|
function controller(magnum, resourceType) {
|
@ -1,4 +1,4 @@
|
|||||||
<div ng-controller="horizon.dashboard.container-infra.bays.DrawerController as drawerCtrl">
|
<div ng-controller="horizon.dashboard.container-infra.clusters.DrawerController as drawerCtrl">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<span class="rsp-alt-p2">
|
<span class="rsp-alt-p2">
|
||||||
<dl class="col-md-5">
|
<dl class="col-md-5">
|
||||||
@ -17,8 +17,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<dl class="col-md-5">
|
<dl class="col-md-5">
|
||||||
<dt translate>Baymodel</dt>
|
<dt translate>Cluster Template</dt>
|
||||||
<dd><a ng-href="project/ngdetails/OS::Magnum::Baymodel/{$ item.baymodel_id $}">{$ item.baymodel_id $}</a></dd>
|
<dd><a ng-href="project/ngdetails/OS::Magnum::ClusterTemplate/{$ item.baymodel_id $}">{$ item.baymodel_id $}</a></dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl class="col-md-3">
|
<dl class="col-md-3">
|
||||||
<dt translate>Node Addresses</dt>
|
<dt translate>Node Addresses</dt>
|
@ -15,18 +15,18 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra.bays')
|
.module('horizon.dashboard.container-infra.clusters')
|
||||||
.controller('BayOverviewController', BayOverviewController);
|
.controller('ClusterOverviewController', ClusterOverviewController);
|
||||||
|
|
||||||
BayOverviewController.$inject = [
|
ClusterOverviewController.$inject = [
|
||||||
'$scope',
|
'$scope',
|
||||||
'horizon.app.core.openstack-service-api.magnum',
|
'horizon.app.core.openstack-service-api.magnum',
|
||||||
'horizon.dashboard.container-infra.bays.resourceType',
|
'horizon.dashboard.container-infra.clusters.resourceType',
|
||||||
'horizon.dashboard.container-infra.bays.events',
|
'horizon.dashboard.container-infra.clusters.events',
|
||||||
'horizon.framework.conf.resource-type-registry.service'
|
'horizon.framework.conf.resource-type-registry.service'
|
||||||
];
|
];
|
||||||
|
|
||||||
function BayOverviewController(
|
function ClusterOverviewController(
|
||||||
$scope,
|
$scope,
|
||||||
magnum,
|
magnum,
|
||||||
resourceType,
|
resourceType,
|
||||||
@ -34,18 +34,18 @@
|
|||||||
registry
|
registry
|
||||||
) {
|
) {
|
||||||
var ctrl = this;
|
var ctrl = this;
|
||||||
ctrl.bay = {};
|
ctrl.cluster = {};
|
||||||
ctrl.baymodel = {};
|
ctrl.cluster_template = {};
|
||||||
|
|
||||||
$scope.context.loadPromise.then(onGetBay);
|
$scope.context.loadPromise.then(onGetCluster);
|
||||||
|
|
||||||
function onGetBay(bay) {
|
function onGetCluster(cluster) {
|
||||||
ctrl.bay = bay.data;
|
ctrl.cluster = cluster.data;
|
||||||
magnum.getBaymodel(ctrl.bay.baymodel_id).success(onGetBaymodel);
|
magnum.getClusterTemplate(ctrl.cluster.baymodel_id).success(onGetClusterTemplate);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onGetBaymodel(baymodel) {
|
function onGetClusterTemplate(cluster_template) {
|
||||||
ctrl.baymodel = baymodel;
|
ctrl.cluster_template = cluster_template;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})();
|
})();
|
@ -0,0 +1,77 @@
|
|||||||
|
<div ng-controller="ClusterOverviewController as ctrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 detail">
|
||||||
|
<h3 translate>Cluster Template</h3>
|
||||||
|
<hr>
|
||||||
|
<dl class="dl-horizontal">
|
||||||
|
<dt translate>Name</dt>
|
||||||
|
<dd><a ng-href="project/ngdetails/OS::Magnum::ClusterTemplate/{$ ctrl.cluster_template.id $}">{$ ctrl.cluster_template.name|noName $}</a></dd>
|
||||||
|
<dt translate>ID</dt>
|
||||||
|
<dd>{$ ctrl.cluster_template.id $}</dd>
|
||||||
|
<dt translate>COE</dt>
|
||||||
|
<dd>{$ ctrl.cluster_template.coe $}</dd>
|
||||||
|
<dt translate>Image ID</dt>
|
||||||
|
<dd>{$ ctrl.cluster_template.image_id $}</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 detail">
|
||||||
|
<h3 translate>Nodes</h3>
|
||||||
|
<hr>
|
||||||
|
<dl class="dl-horizontal">
|
||||||
|
<dt translate>Master Count</dt>
|
||||||
|
<dd>{$ ctrl.cluster.master_count $}</dd>
|
||||||
|
<dt translate>Node Count</dt>
|
||||||
|
<dd>{$ ctrl.cluster.node_count $}</dd>
|
||||||
|
<dt translate>API Address</dt>
|
||||||
|
<dd>{$ ctrl.cluster.api_address $}</dd>
|
||||||
|
<dt translate>Master Addresses</dt>
|
||||||
|
<dd>
|
||||||
|
<div ng-repeat="addr in ctrl.cluster.master_addresses">{$ addr $}</div>
|
||||||
|
</dd>
|
||||||
|
<dt translate>Node Addresses</dt>
|
||||||
|
<dd>
|
||||||
|
<div ng-repeat="addr in ctrl.cluster.node_addresses">{$ addr $}</div>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 detail">
|
||||||
|
<h3 translate>Miscellaneous</h3>
|
||||||
|
<hr>
|
||||||
|
<dl class="dl-horizontal">
|
||||||
|
<dt translate>Stack ID</dt>
|
||||||
|
<dd><a ng-href="project/stacks/stack/{$ ctrl.cluster.stack_id $}" target="_self">
|
||||||
|
{$ ctrl.cluster.stack_id $}
|
||||||
|
</a></dd>
|
||||||
|
<dt translate>Discovery URL</dt>
|
||||||
|
<dd>{$ ctrl.cluster.discovery_url $}</dd>
|
||||||
|
<dt translate>Cluster Create Timeout</dt>
|
||||||
|
<dd>
|
||||||
|
<div ng-switch on="ctrl.cluster.bay_create_timeout === 0 || ctrl.cluster.bay_create_timeout === null">
|
||||||
|
<div ng-switch-when="true" translate>Infinite</div>
|
||||||
|
<div ng-switch-default translate
|
||||||
|
translate-n="ctrl.cluster.bay_create_timeout"
|
||||||
|
translate-plural="{$ ctrl.cluster.bay_create_timeout $} minutes">
|
||||||
|
{$ ctrl.cluster.bay_create_timeout $} minute
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 detail">
|
||||||
|
<h3 translate>Record Properties</h3>
|
||||||
|
<hr>
|
||||||
|
<dl class="dl-horizontal">
|
||||||
|
<dt translate>Created</dt>
|
||||||
|
<dd>{$ ctrl.cluster.created_at | date:'short' $}</dd>
|
||||||
|
<dt translate>Updated</dt>
|
||||||
|
<dd>{$ ctrl.cluster.updated_at | date:'short' $}</dd>
|
||||||
|
<dt translate>ID</dt>
|
||||||
|
<dd>{$ ctrl.cluster.id $}</dd>
|
||||||
|
<dt translate>Status</dt>
|
||||||
|
<dd>{$ ctrl.cluster.status $}</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -0,0 +1,4 @@
|
|||||||
|
<hz-resource-panel resource-type-name="OS::Magnum::Cluster">
|
||||||
|
<hz-resource-table resource-type-name="OS::Magnum::Cluster"
|
||||||
|
track-by="trackBy"></hz-resource-table>
|
||||||
|
</hz-resource-panel>
|
@ -26,8 +26,8 @@
|
|||||||
*/
|
*/
|
||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container-infra', [
|
.module('horizon.dashboard.container-infra', [
|
||||||
'horizon.dashboard.container-infra.bays',
|
'horizon.dashboard.container-infra.clusters',
|
||||||
'horizon.dashboard.container-infra.baymodels',
|
'horizon.dashboard.container-infra.cluster-templates',
|
||||||
'ngRoute'
|
'ngRoute'
|
||||||
])
|
])
|
||||||
.config(config)
|
.config(config)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
@import "baymodels/baymodels";
|
@import "cluster-templates/cluster-templates";
|
||||||
@import "bays/bays";
|
@import "clusters/clusters";
|
||||||
|
|
||||||
.batch-action {
|
.batch-action {
|
||||||
float: right;
|
float: right;
|
||||||
|
@ -28,99 +28,99 @@
|
|||||||
|
|
||||||
function MagnumAPI(apiService, toastService, gettext) {
|
function MagnumAPI(apiService, toastService, gettext) {
|
||||||
var service = {
|
var service = {
|
||||||
createBay: createBay,
|
createCluster: createCluster,
|
||||||
getBay: getBay,
|
getCluster: getCluster,
|
||||||
getBays: getBays,
|
getClusters: getClusters,
|
||||||
deleteBay: deleteBay,
|
deleteCluster: deleteCluster,
|
||||||
deleteBays: deleteBays,
|
deleteClusters: deleteClusters,
|
||||||
createBaymodel: createBaymodel,
|
createClusterTemplate: createClusterTemplate,
|
||||||
getBaymodel: getBaymodel,
|
getClusterTemplate: getClusterTemplate,
|
||||||
getBaymodels: getBaymodels,
|
getClusterTemplates: getClusterTemplates,
|
||||||
deleteBaymodel: deleteBaymodel,
|
deleteClusterTemplate: deleteClusterTemplate,
|
||||||
deleteBaymodels: deleteBaymodels,
|
deleteClusterTemplates: deleteClusterTemplates,
|
||||||
};
|
};
|
||||||
|
|
||||||
return service;
|
return service;
|
||||||
|
|
||||||
//////////
|
//////////
|
||||||
// Bays //
|
// Clusters //
|
||||||
//////////
|
//////////
|
||||||
|
|
||||||
function createBay(params) {
|
function createCluster(params) {
|
||||||
return apiService.post('/api/container-infra/bays/', params)
|
return apiService.post('/api/container_infra/clusters/', params)
|
||||||
.error(function() {
|
.error(function() {
|
||||||
toastService.add('error', gettext('Unable to create Bay.'));
|
toastService.add('error', gettext('Unable to create cluster.'));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBay(id) {
|
function getCluster(id) {
|
||||||
return apiService.get('/api/container-infra/bays/' + id)
|
return apiService.get('/api/container_infra/clusters/' + id)
|
||||||
.error(function() {
|
.error(function() {
|
||||||
toastService.add('error', gettext('Unable to retrieve the Bay.'));
|
toastService.add('error', gettext('Unable to retrieve the cluster.'));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBays() {
|
function getClusters() {
|
||||||
return apiService.get('/api/container-infra/bays/')
|
return apiService.get('/api/container_infra/clusters/')
|
||||||
.error(function() {
|
.error(function() {
|
||||||
toastService.add('error', gettext('Unable to retrieve the Bays.'));
|
toastService.add('error', gettext('Unable to retrieve the clusters.'));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteBay(id, suppressError) {
|
function deleteCluster(id, suppressError) {
|
||||||
var promise = apiService.delete('/api/container-infra/bays/', [id]);
|
var promise = apiService.delete('/api/container_infra/clusters/', [id]);
|
||||||
return suppressError ? promise : promise.error(function() {
|
return suppressError ? promise : promise.error(function() {
|
||||||
var msg = gettext('Unable to delete the Bay with id: %(id)s');
|
var msg = gettext('Unable to delete the cluster with id: %(id)s');
|
||||||
toastService.add('error', interpolate(msg, { id: id }, true));
|
toastService.add('error', interpolate(msg, { id: id }, true));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME(shu-mutou): Unused for batch-delete in Horizon framework in Feb, 2016.
|
// FIXME(shu-mutou): Unused for batch-delete in Horizon framework in Feb, 2016.
|
||||||
function deleteBays(ids) {
|
function deleteClusters(ids) {
|
||||||
return apiService.delete('/api/container-infra/bays/', ids)
|
return apiService.delete('/api/container_infra/clusters/', ids)
|
||||||
.error(function() {
|
.error(function() {
|
||||||
toastService.add('error', gettext('Unable to delete the Bays.'));
|
toastService.add('error', gettext('Unable to delete the clusters.'));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////
|
///////////////
|
||||||
// Baymodels //
|
// ClusterTemplates //
|
||||||
///////////////
|
///////////////
|
||||||
|
|
||||||
function createBaymodel(params) {
|
function createClusterTemplate(params) {
|
||||||
return apiService.post('/api/container-infra/baymodels/', params)
|
return apiService.post('/api/container_infra/cluster_templates/', params)
|
||||||
.error(function() {
|
.error(function() {
|
||||||
toastService.add('error', gettext('Unable to create Baymodel'));
|
toastService.add('error', gettext('Unable to create cluster template'));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBaymodel(id) {
|
function getClusterTemplate(id) {
|
||||||
return apiService.get('/api/container-infra/baymodels/' + id)
|
return apiService.get('/api/container_infra/cluster_templates/' + id)
|
||||||
.error(function() {
|
.error(function() {
|
||||||
toastService.add('error', gettext('Unable to retrieve the Baymodel.'));
|
toastService.add('error', gettext('Unable to retrieve the cluster template.'));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBaymodels() {
|
function getClusterTemplates() {
|
||||||
return apiService.get('/api/container-infra/baymodels/')
|
return apiService.get('/api/container_infra/cluster_templates/')
|
||||||
.error(function() {
|
.error(function() {
|
||||||
toastService.add('error', gettext('Unable to retrieve the Baymodels.'));
|
toastService.add('error', gettext('Unable to retrieve the cluster templates.'));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteBaymodel(id, suppressError) {
|
function deleteClusterTemplate(id, suppressError) {
|
||||||
var promise = apiService.delete('/api/container-infra/baymodels/', [id]);
|
var promise = apiService.delete('/api/container_infra/cluster_templates/', [id]);
|
||||||
return suppressError ? promise : promise.error(function() {
|
return suppressError ? promise : promise.error(function() {
|
||||||
var msg = gettext('Unable to delete the Baymodel with id: %(id)s');
|
var msg = gettext('Unable to delete the cluster template with id: %(id)s');
|
||||||
toastService.add('error', interpolate(msg, { id: id }, true));
|
toastService.add('error', interpolate(msg, { id: id }, true));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME(shu-mutou): Unused for batch-delete in Horizon framework in Feb, 2016.
|
// FIXME(shu-mutou): Unused for batch-delete in Horizon framework in Feb, 2016.
|
||||||
function deleteBaymodels(ids) {
|
function deleteClusterTemplates(ids) {
|
||||||
return apiService.delete('/api/container-infra/baymodels/', ids)
|
return apiService.delete('/api/container_infra/cluster_templates/', ids)
|
||||||
.error(function() {
|
.error(function() {
|
||||||
toastService.add('error', gettext('Unable to delete the Baymodels.'));
|
toastService.add('error', gettext('Unable to delete the cluster templates.'));
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,81 +25,83 @@ TEST = TestData(test_data.data)
|
|||||||
|
|
||||||
class MagnumRestTestCase(test.TestCase):
|
class MagnumRestTestCase(test.TestCase):
|
||||||
|
|
||||||
# Baymodels
|
# Cluster Templates
|
||||||
@mock.patch.object(magnum, 'magnum')
|
@mock.patch.object(magnum, 'magnum')
|
||||||
def test_baymodel_get(self, client):
|
def test_cluster_template_get(self, client):
|
||||||
request = self.mock_rest_request()
|
request = self.mock_rest_request()
|
||||||
client.baymodel_list.return_value = \
|
client.cluster_template_list.return_value = \
|
||||||
mock_resource(TEST.baymodels.list())
|
mock_resource(TEST.cluster_templates.list())
|
||||||
response = magnum.Baymodels().get(request)
|
response = magnum.ClusterTemplates().get(request)
|
||||||
|
|
||||||
self.assertStatusCode(response, 200)
|
self.assertStatusCode(response, 200)
|
||||||
self.assertItemsCollectionEqual(response, TEST.baymodels.list())
|
self.assertItemsCollectionEqual(response,
|
||||||
client.baymodel_list.assert_called_once_with(request)
|
TEST.cluster_templates.list())
|
||||||
|
client.cluster_template_list.assert_called_once_with(request)
|
||||||
|
|
||||||
@mock.patch.object(magnum, 'magnum')
|
@mock.patch.object(magnum, 'magnum')
|
||||||
def test_baymodel_create(self, client):
|
def test_cluster_template_create(self, client):
|
||||||
test_baymodels = mock_resource(TEST.baymodels.list())
|
test_cluster_templates = mock_resource(TEST.cluster_templates.list())
|
||||||
test_bmodel = test_baymodels[0]
|
test_cluster_template = test_cluster_templates[0]
|
||||||
test_body = json.dumps(test_bmodel.to_dict())
|
test_body = json.dumps(test_cluster_template.to_dict())
|
||||||
request = self.mock_rest_request(body=test_body)
|
request = self.mock_rest_request(body=test_body)
|
||||||
client.baymodel_create.return_value = test_bmodel
|
client.cluster_template_create.return_value = test_cluster_template
|
||||||
response = magnum.Baymodels().post(request)
|
response = magnum.ClusterTemplates().post(request)
|
||||||
|
url = '/api/container_infra/cluster_template/%s' % \
|
||||||
|
test_cluster_template.uuid
|
||||||
|
|
||||||
self.assertStatusCode(response, 201)
|
self.assertStatusCode(response, 201)
|
||||||
self.assertEqual(response['location'],
|
self.assertEqual(response['location'], url)
|
||||||
'/api/container-infra/baymodel/%s' % test_bmodel.uuid)
|
client.cluster_template_create.assert_called_once_with(
|
||||||
client.baymodel_create.assert_called_once_with(request,
|
request, **test_cluster_template.to_dict())
|
||||||
**test_bmodel.to_dict())
|
|
||||||
|
|
||||||
@mock.patch.object(magnum, 'magnum')
|
@mock.patch.object(magnum, 'magnum')
|
||||||
def test_baymodel_delete(self, client):
|
def test_cluster_template_delete(self, client):
|
||||||
test_baymodel = TEST.baymodels.first()
|
test_cluster_template = TEST.cluster_templates.first()
|
||||||
request = self.mock_rest_request(
|
request = self.mock_rest_request(
|
||||||
body='{"baymodel_id":' + str(test_baymodel['uuid']) + '}')
|
body='{"baymodel_id":' + str(test_cluster_template['uuid']) + '}')
|
||||||
response = magnum.Baymodels().delete(request)
|
response = magnum.ClusterTemplates().delete(request)
|
||||||
|
|
||||||
self.assertStatusCode(response, 204)
|
self.assertStatusCode(response, 204)
|
||||||
client.baymodel_delete.assert_called_once_with(
|
client.cluster_template_delete.assert_called_once_with(
|
||||||
request,
|
request,
|
||||||
u'baymodel_id')
|
u'baymodel_id')
|
||||||
|
|
||||||
# Bays
|
# Clusters
|
||||||
@mock.patch.object(magnum, 'magnum')
|
@mock.patch.object(magnum, 'magnum')
|
||||||
def test_bay_get(self, client):
|
def test_cluster_get(self, client):
|
||||||
request = self.mock_rest_request()
|
request = self.mock_rest_request()
|
||||||
client.bay_list.return_value = \
|
client.cluster_list.return_value = \
|
||||||
mock_resource(TEST.bays.list())
|
mock_resource(TEST.clusters.list())
|
||||||
response = magnum.Bays().get(request)
|
response = magnum.Clusters().get(request)
|
||||||
|
|
||||||
self.assertStatusCode(response, 200)
|
self.assertStatusCode(response, 200)
|
||||||
self.assertItemsCollectionEqual(response, TEST.bays.list())
|
self.assertItemsCollectionEqual(response, TEST.clusters.list())
|
||||||
client.bay_list.assert_called_once_with(request)
|
client.cluster_list.assert_called_once_with(request)
|
||||||
|
|
||||||
@mock.patch.object(magnum, 'magnum')
|
@mock.patch.object(magnum, 'magnum')
|
||||||
def test_bay_create(self, client):
|
def test_cluster_create(self, client):
|
||||||
test_bays = mock_resource(TEST.bays.list())
|
test_clusters = mock_resource(TEST.clusters.list())
|
||||||
test_bay = test_bays[0]
|
test_cluster = test_clusters[0]
|
||||||
test_body = json.dumps(test_bay.to_dict())
|
test_body = json.dumps(test_cluster.to_dict())
|
||||||
request = self.mock_rest_request(body=test_body)
|
request = self.mock_rest_request(body=test_body)
|
||||||
client.bay_create.return_value = test_bay
|
client.cluster_create.return_value = test_cluster
|
||||||
response = magnum.Bays().post(request)
|
response = magnum.Clusters().post(request)
|
||||||
|
url = '/api/container_infra/cluster/%s' % test_cluster.uuid
|
||||||
|
|
||||||
self.assertStatusCode(response, 201)
|
self.assertStatusCode(response, 201)
|
||||||
self.assertEqual(response['location'],
|
self.assertEqual(response['location'], url)
|
||||||
'/api/container-infra/bay/%s' % test_bay.uuid)
|
client.cluster_create.assert_called_once_with(request,
|
||||||
client.bay_create.assert_called_once_with(request,
|
**test_cluster.to_dict())
|
||||||
**test_bay.to_dict())
|
|
||||||
|
|
||||||
@mock.patch.object(magnum, 'magnum')
|
@mock.patch.object(magnum, 'magnum')
|
||||||
def test_bay_delete(self, client):
|
def test_cluster_delete(self, client):
|
||||||
test_bay = TEST.bays.first()
|
test_cluster = TEST.clusters.first()
|
||||||
request = self.mock_rest_request(
|
request = self.mock_rest_request(
|
||||||
body='{"bay_id":' + str(test_bay['uuid']) + '}')
|
body='{"bay_id":' + str(test_cluster['uuid']) + '}')
|
||||||
response = magnum.Bays().delete(request)
|
response = magnum.Clusters().delete(request)
|
||||||
|
|
||||||
self.assertStatusCode(response, 204)
|
self.assertStatusCode(response, 204)
|
||||||
client.bay_delete.assert_called_once_with(
|
client.cluster_delete.assert_called_once_with(
|
||||||
request,
|
request,
|
||||||
u'bay_id')
|
u'bay_id')
|
||||||
|
|
||||||
|
@ -17,37 +17,37 @@ from openstack_dashboard.test.test_data import utils
|
|||||||
|
|
||||||
def data(TEST):
|
def data(TEST):
|
||||||
# Test Data Container in Horizon
|
# Test Data Container in Horizon
|
||||||
TEST.baymodels = utils.TestDataContainer()
|
TEST.cluster_templates = utils.TestDataContainer()
|
||||||
TEST.bays = utils.TestDataContainer()
|
TEST.clusters = utils.TestDataContainer()
|
||||||
|
|
||||||
# Bay Models
|
# Cluster Templates
|
||||||
baymodel_dict_1 = {"uuid": 1,
|
cluster_template_dict_1 = {"uuid": 1,
|
||||||
"name": "kindofabigdeal",
|
"name": "kindofabigdeal",
|
||||||
"image-id": "",
|
"image-id": "",
|
||||||
"keypair-id": "",
|
"keypair-id": "",
|
||||||
"external-network-id": "",
|
"external-network-id": "",
|
||||||
"coe": "",
|
"coe": "",
|
||||||
"fixed-network": "",
|
"fixed-network": "",
|
||||||
"dns-nameserver": "",
|
"dns-nameserver": "",
|
||||||
"flavor-id": "",
|
"flavor-id": "",
|
||||||
"master-flavor-id": "",
|
"master-flavor-id": "",
|
||||||
"docker-volume-size": "",
|
"docker-volume-size": "",
|
||||||
"http-proxy": "",
|
"http-proxy": "",
|
||||||
"https-proxy": "",
|
"https-proxy": "",
|
||||||
"no-proxy": "",
|
"no-proxy": "",
|
||||||
"labels": "",
|
"labels": "",
|
||||||
"tls-disabled": "",
|
"tls-disabled": "",
|
||||||
"public": ""}
|
"public": ""}
|
||||||
|
|
||||||
TEST.baymodels.add(baymodel_dict_1)
|
TEST.cluster_templates.add(cluster_template_dict_1)
|
||||||
|
|
||||||
# Bays
|
# Clusters
|
||||||
bay_dict_1 = {"uuid": 1,
|
cluster_dict_1 = {"uuid": 1,
|
||||||
"name": "peopleknowme",
|
"name": "peopleknowme",
|
||||||
"baymodel": baymodel_dict_1["uuid"],
|
"baymodel": cluster_template_dict_1["uuid"],
|
||||||
"node-count": "",
|
"node-count": "",
|
||||||
"master-count": "",
|
"master-count": "",
|
||||||
"discovery-url": "",
|
"discovery-url": "",
|
||||||
"timeout": 0}
|
"timeout": 0}
|
||||||
|
|
||||||
TEST.bays.add(bay_dict_1)
|
TEST.clusters.add(cluster_dict_1)
|
||||||
|
Loading…
Reference in New Issue
Block a user