ironic-ui/ironic_ui/static/dashboard/admin/ironic/ironic.service.js
Peter Piela 3fc9f6039a Cleanup code associated with the ironic REST api
- In the ironic_rest_api module use specific names like node, port,
driver for return values. I believe this is more descriptive than
the current approach of using "items" in all function returns. The
use of specific names also reduces the possibility of cut and paste
errors in client code.
- Rethink data returned from functions in the ironic.service. For
example, I believe that a function like getNodes should return a
list of nodes as opposed to a HTTP response as is done today. The
client should receieve the requested data, and be abstracted from
how it was obtained
- Modify controllers to take advantage of the api simplifications

Change-Id: Ica8c9ff8dfa9299cd5ef2893d296e366065bca97
2017-02-28 14:53:31 -05:00

497 lines
16 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,2016 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.app.core.openstack-service-api')
.factory('horizon.app.core.openstack-service-api.ironic', ironicAPI);
ironicAPI.$inject = [
'$q',
'horizon.framework.util.http.service',
'horizon.framework.widgets.toast.service',
'horizon.dashboard.admin.ironic.node-error.service'
];
/**
* @description Service that provides access to the Ironic client API
*
* @param {object} $q - Promise provider
* @param {object} apiService - HTTP service
* @param {object} toastService - User message service
* @param {object} nodeErrorService - Node error service
* @return {object} Ironic API service
*/
function ironicAPI($q, apiService, toastService, nodeErrorService) {
var service = {
createNode: createNode,
createPort: createPort,
deleteNode: deleteNode,
deletePort: deletePort,
getDrivers: getDrivers,
getDriverProperties: getDriverProperties,
getNode: getNode,
getNodes: getNodes,
getPortsWithNode: getPortsWithNode,
powerOffNode: powerOffNode,
powerOnNode: powerOnNode,
putNodeInMaintenanceMode: putNodeInMaintenanceMode,
removeNodeFromMaintenanceMode: removeNodeFromMaintenanceMode,
setNodeProvisionState: setNodeProvisionState,
updateNode: updateNode,
updatePort: updatePort,
validateNode: validateNode
};
return service;
/**
* @description Retrieve a list of nodes
* http://developer.openstack.org/api-ref/baremetal/?
* expanded=create-node-detail#list-nodes-detailed
*
* @return {promise} Node collection in JSON
*/
function getNodes() {
return apiService.get('/api/ironic/nodes/')
.then(function(response) {
angular.forEach(response.data.nodes, function(node) {
nodeErrorService.checkNodeError(node);
});
return response.data.nodes;
})
.catch(function(response) {
var msg = interpolate(
gettext('Unable to retrieve Ironic nodes. %s'),
[response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Retrieve information about the given node.
*
* http://developer.openstack.org/api-ref/baremetal/?
* expanded=create-node-detail#list-nodes-detailed
*
* @param {string} uuid UUID or logical name of a node.
* @return {promise} Node
*/
function getNode(uuid) {
return apiService.get('/api/ironic/nodes/' + uuid)
.then(function(response) {
nodeErrorService.checkNodeError(response.data);
return response.data; // The node
})
.catch(function(response) {
var msg = interpolate(
gettext('Unable to retrieve the Ironic node: %s'),
[response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Retrieve a list of ports associated with a node.
*
* http://developer.openstack.org/api-ref/baremetal/#list-detailed-ports
*
* @param {string} uuid UUID or logical name of a node.
* @return {promise} List of ports
*/
function getPortsWithNode(uuid) {
var config = {
params : {
node_id: uuid
}
};
return apiService.get('/api/ironic/ports/', config)
.then(function(response) {
// Add id and name properties to support delete operations
// using the deleteModalService
angular.forEach(response.data.ports, function(port) {
port.id = port.uuid;
port.name = port.address;
});
return response.data.ports;
})
.catch(function(response) {
var msg = interpolate(
gettext('Unable to retrieve the Ironic node ports: %s'),
[response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Put the node in maintenance mode.
*
* http://developer.openstack.org/api-ref/baremetal/#set-maintenance-flag
*
* @param {string} uuid UUID or logical name of a node.
* @param {string} reason Reason for why node is being put into
* maintenance mode
* @return {promise} Promise
*/
function putNodeInMaintenanceMode(uuid, reason) {
return apiService.patch('/api/ironic/nodes/' + uuid + '/maintenance',
{maint_reason: reason
? reason
: gettext("No reason given.")})
.catch(function(response) {
var msg = interpolate(
gettext('Unable to put the Ironic node %s in maintenance mode: %s'),
[uuid, response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Remove the node from maintenance mode.
*
* http://developer.openstack.org/api-ref/baremetal/#clear-maintenance-flag
*
* @param {string} uuid UUID or logical name of a node.
* @return {promise} Promise
*/
function removeNodeFromMaintenanceMode(uuid) {
return apiService.delete('/api/ironic/nodes/' + uuid + '/maintenance')
.catch(function(response) {
var msg = interpolate(
gettext(
'Unable to remove the Ironic node %s from maintenance mode: %s'),
[uuid, response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Set the power state of the node.
*
* http://developer.openstack.org/api-ref/baremetal/#change-node-power-state
*
* @param {string} uuid UUID or logical name of a node.
* @return {promise} Promise
*/
function powerOnNode(uuid) {
var data = {
state: 'on'
};
return apiService.patch('/api/ironic/nodes/' + uuid + '/states/power',
data)
.then(function() {
toastService.add('success',
gettext('Refresh page to see updated power status'));
})
.catch(function(response) {
var msg = interpolate(gettext('Unable to power on the node: %s'),
[response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Set the power state of the node.
*
* http://developer.openstack.org/api-ref/baremetal/#change-node-power-state
*
* @param {string} uuid UUID or logical name of a node.
* @return {promise} Promise
*/
function powerOffNode(uuid) {
var data = {
state: 'off'
};
return apiService.patch('/api/ironic/nodes/' + uuid + '/states/power',
data)
.then(function() {
toastService.add('success',
gettext('Refresh page to see updated power status'));
})
.catch(function(response) {
var msg = interpolate(gettext('Unable to power off the node: %s'),
[response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Set the target provision state of the node.
*
* http://developer.openstack.org/api-ref/baremetal/#change-node-provision-state
*
* @param {string} uuid UUID of a node.
* @param {string} verb Provisioning verb used to move node to desired
* target state
* @param {object []} cleanSteps - List of cleaning steps. Only used
* when the value of verb is 'clean'
* @return {promise} Promise
*/
function setNodeProvisionState(uuid, verb, cleanSteps) {
return apiService.put('/api/ironic/nodes/' + uuid + '/states/provision',
{verb: verb,
clean_steps: cleanSteps})
.then(function() {
var msg = gettext(
'A request has been made to change the provisioning state of node %s');
toastService.add('success', interpolate(msg, [uuid], false));
})
.catch(function(response) {
var msg = interpolate(
gettext('Unable to set node provision state: %s'),
[response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Create an Ironic node
*
* http://developer.openstack.org/api-ref/baremetal/#create-node
*
* @param {object} params Object containing parameters that define
* the node to be created
* @return {promise} Promise
*/
function createNode(params) {
var data = {
node: params
};
return apiService.post('/api/ironic/nodes/', data)
.catch(function(response) {
var msg = interpolate(gettext('Unable to create node: %s'),
[response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Delete the specified node from inventory
*
* http://developer.openstack.org/api-ref/baremetal/#delete-node
*
* @param {string} nodeIdent UUID or logical name of a node.
* @return {promise} Promise
*/
function deleteNode(nodeIdent) {
var data = {
node: nodeIdent
};
return apiService.delete('/api/ironic/nodes/', data)
.catch(function(response) {
var msg = interpolate(gettext('Unable to delete node %s: %s'),
[nodeIdent, response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Update the definition of a specified node.
*
* http://developer.openstack.org/api-ref/baremetal/#update-node
*
* @param {string} uuid UUID of a node.
* @param {object[]} patch Sequence of update operations
* @return {promise} Promise
*/
function updateNode(uuid, patch) {
var data = {
patch: patch
};
return apiService.patch('/api/ironic/nodes/' + uuid, data)
.then(function(response) {
var msg = gettext('Successfully updated node %s');
toastService.add('success', interpolate(msg, [uuid], false));
return response.data; // The updated node
})
.catch(function(response) {
var msg = interpolate(gettext('Unable to update node %s: %s'),
[uuid, response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Validate the specified node
*
* http://developer.openstack.org/api-ref/baremetal/#validate-node
*
* @param {string} nodeId UUID or logical name of a node.
* @return {promise} Promise. success: list of interface validation
* records, error: failure response
*/
function validateNode(nodeId) {
return apiService.get('/api/ironic/nodes/' + nodeId + '/validate',
{node: nodeId})
.catch(function(response) {
var msg = interpolate(gettext('Unable to validate node %s: %s'),
[nodeId, response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Retrieve the list of Ironic drivers
*
* http://developer.openstack.org/api-ref/baremetal/#list-drivers
*
* @return {promise} Driver collection in JSON
*/
function getDrivers() {
return apiService.get('/api/ironic/drivers/')
.then(function(response) {
return response.data.drivers;
})
.catch(function(response) {
var msg = interpolate(
gettext('Unable to retrieve Ironic drivers: %s'),
[response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Retrieve properities of a specified driver
*
* http://developer.openstack.org/api-ref/baremetal/#show-driver-properties
*
* @param {string} driverName - Driver name
* @returns {promise} Property list
*/
function getDriverProperties(driverName) {
return apiService.get(
'/api/ironic/drivers/' + driverName + '/properties')
.then(function(response) {
return response.data; // Driver properties
})
.catch(function(response) {
var msg = interpolate(
gettext('Unable to retrieve driver properties: %s'),
[response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Create a network port
*
* http://developer.openstack.org/api-ref/baremetal/#create-port
*
* @param {object} port Object containing parameters that define
* the port to be created
* @return {promise} Promise
*/
function createPort(port) {
var data = {
port: port
};
return apiService.post('/api/ironic/ports/', data)
.then(function(response) {
toastService.add('success',
gettext('Port successfully created'));
return response.data; // The newly created port
})
.catch(function(response) {
var msg = interpolate(gettext('Unable to create port: %s'),
[response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Delete a network port
*
* http://developer.openstack.org/api-ref/baremetal/#delete-port
*
* @param {string} portUuid UUID of the port to be deleted
* @return {promise} Promise
*/
function deletePort(portUuid) {
var data = {
port_uuid: portUuid
};
return apiService.delete('/api/ironic/ports/', data)
.catch(function(response) {
var msg = interpolate(gettext('Unable to delete port: %s'),
[response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
/**
* @description Update the definition of a specified port.
*
* http://developer.openstack.org/api-ref/baremetal/#update-a-port
*
* @param {string} portUuid UUID of a port.
* @param {object[]} patch Sequence of update operations
* @return {promise} Promise
*/
function updatePort(portUuid, patch) {
return apiService.patch('/api/ironic/ports/' + portUuid,
{patch: patch})
.then(function(response) {
var msg = gettext('Successfully updated port %s');
toastService.add('success', interpolate(msg, [portUuid], false));
return response.data; // The updated port
})
.catch(function(response) {
var msg = interpolate(gettext('Unable to update port %s: %s'),
[portUuid, response.data],
false);
toastService.add('error', msg);
return $q.reject(msg);
});
}
}
}());