From e476fe9344556784f938344a3ab8403a1c635eee Mon Sep 17 00:00:00 2001 From: Elizabeth Elwell Date: Fri, 13 May 2016 17:42:13 +0100 Subject: [PATCH] Updated to ironic API v1.11 and added manageable state Newly registered nodes begin in the enroll provision state by default instead of available. Actions added to the current dropdown on node view to enable move to manageable, available and active states. Actions are enabled and disabled in view as the current state permits. All necessary fields required to move a node to available state are still required on the enroll node modal. This will be changed to only the necessary fields to move a node to enroll state once the functionality for editing a node is ready. Change-Id: I349a293a1069ad01fd782d1828bad607f9b9d6b0 Co-Authored-By: Peter Piela --- ironic_ui/api/ironic.py | 15 +++- ironic_ui/api/ironic_rest_api.py | 17 ++++ ironic_ui/enabled/_2200_ironic.py | 1 + .../enroll-node/enroll-node.controller.js | 8 +- .../admin/ironic/enroll-node/enroll-node.html | 3 +- .../dashboard/admin/ironic/ironic.service.js | 85 ++++++++++++++++++- .../admin/ironic/node-actions.service.js | 22 ++++- .../node-details/node-details.controller.js | 24 ++++++ .../ironic/node-details/node-details.html | 25 +++++- .../node-details/sections/overview.html | 30 +++---- .../ironic/node-list/node-list.controller.js | 21 ++++- .../admin/ironic/node-list/node-list.html | 43 +++++++--- 12 files changed, 254 insertions(+), 40 deletions(-) diff --git a/ironic_ui/api/ironic.py b/ironic_ui/api/ironic.py index 5aaaedcc..a893665c 100755 --- a/ironic_ui/api/ironic.py +++ b/ironic_ui/api/ironic.py @@ -27,7 +27,7 @@ from openstack_dashboard.api import base LOG = logging.getLogger(__name__) -DEFAULT_IRONIC_API_VERSION = '1.6' +DEFAULT_IRONIC_API_VERSION = '1.11' DEFAULT_INSECURE = False DEFAULT_CACERT = None @@ -103,6 +103,19 @@ def node_set_power_state(request, node_id, state): return ironicclient(request).node.set_power_state(node_id, state) +def node_set_provision_state(request, node_uuid, state): + """Set the target provision state for a given node. + + :param request: HTTP request. + :param node_uuid: The UUID of the node. + :param state: the target provision state to set. + :return: node. + + http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.set_provision_state + """ + return ironicclient(request).node.set_provision_state(node_uuid, state) + + def node_set_maintenance(request, node_id, state, maint_reason=None): """Set the maintenance mode on a given node. diff --git a/ironic_ui/api/ironic_rest_api.py b/ironic_ui/api/ironic_rest_api.py index d27b9fae..34ee7924 100755 --- a/ironic_ui/api/ironic_rest_api.py +++ b/ironic_ui/api/ironic_rest_api.py @@ -130,6 +130,23 @@ class StatesPower(generic.View): return ironic.node_set_power_state(request, node_id, state) +@urls.register +class StatesProvision(generic.View): + + url_regex = r'ironic/nodes/(?P[0-9a-f-]+)/states/provision$' + + @rest_utils.ajax(data_required=True) + def put(self, request, node_uuid): + """Set the provision state for a specified node. + + :param request: HTTP request. + :param node_id: Node uuid + :return: Return code + """ + state = request.DATA.get('state') + return ironic.node_set_provision_state(request, node_uuid, state) + + @urls.register class Maintenance(generic.View): diff --git a/ironic_ui/enabled/_2200_ironic.py b/ironic_ui/enabled/_2200_ironic.py index 37ed4386..6d456cb5 100644 --- a/ironic_ui/enabled/_2200_ironic.py +++ b/ironic_ui/enabled/_2200_ironic.py @@ -24,6 +24,7 @@ PANEL_GROUP = 'admin' ADD_PANEL = 'ironic_ui.content.ironic.panel.Ironic' # A list of applications to be prepended to INSTALLED_APPS ADD_INSTALLED_APPS = ['ironic_ui', ] +# A list of AngularJS modules to be loaded when Angular bootstraps. ADD_ANGULAR_MODULES = ['horizon.dashboard.admin.ironic'] # Automatically discover static resources in installed apps AUTO_DISCOVER_STATIC_FILES = True diff --git a/ironic_ui/static/dashboard/admin/ironic/enroll-node/enroll-node.controller.js b/ironic_ui/static/dashboard/admin/ironic/enroll-node/enroll-node.controller.js index 5102f691..d90ecf8f 100644 --- a/ironic_ui/static/dashboard/admin/ironic/enroll-node/enroll-node.controller.js +++ b/ironic_ui/static/dashboard/admin/ironic/enroll-node/enroll-node.controller.js @@ -52,6 +52,7 @@ // selected driver ctrl.driverProperties = null; ctrl.driverPropertyGroups = null; + ctrl.moveNodeToManageableState = false; // Parameter object that defines the node to be enrolled ctrl.node = { @@ -276,9 +277,14 @@ }); ironic.createNode(ctrl.node).then( - function() { + function(response) { + $log.info("create node response = " + JSON.stringify(response)); $modalInstance.close(); $rootScope.$emit(ironicEvents.ENROLL_NODE_SUCCESS); + if (ctrl.moveNodeToManageableState) { + $log.info("Setting node provision state"); + ironic.setNodeProvisionState(response.data.uuid, 'manage'); + } }, function() { // No additional error processing for now diff --git a/ironic_ui/static/dashboard/admin/ironic/enroll-node/enroll-node.html b/ironic_ui/static/dashboard/admin/ironic/enroll-node/enroll-node.html index f95a5539..5aa69b10 100644 --- a/ironic_ui/static/dashboard/admin/ironic/enroll-node/enroll-node.html +++ b/ironic_ui/static/dashboard/admin/ironic/enroll-node/enroll-node.html @@ -254,10 +254,8 @@ - - @@ -267,6 +265,7 @@ Cancel + + disabled="ctrl.node.power_state!=='power off'"> {$ 'Power on' | translate $} + disabled="ctrl.node.power_state!=='power on'"> {$ 'Power off' | translate $} + disabled="ctrl.node.maintenance"> {$ 'Maintenance on' | translate $} + disabled="!ctrl.node.maintenance"> {$ 'Maintenance off' | translate $} + + {$ ('Move to ' | translate) + targetState $} + diff --git a/ironic_ui/static/dashboard/admin/ironic/node-details/sections/overview.html b/ironic_ui/static/dashboard/admin/ironic/node-details/sections/overview.html index 91b98db3..c87aefbe 100644 --- a/ironic_ui/static/dashboard/admin/ironic/node-details/sections/overview.html +++ b/ironic_ui/static/dashboard/admin/ironic/node-details/sections/overview.html @@ -6,19 +6,19 @@
Name
-
{$ ctrl.node['name'] $}
+
{$ ctrl.node.name $}
Maintenance
-
{$ ctrl.node['maintenance'] | yesno $}
+
{$ ctrl.node.maintenance | yesno $}
Maintenance Reason
-
{$ ctrl.node['maintenance_reason'] | noValue $}
+
{$ ctrl.node.maintenance_reason | noValue $}
Inspection Started At
-
{$ ctrl.node['inspection_started_at'] | date: 'medium' | noValue $}
+
{$ ctrl.node.inspection_started_at | date: 'medium' | noValue $}
Inspection Finished At
-
{$ ctrl.node['inspection_finished_at'] | date: 'medium' | noValue $}
+
{$ ctrl.node.inspection_finished_at | date: 'medium' | noValue $}
Reservation
-
{$ ctrl.node['reservation'] | noValue $}
+
{$ ctrl.node.reservation | noValue $}
Console Enabled
-
{$ ctrl.node['console_enabled'] | yesno $}
+
{$ ctrl.node.console_enabled | yesno $}
@@ -29,22 +29,22 @@
Instance ID
- - {$ ctrl.node['instance_uuid'] | noValue $} + + {$ ctrl.node.instance_uuid | noValue $}
Power State
-
{$ ctrl.node['power_state'] $}
+
{$ ctrl.node.power_state $}
Target Power State
-
{$ ctrl.node['target_power_state'] | noValue $}
+
{$ ctrl.node.target_power_state | noValue $}
Provision State
-
{$ ctrl.node['provision_state'] | noValue $}
+
{$ ctrl.node.provision_state | noValue $}
Target Provision State
-
{$ ctrl.node['target_provision_state'] | noValue $}
+
{$ ctrl.node.target_provision_state | noValue $}
Last Error
-
{$ ctrl.node['last_error'] | noValue $}
+
{$ ctrl.node.last_error | noValue $}
Updated At
-
{$ ctrl.node['updated_at'] | date: 'medium' | noValue $}
+
{$ ctrl.node.updated_at | date: 'medium' | noValue $}
diff --git a/ironic_ui/static/dashboard/admin/ironic/node-list/node-list.controller.js b/ironic_ui/static/dashboard/admin/ironic/node-list/node-list.controller.js index a539e5b3..804b48c2 100755 --- a/ironic_ui/static/dashboard/admin/ironic/node-list/node-list.controller.js +++ b/ironic_ui/static/dashboard/admin/ironic/node-list/node-list.controller.js @@ -24,6 +24,7 @@ IronicNodeListController.$inject = [ '$scope', '$rootScope', + 'horizon.framework.widgets.toast.service', 'horizon.app.core.openstack-service-api.ironic', 'horizon.dashboard.admin.ironic.events', 'horizon.dashboard.admin.ironic.actions', @@ -34,6 +35,7 @@ function IronicNodeListController($scope, $rootScope, + toastService, ironic, ironicEvents, actions, @@ -43,7 +45,7 @@ var ctrl = this; ctrl.nodes = []; - ctrl.nodeSrc = []; + ctrl.nodesSrc = []; ctrl.basePath = basePath; ctrl.actions = actions; @@ -52,6 +54,7 @@ ctrl.removeNodeFromMaintenanceMode = removeNodeFromMaintenanceMode; ctrl.removeNodesFromMaintenanceMode = removeNodesFromMaintenanceMode; ctrl.enrollNode = enrollNode; + ctrl.refresh = refresh; /** * Filtering - client-side MagicSearch @@ -132,11 +135,19 @@ } function onGetNodes(response) { - ctrl.nodesSrc = response.data.items; - ctrl.nodesSrc.forEach(function (node) { + angular.forEach(response.data.items, function (node) { node.id = node.uuid; retrievePorts(node); + + // Report any changes in last-error + if (node.last_error !== "" && + angular.isDefined(ctrl.nodesSrc[node.uuid]) && + node.last_error !== ctrl.nodesSrc[node.uuid].last_error) { + toastService.add('error', + "Node " + node.name + ". " + node.last_error); + } }); + ctrl.nodesSrc = response.data.items; } function retrievePorts(node) { @@ -166,6 +177,10 @@ function enrollNode() { enrollNodeService.modal(); } + + function refresh() { + init(); + } } })(); diff --git a/ironic_ui/static/dashboard/admin/ironic/node-list/node-list.html b/ironic_ui/static/dashboard/admin/ironic/node-list/node-list.html index ffef2839..dece797c 100644 --- a/ironic_ui/static/dashboard/admin/ironic/node-list/node-list.html +++ b/ironic_ui/static/dashboard/admin/ironic/node-list/node-list.html @@ -15,11 +15,18 @@ - +
+ + +
@@ -117,7 +124,7 @@ {$ 'No Instance' | translate $} -
+
{$ node.power_state $}
@@ -130,32 +137,32 @@ {$ 'Power on' | translate $} {$ 'Power off' | translate $} {$ 'Maintenance on' | translate $} {$ 'Maintenance off' | translate $} {$ 'Delete node' | translate $} @@ -165,7 +172,19 @@ item="node"> {$ 'Create port' | translate $} - + + {$ ('Move to ' | translate) + targetState $} +