
This change will modify a number of things about the way we manage guideline sources - it allows the api to pull guidelines from a list of additional guideline sources, as specified in conf - changes the object returned by the guidelines api from a list to a dictionary of lists pertaining to a specific guideline type Change-Id: Ic42197b32d4c9030a35e613cae8cc64dca794c85
388 lines
15 KiB
JavaScript
388 lines
15 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('GuidelinesController', GuidelinesController);
|
|
|
|
GuidelinesController.$inject =
|
|
['$filter', '$http', '$uibModal', 'refstackApiUrl'];
|
|
|
|
/**
|
|
* RefStack Guidelines Controller
|
|
* This controller is for the '/guidelines' page where a user can browse
|
|
* through tests belonging to Interop WG defined capabilities.
|
|
*/
|
|
function GuidelinesController($filter ,$http, $uibModal, refstackApiUrl) {
|
|
var ctrl = this;
|
|
|
|
ctrl.getVersionList = getVersionList;
|
|
ctrl.update = update;
|
|
ctrl.updateTargetCapabilities = updateTargetCapabilities;
|
|
ctrl.filterStatus = filterStatus;
|
|
ctrl.getObjectLength = getObjectLength;
|
|
ctrl.openTestListModal = openTestListModal;
|
|
ctrl.updateVersionList = updateVersionList;
|
|
ctrl.gl_type = 'powered';
|
|
|
|
/** 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/guidelines/partials/' +
|
|
'guidelineDetails.html';
|
|
|
|
/**
|
|
* Update the array of dictionary objects which stores data
|
|
* pertaining to each guideline, sorting them in descending
|
|
* order by guideline name. After these are sorted, the
|
|
* function to update the capabilities is called.
|
|
*/
|
|
function updateVersionList() {
|
|
let gl_files = ctrl.guidelineData[ctrl.gl_type];
|
|
ctrl.versionList = $filter('orderBy')(gl_files, 'name', true);
|
|
// Default to the first approved guideline which is expected
|
|
// to be at index 1.
|
|
ctrl.version = ctrl.versionList[1];
|
|
update();
|
|
}
|
|
|
|
/**
|
|
* Retrieve a dictionary object comprised of available guideline types
|
|
* and and an array of dictionary objects containing file info about
|
|
* each guideline file pertaining to that particular guideline type.
|
|
* After a successful API call, the function to sort and update the
|
|
* version list is called.
|
|
*/
|
|
function getVersionList() {
|
|
var content_url = refstackApiUrl + '/guidelines';
|
|
ctrl.versionsRequest =
|
|
$http.get(content_url).success(function (data) {
|
|
ctrl.guidelineData = data;
|
|
updateVersionList();
|
|
}).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 guideline file corresponding to the selected
|
|
* version.
|
|
*/
|
|
function update() {
|
|
ctrl.content_url = refstackApiUrl + '/guidelines/'
|
|
+ ctrl.version.file;
|
|
let get_params = {'gl_file': ctrl.version.file};
|
|
ctrl.capsRequest =
|
|
$http.get(ctrl.content_url, get_params).success(
|
|
function (data) {
|
|
ctrl.guidelines = data;
|
|
if ('metadata' in data && data.metadata.schema >= '2.0') {
|
|
ctrl.schema = data.metadata.schema;
|
|
ctrl.criteria = data.metadata.scoring.criteria;
|
|
ctrl.releases =
|
|
data.metadata.os_trademark_approval.releases;
|
|
ctrl.guidelineStatus =
|
|
data.metadata.os_trademark_approval.status;
|
|
} else {
|
|
ctrl.schema = data.schema;
|
|
ctrl.criteria = data.criteria;
|
|
ctrl.releases = data.releases;
|
|
ctrl.guidelineStatus = data.status;
|
|
}
|
|
ctrl.updateTargetCapabilities();
|
|
|
|
}).error(function (error) {
|
|
ctrl.showError = true;
|
|
ctrl.guidelines = null;
|
|
ctrl.error = 'Error retrieving guideline content: ' +
|
|
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 Interop WG
|
|
* schema). Each capability will have its status mapped to it.
|
|
*/
|
|
function updateTargetCapabilities() {
|
|
ctrl.targetCapabilities = {};
|
|
var components = ctrl.guidelines.components;
|
|
var targetCaps = ctrl.targetCapabilities;
|
|
var targetComponents = null;
|
|
|
|
var old_type = ctrl.gl_type;
|
|
if (ctrl.target === 'dns' || ctrl.target === 'orchestration') {
|
|
ctrl.gl_type = ctrl.target;
|
|
} else {
|
|
ctrl.gl_type = 'powered';
|
|
}
|
|
// If it has not been updated since the last program type change,
|
|
// will need to update the list
|
|
if (old_type !== ctrl.gl_type) {
|
|
updateVersionList();
|
|
return;
|
|
}
|
|
|
|
// 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' || ctrl.schema >= '2.0') {
|
|
if ('add-ons' in ctrl.guidelines) {
|
|
targetComponents = ['os_powered_' + ctrl.target];
|
|
} else if (ctrl.schema >= '2.0') {
|
|
var platformsMap = {
|
|
'platform': 'OpenStack Powered Platform',
|
|
'compute': 'OpenStack Powered Compute',
|
|
'object': 'OpenStack Powered Storage'
|
|
};
|
|
|
|
targetComponents = ctrl.guidelines.platforms[
|
|
platformsMap[ctrl.target]].components.map(
|
|
function(c) {
|
|
return c.name;
|
|
}
|
|
);
|
|
} else {
|
|
targetComponents = ctrl.guidelines.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(targetComponents, function (component) {
|
|
// Get each capability list belonging to each status.
|
|
var componentList = components[component];
|
|
if (ctrl.schema >= '2.0') {
|
|
componentList = componentList.capabilities;
|
|
}
|
|
angular.forEach(componentList,
|
|
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 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/guidelines/partials' +
|
|
'/testListModal.html',
|
|
backdrop: true,
|
|
windowClass: 'modal',
|
|
animation: true,
|
|
controller: 'TestListModalController as modal',
|
|
size: 'lg',
|
|
resolve: {
|
|
version: function () {
|
|
return ctrl.version.name.slice(0, -5);
|
|
},
|
|
version_file: function() {
|
|
return ctrl.version.file;
|
|
},
|
|
target: function () {
|
|
return ctrl.target;
|
|
},
|
|
status: function () {
|
|
return ctrl.status;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
ctrl.getVersionList();
|
|
}
|
|
|
|
angular
|
|
.module('refstackApp')
|
|
.controller('TestListModalController', TestListModalController);
|
|
|
|
TestListModalController.$inject = [
|
|
'$uibModalInstance', '$http', 'version',
|
|
'version_file', 'target', 'status',
|
|
'refstackApiUrl'
|
|
];
|
|
|
|
/**
|
|
* Test List Modal Controller
|
|
* This controller is for the modal that appears if a user wants to see the
|
|
* test list corresponding to Interop WG capabilities with the selected
|
|
* statuses.
|
|
*/
|
|
function TestListModalController($uibModalInstance, $http, version,
|
|
version_file, target, status, refstackApiUrl) {
|
|
|
|
var ctrl = this;
|
|
|
|
ctrl.version = version;
|
|
ctrl.version_file = version_file;
|
|
ctrl.target = target;
|
|
ctrl.status = status;
|
|
ctrl.close = close;
|
|
ctrl.updateTestListString = updateTestListString;
|
|
|
|
ctrl.aliases = true;
|
|
ctrl.flagged = false;
|
|
|
|
// Check if the API URL is absolute or relative.
|
|
if (refstackApiUrl.indexOf('http') > -1) {
|
|
ctrl.url = refstackApiUrl;
|
|
} else {
|
|
ctrl.url = location.protocol + '//' + location.host +
|
|
refstackApiUrl;
|
|
}
|
|
|
|
/**
|
|
* This function will close/dismiss the modal.
|
|
*/
|
|
function close() {
|
|
$uibModalInstance.dismiss('exit');
|
|
}
|
|
|
|
/**
|
|
* This function will return a list of statuses based on which ones
|
|
* are selected.
|
|
*/
|
|
function getStatusList() {
|
|
var statusList = [];
|
|
angular.forEach(ctrl.status, function(value, key) {
|
|
if (value) {
|
|
statusList.push(key);
|
|
}
|
|
});
|
|
return statusList;
|
|
}
|
|
|
|
/**
|
|
* This will get the list of tests from the API and update the
|
|
* controller's test list string variable.
|
|
*/
|
|
function updateTestListString() {
|
|
var statuses = getStatusList();
|
|
if (!statuses.length) {
|
|
ctrl.error = 'No tests matching selected criteria.';
|
|
return;
|
|
}
|
|
ctrl.testListUrl = [
|
|
ctrl.url, '/guidelines/', ctrl.version_file, '/tests?',
|
|
'target=', ctrl.target, '&',
|
|
'type=', statuses.join(','), '&',
|
|
'alias=', ctrl.aliases.toString(), '&',
|
|
'flag=', ctrl.flagged.toString()
|
|
].join('');
|
|
ctrl.testListRequest =
|
|
$http.get(ctrl.testListUrl).
|
|
then(function successCallback(response) {
|
|
ctrl.error = null;
|
|
ctrl.testListString = response.data;
|
|
if (!ctrl.testListString) {
|
|
ctrl.testListCount = 0;
|
|
} else {
|
|
ctrl.testListCount =
|
|
ctrl.testListString.split('\n').length;
|
|
}
|
|
}, function errorCallback(response) {
|
|
ctrl.testListString = null;
|
|
ctrl.testListCount = null;
|
|
if (angular.isObject(response.data) &&
|
|
response.data.message) {
|
|
ctrl.error = 'Error retrieving test list: ' +
|
|
response.data.message;
|
|
} else {
|
|
ctrl.error = 'Unknown error retrieving test list.';
|
|
}
|
|
});
|
|
}
|
|
|
|
updateTestListString();
|
|
}
|
|
})();
|