refstack/refstack-ui/app/components/capabilities/capabilitiesController.js
Paul Van Eck 907bc9feb3 Add support for defcore schema 1.4
This will allow reports and capabilities using schema version
1.4 to display on the website. This mainly adds alias support.
Capabilities version templates were also reduced to one template
since there was so much overlap.

Change-Id: Ie6fcfd574f45c2e50a4db472d41b1129a59ce2dc
2015-11-11 14:34:54 -08:00

188 lines
7.4 KiB
JavaScript

/*
* 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('refstackApp')
.controller('CapabilitiesController', CapabilitiesController);
CapabilitiesController.$inject = ['$http', 'refstackApiUrl'];
/**
* RefStack Capabilities Controller
* This controller is for the '/capabilities' page where a user can browse
* through tests belonging to DefCore-defined capabilities.
*/
function CapabilitiesController($http, refstackApiUrl) {
var ctrl = this;
ctrl.getVersionList = getVersionList;
ctrl.update = update;
ctrl.updateTargetCapabilities = updateTargetCapabilities;
ctrl.filterStatus = filterStatus;
ctrl.getObjectLength = getObjectLength;
/** The target OpenStack marketing program to show capabilities for. */
ctrl.target = 'platform';
/** The various possible capability statuses. */
ctrl.status = {
required: true,
advisory: false,
deprecated: false,
removed: false
};
/**
* The template to load for displaying capability details.
*/
ctrl.detailsTemplate = 'components/capabilities/partials/' +
'capabilityDetails.html';
/**
* Retrieve an array of available capability files from the Refstack
* API server, sort this array reverse-alphabetically, and store it in
* a scoped variable. The scope's selected version is initialized to
* the latest (i.e. first) version here as well. After a successful API
* call, the function to update the capabilities is called.
* Sample API return array: ["2015.03.json", "2015.04.json"]
*/
function getVersionList() {
var content_url = refstackApiUrl + '/capabilities';
ctrl.versionsRequest =
$http.get(content_url).success(function (data) {
ctrl.versionList = data.sort().reverse();
ctrl.version = ctrl.versionList[0];
ctrl.update();
}).error(function (error) {
ctrl.showError = true;
ctrl.error = 'Error retrieving version list: ' +
angular.toJson(error);
});
}
/**
* This will contact the Refstack API server to retrieve the JSON
* content of the capability file corresponding to the selected
* version.
*/
function update() {
var content_url = refstackApiUrl + '/capabilities/' + ctrl.version;
ctrl.capsRequest =
$http.get(content_url).success(function (data) {
ctrl.capabilities = data;
ctrl.updateTargetCapabilities();
}).error(function (error) {
ctrl.showError = true;
ctrl.capabilities = null;
ctrl.error = 'Error retrieving capabilities: ' +
angular.toJson(error);
});
}
/**
* This will update the scope's 'targetCapabilities' object with
* capabilities belonging to the selected OpenStack marketing program
* (programs typically correspond to 'components' in the DefCore
* schema). Each capability will have its status mapped to it.
*/
function updateTargetCapabilities() {
ctrl.targetCapabilities = {};
var components = ctrl.capabilities.components;
var targetCaps = ctrl.targetCapabilities;
// The 'platform' target is comprised of multiple components, so
// we need to get the capabilities belonging to each of its
// components.
if (ctrl.target === 'platform') {
var platform_components = ctrl.capabilities.platform.required;
// This will contain status priority values, where lower
// values mean higher priorities.
var statusMap = {
required: 1,
advisory: 2,
deprecated: 3,
removed: 4
};
// For each component required for the platform program.
angular.forEach(platform_components, function (component) {
// Get each capability list belonging to each status.
angular.forEach(components[component],
function (caps, status) {
// For each capability.
angular.forEach(caps, function(cap) {
// If the capability has already been added.
if (cap in targetCaps) {
// If the status priority value is less
// than the saved priority value, update
// the value.
if (statusMap[status] <
statusMap[targetCaps[cap]]) {
targetCaps[cap] = status;
}
}
else {
targetCaps[cap] = status;
}
});
});
});
}
else {
angular.forEach(components[ctrl.target],
function (caps, status) {
angular.forEach(caps, function(cap) {
targetCaps[cap] = status;
});
});
}
}
/**
* This filter will check if a capability's status corresponds
* to a status that is checked/selected in the UI. This filter
* is meant to be used with the ng-repeat directive.
* @param {Object} capability
* @returns {Boolean} True if capability's status is selected
*/
function filterStatus(capability) {
var caps = ctrl.targetCapabilities;
return (ctrl.status.required &&
caps[capability.id] === 'required') ||
(ctrl.status.advisory &&
caps[capability.id] === 'advisory') ||
(ctrl.status.deprecated &&
caps[capability.id] === 'deprecated') ||
(ctrl.status.removed &&
caps[capability.id] === 'removed');
}
/**
* This function will get the length of an Object/dict based on
* the number of keys it has.
* @param {Object} object
* @returns {Number} length of object
*/
function getObjectLength(object) {
return Object.keys(object).length;
}
ctrl.getVersionList();
}
})();