229 lines
6.9 KiB
JavaScript
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);
|
|
};
|
|
}
|
|
})();
|