From 8e883de068dcd159e30d76a79414c77f49d0d8d1 Mon Sep 17 00:00:00 2001 From: SerenaFeng Date: Wed, 26 Jul 2017 17:34:16 +0800 Subject: add Pods page in webportal delete OPNFV Powered Guidelines page add Pods page with create/list operations Change-Id: Ib9fd2834bd9d54ee33600458a90e3aac76382589 Signed-off-by: SerenaFeng --- testapi/3rd_party/static/testapi-ui/app.js | 24 +- .../components/guidelines/guidelines.html | 80 ----- .../components/guidelines/guidelinesController.js | 322 --------------------- .../guidelines/partials/guidelineDetails.html | 50 ---- .../guidelines/partials/testListModal.html | 46 --- .../static/testapi-ui/components/pods/pods.html | 71 +++++ .../testapi-ui/components/pods/podsController.js | 119 ++++++++ testapi/3rd_party/static/testapi-ui/index.html | 2 +- .../static/testapi-ui/shared/header/header.html | 2 +- 9 files changed, 212 insertions(+), 504 deletions(-) delete mode 100644 testapi/3rd_party/static/testapi-ui/components/guidelines/guidelines.html delete mode 100644 testapi/3rd_party/static/testapi-ui/components/guidelines/guidelinesController.js delete mode 100644 testapi/3rd_party/static/testapi-ui/components/guidelines/partials/guidelineDetails.html delete mode 100644 testapi/3rd_party/static/testapi-ui/components/guidelines/partials/testListModal.html create mode 100644 testapi/3rd_party/static/testapi-ui/components/pods/pods.html create mode 100644 testapi/3rd_party/static/testapi-ui/components/pods/podsController.js (limited to 'testapi') diff --git a/testapi/3rd_party/static/testapi-ui/app.js b/testapi/3rd_party/static/testapi-ui/app.js index bb31ab0..5f5b861 100644 --- a/testapi/3rd_party/static/testapi-ui/app.js +++ b/testapi/3rd_party/static/testapi-ui/app.js @@ -26,6 +26,22 @@ .module('testapiApp') .config(configureRoutes); + angular + .module('testapiApp') + .directive('dynamicModel', ['$compile', '$parse', function ($compile, $parse) { + return { + restrict: 'A', + terminal: true, + priority: 100000, + link: function (scope, elem) { + var name = $parse(elem.attr('dynamic-model'))(scope); + elem.removeAttr('dynamic-model'); + elem.attr('ng-model', name); + $compile(elem)(scope); + } + }; + }]); + configureRoutes.$inject = ['$stateProvider', '$urlRouterProvider']; /** @@ -43,10 +59,10 @@ url: '/about', templateUrl: 'testapi-ui/components/about/about.html' }). - state('guidelines', { - url: '/guidelines', - templateUrl: 'testapi-ui/components/guidelines/guidelines.html', - controller: 'GuidelinesController as ctrl' + state('pods', { + url: '/pods', + templateUrl: 'testapi-ui/components/pods/pods.html', + controller: 'PodsController as ctrl' }). state('communityResults', { url: '/community_results', diff --git a/testapi/3rd_party/static/testapi-ui/components/guidelines/guidelines.html b/testapi/3rd_party/static/testapi-ui/components/guidelines/guidelines.html deleted file mode 100644 index 1dd39ff..0000000 --- a/testapi/3rd_party/static/testapi-ui/components/guidelines/guidelines.html +++ /dev/null @@ -1,80 +0,0 @@ -

OpenStack Powered™ Guidelines

- - -
-
- Version: - - -
-
- Target Program: - About - -
-
- -
-
- Guideline Status: - {{ctrl.guidelines.status | capitalize}} -
- -
- Corresponding OpenStack Releases: -
    -
  • - {{release | capitalize}} -
  • -
-
- -Capability Status: -
- - - - - - - Test List - -
- - -

Tests marked with are tests flagged by Interop Working Group.

- - -
-
- - -
- - diff --git a/testapi/3rd_party/static/testapi-ui/components/guidelines/guidelinesController.js b/testapi/3rd_party/static/testapi-ui/components/guidelines/guidelinesController.js deleted file mode 100644 index a6f4258..0000000 --- a/testapi/3rd_party/static/testapi-ui/components/guidelines/guidelinesController.js +++ /dev/null @@ -1,322 +0,0 @@ -/* - * 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('testapiApp') - .controller('GuidelinesController', GuidelinesController); - - GuidelinesController.$inject = ['$http', '$uibModal', 'testapiApiUrl']; - - /** - * TestAPI Guidelines Controller - * This controller is for the '/guidelines' page where a user can browse - * through tests belonging to Interop WG defined capabilities. - */ - function GuidelinesController($http, $uibModal, testapiApiUrl) { - var ctrl = this; - - ctrl.getVersionList = getVersionList; - ctrl.update = update; - ctrl.updateTargetCapabilities = updateTargetCapabilities; - ctrl.filterStatus = filterStatus; - ctrl.getObjectLength = getObjectLength; - 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/guidelines/partials/' + - 'guidelineDetails.html'; - - /** - * Retrieve an array of available guideline files from the TestAPI - * 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 = testapiApiUrl + '/guidelines'; - ctrl.versionsRequest = - $http.get(content_url).success(function (data) { - ctrl.versionList = data.sort().reverse(); - // Default to the first approved guideline which is expected - // to be at index 1. - ctrl.version = ctrl.versionList[1]; - ctrl.update(); - }).error(function (error) { - ctrl.showError = true; - ctrl.error = 'Error retrieving version list: ' + - angular.toJson(error); - }); - } - - /** - * This will contact the TestAPI API server to retrieve the JSON - * content of the guideline file corresponding to the selected - * version. - */ - function update() { - var content_url = testapiApiUrl + '/guidelines/' + ctrl.version; - ctrl.capsRequest = - $http.get(content_url).success(function (data) { - ctrl.guidelines = data; - 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; - - // 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.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(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 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.slice(0, -5); - }, - target: function () { - return ctrl.target; - }, - status: function () { - return ctrl.status; - } - } - }); - } - - ctrl.getVersionList(); - } - - angular - .module('testapiApp') - .controller('TestListModalController', TestListModalController); - - TestListModalController.$inject = [ - '$uibModalInstance', '$http', 'version', - 'target', 'status', 'testapiApiUrl' - ]; - - /** - * 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, - target, status, testapiApiUrl) { - - var ctrl = this; - - ctrl.version = version; - 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 (testapiApiUrl.indexOf('http') > -1) { - ctrl.url = testapiApiUrl; - } - else { - ctrl.url = location.protocol + '//' + location.host + - testapiApiUrl; - } - - /** - * 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, '/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(); - } -})(); diff --git a/testapi/3rd_party/static/testapi-ui/components/guidelines/partials/guidelineDetails.html b/testapi/3rd_party/static/testapi-ui/components/guidelines/partials/guidelineDetails.html deleted file mode 100644 index f020c9a..0000000 --- a/testapi/3rd_party/static/testapi-ui/components/guidelines/partials/guidelineDetails.html +++ /dev/null @@ -1,50 +0,0 @@ - - -
    -
  1. - {{capability.id}}
    - {{capability.description}}
    - Status: {{ctrl.targetCapabilities[capability.id]}}
    - Project: {{capability.project | capitalize}}
    - Achievements ({{capability.achievements.length}})
    -
      -
    1. - {{achievement}} -
    2. -
    - - Tests ({{ctrl.getObjectLength(capability.tests)}}) -
      -
    • - - {{test}} -
    • -
    • - - {{testName}} -
      - Aliases: -
      • {{alias}}
      -
      -
    • -
    -
  2. -
- -
-
-

Criteria

-
-
    -
  • - {{criterion.name}}
    - {{criterion.Description}}
    - Weight: {{criterion.weight}} -
  • -
-
-
diff --git a/testapi/3rd_party/static/testapi-ui/components/guidelines/partials/testListModal.html b/testapi/3rd_party/static/testapi-ui/components/guidelines/partials/testListModal.html deleted file mode 100644 index 5b1d698..0000000 --- a/testapi/3rd_party/static/testapi-ui/components/guidelines/partials/testListModal.html +++ /dev/null @@ -1,46 +0,0 @@ - diff --git a/testapi/3rd_party/static/testapi-ui/components/pods/pods.html b/testapi/3rd_party/static/testapi-ui/components/pods/pods.html new file mode 100644 index 0000000..cdfcfaf --- /dev/null +++ b/testapi/3rd_party/static/testapi-ui/components/pods/pods.html @@ -0,0 +1,71 @@ +

{{ctrl.pageHeader}}

+

{{ctrl.pageParagraph}}

+
+ +
+

Create

+
+
+
+

+ + + + + + + + + + +

+
+
+ +
+ +
+
+
+ +
+

Filters

+
+
+ + +
+
+
+ +
+
+ +
+ + + + + + + + +
+ {{pod.name}} +
+

+ role: {{pod.role}}
+ mode: {{pod.mode}}
+ create_date: {{pod.creation_date}}
+ details: {{pod.details}} +

+
+
+
+ + diff --git a/testapi/3rd_party/static/testapi-ui/components/pods/podsController.js b/testapi/3rd_party/static/testapi-ui/components/pods/podsController.js new file mode 100644 index 0000000..53e8b1e --- /dev/null +++ b/testapi/3rd_party/static/testapi-ui/components/pods/podsController.js @@ -0,0 +1,119 @@ +/* + * 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('testapiApp') + .controller('PodsController', PodsController); + + PodsController.$inject = [ + '$scope', '$http', '$filter', '$state', 'testapiApiUrl','raiseAlert' + ]; + + /** + * TestAPI Pods Controller + * This controller is for the '/pods' page where a user can browse + * through pods declared in TestAPI. + */ + function PodsController($scope, $http, $filter, $state, testapiApiUrl, + raiseAlert) { + var ctrl = this; + + ctrl.url = testapiApiUrl + '/pods'; + + ctrl.create = create; + ctrl.update = update; + ctrl.open = open; + ctrl.clearFilters = clearFilters; + + ctrl.roles = ['community-ci', 'production-ci']; + ctrl.modes = ['metal', 'virtual']; + ctrl.createRequirements = [ + {label: 'name', type: 'text', required: true}, + {label: 'mode', type: 'select', selects: ctrl.modes}, + {label: 'role', type: 'select', selects: ctrl.roles}, + {label: 'details', type: 'textarea', required: false} + ]; + + ctrl.name = ''; + ctrl.role = 'community-ci'; + ctrl.mode = 'metal'; + ctrl.details = ''; + + ctrl.pageHeader = 'Pods'; + ctrl.pageParagraph = 'This page is used to create or query pods.'; + + /** + * This is called when the date filter calendar is opened. It + * does some event handling, and sets a scope variable so the UI + * knows which calendar was opened. + * @param {Object} $event - The Event object + * @param {String} openVar - Tells which calendar was opened + */ + function open($event, openVar) { + $event.preventDefault(); + $event.stopPropagation(); + ctrl[openVar] = true; + } + + /** + * This function will clear all filters and update the results + * listing. + */ + function clearFilters() { + ctrl.update(); + } + + /** + * This will contact the TestAPI to create a new pod. + */ + function create() { + ctrl.showError = false; + var pods_url = ctrl.url; + var body = { + name: ctrl.name, + mode: ctrl.mode, + role: ctrl.role, + details: ctrl.details + }; + + ctrl.podsRequest = + $http.post(pods_url, body).error(function (error) { + ctrl.showError = true; + ctrl.error = + 'Error creating the new pod from server: ' + + angular.toJson(error); + }); + } + + /** + * This will contact the TestAPI to get a listing of declared pods. + */ + function update() { + ctrl.showError = false; + ctrl.podsRequest = + $http.get(ctrl.url).success(function (data) { + ctrl.data = data; + }).error(function (error) { + ctrl.data = null; + ctrl.showError = true; + ctrl.error = + 'Error retrieving pods from server: ' + + angular.toJson(error); + }); + } + } +})(); diff --git a/testapi/3rd_party/static/testapi-ui/index.html b/testapi/3rd_party/static/testapi-ui/index.html index 46ccc61..2d7399f 100644 --- a/testapi/3rd_party/static/testapi-ui/index.html +++ b/testapi/3rd_party/static/testapi-ui/index.html @@ -40,7 +40,7 @@ - + diff --git a/testapi/3rd_party/static/testapi-ui/shared/header/header.html b/testapi/3rd_party/static/testapi-ui/shared/header/header.html index 85c33b6..f5b2414 100644 --- a/testapi/3rd_party/static/testapi-ui/shared/header/header.html +++ b/testapi/3rd_party/static/testapi-ui/shared/header/header.html @@ -17,7 +17,7 @@ TestAPI