2e9c34b4cc
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
369 lines
12 KiB
JavaScript
Executable File
369 lines
12 KiB
JavaScript
Executable File
/*
|
||
* 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);
|
||
}
|
||
}
|
||
})();
|