refstack/refstack-ui/app/components/capabilities/capabilitiesController.js
Paul Van Eck 64f1efe961 Add option to view/download test lists
On the guideline page when viewing DefCore capabilities, users
might want to get the test list containing only required or advisory
tests. This patch provides a way for a user to get that test list
to use with RefStack client. The phantomjs version was updated to allow
testing with Blobs.

Change-Id: I9243f5781cb8a688ca3e64645302db5bc4527c37
2016-03-01 11:20:32 -08:00

302 lines
11 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', '$uibModal', '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, $uibModal, refstackApiUrl) {
var ctrl = this;
ctrl.getVersionList = getVersionList;
ctrl.update = update;
ctrl.updateTargetCapabilities = updateTargetCapabilities;
ctrl.filterStatus = filterStatus;
ctrl.getObjectLength = getObjectLength;
ctrl.getTestList = getTestList;
ctrl.openTestListModal = openTestListModal;
/** 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;
}
/**
* This will give a list of tests belonging to capabilities with
* the selected status(es).
*/
function getTestList() {
var caps = ctrl.capabilities.capabilities;
var tests = [];
angular.forEach(ctrl.targetCapabilities,
function (status, cap) {
if (ctrl.status[status]) {
if (ctrl.capabilities.schema === '1.2') {
tests.push.apply(tests, caps[cap].tests);
}
else {
angular.forEach(caps[cap].tests,
function(info, test) {
tests.push(test);
});
}
}
});
return tests;
}
/**
* This will open the modal that will show a list of all tests
* belonging to capabilities with the selected status(es).
*/
function openTestListModal() {
$uibModal.open({
templateUrl: '/components/capabilities/partials' +
'/testListModal.html',
backdrop: true,
windowClass: 'modal',
animation: true,
controller: 'TestListModalController as modal',
size: 'lg',
resolve: {
tests: function () {
return ctrl.getTestList();
},
version: function () {
return ctrl.version.slice(0, -5);
},
status: function () {
return ctrl.status;
}
}
});
}
ctrl.getVersionList();
}
angular
.module('refstackApp')
.controller('TestListModalController', TestListModalController);
TestListModalController.$inject = [
'$uibModalInstance', '$window', 'tests', 'version', 'status'
];
/**
* Test List Modal Controller
* This controller is for the modal that appears if a user wants to see the
* ftest list corresponding to DefCore capabilities with the selected
* statuses.
*/
function TestListModalController($uibModalInstance, $window, tests,
version, status) {
var ctrl = this;
ctrl.tests = tests;
ctrl.version = version;
ctrl.status = status;
ctrl.close = close;
ctrl.getTestListString = getTestListString;
ctrl.downloadTestList = downloadTestList;
/**
* This function will close/dismiss the modal.
*/
function close() {
$uibModalInstance.dismiss('exit');
}
/**
* This function will return a string representing the sorted
* tests list separated by newlines.
*/
function getTestListString() {
return ctrl.tests.sort().join('\n');
}
/**
* Serve the test list as a downloadable file.
*/
function downloadTestList() {
var blob = new Blob([ctrl.getTestListString()], {type: 'text/csv'});
var filename = ctrl.version + '-test-list.txt';
if ($window.navigator.msSaveOrOpenBlob) {
$window.navigator.msSaveBlob(blob, filename);
}
else {
var a = $window.document.createElement('a');
a.href = $window.URL.createObjectURL(blob);
a.download = filename;
$window.document.body.appendChild(a);
a.click();
$window.document.body.removeChild(a);
}
}
}
})();