Delete unused files and clean up cookie cutter files
These files were auto-generated from the cookiecutter commit and aren't needed. Some should be renamed. Change-Id: I2d6f7af84f9c8580b1a753f03b7170fd90e05314
This commit is contained in:
parent
72a202fb63
commit
2a90199ded
|
@ -0,0 +1,22 @@
|
|||
AUTHORS
|
||||
ChangeLog
|
||||
build
|
||||
cover
|
||||
doc/source/contributor/api
|
||||
node_modules
|
||||
npm-debug.log
|
||||
releasenotes/build
|
||||
castellan_ui/test/.secret_key_store
|
||||
.coverage*
|
||||
.jshintrc
|
||||
.project
|
||||
.pydevproject
|
||||
.settings
|
||||
.tox
|
||||
.venv
|
||||
*.egg*
|
||||
*.lock
|
||||
*.mo
|
||||
*.py[cod]
|
||||
*.swp
|
||||
*nose_results.html
|
|
@ -2,7 +2,7 @@
|
|||
Castellan UI
|
||||
===============================
|
||||
|
||||
Generic Key Manager interface UI plugin for Horizon
|
||||
Generic Key Manager UI Plugin for Horizon
|
||||
|
||||
* Free software: Apache license
|
||||
* Source: http://git.openstack.org/cgit/openstack/castellan-ui
|
||||
|
@ -53,12 +53,12 @@ Install Castellan UI with all dependencies in your virtual environment::
|
|||
|
||||
And enable it in Horizon::
|
||||
|
||||
ln -s ../castellan-ui/castellan_ui/enabled/_90_project_castellan_panelgroup.py openstack_dashboard/local/enabled
|
||||
ln -s ../castellan-ui/castellan_ui/enabled/_91_project_castellan_manages_panel.py openstack_dashboard/local/enabled
|
||||
TODO(kfarr): add the panel group here
|
||||
TODO(kfarr): add the panels here
|
||||
|
||||
To run horizon with the newly enabled Castellan UI plugin run::
|
||||
|
||||
./run_tests.sh --runserver 0.0.0.0:8080
|
||||
|
||||
to have the application start on port 8080 and the horizon dashboard will be
|
||||
available in your browser at http://localhost:8080/
|
||||
available in your browser at http://localhost:8080/
|
||||
|
|
|
@ -1,131 +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.
|
||||
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import logging
|
||||
|
||||
from castellan import key_manager
|
||||
|
||||
from horizon import exceptions
|
||||
from horizon.utils.memoized import memoized
|
||||
from openstack_dashboard.api import base
|
||||
|
||||
# for stab, should remove when use CLI API
|
||||
import copy
|
||||
from datetime import datetime
|
||||
import uuid
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
ATTRIBUTES = ['name', 'description', 'enabled', 'size', 'temperature',
|
||||
'base', 'flavor', 'topping']
|
||||
|
||||
STUB_DATA = {}
|
||||
|
||||
|
||||
# for stab, should be removed when use CLI API
|
||||
class StubResponse(object):
|
||||
|
||||
def __init__(self, info):
|
||||
self._info = info
|
||||
|
||||
def __repr__(self):
|
||||
reprkeys = sorted(k for k in self.__dict__.keys() if k[0] != '_')
|
||||
info = ", ".join("%s=%s" % (k, getattr(self, k)) for k in reprkeys)
|
||||
return "<%s %s>" % (self.__class__.__name__, info)
|
||||
|
||||
def to_dict(self):
|
||||
return copy.deepcopy(self._info)
|
||||
|
||||
|
||||
@memoized
|
||||
def apiclient(request):
|
||||
api_url = ""
|
||||
|
||||
try:
|
||||
api_url = base.url_for(request, 'manage')
|
||||
except exceptions.ServiceCatalogException:
|
||||
LOG.debug('No Manage Management service is configured.')
|
||||
return None
|
||||
|
||||
LOG.debug('castellan connection created using the token "%s" and url'
|
||||
'"%s"' % (request.user.token.id, api_url))
|
||||
c = key_manager.API()
|
||||
return c
|
||||
|
||||
|
||||
def manage_create(request, **kwargs):
|
||||
args = {}
|
||||
for (key, value) in kwargs.items():
|
||||
if key in ATTRIBUTES:
|
||||
args[str(key)] = value
|
||||
else:
|
||||
raise exceptions.BadRequest(
|
||||
"Key must be in %s" % ",".join(ATTRIBUTES))
|
||||
# created = apiclient(request).manages.create(**args)
|
||||
|
||||
# create dummy response
|
||||
args["uuid"] = uuid.uuid1().hex
|
||||
args["created_at"] = datetime.now().isoformat()
|
||||
created = StubResponse(args)
|
||||
for k in args:
|
||||
setattr(created, k, args[k])
|
||||
STUB_DATA[created.uuid] = created
|
||||
|
||||
return created
|
||||
|
||||
|
||||
def manage_update(request, id, **kwargs):
|
||||
args = {}
|
||||
for (key, value) in kwargs.items():
|
||||
if key in ATTRIBUTES:
|
||||
args[str(key)] = value
|
||||
else:
|
||||
raise exceptions.BadRequest(
|
||||
"Key must be in %s" % ",".join(ATTRIBUTES))
|
||||
# updated = apiclient(request).manage.update(id, **args)
|
||||
|
||||
# update dummy response
|
||||
args["uuid"] = id
|
||||
args["updated_at"] = datetime.now().isoformat()
|
||||
updated = StubResponse(args)
|
||||
for k in args:
|
||||
setattr(updated, k, args[k])
|
||||
STUB_DATA[updated.uuid] = updated
|
||||
|
||||
return updated
|
||||
|
||||
|
||||
def manage_delete(request, id):
|
||||
# deleted = apiclient(request).manages.delete(id)
|
||||
deleted = STUB_DATA.pop(id)
|
||||
|
||||
return deleted
|
||||
|
||||
|
||||
def manage_list(
|
||||
request, limit=None, marker=None, sort_key=None,
|
||||
sort_dir=None, detail=True):
|
||||
|
||||
# list = apiclient(request).Manages.list(limit, marker, sort_key,
|
||||
# sort_dir, detail)
|
||||
list = [STUB_DATA[data] for data in STUB_DATA]
|
||||
return list
|
||||
|
||||
|
||||
def manage_show(request, id):
|
||||
# show = apiclient(request).manages.get(id)
|
||||
show = STUB_DATA.get(id)
|
||||
return show
|
|
@ -1,86 +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.
|
||||
|
||||
from django.views import generic
|
||||
|
||||
from castellan_ui.api import client
|
||||
|
||||
from openstack_dashboard.api.rest import urls
|
||||
from openstack_dashboard.api.rest import utils as rest_utils
|
||||
|
||||
|
||||
def change_to_id(obj):
|
||||
"""Change key named 'uuid' to 'id'
|
||||
|
||||
API returns objects with a field called 'uuid' many of Horizons
|
||||
directives however expect objects to have a field called 'id'.
|
||||
"""
|
||||
obj['id'] = obj.pop('uuid')
|
||||
return obj
|
||||
|
||||
|
||||
@urls.register
|
||||
class Manage(generic.View):
|
||||
"""API for retrieving a single Manage"""
|
||||
url_regex = r'castellan/manages/(?P<id>[^/]+)$'
|
||||
|
||||
@rest_utils.ajax()
|
||||
def get(self, request, id):
|
||||
"""Get a specific manage"""
|
||||
return change_to_id(client.manage_show(request, id).to_dict())
|
||||
|
||||
@rest_utils.ajax(data_required=True)
|
||||
def post(self, request, id):
|
||||
"""Update a Manage.
|
||||
|
||||
Returns the updated Manage object on success.
|
||||
"""
|
||||
manage = client.manage_update(request, id, **request.DATA)
|
||||
return rest_utils.CreatedResponse(
|
||||
'/api/castellan/manage/%s' % manage.uuid,
|
||||
manage.to_dict())
|
||||
|
||||
|
||||
@urls.register
|
||||
class Manages(generic.View):
|
||||
"""API for Manages"""
|
||||
url_regex = r'castellan/manages/$'
|
||||
|
||||
@rest_utils.ajax()
|
||||
def get(self, request):
|
||||
"""Get a list of the Manages for a project.
|
||||
|
||||
The returned result is an object with property 'items' and each
|
||||
item under this is a Manage.
|
||||
"""
|
||||
result = client.manage_list(request)
|
||||
return {'items': [change_to_id(n.to_dict()) for n in result]}
|
||||
|
||||
@rest_utils.ajax(data_required=True)
|
||||
def delete(self, request):
|
||||
"""Delete one or more Manages by id.
|
||||
|
||||
Returns HTTP 204 (no content) on successful deletion.
|
||||
"""
|
||||
for id in request.DATA:
|
||||
client.manage_delete(request, id)
|
||||
|
||||
@rest_utils.ajax(data_required=True)
|
||||
def put(self, request):
|
||||
"""Create a new Manage.
|
||||
|
||||
Returns the new Manage object on success.
|
||||
"""
|
||||
manage = client.manage_create(request, **request.DATA)
|
||||
return rest_utils.CreatedResponse(
|
||||
'/api/castellan/manage/%s' % manage.uuid,
|
||||
manage.to_dict())
|
|
@ -1,23 +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.
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
import horizon
|
||||
|
||||
# This panel will be loaded from horizon, because specified in enabled file.
|
||||
# To register REST api, import below here.
|
||||
from castellan_ui.api import rest_api # noqa: F401
|
||||
|
||||
|
||||
class Manages(horizon.Panel):
|
||||
name = _("Manages")
|
||||
slug = "manages"
|
|
@ -1,19 +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.
|
||||
|
||||
from openstack_dashboard.test import helpers as test
|
||||
|
||||
|
||||
class ManagesTests(test.TestCase):
|
||||
# Unit tests for manage.
|
||||
def test_me(self):
|
||||
self.assertTrue(1 + 1 == 2)
|
|
@ -1,20 +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.
|
||||
|
||||
from django.conf.urls import url
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from horizon.browsers import views
|
||||
|
||||
title = _("Manages")
|
||||
urlpatterns = [
|
||||
url('', views.AngularIndexView.as_view(title=title), name='index'),
|
||||
]
|
|
@ -1,36 +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.
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
# The slug of the panel group to be added to HORIZON_CONFIG. Required.
|
||||
PANEL_GROUP = 'castellan'
|
||||
# The display name of the PANEL_GROUP. Required.
|
||||
PANEL_GROUP_NAME = _('Castellan')
|
||||
# The slug of the dashboard the PANEL_GROUP associated with. Required.
|
||||
PANEL_GROUP_DASHBOARD = 'project'
|
||||
|
||||
ADD_INSTALLED_APPS = ['castellan_ui']
|
||||
|
||||
ADD_ANGULAR_MODULES = [
|
||||
'horizon.dashboard.castellan'
|
||||
]
|
||||
|
||||
ADD_JS_FILES = [
|
||||
'horizon/lib/angular/angular-route.js'
|
||||
]
|
||||
|
||||
ADD_SCSS_FILES = [
|
||||
'dashboard/castellan/castellan.scss'
|
||||
]
|
||||
|
||||
AUTO_DISCOVER_STATIC_FILES = True
|
|
@ -1,21 +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.
|
||||
|
||||
# The slug of the panel to be added to HORIZON_CONFIG. Required.
|
||||
PANEL = 'manages'
|
||||
# The slug of the panel group the PANEL is associated with.
|
||||
PANEL_GROUP = 'castellan'
|
||||
# The slug of the dashboard the PANEL associated with. Required.
|
||||
PANEL_DASHBOARD = 'project'
|
||||
|
||||
# Python panel class of the PANEL to be added.
|
||||
ADD_PANEL = 'castellan_ui.content.manages.panel.Manages'
|
|
@ -1,37 +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
|
||||
* @name horizon.dashboard.castellan
|
||||
* @description
|
||||
* Dashboard module to host various castellan panels.
|
||||
*/
|
||||
angular
|
||||
.module('horizon.dashboard.castellan', [
|
||||
'horizon.dashboard.castellan.manages',
|
||||
'ngRoute'
|
||||
])
|
||||
.config(config)
|
||||
|
||||
config.$inject = ['$provide', '$windowProvider', '$routeProvider'];
|
||||
|
||||
function config($provide, $windowProvider, $routeProvider) {
|
||||
var path = $windowProvider.$get().STATIC_URL + 'dashboard/castellan/';
|
||||
$provide.constant('horizon.dashboard.castellan.basePath', path);
|
||||
}
|
||||
})();
|
|
@ -1,23 +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';
|
||||
|
||||
describe('horizon.dashboard.castellan', function() {
|
||||
it('should exist', function() {
|
||||
expect(angular.module('horizon.dashboard.castellan')).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
})();
|
|
@ -1,8 +0,0 @@
|
|||
@import "manages/manages";
|
||||
|
||||
.batch-action {
|
||||
float: right;
|
||||
action-list {
|
||||
padding-left: 0.3em;
|
||||
}
|
||||
}
|
|
@ -1,81 +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';
|
||||
|
||||
angular
|
||||
.module('horizon.app.core.openstack-service-api')
|
||||
.factory('horizon.app.core.openstack-service-api.castellan', API);
|
||||
|
||||
API.$inject = [
|
||||
'horizon.framework.util.http.service',
|
||||
'horizon.framework.widgets.toast.service',
|
||||
'horizon.framework.util.i18n.gettext'
|
||||
];
|
||||
|
||||
function API(apiService, toastService, gettext) {
|
||||
var service = {
|
||||
getManage: getManage,
|
||||
getManages: getManages,
|
||||
createManage: createManage,
|
||||
updateManage: updateManage,
|
||||
deleteManage: deleteManage,
|
||||
};
|
||||
|
||||
return service;
|
||||
|
||||
///////////////
|
||||
// Manages //
|
||||
///////////////
|
||||
|
||||
function getManage(id) {
|
||||
return apiService.get('/api/castellan/manages/' + id)
|
||||
.error(function() {
|
||||
var msg = gettext('Unable to retrieve the Manage with id: %(id)s.');
|
||||
toastService.add('error', interpolate(msg, {id: id}, true));
|
||||
});
|
||||
}
|
||||
|
||||
function getManages() {
|
||||
return apiService.get('/api/castellan/manages/')
|
||||
.error(function() {
|
||||
toastService.add('error', gettext('Unable to retrieve the Manages.'));
|
||||
});
|
||||
}
|
||||
|
||||
function createManage(params) {
|
||||
return apiService.put('/api/castellan/manages/', params)
|
||||
.error(function() {
|
||||
var msg = gettext('Unable to create the Manage with name: %(name)s');
|
||||
toastService.add('error', interpolate(msg, { name: params.name }, true));
|
||||
});
|
||||
}
|
||||
|
||||
function updateManage(id, params) {
|
||||
return apiService.post('/api/castellan/manages/' + id, params)
|
||||
.error(function() {
|
||||
var msg = gettext('Unable to update the Manage with id: %(id)s');
|
||||
toastService.add('error', interpolate(msg, { id: params.id }, true));
|
||||
});
|
||||
}
|
||||
|
||||
function deleteManage(id, suppressError) {
|
||||
var promise = apiService.delete('/api/castellan/manages/', [id]);
|
||||
return suppressError ? promise : promise.error(function() {
|
||||
var msg = gettext('Unable to delete the Manage with id: %(id)s');
|
||||
toastService.add('error', interpolate(msg, { id: id }, true));
|
||||
});
|
||||
}
|
||||
}
|
||||
}());
|
|
@ -1,87 +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.castellan.manages.actions
|
||||
*
|
||||
* @description
|
||||
* Provides all of the actions for Manages.
|
||||
*/
|
||||
angular
|
||||
.module('horizon.dashboard.castellan.manages.actions', [
|
||||
'horizon.framework',
|
||||
'horizon.dashboard.castellan'
|
||||
])
|
||||
.run(registerManageActions);
|
||||
|
||||
registerManageActions.$inject = [
|
||||
'horizon.framework.conf.resource-type-registry.service',
|
||||
'horizon.framework.util.i18n.gettext',
|
||||
'horizon.dashboard.castellan.manages.create.service',
|
||||
'horizon.dashboard.castellan.manages.update.service',
|
||||
'horizon.dashboard.castellan.manages.delete.service',
|
||||
'horizon.dashboard.castellan.manages.resourceType'
|
||||
];
|
||||
|
||||
function registerManageActions (
|
||||
registry,
|
||||
gettext,
|
||||
createManageService,
|
||||
updateManageService,
|
||||
deleteManageService,
|
||||
resourceType
|
||||
) {
|
||||
var managesResourceType = registry.getResourceType(resourceType);
|
||||
managesResourceType.globalActions
|
||||
.append({
|
||||
id: 'createManageAction',
|
||||
service: createManageService,
|
||||
template: {
|
||||
type: 'create',
|
||||
text: gettext('Create Manage')
|
||||
}
|
||||
});
|
||||
|
||||
managesResourceType.batchActions
|
||||
.append({
|
||||
id: 'batchDeleteManageAction',
|
||||
service: deleteManageService,
|
||||
template: {
|
||||
type: 'delete-selected',
|
||||
text: gettext('Delete Manages')
|
||||
}
|
||||
});
|
||||
|
||||
managesResourceType.itemActions
|
||||
.append({
|
||||
id: 'updateManageAction',
|
||||
service: updateManageService,
|
||||
template: {
|
||||
text: gettext('Update Manage')
|
||||
}
|
||||
})
|
||||
.append({
|
||||
id: 'deleteManageAction',
|
||||
service: deleteManageService,
|
||||
template: {
|
||||
type: 'delete',
|
||||
text: gettext('Delete Manage')
|
||||
}
|
||||
});
|
||||
}
|
||||
})();
|
|
@ -1,103 +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
|
||||
* @name horizon.dashboard.castellan.manages.create.service
|
||||
* @description Service for the manage create modal
|
||||
*/
|
||||
angular
|
||||
.module('horizon.dashboard.castellan.manages')
|
||||
.factory('horizon.dashboard.castellan.manages.create.service', createService);
|
||||
|
||||
createService.$inject = [
|
||||
'$location',
|
||||
'horizon.app.core.openstack-service-api.castellan',
|
||||
'horizon.app.core.openstack-service-api.policy',
|
||||
'horizon.framework.util.actions.action-result.service',
|
||||
'horizon.framework.util.i18n.gettext',
|
||||
'horizon.framework.util.q.extensions',
|
||||
'horizon.framework.widgets.toast.service',
|
||||
'horizon.dashboard.castellan.manages.events',
|
||||
'horizon.dashboard.castellan.manages.model',
|
||||
'horizon.dashboard.castellan.manages.resourceType',
|
||||
'horizon.dashboard.castellan.manages.workflow'
|
||||
];
|
||||
|
||||
function createService(
|
||||
$location, api, policy, actionResult, gettext, $qExtensions,
|
||||
toast, events, model, resourceType, workflow
|
||||
) {
|
||||
|
||||
var message = {
|
||||
success: gettext('Manage %s was successfully created.')
|
||||
};
|
||||
|
||||
var service = {
|
||||
initAction: initAction,
|
||||
perform: perform,
|
||||
allowed: allowed
|
||||
};
|
||||
|
||||
return service;
|
||||
|
||||
//////////////
|
||||
|
||||
// fixme: include this function in your service
|
||||
// if you plan to emit events to the parent controller,
|
||||
// otherwise remove it
|
||||
function initAction() {
|
||||
}
|
||||
|
||||
// fixme: if newScope is unnecessary, remove it
|
||||
/* eslint-disable no-unused-vars */
|
||||
function perform(selected, newScope) {
|
||||
// modal title, buttons
|
||||
var title, submitText, submitIcon;
|
||||
title = gettext("Create Manage");
|
||||
submitText = gettext("Create");
|
||||
submitIcon = "fa fa-check";
|
||||
model.init();
|
||||
|
||||
var result = workflow.init(title, submitText, submitIcon, model.spec);
|
||||
return result.then(submit);
|
||||
}
|
||||
|
||||
function allowed() {
|
||||
return $qExtensions.booleanAsPromise(true);
|
||||
// fixme: if you need to set policy, change as follow
|
||||
//return policy.ifAllowed({ rules: [['manage', 'create_manage']] });
|
||||
}
|
||||
|
||||
function submit() {
|
||||
model.cleanProperties();
|
||||
return api.createManage(model.spec).then(success);
|
||||
}
|
||||
|
||||
function success(response) {
|
||||
response.data.id = response.data.uuid;
|
||||
toast.add('success', interpolate(message.success, [response.data.id]));
|
||||
var result = actionResult.getActionResult()
|
||||
.created(resourceType, response.data.id);
|
||||
if (result.result.failed.length === 0 && result.result.created.length > 0) {
|
||||
$location.path('/project/manages');
|
||||
} else {
|
||||
return result.result;
|
||||
}
|
||||
}
|
||||
}
|
||||
})();
|
|
@ -1,156 +0,0 @@
|
|||
/**
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
* not use self 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 factory
|
||||
* @name horizon.dashboard.castellan.manages.delete.service
|
||||
* @Description
|
||||
* Brings up the delete manages confirmation modal dialog.
|
||||
* On submit, delete selected resources.
|
||||
* On cancel, do nothing.
|
||||
*/
|
||||
angular
|
||||
.module('horizon.dashboard.castellan.manages')
|
||||
.factory('horizon.dashboard.castellan.manages.delete.service', deleteService);
|
||||
|
||||
deleteService.$inject = [
|
||||
'$location',
|
||||
'$q',
|
||||
'horizon.app.core.openstack-service-api.castellan',
|
||||
'horizon.app.core.openstack-service-api.policy',
|
||||
'horizon.framework.util.actions.action-result.service',
|
||||
'horizon.framework.util.i18n.gettext',
|
||||
'horizon.framework.util.q.extensions',
|
||||
'horizon.framework.widgets.modal.deleteModalService',
|
||||
'horizon.framework.widgets.toast.service',
|
||||
'horizon.dashboard.castellan.manages.resourceType',
|
||||
'horizon.dashboard.castellan.manages.events'
|
||||
];
|
||||
|
||||
function deleteService(
|
||||
$location, $q, api, policy, actionResult, gettext, $qExtensions,
|
||||
deleteModal, toast, resourceType, events
|
||||
) {
|
||||
var scope;
|
||||
var context = {
|
||||
labels: null,
|
||||
deleteEntity: deleteEntity,
|
||||
successEvent: events.DELETE_SUCCESS
|
||||
};
|
||||
var service = {
|
||||
initAction: initAction,
|
||||
allowed: allowed,
|
||||
perform: perform
|
||||
};
|
||||
var notAllowedMessage =
|
||||
gettext("You are not allowed to delete manages: %s");
|
||||
|
||||
return service;
|
||||
|
||||
//////////////
|
||||
|
||||
// fixme: include this function in your service
|
||||
// if you plan to emit events to the parent controller,
|
||||
// otherwise remove it
|
||||
function initAction() {
|
||||
}
|
||||
|
||||
function allowed() {
|
||||
return $qExtensions.booleanAsPromise(true);
|
||||
// fixme: if you need to set policy, change as follow
|
||||
//return policy.ifAllowed({ rules: [['manage', 'delete_manage']] });
|
||||
}
|
||||
|
||||
// delete selected resource objects
|
||||
function perform(selected, newScope) {
|
||||
scope = newScope;
|
||||
selected = angular.isArray(selected) ? selected : [selected];
|
||||
context.labels = labelize(selected.length);
|
||||
return $qExtensions.allSettled(selected.map(checkPermission)).then(afterCheck);
|
||||
}
|
||||
|
||||
function labelize(count) {
|
||||
return {
|
||||
title: ngettext('Confirm Delete Manage',
|
||||
'Confirm Delete Manages', count),
|
||||
/* eslint-disable max-len */
|
||||
message: ngettext('You have selected "%s". Please confirm your selection. Deleted manage is not recoverable.',
|
||||
'You have selected "%s". Please confirm your selection. Deleted manages are not recoverable.', count),
|
||||
/* eslint-enable max-len */
|
||||
submit: ngettext('Delete Manage',
|
||||
'Delete Manages', count),
|
||||
success: ngettext('Deleted Manage: %s.',
|
||||
'Deleted Manages: %s.', count),
|
||||
error: ngettext('Unable to delete Manage: %s.',
|
||||
'Unable to delete Manages: %s.', count)
|
||||
};
|
||||
}
|
||||
|
||||
// for batch delete
|
||||
function checkPermission(selected) {
|
||||
return {promise: allowed(selected), context: selected};
|
||||
}
|
||||
|
||||
// for batch delete
|
||||
function afterCheck(result) {
|
||||
var outcome = $q.reject(); // Reject the promise by default
|
||||
if (result.fail.length > 0) {
|
||||
toast.add('error', getMessage(notAllowedMessage, result.fail));
|
||||
outcome = $q.reject(result.fail);
|
||||
}
|
||||
if (result.pass.length > 0) {
|
||||
outcome = deleteModal.open(scope, result.pass.map(getEntity), context).then(createResult);
|
||||
}
|
||||
return outcome;
|
||||
}
|
||||
|
||||
function createResult(deleteModalResult) {
|
||||
// To make the result of this action generically useful, reformat the return
|
||||
// from the deleteModal into a standard form
|
||||
var result = actionResult.getActionResult();
|
||||
deleteModalResult.pass.forEach(function markDeleted(item) {
|
||||
result.deleted(resourceType, getEntity(item).id);
|
||||
});
|
||||
deleteModalResult.fail.forEach(function markFailed(item) {
|
||||
result.failed(resourceType, getEntity(item).id);
|
||||
});
|
||||
if (result.result.failed.length === 0 && result.result.deleted.length > 0) {
|
||||
$location.path('/project/manages');
|
||||
} else {
|
||||
return result.result;
|
||||
}
|
||||
}
|
||||
|
||||
function getMessage(message, entities) {
|
||||
return interpolate(message, [entities.map(getName).join(", ")]);
|
||||
}
|
||||
|
||||
function getName(result) {
|
||||
return getEntity(result).name;
|
||||
}
|
||||
|
||||
// for batch delete
|
||||
function getEntity(result) {
|
||||
return result.context;
|
||||
}
|
||||
|
||||
// call delete REST API
|
||||
function deleteEntity(id) {
|
||||
return api.deleteManage(id, true);
|
||||
}
|
||||
}
|
||||
})();
|
|
@ -1,122 +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
|
||||
* @name horizon.dashboard.castellan.manages.update.service
|
||||
* @description Service for the manage update modal
|
||||
*/
|
||||
angular
|
||||
.module('horizon.dashboard.castellan.manages')
|
||||
.factory('horizon.dashboard.castellan.manages.update.service', updateService);
|
||||
|
||||
updateService.$inject = [
|
||||
'$location',
|
||||
'horizon.app.core.openstack-service-api.castellan',
|
||||
'horizon.app.core.openstack-service-api.policy',
|
||||
'horizon.framework.util.actions.action-result.service',
|
||||
'horizon.framework.util.i18n.gettext',
|
||||
'horizon.framework.util.q.extensions',
|
||||
'horizon.framework.widgets.toast.service',
|
||||
'horizon.dashboard.castellan.manages.events',
|
||||
'horizon.dashboard.castellan.manages.model',
|
||||
'horizon.dashboard.castellan.manages.resourceType',
|
||||
'horizon.dashboard.castellan.manages.workflow'
|
||||
];
|
||||
|
||||
function updateService(
|
||||
$location, api, policy, actionResult, gettext, $qExtensions,
|
||||
toast, events, model, resourceType, workflow
|
||||
) {
|
||||
|
||||
var message = {
|
||||
success: gettext('Manage %s was successfully updated.')
|
||||
};
|
||||
|
||||
var service = {
|
||||
initAction: initAction,
|
||||
perform: perform,
|
||||
allowed: allowed
|
||||
};
|
||||
|
||||
var id;
|
||||
|
||||
return service;
|
||||
|
||||
//////////////
|
||||
|
||||
// fixme: include this function in your service
|
||||
// if you plan to emit events to the parent controller,
|
||||
// otherwise remove it
|
||||
function initAction() {
|
||||
}
|
||||
|
||||
// fixme: if newScope is unnecessary, remove it
|
||||
/* eslint-disable no-unused-vars */
|
||||
function perform(selected, newScope) {
|
||||
// modal title, buttons
|
||||
var title, submitText, submitIcon;
|
||||
title = gettext("Update Manage");
|
||||
submitText = gettext("Update");
|
||||
submitIcon = "fa fa-check";
|
||||
model.init();
|
||||
|
||||
// load current data
|
||||
id = selected.id;
|
||||
var deferred = api.getManage(id);
|
||||
deferred.then(onLoad);
|
||||
|
||||
function onLoad(response) {
|
||||
model.spec.id = response.data.id;
|
||||
model.spec.name = response.data.name;
|
||||
model.spec.description = response.data.description;
|
||||
model.spec.enabled = response.data.enabled;
|
||||
model.spec.size = response.data.size;
|
||||
model.spec.temperature = response.data.temperature;
|
||||
model.spec.base = response.data.base;
|
||||
model.spec.flavor = response.data.flavor;
|
||||
model.spec.topping = response.data.topping;
|
||||
}
|
||||
|
||||
var result = workflow.init(title, submitText, submitIcon, model.spec);
|
||||
return result.then(submit);
|
||||
}
|
||||
|
||||
function allowed() {
|
||||
return $qExtensions.booleanAsPromise(true);
|
||||
// fixme: if you need to set policy, change as follow
|
||||
//return policy.ifAllowed({ rules: [['manage', 'update_manage']] });
|
||||
}
|
||||
|
||||
function submit() {
|
||||
model.cleanProperties();
|
||||
return api.updateManage(id, model.spec).then(success);
|
||||
}
|
||||
|
||||
function success(response) {
|
||||
response.data.id = response.data.uuid;
|
||||
toast.add('success', interpolate(message.success, [response.data.id]));
|
||||
var result = actionResult.getActionResult()
|
||||
.updated(resourceType, response.data.id);
|
||||
if (result.result.failed.length === 0 && result.result.updated.length > 0) {
|
||||
$location.path('/project/manages');
|
||||
} else {
|
||||
return result.result;
|
||||
}
|
||||
}
|
||||
}
|
||||
})();
|
|
@ -1,57 +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.castellan.manages.details
|
||||
*
|
||||
* @description
|
||||
* Provides details features for Manage.
|
||||
*/
|
||||
angular
|
||||
.module('horizon.dashboard.castellan.manages.details', [
|
||||
'horizon.app.core',
|
||||
'horizon.framework.conf'
|
||||
])
|
||||
.run(registerDetails);
|
||||
|
||||
registerDetails.$inject = [
|
||||
'horizon.app.core.openstack-service-api.castellan',
|
||||
'horizon.dashboard.castellan.manages.basePath',
|
||||
'horizon.dashboard.castellan.manages.resourceType',
|
||||
'horizon.framework.conf.resource-type-registry.service'
|
||||
];
|
||||
|
||||
function registerDetails(
|
||||
api,
|
||||
basePath,
|
||||
resourceType,
|
||||
registry
|
||||
) {
|
||||
registry.getResourceType(resourceType)
|
||||
.setLoadFunction(loadFunction)
|
||||
.detailsViews.append({
|
||||
id: 'manageDetailsOverview',
|
||||
name: gettext('Overview'),
|
||||
template: basePath + 'details/overview.html'
|
||||
});
|
||||
|
||||
function loadFunction(identifier) {
|
||||
return api.getManage(identifier);
|
||||
}
|
||||
}
|
||||
})();
|
|
@ -1,6 +0,0 @@
|
|||
<hz-resource-property-list
|
||||
resource-type-name="OS::Castellan::Manage"
|
||||
item="item"
|
||||
property-groups="[['id'],
|
||||
['topping', 'created_at', 'updated_at']]">
|
||||
</hz-resource-property-list>
|
|
@ -1,43 +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";
|
||||
|
||||
angular
|
||||
.module('horizon.dashboard.castellan.manages')
|
||||
.controller('horizon.dashboard.castellan.manages.OverviewController', controller);
|
||||
|
||||
controller.$inject = [
|
||||
'$scope',
|
||||
'horizon.dashboard.castellan.manages.resourceType',
|
||||
'horizon.dashboard.castellan.manages.events',
|
||||
'horizon.framework.conf.resource-type-registry.service'
|
||||
];
|
||||
|
||||
function controller(
|
||||
$scope,
|
||||
resourceType,
|
||||
events,
|
||||
registry
|
||||
) {
|
||||
var ctrl = this;
|
||||
ctrl.manage = {};
|
||||
|
||||
$scope.context.loadPromise.then(onGetManage);
|
||||
|
||||
function onGetManage(manage) {
|
||||
ctrl.manage = manage.data;
|
||||
}
|
||||
}
|
||||
})();
|
|
@ -1,16 +0,0 @@
|
|||
<div ng-controller="horizon.dashboard.castellan.manages.OverviewController as ctrl">
|
||||
<div class="row">
|
||||
<div class="col-md-12 detail">
|
||||
<h3 translate>Manage</h3>
|
||||
<hr>
|
||||
<hz-resource-property-list
|
||||
resource-type-name="OS::Castellan::Manage"
|
||||
cls="dl-horizontal"
|
||||
item="ctrl.manage"
|
||||
property-groups="[['name', 'description', 'enabled'],
|
||||
['size', 'temperature', 'base', 'flavor', 'topping'],
|
||||
['id', 'created_at', 'updated_at']]">
|
||||
</hz-resource-property-list>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,166 +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
|
||||
* @name horizon.dashboard.castellan.manages
|
||||
* @ngModule
|
||||
* @description
|
||||
* Provides all the services and widgets require to display the Manage
|
||||
* panel
|
||||
*/
|
||||
angular
|
||||
.module('horizon.dashboard.castellan.manages', [
|
||||
'ngRoute',
|
||||
'horizon.dashboard.castellan.manages.actions',
|
||||
'horizon.dashboard.castellan.manages.details'
|
||||
])
|
||||
.constant('horizon.dashboard.castellan.manages.events', events())
|
||||
.constant('horizon.dashboard.castellan.manages.resourceType', 'OS::Castellan::Manage')
|
||||
.run(run)
|
||||
.config(config);
|
||||
|
||||
/**
|
||||
* @ngdoc constant
|
||||
* @name horizon.dashboard.castellan.manages.events
|
||||
* @description A list of events used by Manage
|
||||
*/
|
||||
function events() {
|
||||
return {
|
||||
CREATE_SUCCESS: 'horizon.dashboard.castellan.manages.CREATE_SUCCESS',
|
||||
DELETE_SUCCESS: 'horizon.dashboard.castellan.manages.DELETE_SUCCESS'
|
||||
};
|
||||
}
|
||||
|
||||
run.$inject = [
|
||||
'horizon.framework.conf.resource-type-registry.service',
|
||||
'horizon.dashboard.castellan.manages.service',
|
||||
'horizon.dashboard.castellan.manages.basePath',
|
||||
'horizon.dashboard.castellan.manages.resourceType'
|
||||
];
|
||||
|
||||
function run(registry, service, basePath, resourceType) {
|
||||
registry.getResourceType(resourceType)
|
||||
.setNames(gettext('Manage'), gettext('Manages'))
|
||||
// for detail summary view on table row
|
||||
.setSummaryTemplateUrl(basePath + 'details/drawer.html')
|
||||
// for table row items and detail summary view.
|
||||
.setProperties(properties())
|
||||
.setListFunction(service.getPromise)
|
||||
.tableColumns
|
||||
.append({
|
||||
id: 'name',
|
||||
priority: 1,
|
||||
sortDefault: true,
|
||||
filters: ['noName'],
|
||||
urlFunction: service.urlFunction
|
||||
})
|
||||
.append({
|
||||
id: 'size',
|
||||
priority: 1,
|
||||
filters: ['noValue']
|
||||
})
|
||||
.append({
|
||||
id: 'temperature',
|
||||
priority: 1,
|
||||
filters: ['noValue']
|
||||
})
|
||||
.append({
|
||||
id: 'base',
|
||||
priority: 1,
|
||||
filters: ['noValue']
|
||||
})
|
||||
.append({
|
||||
id: 'flavor',
|
||||
priority: 1,
|
||||
filters: ['noValue']
|
||||
})
|
||||
.append({
|
||||
id: 'topping',
|
||||
priority: 2,
|
||||
filters: ['noValue']
|
||||
})
|
||||
.append({
|
||||
id: 'created_at',
|
||||
priority: 2
|
||||
})
|
||||
.append({
|
||||
id: 'updated_at',
|
||||
priority: 2
|
||||
});
|
||||
// for magic-search
|
||||
registry.getResourceType(resourceType).filterFacets
|
||||
.append({
|
||||
'label': gettext('Name'),
|
||||
'name': 'name',
|
||||
'singleton': true
|
||||
})
|
||||
.append({
|
||||
'label': gettext('Base'),
|
||||
'name': 'base',
|
||||
'singleton': true
|
||||
})
|
||||
.append({
|
||||
'label': gettext('Flavor'),
|
||||
'name': 'flavor',
|
||||
'singleton': true
|
||||
})
|
||||
.append({
|
||||
'label': gettext('ID'),
|
||||
'name': 'id',
|
||||
'singleton': true
|
||||
});
|
||||
}
|
||||
|
||||
function properties() {
|
||||
return {
|
||||
id: { label: gettext('ID'), filters: ['noValue'] },
|
||||
name: { label: gettext('Name'), filters: ['noName'] },
|
||||
description: { label: gettext('Description'), filters: ['noValue'] },
|
||||
enabled: { label: gettext('Enabled'), filters: ['yesno'] },
|
||||
size: { label: gettext('Size'), filters: ['noValue'] },
|
||||
temperature: { label: gettext('Temperature'), filters: ['noValue'] },
|
||||
base: { label: gettext('Base'), filters: ['noValue'] },
|
||||
flavor: { label: gettext('Flavor'), filters: ['noValue'] },
|
||||
topping: { label: gettext('Topping'), filters: ['noValue'] },
|
||||
created_at: { label: gettext('Created'), filters: ['simpleDate', 'noValue'] },
|
||||
updated_at: { label: gettext('Updated'), filters: ['simpleDate', 'noValue'] }
|
||||
};
|
||||
}
|
||||
|
||||
config.$inject = [
|
||||
'$provide',
|
||||
'$windowProvider',
|
||||
'$routeProvider'
|
||||
];
|
||||
|
||||
/**
|
||||
* @name config
|
||||
* @param {Object} $provide
|
||||
* @param {Object} $windowProvider
|
||||
* @param {Object} $routeProvider
|
||||
* @description Routes used by this module.
|
||||
* @returns {undefined} Returns nothing
|
||||
*/
|
||||
function config($provide, $windowProvider, $routeProvider) {
|
||||
var path = $windowProvider.$get().STATIC_URL + 'dashboard/castellan/manages/';
|
||||
$provide.constant('horizon.dashboard.castellan.manages.basePath', path);
|
||||
$routeProvider.when('/project/manages', {
|
||||
templateUrl: path + 'panel.html'
|
||||
});
|
||||
}
|
||||
})();
|
|
@ -1,23 +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';
|
||||
|
||||
describe('horizon.dashboard.castellan.manages', function() {
|
||||
it('should exist', function() {
|
||||
expect(angular.module('horizon.dashboard.castellan.manages')).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
})();
|
|
@ -1,62 +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";
|
||||
|
||||
angular.module('horizon.dashboard.castellan.manages')
|
||||
.factory('horizon.dashboard.castellan.manages.service',
|
||||
service);
|
||||
|
||||
service.$inject = [
|
||||
'$filter',
|
||||
'horizon.app.core.detailRoute',
|
||||
'horizon.app.core.openstack-service-api.castellan'
|
||||
];
|
||||
|
||||
/*
|
||||
* @ngdoc factory
|
||||
* @name horizon.dashboard.castellan.manages.service
|
||||
*
|
||||
* @description
|
||||
* This service provides functions that are used through the Manages
|
||||
* features. These are primarily used in the module registrations
|
||||
* but do not need to be restricted to such use. Each exposed function
|
||||
* is documented below.
|
||||
*/
|
||||
function service($filter, detailRoute, api) {
|
||||
return {
|
||||
getPromise: getPromise,
|
||||
urlFunction: urlFunction
|
||||
};
|
||||
|
||||
function getPromise(params) {
|
||||
return api.getManages(params).then(modifyResponse);
|
||||
}
|
||||
|
||||
function modifyResponse(response) {
|
||||
return {data: {items: response.data.items.map(modifyItem)}};
|
||||
|
||||
function modifyItem(item) {
|
||||
var timestamp = item.updated_at ? item.updated_at : item.created_at;
|
||||
item.trackBy = item.id.concat(timestamp);
|
||||
return item;
|
||||
};
|
||||
}
|
||||
|
||||
function urlFunction(item) {
|
||||
return detailRoute + 'OS::Castellan::Manage/' + item.id;
|
||||
}
|
||||
}
|
||||
})();
|
|
@ -1,51 +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";
|
||||
|
||||
describe('Manages service', function() {
|
||||
var service;
|
||||
beforeEach(module('horizon.dashboard.castellan.manages'));
|
||||
beforeEach(inject(function($injector) {
|
||||
service = $injector.get('horizon.dashboard.castellan.manages.service');
|
||||
}));
|
||||
|
||||
describe('getPromise', function() {
|
||||
it("provides a promise", inject(function($q, $injector, $timeout) {
|
||||
var api = $injector.get('horizon.app.core.openstack-service-api.castellan');
|
||||
var deferred = $q.defer();
|
||||
spyOn(api, 'getManages').and.returnValue(deferred.promise);
|
||||
var result = service.getPromise({});
|
||||
deferred.resolve({
|
||||
data:{
|
||||
items: [{id: 123, name: 'resource1'}]
|
||||
}
|
||||
});
|
||||
$timeout.flush();
|
||||
expect(api.getManages).toHaveBeenCalled();
|
||||
expect(result.$$state.value.data.items[0].name).toBe('resource1');
|
||||
}));
|
||||
});
|
||||
|
||||
describe('urlFunction', function() {
|
||||
it("get url", inject(function() {
|
||||
var detailRoute = $injector.get('horizon.app.core.detailRoute');
|
||||
var result = service.urlFunction({id:"123abc"});
|
||||
expect(result).toBe(detailRoute + "OS::Castellan::Manage/123abc");
|
||||
}));
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
})();
|
|
@ -1,5 +0,0 @@
|
|||
<hz-resource-panel resource-type-name="OS::Castellan::Manage">
|
||||
<hz-resource-table resource-type-name="OS::Castellan::Manage"
|
||||
track-by="trackBy">
|
||||
</hz-resource-table>
|
||||
</hz-resource-panel>
|
|
@ -1,4 +0,0 @@
|
|||
<dl>
|
||||
<dt translate>Manage Name</dt>
|
||||
<dd translate>An arbitrary human-readable name</dd>
|
||||
</dl>
|
|
@ -1,62 +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 model
|
||||
* @name horizon.dashboard.castellan.manages.model
|
||||
* @description Service for the manage model
|
||||
*/
|
||||
angular
|
||||
.module('horizon.dashboard.castellan.manages')
|
||||
.factory('horizon.dashboard.castellan.manages.model', model);
|
||||
|
||||
model.$inject = [
|
||||
];
|
||||
|
||||
function model() {
|
||||
var model = {
|
||||
// params
|
||||
"spec": {},
|
||||
|
||||
// methods
|
||||
"init": init,
|
||||
"cleanProperties": cleanProperties
|
||||
};
|
||||
|
||||
function init() {
|
||||
// initialize model
|
||||
model.spec = {
|
||||
"id": "",
|
||||
"name": "", // text required
|
||||
"description": "", // textarea
|
||||
"enabled": true, // checkbox
|
||||
"size": "M", // radio
|
||||
"temperature": "H", // radio
|
||||
"base": "", // select
|
||||
"flavor": "", // select
|
||||
"topping": "" // checkboxes
|
||||
};
|
||||
}
|
||||
|
||||
function cleanProperties() {
|
||||
delete model.spec.id;
|
||||
delete model.spec.tabs;
|
||||
}
|
||||
|
||||
return model;
|
||||
}
|
||||
})();
|
|
@ -1,6 +0,0 @@
|
|||
<dl>
|
||||
<dt translate>Base</dt>
|
||||
<dd translate>Choose base drink.</dd>
|
||||
<dt translate>Other options</dt>
|
||||
<dd translate>Choose favorite options.</dd>
|
||||
</dl>
|
|
@ -1,210 +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 workflow
|
||||
* @name horizon.dashboard.castellan.manages.workflow
|
||||
* @description Service for the create/update workflow
|
||||
*/
|
||||
angular
|
||||
.module('horizon.dashboard.castellan.manages')
|
||||
.factory('horizon.dashboard.castellan.manages.workflow', workflow);
|
||||
|
||||
workflow.$inject = [
|
||||
'horizon.dashboard.castellan.basePath',
|
||||
'horizon.framework.util.i18n.gettext',
|
||||
'horizon.framework.widgets.form.ModalFormService'
|
||||
];
|
||||
|
||||
function workflow(basePath, gettext, modal) {
|
||||
var workflow = {
|
||||
init: init
|
||||
};
|
||||
|
||||
function init(title, submitText, submitIcon, model) {
|
||||
var schema, form;
|
||||
|
||||
// schema
|
||||
schema = {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"title": gettext("Name"),
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"title": gettext("Description"),
|
||||
"type": "string"
|
||||
},
|
||||
"enabled": {
|
||||
"title": gettext("Enabled"),
|
||||
"type": "boolean",
|
||||
"default": true
|
||||
},
|
||||
"size": {
|
||||
"title": gettext("Size"),
|
||||
"type": "string",
|
||||
"default": "M"
|
||||
},
|
||||
"temperature": {
|
||||
"title": gettext("Temperature"),
|
||||
"type": "string",
|
||||
"default": "H"
|
||||
},
|
||||
"base": {
|
||||
"title": gettext("Base"),
|
||||
"type": "string",
|
||||
"default": ""
|
||||
},
|
||||
"flavor": {
|
||||
"title": gettext("Flavor"),
|
||||
"type": "string",
|
||||
"default": ""
|
||||
},
|
||||
"topping": {
|
||||
"title": gettext("Topping")
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// form
|
||||
form = [
|
||||
{
|
||||
"type": "tabs",
|
||||
"tabs": [
|
||||
{
|
||||
"title": gettext("Info"),
|
||||
"help": basePath + "manages/workflow/info.help.html",
|
||||
"items": [
|
||||
{
|
||||
"key": "name",
|
||||
"placeholder": gettext("Name of the manage."),
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"key": "description",
|
||||
"type": "textarea"
|
||||
},
|
||||
{
|
||||
"key": "enabled",
|
||||
"type": "checkbox"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": gettext("Recipe"),
|
||||
"help": basePath + "manages/workflow/recipe.help.html",
|
||||
"items": [
|
||||
{
|
||||
"key": "size",
|
||||
"type": "radiobuttons",
|
||||
"titleMap": [
|
||||
{"value": "S", "name": gettext("Small")},
|
||||
{"value": "M", "name": gettext("Medium")},
|
||||
{"value": "L", "name": gettext("Large")},
|
||||
{"value": "XL", "name": gettext("Extra Large")}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "temperature",
|
||||
"type": "radiobuttons",
|
||||
"titleMap": [
|
||||
{"value": "H", "name": gettext("Hot")},
|
||||
{"value": "I", "name": gettext("Ice")}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "base",
|
||||
"type": "select",
|
||||
"titleMap": [
|
||||
{"value": "", "name": gettext("Choose base.")},
|
||||
{
|
||||
"value": "blend",
|
||||
"name": gettext("House Blend"),
|
||||
"group": gettext("Coffee")
|
||||
},
|
||||
{
|
||||
"value": "mandheling",
|
||||
"name": gettext("Mandheling"),
|
||||
"group": gettext("Coffee")},
|
||||
{
|
||||
"value": "colombia",
|
||||
"name": gettext("Colombia"),
|
||||
"group": gettext("Coffee")
|
||||
},
|
||||
{
|
||||
"value": "espresso",
|
||||
"name": gettext("Espresso"),
|
||||
"group": gettext("Coffee")
|
||||
},
|
||||
{
|
||||
"value": "earl_gray",
|
||||
"name": gettext("Earl Gray"),
|
||||
"group": gettext("Tea")
|
||||
},
|
||||
{
|
||||
"value": "darjeeling",
|
||||
"name": gettext("Darjeeling"),
|
||||
"group": gettext("Tea")},
|
||||
{
|
||||
"value": "orange_pekoe",
|
||||
"name": gettext("Orange Pekoe"),
|
||||
"group": gettext("Tea")
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "flavor",
|
||||
"type": "select",
|
||||
"titleMap": [
|
||||
{"value": "", "name": gettext("Choose flavor.")},
|
||||
{"value": "chocolate", "name": gettext("Chocolate")},
|
||||
{"value": "mocha", "name": gettext("Mocha")},
|
||||
{"value": "strawberry", "name": gettext("Strawberry")},
|
||||
{"value": "blueberry", "name": gettext("Blueberry")},
|
||||
{"value": "raspberry", "name": gettext("Raspberry")}
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "topping",
|
||||
"type": "checkboxes",
|
||||
"titleMap": [
|
||||
{"value": "clushed_nuts", "name": gettext("Clushed Nuts")},
|
||||
{"value": "whip_cream", "name": gettext("Whip Cream")},
|
||||
{"value": "mixed_serial", "name": gettext("Mixed Serial")}
|
||||
]
|
||||
}
|
||||
] // items
|
||||
} // tab
|
||||
] // tabs
|
||||
}
|
||||
]; // form
|
||||
|
||||
var config = {
|
||||
"title": title,
|
||||
"submitText": submitText,
|
||||
"schema": schema,
|
||||
"form": form,
|
||||
"model": model
|
||||
};
|
||||
|
||||
return modal.open(config);
|
||||
}
|
||||
|
||||
return workflow;
|
||||
}
|
||||
})();
|
|
@ -2,7 +2,7 @@
|
|||
Castellan UI
|
||||
===============================
|
||||
|
||||
Generic Key Manager interface UI plugin for Horizon
|
||||
Generic Key Manager UI Plugin for Horizon
|
||||
|
||||
* Free software: Apache license
|
||||
* Source: http://git.openstack.org/cgit/openstack/castellan-ui
|
||||
|
@ -30,4 +30,4 @@ Contributor Guide
|
|||
:glob:
|
||||
:maxdepth: 2
|
||||
|
||||
contributor/index
|
||||
contributor/index
|
||||
|
|
|
@ -42,12 +42,12 @@ Install Castellan UI with all dependencies in your virtual environment::
|
|||
|
||||
And enable it in Horizon::
|
||||
|
||||
ln -s ../castellan-ui/castellan_ui/enabled/_90_project_castellan_panelgroup.py openstack_dashboard/local/enabled
|
||||
ln -s ../castellan-ui/castellan_ui/enabled/_91_project_castellan_manages_panel.py openstack_dashboard/local/enabled
|
||||
ln -s ../castellan-ui/castellan_ui/enabled/_90_project_key_manager_panelgroup.py openstack_dashboard/local/enabled
|
||||
ln -s ../castellan-ui/castellan_ui/enabled/_91_project_key_manager_symmetric_keys_panel.py openstack_dashboard/local/enabled
|
||||
|
||||
To run horizon with the newly enabled Castellan UI plugin run::
|
||||
|
||||
./run_tests.sh --runserver 0.0.0.0:8080
|
||||
|
||||
to have the application start on port 8080 and the horizon dashboard will be
|
||||
available in your browser at http://localhost:8080/
|
||||
available in your browser at http://localhost:8080/
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[metadata]
|
||||
name = castellan-ui
|
||||
summary = Generic Key Manager interface UI plugin for Horizon
|
||||
summary = Generic Key Manager UI Plugin for Horizon
|
||||
description-file =
|
||||
README.rst
|
||||
author = OpenStack
|
||||
|
@ -26,4 +26,4 @@ packages =
|
|||
all_files = 1
|
||||
build-dir = doc/build
|
||||
source-dir = doc/source
|
||||
warning-is-error = 1
|
||||
warning-is-error = 1
|
||||
|
|
Loading…
Reference in New Issue