ironic-ui/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.controller.js
Peter Piela 2e9c34b4cc Added support for injecting non-maskable interrupts
A a new action 'Inject NMI' has been added to node actions dropdown
menu in the 'Node Details' page.

Closes-Bug: #1713519
Change-Id: I01e9d7f352119c201d701127bb08fa2f0607a214
2018-01-02 13:57:31 +00:00

369 lines
12 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 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';
angular
.module('horizon.dashboard.admin.ironic')
.controller('horizon.dashboard.admin.ironic.NodeDetailsController',
IronicNodeDetailsController);
IronicNodeDetailsController.$inject = [
'$scope',
'$location',
'horizon.framework.widgets.toast.service',
'horizon.app.core.openstack-service-api.ironic',
'horizon.dashboard.admin.ironic.actions',
'horizon.dashboard.admin.ironic.basePath',
'horizon.dashboard.admin.ironic.edit-node.service',
'horizon.dashboard.admin.ironic.create-port.service',
'horizon.dashboard.admin.ironic.create-portgroup.service',
'horizon.dashboard.admin.ironic.edit-port.service',
'horizon.dashboard.admin.ironic.edit-portgroup.service',
'horizon.dashboard.admin.ironic.maintenance.service',
'horizon.dashboard.admin.ironic.bootdevice.service',
'horizon.dashboard.admin.ironic.raidconfig.service',
'horizon.dashboard.admin.ironic.node-state-transition.service',
'horizon.dashboard.admin.ironic.validUuidPattern'
];
function IronicNodeDetailsController($scope,
$location,
toastService,
ironic,
actions,
basePath,
editNodeService,
createPortService,
createPortgroupService,
editPortService,
editPortgroupService,
maintenanceService,
bootDeviceService,
raidConfigService,
nodeStateTransitionService,
validUuidPattern) {
var ctrl = this;
var path = basePath + '/node-details/sections/';
ctrl.noPortsText = gettext('No network ports have been defined');
ctrl.noPortgroupsText = gettext('No portgroups have been defined');
ctrl.actions = actions;
ctrl.maintenanceService = maintenanceService;
ctrl.bootDeviceService = bootDeviceService;
ctrl.raidConfigService = raidConfigService;
ctrl.sections = [
{
heading: gettext('Overview'),
templateUrl: path + 'overview.html'
},
{
heading: gettext('Configuration'),
templateUrl: path + 'configuration.html'
}
];
ctrl.portDetailsTemplateUrl = path + "port-details.html";
ctrl.portgroupDetailsTemplateUrl = path + "portgroup-details.html";
ctrl.node = null;
ctrl.nodeValidation = []; // List of validation results
ctrl.nodeValidationMap = {}; // Validation results indexed by interface
ctrl.nodeStateTransitions = [];
ctrl.nodePowerTransitions = [];
ctrl.ports = [];
ctrl.portsSrc = [];
ctrl.portgroups = [];
ctrl.portgroupsSrc = [];
ctrl.basePath = basePath;
ctrl.re_uuid = new RegExp(validUuidPattern);
ctrl.isUuid = isUuid;
ctrl.getVifPortId = getVifPortId;
ctrl.editNode = editNode;
ctrl.createPort = createPort;
ctrl.createPortgroup = createPortgroup;
ctrl.deletePort = deletePort;
ctrl.editPort = editPort;
ctrl.editPortgroup = editPortgroup;
ctrl.refresh = refresh;
ctrl.toggleConsoleMode = toggleConsoleMode;
ctrl.deletePortgroups = deletePortgroups;
ctrl.injectNmi = injectNmi;
$scope.emptyObject = function(obj) {
return angular.isUndefined(obj) || Object.keys(obj).length === 0;
};
$scope.isDefined = angular.isDefined;
init();
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.init
* @description Initialize the controller instance based on the
* current page url.
*
* @return {void}
*/
function init() {
// Fetch the Node ID from the URL.
var pattern = /(.*\/admin\/ironic\/)(.+)\/(detail)?/;
var uuid = $location.absUrl().match(pattern)[2];
retrieveNode(uuid).then(function () {
ctrl.nodeStateTransitions =
nodeStateTransitionService.getTransitions(ctrl.node.provision_state);
ctrl.nodePowerTransitions = actions.getPowerTransitions(ctrl.node);
retrievePorts();
retrieveBootDevice();
retrievePortgroups();
validateNode();
});
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.retrieveNode
* @description Retrieve the node instance for a specified node id,
* and store it in the controller instance.
*
* @param {string} uuid Node name or UUID
* @return {promise} promise
*/
function retrieveNode(uuid) {
return ironic.getNode(uuid).then(function (node) {
ctrl.node = node;
ctrl.node.id = ctrl.node.uuid;
ironic.nodeGetConsole(uuid).then(function(consoleData) {
ctrl.node.console_enabled = consoleData.console_enabled;
ctrl.node.console_info = consoleData.console_info;
});
});
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.retrievePorts
* @description Retrieve the ports associated with the current node,
* and store them in the controller instance.
*
* @return {void}
*/
function retrievePorts() {
ironic.getPortsWithNode(ctrl.node.uuid).then(function (ports) {
ctrl.portsSrc = ports;
});
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.retrieveBootDevice
* @description Retrieve the boot device associated with the current node,
* and store it in the controller instance.
*
* @return {void}
*/
function retrieveBootDevice() {
ironic.getBootDevice(ctrl.node.uuid).then(function (bootDevice) {
ctrl.node.bootDevice = bootDevice;
});
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.retrievePortgroups
* @description Retrieve the port groups associated with the current node,
* and store them in the controller instance.
*
* @return {void}
*/
function retrievePortgroups() {
ironic.getPortgroups(ctrl.node.uuid).then(function(portgroups) {
ctrl.portgroupsSrc = portgroups;
angular.forEach(portgroups, function(portgroup) {
portgroup.ports = [];
ironic.getPortgroupPorts(portgroup.uuid).then(function(ports) {
portgroup.ports = ports;
});
});
});
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.validateNode
* @description Retrieve the ports associated with the current node,
* and store them in the controller instance.
*
* @return {void}
*/
function validateNode() {
ironic.validateNode(ctrl.node.uuid).then(function(response) {
var nodeValidation = [];
ctrl.nodeValidationMap = {};
angular.forEach(response.data, function(interfaceStatus) {
interfaceStatus.id = interfaceStatus.interface;
ctrl.nodeValidationMap[interfaceStatus.interface] = interfaceStatus;
interfaceStatus.hw_interface = ctrl.node[interfaceStatus.interface + '_interface'];
nodeValidation.push(interfaceStatus);
});
ctrl.nodeValidation = nodeValidation;
});
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.isUuid
* @description Test whether a string is an OpenStack UUID
*
* @param {string} str string
* @return {boolean} True if the string is an OpenStack UUID,
* otherwise false
*/
function isUuid(str) {
return !!str.match(ctrl.re_uuid);
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.getVifPortId
* @description Get the vif_port_id property of a specified port
*
* @param {object} port instance of port
* @return {string} Value of vif_port_id property or
* "" if the property does not exist
*/
function getVifPortId(port) {
return angular.isDefined(port.extra) &&
angular.isDefined(port.extra.vif_port_id)
? port.extra.vif_port_id : "";
}
/**
* @description: Edit the current node
*
* @return {void}
*/
function editNode() {
editNodeService.editNode(ctrl.node).then(function() {
ctrl.refresh();
});
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.createPort
* @description Initiate creation of a newtwork port for the current
* node
*
* @return {void}
*/
function createPort() {
createPortService.createPort(ctrl.node).then(function() {
ctrl.refresh();
});
}
/**
* @description: Edit a specified port
*
* @param {port} port - Port to be edited
* @return {void}
*/
function editPort(port) {
editPortService.editPort(port, ctrl.node).then(function() {
ctrl.refresh();
});
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.deletePort
* @description Delete a list of ports
*
* @param {port []} ports ports to be deleted
* @return {void}
*/
function deletePort(ports) {
actions.deletePort(ports).then(function() {
ctrl.refresh();
});
}
/**
* @description: Edit a specified portgroup
*
* @param {portgroup} portgroup - Portgroup to be edited
* @return {void}
*/
function editPortgroup(portgroup) {
editPortgroupService.editPortgroup(portgroup).then(function() {
ctrl.refresh();
});
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.portgroupDelete
* @description Delete a list of portgroups.
*
* @param {port []} portgroups portgroups to be deleted.
* @return {void}
*/
function deletePortgroups(portgroups) {
actions.deletePortgroups(portgroups).then(function() {
ctrl.refresh();
});
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.refresh
* @description Update node information
*
* @return {void}
*/
function refresh() {
init();
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.toggleConsoleMode
* @description Toggle the state of the console for the current node
*
* @return {void}
*/
function toggleConsoleMode() {
ironic.nodeSetConsoleMode(ctrl.node.uuid, !ctrl.node.console_enabled);
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.createPortgroup
* @description Initiate creation of a portgroup for the current
* node
*
* @return {void}
*/
function createPortgroup() {
createPortgroupService.createPortgroup(ctrl.node).then(function() {
ctrl.refresh();
});
}
/**
* @name horizon.dashboard.admin.ironic.NodeDetailsController.injectNmi
* @description Inject non-masking interrupts into the current node
*
* @return {void}
*/
function injectNmi() {
ironic.injectNmi(ctrl.node.uuid);
}
}
})();