From 0b0aceb5c818248d6ade80de368db4f42772b843 Mon Sep 17 00:00:00 2001 From: jiangpch Date: Wed, 9 Aug 2017 04:23:54 -0400 Subject: [PATCH] Show actions according to container status Now the ui will show all of the actions regardless of container's status, while the zun_api will check it and return a 409 code if status is not valid, we should filter the actions just like what nova instances do Change-Id: Id87ec80238b407f1475c83303f6a5cab57e07385 --- .../actions/delete-force.service.js | 11 +++++---- .../containers/actions/delete.service.js | 17 +++++++++---- .../containers/actions/execute.service.js | 9 ++++--- .../containers/actions/kill.service.js | 9 ++++--- .../containers/actions/pause.service.js | 9 ++++--- .../containers/actions/restart.service.js | 9 ++++--- .../containers/actions/start.service.js | 9 ++++--- .../containers/actions/stop.service.js | 9 ++++--- .../containers/actions/unpause.service.js | 9 ++++--- .../containers/actions/update.service.js | 13 +++++++--- .../container/containers/containers.module.js | 24 +++++++++++++++++++ 11 files changed, 96 insertions(+), 32 deletions(-) diff --git a/zun_ui/static/dashboard/container/containers/actions/delete-force.service.js b/zun_ui/static/dashboard/container/containers/actions/delete-force.service.js index f765db1..fa89ea3 100644 --- a/zun_ui/static/dashboard/container/containers/actions/delete-force.service.js +++ b/zun_ui/static/dashboard/container/containers/actions/delete-force.service.js @@ -38,12 +38,13 @@ 'horizon.framework.widgets.modal.deleteModalService', 'horizon.framework.widgets.toast.service', 'horizon.dashboard.container.containers.resourceType', - 'horizon.dashboard.container.containers.events' + 'horizon.dashboard.container.containers.events', + 'horizon.dashboard.container.containers.validStates' ]; function deleteForceService( $location, $q, zun, policy, actionResult, gettext, $qExtensions, deleteModal, - toast, resourceType, events + toast, resourceType, events, validStates ) { var scope; var context = { @@ -65,8 +66,10 @@ function initAction() { } - function allowed() { - return $qExtensions.booleanAsPromise(true); + function allowed(container) { + return $qExtensions.booleanAsPromise( + validStates.delete_force.indexOf(container.status) >= 0 + ); } // delete selected resource objects diff --git a/zun_ui/static/dashboard/container/containers/actions/delete.service.js b/zun_ui/static/dashboard/container/containers/actions/delete.service.js index 443f9bd..c09f0e5 100644 --- a/zun_ui/static/dashboard/container/containers/actions/delete.service.js +++ b/zun_ui/static/dashboard/container/containers/actions/delete.service.js @@ -38,12 +38,13 @@ 'horizon.framework.widgets.modal.deleteModalService', 'horizon.framework.widgets.toast.service', 'horizon.dashboard.container.containers.resourceType', - 'horizon.dashboard.container.containers.events' + 'horizon.dashboard.container.containers.events', + 'horizon.dashboard.container.containers.validStates' ]; function deleteService( $location, $q, zun, policy, actionResult, gettext, $qExtensions, deleteModal, - toast, resourceType, events + toast, resourceType, events, validStates ) { var scope; var context = { @@ -65,8 +66,16 @@ function initAction() { } - function allowed() { - return $qExtensions.booleanAsPromise(true); + function allowed(container) { + // only row actions pass in container + // otherwise, assume it is a batch action + if (container) { + return $qExtensions.booleanAsPromise( + validStates.delete.indexOf(container.status) >= 0 + ); + } else { + return $qExtensions.booleanAsPromise(true); + } } // delete selected resource objects diff --git a/zun_ui/static/dashboard/container/containers/actions/execute.service.js b/zun_ui/static/dashboard/container/containers/actions/execute.service.js index 6b2d961..12f1d15 100644 --- a/zun_ui/static/dashboard/container/containers/actions/execute.service.js +++ b/zun_ui/static/dashboard/container/containers/actions/execute.service.js @@ -30,6 +30,7 @@ executeContainerService.$inject = [ 'horizon.app.core.openstack-service-api.zun', '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', @@ -39,7 +40,7 @@ ]; function executeContainerService( - zun, resourceType, actionResult, gettext, $qExtensions, modal, waitSpinner, toast + zun, resourceType, validStates, actionResult, gettext, $qExtensions, modal, waitSpinner, toast ) { // schema var schema = { @@ -121,8 +122,10 @@ function initAction() { } - function allowed() { - return $qExtensions.booleanAsPromise(true); + function allowed(container) { + return $qExtensions.booleanAsPromise( + validStates.execute.indexOf(container.status) >= 0 + ); } function perform(selected) { diff --git a/zun_ui/static/dashboard/container/containers/actions/kill.service.js b/zun_ui/static/dashboard/container/containers/actions/kill.service.js index f1c8919..be52820 100644 --- a/zun_ui/static/dashboard/container/containers/actions/kill.service.js +++ b/zun_ui/static/dashboard/container/containers/actions/kill.service.js @@ -31,6 +31,7 @@ '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', @@ -39,7 +40,7 @@ ]; function killContainerService( - zun, basePath, resourceType, actionResult, gettext, $qExtensions, modal, toast + zun, basePath, resourceType, validStates, actionResult, gettext, $qExtensions, modal, toast ) { // schema var schema = { @@ -96,8 +97,10 @@ function initAction() { } - function allowed() { - return $qExtensions.booleanAsPromise(true); + function allowed(container) { + return $qExtensions.booleanAsPromise( + validStates.kill.indexOf(container.status) >= 0 + ); } function perform(selected) { diff --git a/zun_ui/static/dashboard/container/containers/actions/pause.service.js b/zun_ui/static/dashboard/container/containers/actions/pause.service.js index 7fa67c4..ece068a 100644 --- a/zun_ui/static/dashboard/container/containers/actions/pause.service.js +++ b/zun_ui/static/dashboard/container/containers/actions/pause.service.js @@ -28,13 +28,14 @@ pauseService.$inject = [ 'horizon.app.core.openstack-service-api.zun', 'horizon.dashboard.container.containers.resourceType', + 'horizon.dashboard.container.containers.validStates', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.toast.service' ]; function pauseService( - zun, resourceType, actionResult, $qExtensions, toast + zun, resourceType, validStates, actionResult, $qExtensions, toast ) { var message = { @@ -56,8 +57,10 @@ function initAction() { } - function allowed() { - return $qExtensions.booleanAsPromise(true); + function allowed(container) { + return $qExtensions.booleanAsPromise( + validStates.pause.indexOf(container.status) >= 0 + ); } function perform(selected) { diff --git a/zun_ui/static/dashboard/container/containers/actions/restart.service.js b/zun_ui/static/dashboard/container/containers/actions/restart.service.js index 5b95506..2a13afc 100644 --- a/zun_ui/static/dashboard/container/containers/actions/restart.service.js +++ b/zun_ui/static/dashboard/container/containers/actions/restart.service.js @@ -29,6 +29,7 @@ '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', @@ -37,7 +38,7 @@ ]; function restartService( - zun, basePath, resourceType, actionResult, gettext, $qExtensions, modal, toast + zun, basePath, resourceType, validStates, actionResult, gettext, $qExtensions, modal, toast ) { // schema var schema = { @@ -93,8 +94,10 @@ function initAction() { } - function allowed() { - return $qExtensions.booleanAsPromise(true); + function allowed(container) { + return $qExtensions.booleanAsPromise( + validStates.restart.indexOf(container.status) >= 0 + ); } function perform(selected) { diff --git a/zun_ui/static/dashboard/container/containers/actions/start.service.js b/zun_ui/static/dashboard/container/containers/actions/start.service.js index 5e8a804..1f37379 100644 --- a/zun_ui/static/dashboard/container/containers/actions/start.service.js +++ b/zun_ui/static/dashboard/container/containers/actions/start.service.js @@ -28,13 +28,14 @@ startService.$inject = [ 'horizon.app.core.openstack-service-api.zun', 'horizon.dashboard.container.containers.resourceType', + 'horizon.dashboard.container.containers.validStates', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.toast.service' ]; function startService( - zun, resourceType, actionResult, $qExtensions, toast + zun, resourceType, validStates, actionResult, $qExtensions, toast ) { var message = { @@ -56,8 +57,10 @@ function initAction() { } - function allowed() { - return $qExtensions.booleanAsPromise(true); + function allowed(container) { + return $qExtensions.booleanAsPromise( + validStates.start.indexOf(container.status) >= 0 + ); } function perform(selected) { diff --git a/zun_ui/static/dashboard/container/containers/actions/stop.service.js b/zun_ui/static/dashboard/container/containers/actions/stop.service.js index 3025e4f..86cbcd0 100644 --- a/zun_ui/static/dashboard/container/containers/actions/stop.service.js +++ b/zun_ui/static/dashboard/container/containers/actions/stop.service.js @@ -29,6 +29,7 @@ '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', @@ -37,7 +38,7 @@ ]; function stopService( - zun, basePath, resourceType, actionResult, gettext, $qExtensions, modal, toast + zun, basePath, resourceType, validStates, actionResult, gettext, $qExtensions, modal, toast ) { // schema var schema = { @@ -93,8 +94,10 @@ function initAction() { } - function allowed() { - return $qExtensions.booleanAsPromise(true); + function allowed(container) { + return $qExtensions.booleanAsPromise( + validStates.stop.indexOf(container.status) >= 0 + ); } function perform(selected) { diff --git a/zun_ui/static/dashboard/container/containers/actions/unpause.service.js b/zun_ui/static/dashboard/container/containers/actions/unpause.service.js index 6b7c7a6..3c2226d 100644 --- a/zun_ui/static/dashboard/container/containers/actions/unpause.service.js +++ b/zun_ui/static/dashboard/container/containers/actions/unpause.service.js @@ -28,13 +28,14 @@ unpauseService.$inject = [ 'horizon.app.core.openstack-service-api.zun', 'horizon.dashboard.container.containers.resourceType', + 'horizon.dashboard.container.containers.validStates', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.toast.service' ]; function unpauseService( - zun, resourceType, actionResult, $qExtensions, toast + zun, resourceType, validStates, actionResult, $qExtensions, toast ) { var message = { @@ -56,8 +57,10 @@ function initAction() { } - function allowed() { - return $qExtensions.booleanAsPromise(true); + function allowed(container) { + return $qExtensions.booleanAsPromise( + validStates.unpause.indexOf(container.status) >= 0 + ); } function perform(selected) { diff --git a/zun_ui/static/dashboard/container/containers/actions/update.service.js b/zun_ui/static/dashboard/container/containers/actions/update.service.js index d24e8af..fac9ef7 100644 --- a/zun_ui/static/dashboard/container/containers/actions/update.service.js +++ b/zun_ui/static/dashboard/container/containers/actions/update.service.js @@ -25,9 +25,11 @@ .factory('horizon.dashboard.container.containers.update.service', updateService); updateService.$inject = [ + '$q', 'horizon.app.core.openstack-service-api.policy', 'horizon.app.core.openstack-service-api.zun', 'horizon.dashboard.container.containers.resourceType', + 'horizon.dashboard.container.containers.validStates', 'horizon.dashboard.container.containers.workflow', 'horizon.framework.util.actions.action-result.service', 'horizon.framework.util.i18n.gettext', @@ -37,7 +39,7 @@ ]; function updateService( - policy, zun, resourceType, workflow, + $q, policy, zun, resourceType, validStates, workflow, actionResult, gettext, $qExtensions, modal, toast ) { var message = { @@ -98,8 +100,13 @@ return modal.open(config).then(submit); } - function allowed() { - return policy.ifAllowed({ rules: [['container', 'edit_container']] }); + function allowed(container) { + return $q.all([ + policy.ifAllowed({ rules: [['container', 'edit_container']] }), + $qExtensions.booleanAsPromise( + validStates.update.indexOf(container.status) >= 0 + ) + ]); } function submit(context) { diff --git a/zun_ui/static/dashboard/container/containers/containers.module.js b/zun_ui/static/dashboard/container/containers/containers.module.js index 4039a92..83feab6 100644 --- a/zun_ui/static/dashboard/container/containers/containers.module.js +++ b/zun_ui/static/dashboard/container/containers/containers.module.js @@ -30,6 +30,7 @@ 'horizon.dashboard.container.containers.details' ]) .constant('horizon.dashboard.container.containers.events', events()) + .constant('horizon.dashboard.container.containers.validStates', validStates()) .constant('horizon.dashboard.container.containers.resourceType', 'OS::Zun::Container') .run(run) .config(config); @@ -47,6 +48,29 @@ }; } + function validStates() { + var states = { + ERROR: 'Error', RUNNING: 'Running', STOPPED: 'Stopped', + PAUSED: 'Paused', UNKNOWN: 'Unknown', CREATING: 'Creating', + CREATED: 'Created', DELETED: 'Deleted' + }; + return { + update: [states.CREATED, states.RUNNING, states.STOPPED, states.PAUSED], + start: [states.CREATED, states.STOPPED, states.ERROR], + stop: [states.RUNNING], + restart: [states.CREATED, states.RUNNING, states.STOPPED, states.ERROR], + pause: [states.RUNNING], + unpause: [states.PAUSED], + execute: [states.RUNNING], + kill: [states.RUNNING], + delete: [states.CREATED, states.ERROR, states.STOPPED, states.DELETED], + delete_force: [ + states.CREATED, states.CREATING, states.ERROR, states.RUNNING, + states.STOPPED, states.UNKNOWN, states.DELETED + ] + }; + } + run.$inject = [ 'horizon.framework.conf.resource-type-registry.service', 'horizon.app.core.openstack-service-api.zun',