diff --git a/ironic_ui/api/ironic.py b/ironic_ui/api/ironic.py index a1057341..d9df1cbf 100755 --- a/ironic_ui/api/ironic.py +++ b/ironic_ui/api/ironic.py @@ -384,3 +384,18 @@ def portgroup_get_ports(request, portgroup_id): http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.portgroup.html#ironicclient.v1.portgroup.PortgroupManager.list_ports """ return ironicclient(request).portgroup.list_ports(portgroup_id) + + +def node_set_raid_config(request, node_id, target_raid_config): + """Set target raid configuration for a given node. + + :param request: HTTP request. + :param node_id: The UUID or name of the node. + :param target_raid_config: Target raid configuration. + :return: Node. + + http://docs.openstack.org/developer/python-ironicclient/api/ironicclient.v1.node.html#ironicclient.v1.node.NodeManager.set_target_raid_config + """ + return ironicclient(request).node.set_target_raid_config( + node_id, + target_raid_config) diff --git a/ironic_ui/api/ironic_rest_api.py b/ironic_ui/api/ironic_rest_api.py index fac9f7e5..6614b2ed 100755 --- a/ironic_ui/api/ironic_rest_api.py +++ b/ironic_ui/api/ironic_rest_api.py @@ -416,3 +416,23 @@ class PortgroupPorts(generic.View): return { 'ports': [i.to_dict() for i in ports] } + + +@urls.register +class RaidConfig(generic.View): + + url_regex = r'ironic/nodes/(?P{})/states/raid$'. \ + format(LOGICAL_NAME_PATTERN) + + @rest_utils.ajax(data_required=True) + def put(self, request, node_id): + """Set the RAID configuration for a specified node. + + :param request: HTTP request. + :param node_id: Node name or node uuid + :return: None + """ + return ironic.node_set_raid_config( + request, + node_id, + request.DATA.get('target_raid_config')) diff --git a/ironic_ui/static/dashboard/admin/ironic/ironic.service.js b/ironic_ui/static/dashboard/admin/ironic/ironic.service.js index 6ad1e306..b572870a 100755 --- a/ironic_ui/static/dashboard/admin/ironic/ironic.service.js +++ b/ironic_ui/static/dashboard/admin/ironic/ironic.service.js @@ -57,6 +57,7 @@ nodeSetMaintenance: nodeSetMaintenance, nodeSetBootDevice: nodeSetBootDevice, nodeSetPowerState: nodeSetPowerState, + nodeSetRaidConfig: nodeSetRaidConfig, setNodeProvisionState: setNodeProvisionState, updateNode: updateNode, updatePort: updatePort, @@ -288,6 +289,31 @@ }); } + /** + * @description Set the target raid configuration of a node + * + * http://developer.openstack.org/api-ref/baremetal/#set-target-raid-config + * + * @param {string} nodeId – UUID or logical name of a node. + * @param {string} raidConfig - Target raid configuration. + * @return {promise} Promise + */ + function nodeSetRaidConfig(nodeId, raidConfig) { + return apiService.put('/api/ironic/nodes/' + nodeId + '/states/raid', + {target_raid_config: raidConfig}) + .then(function() { + toastService.add('success', + gettext('Refresh page.')); + }) + .catch(function(response) { + var msg = interpolate(gettext('Unable to set raid config: %s'), + [response.data], + false); + toastService.add('error', msg); + return $q.reject(msg); + }); + } + /** * @description Set the target provision state of the node. * diff --git a/ironic_ui/static/dashboard/admin/ironic/ironic.service.spec.js b/ironic_ui/static/dashboard/admin/ironic/ironic.service.spec.js index 1e6f18ca..e9a936cf 100644 --- a/ironic_ui/static/dashboard/admin/ironic/ironic.service.spec.js +++ b/ironic_ui/static/dashboard/admin/ironic/ironic.service.spec.js @@ -37,6 +37,7 @@ 'nodeSetBootDevice', 'nodeSetConsoleMode', 'nodeSetPowerState', + 'nodeSetRaidConfig', 'nodeSetMaintenance', 'setNodeProvisionState', 'updateNode', diff --git a/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.controller.js b/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.controller.js index 3e1e2d5f..737ab686 100755 --- a/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.controller.js +++ b/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.controller.js @@ -36,6 +36,7 @@ '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' ]; @@ -53,6 +54,7 @@ editPortgroupService, maintenanceService, bootDeviceService, + raidConfigService, nodeStateTransitionService, validUuidPattern) { var ctrl = this; @@ -64,6 +66,7 @@ ctrl.actions = actions; ctrl.maintenanceService = maintenanceService; ctrl.bootDeviceService = bootDeviceService; + ctrl.raidConfigService = raidConfigService; ctrl.sections = [ { diff --git a/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.html b/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.html index 5b3c7686..e8e3eb9d 100644 --- a/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.html +++ b/ironic_ui/static/dashboard/admin/ironic/node-details/node-details.html @@ -45,6 +45,14 @@ {$ "Set boot device" | translate $} +
  • + + {$ "Set RAID configuration" | translate $} + +
  • + + + + + + + diff --git a/ironic_ui/static/dashboard/admin/ironic/raidconfig/raidconfig.service.js b/ironic_ui/static/dashboard/admin/ironic/raidconfig/raidconfig.service.js new file mode 100644 index 00000000..1affba62 --- /dev/null +++ b/ironic_ui/static/dashboard/admin/ironic/raidconfig/raidconfig.service.js @@ -0,0 +1,68 @@ +/* + * Copyright 2017 Intel Corporation + * + * 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'; + + /* + * @ngdoc service + * @name horizon.dashboard.admin.ironic.raidconfig.service + * @description Service for setting the target raid configuration of a node + */ + angular + .module('horizon.dashboard.admin.ironic') + .factory('horizon.dashboard.admin.ironic.raidconfig.service', + raidConfigService); + + raidConfigService.$inject = [ + '$uibModal', + 'horizon.dashboard.admin.ironic.basePath', + 'horizon.app.core.openstack-service-api.ironic' + ]; + + function raidConfigService($uibModal, basePath, ironic) { + var service = { + setRaidConfig: setRaidConfig + }; + return service; + + /* + * @description Set the target raid configuration of a specified node + * + * @param {object} node - node object + * @return {promise} + */ + function setRaidConfig(node) { + var promise; + var options = { + controller: "RaidConfigController as ctrl", + backdrop: 'static', + resolve: { + node: function() { + return node; + } + }, + templateUrl: basePath + '/raidconfig/raidconfig.html' + }; + promise = $uibModal.open(options).result.then( + function(result) { + return ironic.nodeSetRaidConfig(node.uuid, + result.target_raid_config); + }); + return promise; + } + } +})(); +