ironic-ui/ironic_ui/static/dashboard/admin/ironic/node-actions.service.js
Peter Piela 863e9e6295 Add functionality to view portgroups
This is the first in a series of reviews that will add functionality
to manage portgroups within the Ironic UI. Specifically, this commit
adds the following items:

- API functions for listing, creating, and deleting portgroups
- A tabular view of the portgroups associated with a node in
  the node-details/configuration table
- The portgroup table utilizes expandable detail rows for
  giving the user access to additional information. Detail
  rows provide a scalable way to display additional information
  without resorting to a separate tab/page.
- The node-details/configuration ports table has been reworked
  to take advantage of detail rows.
- The batch and inividual delete-portgroup actions are working.

I am looking for feedback on all aspects of the new functionality,
including the use of detail rows in data tables.

Change-Id: I4c150db4e56fa6970cc112c87cdc54cb3fbb28e5
2017-06-28 16:02:26 -04:00

245 lines
8.7 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* © Copyright 2015,2016 Hewlett Packard Enterprise Development Company LP
* Copyright 2016 Cray Inc.
*
* 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';
function PowerTransition(label, state, soft) {
this.label = label;
this.state = state;
this.soft = soft;
}
var POWER_ON_TRANSITIONS = [
new PowerTransition(gettext('Power on'), 'on', false)
];
var POWER_OFF_TRANSITIONS = [
new PowerTransition(gettext('Power off'), 'off', false),
new PowerTransition(gettext('Soft power off'), 'off', true),
new PowerTransition(gettext('Reboot'), 'reboot', false),
new PowerTransition(gettext('Soft reboot'), 'reboot', true)
];
var ALL_POWER_TRANSITIONS =
POWER_ON_TRANSITIONS.concat(POWER_OFF_TRANSITIONS);
angular
.module('horizon.dashboard.admin.ironic')
.factory('horizon.dashboard.admin.ironic.actions', actions);
actions.$inject = [
'horizon.app.core.openstack-service-api.ironic',
'horizon.dashboard.admin.ironic.events',
'horizon.framework.widgets.modal.deleteModalService',
'horizon.dashboard.admin.ironic.clean-node.service',
'$q',
'$rootScope'
];
function actions(ironic,
ironicEvents,
deleteModalService,
cleanNodeService,
$q,
$rootScope) {
var service = {
deleteNode: deleteNode,
deletePort: deletePort,
deletePortgroups: deletePortgroups,
setPowerState: setPowerState,
setMaintenance: setMaintenance,
setProvisionState: setProvisionState,
getPowerTransitions : getPowerTransitions
};
return service;
function deleteNode(nodes) {
var context = {
labels: {
title: ngettext("Delete Node",
"Delete Nodes",
nodes.length),
message: ngettext('Are you sure you want to delete node "%s"? ' +
'This action cannot be undone.',
'Are you sure you want to delete nodes "%s"? ' +
'This action cannot be undone.',
nodes.length),
submit: ngettext("Delete Node",
"Delete Nodes",
nodes.length),
success: ngettext('Successfully deleted node "%s"',
'Successfully deleted nodes "%s"',
nodes.length),
error: ngettext('Unable to delete node "%s"',
'Unable to delete nodes "%s"',
nodes.length)
},
deleteEntity: ironic.deleteNode,
successEvent: ironicEvents.DELETE_NODE_SUCCESS
};
return deleteModalService.open($rootScope, nodes, context);
}
// power state
/**
* @description Set the power state of a list of nodes
*
* @param {object[]} nodes - List of node objects
* @param {string} state - Target power state
* @param {boolean} [soft] - Flag for graceful power 'off' or reboot
* @return {promise} promise
*/
function setPowerState(nodes, state, soft) {
var promises = [];
angular.forEach(nodes,
function(node) {
promises.push(
ironic.nodeSetPowerState(node.uuid,
state,
soft)
);
});
return $q.all(promises);
}
// maintenance
/**
* @description Set the maintenance state of a list of nodes
*
* @param {object[]} nodes - List of node objects
* @param {boolean} mode - True if the nodes are to be put in
* maintenance mode, otherwise false.
* @param {string} [reason] - Optional reason for putting nodes in
* maintenance mode.
* @return {promise} promise
*/
function setMaintenance(nodes, mode, reason) {
var promises = [];
angular.forEach(nodes, function(node) {
var promise;
if (node.maintenance === mode) {
var msg = gettext(
"Node %s is already in target maintenance state.");
promise = $q.reject(interpolate(msg, [node.uuid], false));
} else {
promise = ironic.nodeSetMaintenance(node.uuid, mode, reason).then(
function (result) {
node.maintenance = mode;
node.maintenance_reason =
mode && angular.isDefined(reason) ? reason : "";
return result;
}
);
}
promises.push(promise);
});
return $q.all(promises);
}
/*
* @name horizon.dashboard.admin.ironic.actions.setProvisionState
* @description Set the provisioning state of a specified node
*
* @param {object} args - Object with two properties named 'node'
* and 'verb'.
* node: node object.
* verb: string the value of which is the verb used to move
* the node to the desired target state for the node.
*/
function setProvisionState(args) {
if (args.verb === 'clean') {
cleanNodeService.clean(args.node);
} else {
ironic.setNodeProvisionState(args.node.uuid, args.verb);
}
}
function deletePort(ports) {
var context = {
labels: {
title: ngettext("Delete Port",
"Delete Ports",
ports.length),
message: ngettext('Are you sure you want to delete port "%s"? ' +
'This action cannot be undone.',
'Are you sure you want to delete ports "%s"? ' +
'This action cannot be undone.',
ports.length),
submit: ngettext("Delete Port",
"Delete Ports",
ports.length),
success: ngettext('Successfully deleted port "%s"',
'Successfully deleted ports "%s"',
ports.length),
error: ngettext('Unable to delete port "%s"',
'Unable to delete ports "%s"',
ports.length)
},
deleteEntity: ironic.deletePort,
successEvent: ironicEvents.DELETE_PORT_SUCCESS
};
return deleteModalService.open($rootScope, ports, context);
}
function deletePortgroups(portgroups) {
var context = {
labels: {
title: ngettext("Delete Portgroup",
"Delete Portgroups",
portgroups.length),
message: ngettext('Are you sure you want to delete portgroup "%s"? ' +
'This action cannot be undone.',
'Are you sure you want to delete portgroups "%s"? ' +
'This action cannot be undone.',
portgroups.length),
submit: ngettext("Delete Portgroup",
"Delete Portgroups",
portgroups.length),
success: ngettext('Successfully deleted portgroup "%s"',
'Successfully deleted portgroups "%s"',
portgroups.length),
error: ngettext('Unable to delete portgroup "%s"',
'Unable to delete portgroups "%s"',
portgroups.length)
},
deleteEntity: ironic.deletePortgroup
};
return deleteModalService.open($rootScope, portgroups, context);
}
/*
* @name horizon.dashboard.admin.ironic.actions.getPowerTransitions
* @description Get the list of power transitions for a specified
* node, or all power transitions if the node is not specified.
*
* @param {object} node Node object for which power transitions
* are requested. If node is undefined all possible power transitions
* are returned.
* @return {object[]} - List of PowerTransition objects
*/
function getPowerTransitions(node) {
return angular.isUndefined(node) ? ALL_POWER_TRANSITIONS
: node.power_state === 'power on'
? POWER_OFF_TRANSITIONS : POWER_ON_TRANSITIONS;
}
}
})();