From 3b037deebd3aebe65a870d8e97ed2ab7f8618019 Mon Sep 17 00:00:00 2001 From: Shu Muto Date: Mon, 4 Jun 2018 17:32:11 +0900 Subject: [PATCH] Add rebuild action for container This patch adds "rebuild" action for container. Change-Id: I68732d40faecfe6ce80c38b8f8b417c0b704a288 Implements: blueprint build-action --- zun_ui/api/client.py | 4 + zun_ui/api/rest_api.py | 2 + .../container/containers/actions.module.js | 9 ++ .../containers/actions/rebuild.service.js | 149 ++++++++++++++++++ .../container/containers/containers.module.js | 1 + .../static/dashboard/container/zun.service.js | 6 + 6 files changed, 171 insertions(+) create mode 100644 zun_ui/static/dashboard/container/containers/actions/rebuild.service.js diff --git a/zun_ui/api/client.py b/zun_ui/api/client.py index 538aa9f..664d8da 100644 --- a/zun_ui/api/client.py +++ b/zun_ui/api/client.py @@ -222,6 +222,10 @@ def container_restart(request, id, timeout): return zunclient(request).containers.restart(id, timeout) +def container_rebuild(request, id, **kwargs): + return zunclient(request).containers.rebuild(id, **kwargs) + + def container_pause(request, id): return zunclient(request).containers.pause(id) diff --git a/zun_ui/api/rest_api.py b/zun_ui/api/rest_api.py index 98564f9..2aa9731 100644 --- a/zun_ui/api/rest_api.py +++ b/zun_ui/api/rest_api.py @@ -70,6 +70,8 @@ class ContainerActions(generic.View): elif action == 'restart': timeout = request.DATA.get("timeout") or 10 return client.container_restart(request, id, timeout) + elif action == 'rebuild': + return client.container_rebuild(request, id, **request.DATA) elif action == 'pause': return client.container_pause(request, id) elif action == 'unpause': diff --git a/zun_ui/static/dashboard/container/containers/actions.module.js b/zun_ui/static/dashboard/container/containers/actions.module.js index 8fefffc..cabcf52 100644 --- a/zun_ui/static/dashboard/container/containers/actions.module.js +++ b/zun_ui/static/dashboard/container/containers/actions.module.js @@ -40,6 +40,7 @@ 'horizon.dashboard.container.containers.start.service', 'horizon.dashboard.container.containers.stop.service', 'horizon.dashboard.container.containers.restart.service', + 'horizon.dashboard.container.containers.rebuild.service', 'horizon.dashboard.container.containers.pause.service', 'horizon.dashboard.container.containers.unpause.service', 'horizon.dashboard.container.containers.execute.service', @@ -60,6 +61,7 @@ startContainerService, stopContainerService, restartContainerService, + rebuildContainerService, pauseContainerService, unpauseContainerService, executeContainerService, @@ -133,6 +135,13 @@ text: gettext('Restart Container') } }) + .append({ + id: 'rebuildContainerAction', + service: rebuildContainerService, + template: { + text: gettext('Rebuild Container') + } + }) .append({ id: 'pauseContainerAction', service: pauseContainerService, diff --git a/zun_ui/static/dashboard/container/containers/actions/rebuild.service.js b/zun_ui/static/dashboard/container/containers/actions/rebuild.service.js new file mode 100644 index 0000000..062dfaa --- /dev/null +++ b/zun_ui/static/dashboard/container/containers/actions/rebuild.service.js @@ -0,0 +1,149 @@ +/** + * 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.container.containers.rebuild.service + * @Description + * rebuild container. + */ + angular + .module('horizon.dashboard.container.containers') + .factory('horizon.dashboard.container.containers.rebuild.service', rebuildService); + + rebuildService.$inject = [ + 'horizon.app.core.openstack-service-api.zun', + 'horizon.dashboard.container.containers.basePath', + 'horizon.dashboard.container.containers.resourceType', + 'horizon.dashboard.container.containers.validStates', + 'horizon.framework.util.actions.action-result.service', + 'horizon.framework.util.i18n.gettext', + 'horizon.framework.util.q.extensions', + 'horizon.framework.widgets.form.ModalFormService', + 'horizon.framework.widgets.toast.service' + ]; + + function rebuildService( + zun, basePath, resourceType, validStates, actionResult, gettext, $qExtensions, modal, toast + ) { + var imageDrivers = [ + {value: "", name: gettext("Select image driver for changing image.")}, + {value: "docker", name: gettext("Docker Hub")}, + {value: "glance", name: gettext("Glance")} + ]; + + // model + var model = { + id: "", + name: "", + image: "", + image_driver: "" + }; + + // schema + var schema = { + type: "object", + properties: { + image: { + title: gettext("Image"), + type: "string" + }, + image_driver: { + title: gettext("Image Driver"), + type: "string" + } + } + }; + + // form + var form = [ + { + type: 'section', + htmlClass: 'row', + items: [ + { + type: 'section', + htmlClass: 'col-sm-12', + items: [ + { + "key": "image", + "placeholder": gettext("Specify an image to change.") + }, + { + "key": "image_driver", + "type": "select", + "titleMap": imageDrivers, + "condition": model.image !== "" + } + ] + } + ] + } + ]; + + var message = { + success: gettext('Container %s was successfully rebuilt.') + }; + + var service = { + initAction: initAction, + allowed: allowed, + perform: perform + }; + + return service; + + ////////////// + + // include this function in your service + // if you plan to emit events to the parent controller + function initAction() { + } + + function allowed(container) { + return $qExtensions.booleanAsPromise( + validStates.rebuild.indexOf(container.status) >= 0 + ); + } + + function perform(selected) { + model.id = selected.id; + model.name = selected.name; + // modal config + var config = { + "title": gettext('Rebuild Container'), + "submitText": gettext('Rebuild'), + "schema": schema, + "form": form, + "model": model + }; + return modal.open(config).then(submit); + + function submit(context) { + var id = context.model.id; + var name = context.model.name; + delete context.model.id; + delete context.model.name; + return zun.rebuildContainer(id, context.model).then(function() { + toast.add('success', interpolate(message.success, [name])); + var result = actionResult.getActionResult().updated(resourceType, id); + return result.result; + }); + } + } + } +})(); diff --git a/zun_ui/static/dashboard/container/containers/containers.module.js b/zun_ui/static/dashboard/container/containers/containers.module.js index e49c8ee..7af3d83 100644 --- a/zun_ui/static/dashboard/container/containers/containers.module.js +++ b/zun_ui/static/dashboard/container/containers/containers.module.js @@ -59,6 +59,7 @@ start: [states.CREATED, states.STOPPED, states.ERROR], stop: [states.RUNNING], restart: [states.CREATED, states.RUNNING, states.STOPPED, states.ERROR], + rebuild: [states.CREATED, states.RUNNING, states.STOPPED, states.ERROR], pause: [states.RUNNING], unpause: [states.PAUSED], execute: [states.RUNNING], diff --git a/zun_ui/static/dashboard/container/zun.service.js b/zun_ui/static/dashboard/container/zun.service.js index 51e5647..6e2a780 100644 --- a/zun_ui/static/dashboard/container/zun.service.js +++ b/zun_ui/static/dashboard/container/zun.service.js @@ -40,6 +40,7 @@ stopContainer: stopContainer, logsContainer: logsContainer, restartContainer: restartContainer, + rebuildContainer: rebuildContainer, pauseContainer: pauseContainer, unpauseContainer: unpauseContainer, executeContainer: executeContainer, @@ -131,6 +132,11 @@ return apiService.post(containersPath + id + '/restart', params).error(error(msg)); } + function rebuildContainer(id, params) { + var msg = gettext('Unable to rebuild Container.'); + return apiService.post(containersPath + id + '/rebuild', params).error(error(msg)); + } + function pauseContainer(id) { var msg = gettext('Unable to pause Container'); return apiService.post(containersPath + id + '/pause').error(error(msg));