deb-ironic-ui/ironic_ui/static/dashboard/admin/ironic/base-port/base-port.controller.js

229 lines
6.9 KiB
JavaScript

/*
* 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';
/**
* Controller used to support operations on an Ironic port
*/
angular
.module('horizon.dashboard.admin.ironic')
.controller('BasePortController', BasePortController);
BasePortController.$inject = [
'$uibModalInstance',
'horizon.dashboard.admin.ironic.validMacAddressPattern',
'horizon.dashboard.admin.ironic.validDatapathIdPattern',
'horizon.dashboard.admin.ironic.form-field.service',
'horizon.app.core.openstack-service-api.ironic',
'ctrl',
'node'
];
/**
* @description Utility class used to manage local-link-connection
* form fields.
*
* @param {string} formFieldService - Provider service for creating
* form fields.
* @param {string} validMacAddressPattern - Regular expression
* pattern used to test for valid mac addresses.
* @param {string} validDatapathIdPattern - Regular expression
* pattern used to test for valid datapath ids.
* @return {void}
*/
function LocalLinkConnectionMgr(formFieldService,
validMacAddressPattern,
validDatapathIdPattern) {
var mgr = this;
mgr.port_id = new formFieldService.FormField(
{id: 'port_id', title: 'port_id'});
mgr.switch_id = new formFieldService.FormField(
{id: 'switch_id',
title: 'switch_id',
desc: gettext("MAC address or OpenFlow datapath ID"),
pattern: new RegExp(validMacAddressPattern + '|' +
validDatapathIdPattern)});
mgr.switch_info = new formFieldService.FormField(
{id: 'switch_info', title: 'switch_info'});
mgr.fields = {
port_id: mgr.port_id,
switch_id: mgr.switch_id,
switch_info: mgr.switch_info
};
/**
* Update the required property of each field based on current values
*
* @return {void}
*/
mgr.update = function() {
var required = mgr.port_id.hasValue() || mgr.switch_id.hasValue();
mgr.port_id.required = required;
mgr.switch_id.required = required;
};
// Add form field value change handlers
angular.forEach(mgr.fields, function(field) {
field.change = mgr.update;
});
/**
* Generate an attribute object that conforms to the format
* required for port creation using the Ironic client
*
* @return {object|null} local_link_connection attribute object.
* A value of null is returned if the local-link-connection
* information is incomplete.
*/
mgr.toPortAttr = function() {
var attr = null;
if (mgr.port_id.hasValue() &&
mgr.switch_id.hasValue()) {
attr = {};
attr.port_id = mgr.port_id.value;
attr.switch_id = mgr.switch_id.value;
if (mgr.switch_info.hasValue()) {
attr.switch_info = mgr.switch_info.value;
}
}
return attr;
};
/**
* @description Set values of form fields;
*
* @param {object} values - Dictionary of values indexed by
* property-name
* @return {void}
*/
mgr.setValues = function(values) {
angular.forEach(mgr.fields, function(field, propertyName) {
if (angular.isDefined(values[propertyName])) {
field.value = values[propertyName];
}
});
};
/**
* @description Disable the local-link-connection form fields.
*
* @param {string} reason - Optional reason for disabling fields.
* @return {void}
*/
mgr.disable = function(reason) {
angular.forEach(mgr.fields, function(item) {
item.disable(reason);
});
};
}
function BasePortController($uibModalInstance,
validMacAddressPattern,
validDatapathIdPattern,
formFieldService,
ironic,
ctrl,
node) {
ctrl.port = {
extra: {},
node_uuid: node.uuid
};
ctrl.address = new formFieldService.FormField({
id: "macAddress",
title: gettext("MAC address"),
desc: gettext("MAC address for this port. Required."),
pattern: new RegExp(validMacAddressPattern),
value: null,
required: true,
autoFocus: true
});
ctrl.pxeEnabled = new formFieldService.FormField({
type: "radio",
id: "pxeEnabled",
title: gettext("PXE enabled"),
desc: gettext(
"Indicates whether this port should be used when PXE booting this node"),
options: ['True', 'False'],
value: 'True'});
ctrl.portgroup_uuid = new formFieldService.FormField({
type: "select",
id: "portgroup-uuid",
title: gettext("Portgroup"),
desc: gettext("Portgroup that this port belongs to"),
portgroups: [],
options: "portgroup.uuid as portgroup.name ? portgroup.name : portgroup.uuid for portgroup in field.portgroups", // eslint-disable-line max-len
value: null});
// Object used to manage local-link-connection form fields
ctrl.localLinkConnection =
new LocalLinkConnectionMgr(formFieldService,
validMacAddressPattern,
validDatapathIdPattern);
ironic.getPortgroups(node.uuid).then(function(portgroups) {
var field = ctrl.portgroup_uuid;
if (portgroups.length > 0) {
field.portgroups.push({uuid: null, name: gettext("Select a portgroup")});
}
field.portgroups = field.portgroups.concat(portgroups);
if (portgroups.length === 0) {
field.disable();
}
});
/**
* Cancel the modal
*
* @return {void}
*/
ctrl.cancel = function() {
$uibModalInstance.dismiss('cancel');
};
/**
* Delete a port metadata property
*
* @param {string} propertyName - Name of the property
* @return {void}
*/
ctrl.deleteExtra = function(propertyName) {
delete ctrl.port.extra[propertyName];
};
/**
* Check whether the specified port metadata property already exists
*
* @param {string} propertyName - Name of the metadata property
* @return {boolean} True if the property already exists,
* otherwise false
*/
ctrl.checkExtraUnique = function(propertyName) {
return !(propertyName in ctrl.port.extra);
};
}
})();