From b3e40f026d655501bfa581452c447784604ecb05 Mon Sep 17 00:00:00 2001 From: xudan Date: Fri, 6 Jul 2018 05:16:40 -0400 Subject: Move all web portal code to the new repo dovetail-webportal This is only the first step to simply copy the file here. There still need some more work to make sure all work well. All the changes will be submitted with other patches to make it easily to review. JIRA: DOVETAIL-671 Change-Id: I64d32a9df562184166b6199e2719f298687d1a0a Signed-off-by: xudan --- .../static/testapi-ui/components/about/about.html | 11 + .../testapi-ui/components/about/aboutController.js | 53 + .../components/about/templates/README.html | 131 ++ .../components/application/application.html | 348 +++++ .../application/applicationController.js | 177 +++ .../testapi-ui/components/application/logo-request | 1417 ++++++++++++++++++++ .../components/application/modal/confirmModal.html | 43 + .../auth-failure/authFailureController.js | 33 + .../testapi-ui/components/auth/authPortal.html | 21 + .../testapi-ui/components/directory/directory.html | 34 + .../components/directory/directoryController.js | 44 + .../components/guidelines/data/danube.json | 590 ++++++++ .../testapi-ui/components/guidelines/data/gen.py | 16 + .../components/guidelines/data/mandatory.json | 248 ++++ .../components/guidelines/guidelines.html | 70 + .../components/guidelines/guidelinesController.js | 188 +++ .../guidelines/partials/guidelineDetails.html | 90 ++ .../guidelines/partials/testListModal.html | 46 + .../static/testapi-ui/components/home/home.html | 142 ++ .../testapi-ui/components/home/homeController.js | 58 + .../testapi-ui/components/logout/logout.html | 1 + .../components/logout/logoutController.js | 44 + .../components/profile/importPubKeyModal.html | 27 + .../testapi-ui/components/profile/profile.html | 40 + .../components/profile/profileController.js | 219 +++ .../components/profile/showPubKeyModal.html | 11 + .../components/results-report/data/testcases.json | 509 +++++++ .../results-report/partials/editTestModal.html | 65 + .../results-report/partials/fullTestListModal.html | 13 + .../results-report/partials/reportDetails.html | 52 + .../components/results-report/resultsReport.html | 45 + .../results-report/resultsReportController.js | 247 ++++ .../components/results/modal/sharedModal.html | 19 + .../testapi-ui/components/results/results.html | 106 ++ .../components/results/resultsController.js | 515 +++++++ .../static/testapi-ui/components/sut/sut.html | 42 + .../testapi-ui/components/sut/sutController.js | 48 + 37 files changed, 5763 insertions(+) create mode 100644 3rd_party/static/testapi-ui/components/about/about.html create mode 100644 3rd_party/static/testapi-ui/components/about/aboutController.js create mode 100644 3rd_party/static/testapi-ui/components/about/templates/README.html create mode 100644 3rd_party/static/testapi-ui/components/application/application.html create mode 100644 3rd_party/static/testapi-ui/components/application/applicationController.js create mode 100644 3rd_party/static/testapi-ui/components/application/logo-request create mode 100644 3rd_party/static/testapi-ui/components/application/modal/confirmModal.html create mode 100644 3rd_party/static/testapi-ui/components/auth-failure/authFailureController.js create mode 100644 3rd_party/static/testapi-ui/components/auth/authPortal.html create mode 100644 3rd_party/static/testapi-ui/components/directory/directory.html create mode 100644 3rd_party/static/testapi-ui/components/directory/directoryController.js create mode 100644 3rd_party/static/testapi-ui/components/guidelines/data/danube.json create mode 100644 3rd_party/static/testapi-ui/components/guidelines/data/gen.py create mode 100644 3rd_party/static/testapi-ui/components/guidelines/data/mandatory.json create mode 100644 3rd_party/static/testapi-ui/components/guidelines/guidelines.html create mode 100644 3rd_party/static/testapi-ui/components/guidelines/guidelinesController.js create mode 100644 3rd_party/static/testapi-ui/components/guidelines/partials/guidelineDetails.html create mode 100644 3rd_party/static/testapi-ui/components/guidelines/partials/testListModal.html create mode 100644 3rd_party/static/testapi-ui/components/home/home.html create mode 100644 3rd_party/static/testapi-ui/components/home/homeController.js create mode 100644 3rd_party/static/testapi-ui/components/logout/logout.html create mode 100644 3rd_party/static/testapi-ui/components/logout/logoutController.js create mode 100644 3rd_party/static/testapi-ui/components/profile/importPubKeyModal.html create mode 100644 3rd_party/static/testapi-ui/components/profile/profile.html create mode 100644 3rd_party/static/testapi-ui/components/profile/profileController.js create mode 100644 3rd_party/static/testapi-ui/components/profile/showPubKeyModal.html create mode 100644 3rd_party/static/testapi-ui/components/results-report/data/testcases.json create mode 100644 3rd_party/static/testapi-ui/components/results-report/partials/editTestModal.html create mode 100644 3rd_party/static/testapi-ui/components/results-report/partials/fullTestListModal.html create mode 100644 3rd_party/static/testapi-ui/components/results-report/partials/reportDetails.html create mode 100644 3rd_party/static/testapi-ui/components/results-report/resultsReport.html create mode 100644 3rd_party/static/testapi-ui/components/results-report/resultsReportController.js create mode 100644 3rd_party/static/testapi-ui/components/results/modal/sharedModal.html create mode 100644 3rd_party/static/testapi-ui/components/results/results.html create mode 100644 3rd_party/static/testapi-ui/components/results/resultsController.js create mode 100644 3rd_party/static/testapi-ui/components/sut/sut.html create mode 100644 3rd_party/static/testapi-ui/components/sut/sutController.js (limited to '3rd_party/static/testapi-ui/components') diff --git a/3rd_party/static/testapi-ui/components/about/about.html b/3rd_party/static/testapi-ui/components/about/about.html new file mode 100644 index 0000000..f356050 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/about/about.html @@ -0,0 +1,11 @@ +
+ +
+
+
diff --git a/3rd_party/static/testapi-ui/components/about/aboutController.js b/3rd_party/static/testapi-ui/components/about/aboutController.js new file mode 100644 index 0000000..b0e3601 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/about/aboutController.js @@ -0,0 +1,53 @@ +/* + * 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('AboutController', AboutController); + + AboutController.$inject = ['$location']; + + /** + * RefStack About Controller + * This controller handles the about page and the multiple templates + * associated to the page. + */ + function AboutController($location) { + var ctrl = this; + + ctrl.selectOption = selectOption; + + ctrl.options = { + 'about' : { + 'title': 'About CVP', + 'template': 'testapi-ui/components/about/templates/README.html', + 'order': 1 + } + }; + + /** + * Given an option key, mark it as selected and set the corresponding + * template and URL hash. + */ + function selectOption(key) { + ctrl.selected = key; + ctrl.template = ctrl.options[key].template; + } + + ctrl.selectOption('about'); + } +})(); diff --git a/3rd_party/static/testapi-ui/components/about/templates/README.html b/3rd_party/static/testapi-ui/components/about/templates/README.html new file mode 100644 index 0000000..cb4140e --- /dev/null +++ b/3rd_party/static/testapi-ui/components/about/templates/README.html @@ -0,0 +1,131 @@ +

Executive Summary

+

OPNFV® is offering OPNFV compliance verification through its Compliance Verification Program (CVP). The CVP verifies products (“Offerings”) that claim compliance to OPNFV.

+

The OPNFV CVP is a compliance verification program intended to increase the awareness and adoption of OPNFV by demonstrating the readiness and availability of commercial products based on OPNFV.

+

The key objectives and benefits of the OPNFV CVP are to:

+ +

Verified products submitted by respective vendors are expected to differentiate themselves with different features and capabilities but remain compliant by implementing explicitly defined interfaces, behaviors, and key features.

+

Purpose of This Document

+

This document defines the framework and governance of the OPNFV CVP, including the scope and objectives of the program, maintenance of program materials, compliance verification requirements and processes, trademark/logo usage guidelines, requirements for systems under compliance verification, and escalation procedures.

+This document does not define compliance verification procedures. Compliance verification procedures are defined by the community under the oversight of the Technical Steering Committee. +

The current scope of compliance verification is based on multiple sources:

+ +

Please note that these sources are subject to further revisions and may be updated at some future time. The current compliance verification procedures are published by OPNFV.

+ + + + +

Program Management & Maintenance

+ +

Role of C&C Committee

+

The OPNFV Certification & Compliance (C&C) Committee, hereafter referred to as the Committee, serves as the CVP administrator on behalf of the OPNFV Board of Directors. The Committee is responsible for defining program governance, compliance verification strategy, and the overall scope of the compliance verification procedures.

+

Maintenance of Program Documents

+

Program documents, such as this document, produced by the Committee will be labeled using semantic versioning. That is, they will be labeled using MAJOR.MINOR.PATCH notation, where MAJOR, MINOR, and PATCH are non-negative integers.

+

1.MAJOR version. Note: to avoid market confusion, the scope of compliance verification and other project documents is tied to the major version, and once approved by the Board of Directors, will not change until the next major release.

+

2.MINOR version is used to denote significant functionality changes (e.g., addition/subtraction of compliance verification procedures and/or document sections). Changes to a minor version of an approved document require Board approval. It is a goal that minor changes should not affect the ability of a product to achieve compliance/qualification status.

+

3.PATCH version is used to indicate error corrections or editorial changes.

+

The scope of a particular version of the CVP requirements, test-cases, compliance verification checks, tools and results is tied to an OPNFV release.

+ +

Maintenance of CVP compliance verification procedures

+

The overall CVP compliance verification scope tied to an OPNFV release is determined by the Committee. The OPNFV TSC defines and maintains the compliance verification procedures and associated tools. The scope is constrained to features, capabilities, components, and interfaces included in an OPNFV release that are generally available in the industry (e.g., through adoption by an upstream community). Compliance verification is evaluated using functional tests that focus on defined interfaces and/or behaviors without regard to the underlying system under test. In practice, testing exercises interfaces and/or behaviors developed or exposed by OPNFV.

+ +

OPNFV Trademark/Logo Usage Guidelines

+ +

Because of its position in the industry as an Open Source Project maintained by the Linux Foundation, OPNFV cannot endorse any products or appear to endorse any products.

+ +

Use of the Term OPNFV Ready

+

Products that pass the CVP compliance verification suite may be labeled as “OPNFV Ready”. Products that are “OPNFV Ready” expose key features/behaviors of the OPNFV release.

+ + +

The OPNFV C&C Committee on behalf of the Board of Directors can award a product “OPNFV Ready” status. “OPNFV Ready”, therefore, may not be used in relation to a vendor’s product without first having met the requirements outlined in this document.

+

Use of “Ready” must be used in conjunction with the OPNFV release name under which the product was verified (e.g., “OPNFV Colorado Ready”). This allows the OPNFV compliance/qualification standard to evolve over time as the OPNFV platform matures.

+

Organizations applying for compliance verification shall use the Logo/Trademark solely for the Product/Technology that was verified to have met the requirements designated by The Committee with respect to the appropriate category.

+They shall not use the Logo/Trademark for any product/technology other than the Product/Technology submitted for compliance verification even if it belongs to the appropriate category. +

They shall only use the Logo/Trademark solely for the following purposes in order to:

+ + +

Organizations shall not use the Logo/Trademark in any way that would associate it with any individual or company logo or brand, beyond the association to the specific platform to which it was awarded.

+ +

They shall use the Logo/Trademark solely in accordance with the OPNFV Logo Style Guide which is prepared and amended by the Committee from time to time. Other than in association to the specific platform to which it was awarded, they shall not frame, post, upload, transmit or modify in any way, all or any part of the Logo, unless expressly authorized in writing by the Committee.

+

+

Organizations shall immediately notify the Committee if they suspect or discover that the Logo/Trademark is or will be used for any purposes other than the confirmed purposes or that the use conflicts with any of the representations hereof as a result of upgrading of its submitted product/technology. In the event that the above notification is provided, they shall provide the Committee with any and all information requested by the Committee in relation to the upgrading of the confirmed product/technology and all information in order to confirm the revised product/technology actually meets the requirements designated by the Committee with respect to the appropriate category. They shall not use the Logo/Trademark for any product/technology which does not meet the requirements designated by the Committee with respect to the confirmed category.

+

Note: Such organizations will be held responsible for any illegal use of the Logo/Trademark by others.

+

Organizations participating in the OPNFV CVP do not own any intellectual property rights in relation to the Logo/Trademark, program documents, or compliance verification procedures.

+ + +

Compliance Verification & Application Requirements

+

Compliance Verification Procedures Requirements

+

CVP compliance verification procedures leverage tests, compliance verification tools, test infrastructure and compliance verification program infrastructure defined and maintained by OPNFV projects which are included in an OPNFV release. The OPNFV TSC defines which compliance verification procedures are included as part of the CVP. Once published, the compliance verification procedure suites will not change until the next OPNFV release (except to fix bugs or errors), as described above.

+

OPNFV compliance verification is applicable to one or more of the following categories:

+ +

The scope of the criteria and requirements for each CVP release is set forth in an addendum to this document.

+ +

Self-Compliance Verification

+

Organizations may conduct compliance verification using the OPNFV-designated tools at their facilities. The OPNFV-designated tools will ensure that the results were produced by an unaltered version of the tools, and that the results were unaltered. For example, this could be accomplished by digitally verifying the tools themselves, and signing the results file(s). Results MUST be submitted for review with application documentation and the logo usage agreement to OPNFV.

+ +

OPNFV Preferred Verification Labs

+

Vendors may request service from third parties to conduct OPNFV compliance verification and collect results. Compliance verification occurs as documented in “Self Compliance Verification” above. The compliance verification results and documentation may be submitted by the third party on behalf of the vendor requesting the use of an OPNFV Logo/Trademark.

+

OPNFV may identify organizations providing third-party verification as Preferred Labs and list them on the OPNFV web site. OPNFV does not endorse or sponsor Preferred Labs’ services. Vendors are not required to use OPNFV Preferred Labs.

+ +

Compliance Application Requirements

+

The use of the OPNFV Ready logo is not restricted to OPNFV member companies. The request for use of an OPNFV Logo/Trademark must state the organization, a contact person (email and telephone number); their postal address; the location where the verification results and documentation was prepared, the category or categories the product is requesting an OPNFV Logo/Trademark(s) for; the attestation stating they will abide by OPNFV policies and procedures for use of an OPNFV Logo/Trademark; any third-party lab conducting the verification; and the product identifier.

+ +

Review Process

+

The compliance verification results and documentation submitted will be reviewed by the Committee for completeness and validity. Based on the determination of the Committee, a recommendation will be made to the OPNFV Board of Directors regarding the approval of the granting of permission to use an OPNFV Logo/Trademark.

+

The Committee may request additional information regarding the application for use of an OPNFV Logo/Trademark.

+

OPNFV may charge a reasonable fee for reviewing results. Reviews will be conducted by OPNFV member companies participating in the review committee (a C&C subcommittee). No member company may review its own compliance verification results.

+

In the event of a dispute, the submitting organization has a right to appeal the decision with the OPNFV Board of Directors. An appeals process is documented in the Escalation Process below.

+ +

System Under Compliance Verification Requirements

+

The compliance verification environment (hardware and software) is defined by the OPNFV TSC.

+ +

Similarity Policy

+ +

Hardware platforms identified as similar to platforms that have passed CVP compliance verification procedures may apply to use the OPNFV Ready trademark. The C&C Committee can decide to grant “OPNFV Ready” to products designated “under similarity”. The Committee will consider similarity in the following areas (for example):

+ +

Hardware platforms receiving rights to use the Logo/Trademark “under similarity” will be so designated on the website.

+ +

Escalation Process

+

If, after submitting compliance verification results and documentation, a vendor believes its results were evaluated unfairly or if it identifies issues with the test plan, tools, or third party lab, it may send an appeal in writing to the Committee. The Committee will review the appeal in a reasonable timeframe and respond in writing.

+

If the vendor wishes to appeal further, it may send a further appeal in writing to the OPNFV Board of Directors. The Board will evaluate the appeal at its next regular meeting.

diff --git a/3rd_party/static/testapi-ui/components/application/application.html b/3rd_party/static/testapi-ui/components/application/application.html new file mode 100644 index 0000000..17b17c6 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/application/application.html @@ -0,0 +1,348 @@ + + Logo Request » OpenStack Open Source Cloud Computing Software + + + + + + + +
+
+
+

+

Complete this application then start your CVP journey

+ +

+
+
+ +
+
+ +
+ +
+
+ + + +
+ +
+
+
+ + +
+ +
+
+
+ +
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+ + +
+ +
+
+ + +
+ +
+
+ + +
+ +
+
+
+ + +
+ +
+
+ +
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Create DateOrganization nameOrganization websiteProduct nameProduct specificationsProduct documentationProduct categoriesPrimary contact namePrimary business emailPrimary postal addressPrimary phone numberUser ID TypeUser IDDescriptionSUT versionSUT HW versionOVP versionOVP categoryCompany logoApprove dateApprovedTest IDLocationOperation
{{ app.creation_date | limitTo: 10 }}{{ app.organization_name }}{{ app.organization_web }}{{ app.product_name}}{{app.product_spec}}{{app.product_documentation}}{{ app.product_categories | category }}{{ app.prim_name }}{{ app.prim_email }}{{ app.prim_address }}{{ app.prim_phone }}{{ app.id_type }}{{ app.user_id }}{{ app.description }}{{ app.sut_version }}{{ app.sut_hw_version }}{{ app.ovp_version }}{{ app.ovp_category }}{{ app.company_logo }}{{ app.approve_date }}{{ app.approved }}{{ app.test_id }}{{ app.lab_location | labLocation}}
+ +
+ + +
+
+ +
+
+

Company Logo Upload for Directory

+
+
+ +
+ +
+
+ +
diff --git a/3rd_party/static/testapi-ui/components/application/applicationController.js b/3rd_party/static/testapi-ui/components/application/applicationController.js new file mode 100644 index 0000000..5666ff2 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/application/applicationController.js @@ -0,0 +1,177 @@ +/* + * 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('ApplicationController', ApplicationController); + + ApplicationController.$inject = [ + '$http', '$stateParams', '$window', '$sce', + '$uibModal', 'testapiApiUrl', 'raiseAlert', 'ngDialog', '$scope' + ]; + + /** + */ + function ApplicationController($http, $stateParams, $window, $sce, + $uibModal, testapiApiUrl, raiseAlert, ngDialog, $scope) { + + var ctrl = this; + ctrl.uploadLogo=uploadLogo; + + function init(){ + ctrl.organization_name = null; + ctrl.organization_web = null; + ctrl.product_name = null; + ctrl.product_spec = null; + ctrl.product_documentation = null; + ctrl.product_categories = "soft&hard"; + ctrl.prim_name = null; + ctrl.prim_email = null; + ctrl.prim_address = null; + ctrl.prim_phone = null; + ctrl.id_type = "Linux Foundation"; + ctrl.user_id = null; + ctrl.description = null; + ctrl.sut_version = null; + ctrl.sut_hw_version = null; + ctrl.ovp_version = "2018.01"; + ctrl.ovp_category = "Infrastructure"; + ctrl.company_logo = null; + ctrl.approve_date = null; + ctrl.approved = "false"; + ctrl.test_id = null; + ctrl.lab_location="internal"; + ctrl.lab_name = null; + ctrl.lab_email=null; + ctrl.lab_address=null; + ctrl.lab_phone=null; + ctrl.applications = []; + ctrl.showApplications = []; + + ctrl.totalItems = null; + ctrl.currentPage = 1; + ctrl.itemsPerPage = 5; + ctrl.numPages = null; + ctrl.lab_tpl = "lab.tpl.html"; + ctrl.product_tpl = "product.tpl.html"; + //ctrl.lab_html=$sce.trustAsHtml('
{{app.lab_email}}
{{app.lab_address}}
{{app.lab_phone}}
'); + + getApplication(); + } + + + ctrl.submitForm = function(){ + var data = { + "organization_name": ctrl.organization_name, + "organization_web": ctrl.organization_web, + "product_name": ctrl.product_name, + "product_spec": ctrl.product_spec, + "product_documentation": ctrl.product_documentation, + "product_categories": ctrl.product_categories, + "prim_name": ctrl.prim_name, + "prim_email": ctrl.prim_email, + "prim_address": ctrl.prim_address, + "prim_phone": ctrl.prim_phone, + "id_type": ctrl.id_type, + "user_id": ctrl.user_id, + "description": ctrl.description, + "sut_version": ctrl.sut_version, + "sut_hw_version": ctrl.sut_hw_version, + "ovp_version": ctrl.ovp_version, + "ovp_category": ctrl.ovp_category, + "company_logo": ctrl.company_logo, + "approve_date": ctrl.approve_date, + "approved": ctrl.approved, + "test_id": ctrl.test_id, + "lab_location": ctrl.lab_location, + "lab_email": ctrl.lab_email, + "lab_address": ctrl.lab_address, + "lab_phone": ctrl.lab_phone + }; + console.log(data); + $http.post(testapiApiUrl + "/cvp/applications", data).then(function(resp){ + if(resp.data.code && resp.data.code != 0) { + alert(resp.data.msg); + return; + } + getApplication(); + }, function(error){ + }); + } + + ctrl.openConfirmModal = function(){ + var resp = confirm("Are you sure to submit?"); + if (resp) { + ctrl.submitForm(); + } + } + + ctrl.cancelSubmit = function(){ + ngDialog.close(); + } + + ctrl.updatePage = function(){ + getApplication(); + } + + ctrl.deleteApp = function(id){ + var resp = confirm('Are you sure to delete this application?'); + if (!resp) + return; + + var delUrl = testapiApiUrl + "/cvp/applications/" + id; + $http.delete(delUrl) + .then( function(ret) { + if(ret.data.code && ret.data.code != 0) { + alert(ret.data.msg); + return; + } + getApplication(); + }); + } + + function uploadLogo(){ + var file = $scope.logoFile; + var fd = new FormData(); + fd.append('file', file); + + $http.post(testapiApiUrl + "/cvp/applications/uploadlogo", fd, { + transformRequest: angular.identity, + headers: {'Content-Type': undefined} + }).then(function(resp){ + if(resp.data.code && resp.data.code != 0) { + alert(resp.data.msg); + return; + } + }, function(error){ + }); + + }; + + function getApplication(){ + $http.get(testapiApiUrl + "/cvp/applications?page="+ctrl.currentPage+"&signed&per_page="+ctrl.itemsPerPage).then(function(response){ + ctrl.applications = response.data.applications; + ctrl.totalItems = response.data.pagination.total_pages* ctrl.itemsPerPage; + ctrl.currentPage = response.data.pagination.current_page; + ctrl.numPages = response.data.pagination.total_pages; + }, function(error){ + }); + } + + init(); + } +})(); diff --git a/3rd_party/static/testapi-ui/components/application/logo-request b/3rd_party/static/testapi-ui/components/application/logo-request new file mode 100644 index 0000000..c7bb109 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/application/logo-request @@ -0,0 +1,1417 @@ + + + + + + + + + + Logo Request » OpenStack Open Source Cloud Computing Software + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+

Join the global OpenStack community for use cases & training at the OpenStack Summit Sydney, November 6-8     + Register now +

+
+
+ + + + + + +
+ +
+ +
+
+ + +

Request information on OpenStack trademark licensing

+

If you plan to offer an OpenStack-related product or service using a trademark or brand that includes an OpenStack mark (e.g. logo or the word OpenStack), you are required to apply for and obtain a trademark license. We’ve created a family of logos and a set of standards specifically for this purpose. Once we understand more about your product or service, we can determine which (if any) logo program it falls under, and send you the appropriate license for signature.  

+ +
+ + + + + +
+ + +
+ +
+ +
+ + + +
+ + +
+ +
+ +
+ + + +
+ + + + + +
+ +
+ +
+ + + +
+ + +
+ +
+
    + + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + + +
+
+ + + +
+ + +
+ +
+ + + + +
+ + +
+ + + + +
+ +
+ +
+ + + +
+ + +
+ +
+ +
+ +
+ +
+ + + +
+ + +
+ +
+ +
+ +
+ + + +
+ + + If your proposed product name includes the OpenStack word mark, it will need to be approved as part of the licensing process.

+ +
+ +
+ +
+ +
+ + + +
+ + +
+ +
+
    + + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + + +
+
+ + + +
+ + +
+ +
+
    + + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + + +
+
+ + + +
+ + +
+ +
+
    + + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + +
  • + + +
  • + + +
+
+ + + +
+ + +
+ + + + +
+ + +
+ +
+ +
+ + + +
+ + + + + +
+
+ + +
+ + + + + + +
+ + +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/3rd_party/static/testapi-ui/components/application/modal/confirmModal.html b/3rd_party/static/testapi-ui/components/application/modal/confirmModal.html new file mode 100644 index 0000000..749315d --- /dev/null +++ b/3rd_party/static/testapi-ui/components/application/modal/confirmModal.html @@ -0,0 +1,43 @@ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ + diff --git a/3rd_party/static/testapi-ui/components/auth-failure/authFailureController.js b/3rd_party/static/testapi-ui/components/auth-failure/authFailureController.js new file mode 100644 index 0000000..29d1d70 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/auth-failure/authFailureController.js @@ -0,0 +1,33 @@ +/* + * 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('AuthFailureController', AuthFailureController); + + AuthFailureController.$inject = ['$location', '$state', 'raiseAlert']; + /** + * TestAPI Auth Failure Controller + * This controller handles messages from TestAPI API if user auth fails. + */ + function AuthFailureController($location, $state, raiseAlert) { + var ctrl = this; + ctrl.message = $location.search().message; + raiseAlert('danger', 'Authentication Failure:', ctrl.message); + $state.go('home'); + } +})(); diff --git a/3rd_party/static/testapi-ui/components/auth/authPortal.html b/3rd_party/static/testapi-ui/components/auth/authPortal.html new file mode 100644 index 0000000..8232769 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/auth/authPortal.html @@ -0,0 +1,21 @@ +

Sign In

+Please choose your account provider: +
+
+ + LinuxFoundationID + +
+
+ + OPENSTACK + +
+ +
diff --git a/3rd_party/static/testapi-ui/components/directory/directory.html b/3rd_party/static/testapi-ui/components/directory/directory.html new file mode 100644 index 0000000..1174752 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/directory/directory.html @@ -0,0 +1,34 @@ +
+

OPNFV Verified Product Directory

+ +
+

Compliance Marks Granted to {{ctrl.companyID}}

+ + + + + + + + + + + + + + + + + + + + + + + + +
ProductDescriptionOVP CateogryOVP VersionProduct InfoSUT VersionSUT HW Version
{{ prod.product_name}}{{ prod.description}}{{ prod.ovp_category}}{{ prod.ovp_version}}{{ prod.product_documentation}}{{ prod.sut_version}}{{ prod.sut_hw_version}}
+ +
+ +
diff --git a/3rd_party/static/testapi-ui/components/directory/directoryController.js b/3rd_party/static/testapi-ui/components/directory/directoryController.js new file mode 100644 index 0000000..18fda09 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/directory/directoryController.js @@ -0,0 +1,44 @@ +/* + * 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('DirectoryController', DirectoryController); + + DirectoryController.$inject = ['$location', '$http', '$stateParams', + 'testapiApiUrl' + ]; + + /** + * This controller handles the directory page + */ + function DirectoryController($location, $http, $stateParams, testapiApiUrl) { + var ctrl = this; + + ctrl.companyID = $stateParams.companyID; + ctrl.company_logo = $stateParams.logo; + getDirectory(); + + function getDirectory(){ + $http.get(testapiApiUrl + "/cvp/applications").then(function(response){ + ctrl.directory = response.data.applications; + }, function(error){ + }); + } + + } +})(); diff --git a/3rd_party/static/testapi-ui/components/guidelines/data/danube.json b/3rd_party/static/testapi-ui/components/guidelines/data/danube.json new file mode 100644 index 0000000..99613b7 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/guidelines/data/danube.json @@ -0,0 +1,590 @@ +{ + "mandatory": { + "name": "Mandatory CVP Test Areas", + "value": [ + { + "area_name": "Test Area VIM Operations - Compute", + "value": [ + { + "api_name": "Image operations within the Compute API", + "value": [ + "tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_delete_image", + "tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_image_specify_multibyte_character_image_name" + ] + }, + { + "api_name": "Basic support Compute API for server actions such as reboot, rebuild, resize", + "value": [ + "tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_get_instance_action", + "tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_list_instance_actions" + ] + }, + { + "api_name": "Generate, import, and delete SSH keys within Compute services", + "value": [ + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_specify_keypair" + ] + }, + { + "api_name": "List supported versions of the Compute API", + "value": [ + "tempest.api.compute.test_versions.TestVersions.test_list_api_versions" + ] + }, + { + "api_name": "Quotas management in Compute API", + "value": [ + "tempest.api.compute.test_quotas.QuotasTestJSON.test_get_default_quotas", + "tempest.api.compute.test_quotas.QuotasTestJSON.test_get_quotas" + ] + }, + { + "api_name": "Basic server operations in the Compute API", + "value": [ + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_server_with_admin_password", + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_with_existing_server_name", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_numeric_server_name", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_metadata_exceeds_length_limit", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_name_length_exceeds_256", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_flavor", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_image", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_network_uuid", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_id_exceeding_length_limit", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_negative_id", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_get_non_existent_server", + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_host_name_is_same_as_server_name", + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_host_name_is_same_as_server_name", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_invalid_ip_v6_address", + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers", + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers_with_detail", + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers", + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers_with_detail", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_flavor", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_image", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_name", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_status", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_limit_results", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_flavor", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_image", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_limit", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_name", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_status", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filtered_by_name_wildcard", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_future_date", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_invalid_date", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_greater_than_actual_count", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_negative_value", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_string", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_flavor", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_image", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_server_name", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_detail_server_is_deleted", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_status_non_existing", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_with_a_deleted_server", + "tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_lock_unlock_server", + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_delete_server_metadata_item", + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_get_server_metadata_item", + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_list_server_metadata", + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata", + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata_item", + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_update_server_metadata", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_server_name_blank", + "tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_reboot_server_hard", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_reboot_non_existent_server", + "tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_rebuild_server", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_deleted_server", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_non_existent_server", + "tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_stop_start_server", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_stop_non_existent_server", + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_access_server_address", + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_server_name", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_name_of_non_existent_server", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_name_length_exceeds_256", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_set_empty_name", + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_created_server_vcpus", + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_server_details", + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_created_server_vcpus", + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_server_details" + ] + }, + { + "api_name": "Retrieve volume information through the Compute API", + "value": [ + "tempest.api.compute.volumes.test_attach_volume.AttachVolumeTestJSON.test_attach_detach_volume", + "tempest.api.compute.volumes.test_attach_volume.AttachVolumeTestJSON.test_list_get_volume_attachments" + ] + } + ] + }, + { + "area_name": "Test Area VIM Operations - Identity", + "value": [ + { + "api_name": "API discovery operations within the Identity v3 API", + "value": [ + "tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_media_types", + "tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_resources", + "tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_statuses" + ] + }, + { + "api_name": "Auth operations within the Identity API", + "value": [ + "tempest.api.identity.v3.test_tokens.TokensV3Test.test_create_token" + ] + } + ] + }, + { + "area_name": "Test Area VIM Operations - Image", + "value": [ + { + "api_name": "Image deletion tests using the Glance v2 API", + "value": [ + "tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_delete_image", + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_image_null_id", + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_non_existing_image", + "tempest.api.image.v2.test_images_tags_negative.ImagesTagsNegativeTest.test_delete_non_existing_tag" + ] + }, + { + "api_name": "Image get tests using the Glance v2 API", + "value": [ + "tempest.api.image.v2.test_images.ListImagesTest.test_get_image_schema", + "tempest.api.image.v2.test_images.ListImagesTest.test_get_images_schema", + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_delete_deleted_image", + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_image_null_id", + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_non_existent_image" + ] + }, + { + "api_name": "CRUD image operations in Images API v2", + "value": [ + "tempest.api.image.v2.test_images.ListImagesTest.test_list_no_params" + ] + }, + { + "api_name": "Image list tests using the Glance v2 API", + "value": [ + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_container_format", + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_disk_format", + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_limit", + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_min_max_size", + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_size", + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_status", + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_visibility" + ] + }, + { + "api_name": "Image update tests using the Glance v2 API", + "value": [ + "tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_update_image", + "tempest.api.image.v2.test_images_tags.ImagesTagsTest.test_update_delete_tags_for_image", + "tempest.api.image.v2.test_images_tags_negative.ImagesTagsNegativeTest.test_update_tags_for_non_existing_image" + ] + } + ] + }, + { + "area_name": "Test Area VIM Operations - Network", + "value": [ + { + "api_name": "Basic CRUD operations on L2 networks and L2 network ports", + "value": [ + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_all_attributes", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_allocation_pools", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_dhcp_enabled", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_gw", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_gw_and_allocation_pools", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_host_routes_and_dns_nameservers", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_without_gateway", + "tempest.api.network.test_networks.NetworksTest.test_create_update_delete_network_subnet", + "tempest.api.network.test_networks.NetworksTest.test_delete_network_with_subnet", + "tempest.api.network.test_networks.NetworksTest.test_list_networks", + "tempest.api.network.test_networks.NetworksTest.test_list_networks_fields", + "tempest.api.network.test_networks.NetworksTest.test_list_subnets", + "tempest.api.network.test_networks.NetworksTest.test_list_subnets_fields", + "tempest.api.network.test_networks.NetworksTest.test_show_network", + "tempest.api.network.test_networks.NetworksTest.test_show_network_fields", + "tempest.api.network.test_networks.NetworksTest.test_show_subnet", + "tempest.api.network.test_networks.NetworksTest.test_show_subnet_fields", + "tempest.api.network.test_networks.NetworksTest.test_update_subnet_gw_dns_host_routes_dhcp", + "tempest.api.network.test_ports.PortsTestJSON.test_create_bulk_port", + "tempest.api.network.test_ports.PortsTestJSON.test_create_port_in_allowed_allocation_pools", + "tempest.api.network.test_ports.PortsTestJSON.test_create_update_delete_port", + "tempest.api.network.test_ports.PortsTestJSON.test_list_ports", + "tempest.api.network.test_ports.PortsTestJSON.test_list_ports_fields", + "tempest.api.network.test_ports.PortsTestJSON.test_show_port", + "tempest.api.network.test_ports.PortsTestJSON.test_show_port_fields", + "tempest.api.network.test_ports.PortsTestJSON.test_update_port_with_security_group_and_extra_attributes", + "tempest.api.network.test_ports.PortsTestJSON.test_update_port_with_two_security_groups_and_extra_attributes" + ] + }, + { + "api_name": "Basic CRUD operations on security groups", + "value": [ + "tempest.api.network.test_security_groups.SecGroupTest.test_create_list_update_show_delete_security_group", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_additional_args", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_icmp_type_code", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_protocol_integer_value", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_remote_group_id", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_remote_ip_prefix", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_show_delete_security_group_rule", + "tempest.api.network.test_security_groups.SecGroupTest.test_list_security_groups", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_additional_default_security_group_fails", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_duplicate_security_group_rule_fails", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_ethertype", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_protocol", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_remote_ip_prefix", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_invalid_ports", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_non_existent_remote_groupid", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_non_existent_security_group", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_delete_non_existent_security_group", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_show_non_existent_security_group", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_show_non_existent_security_group_rule" + ] + } + ] + }, + { + "area_name": "Test Area VIM Operations - Volume", + "value": [ + { + "api_name": "Volume attach and detach operations with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_attach_detach_volume_to_instance", + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_get_volume_attachment", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_attach_volumes_with_nonexistent_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_detach_volumes_with_invalid_volume_id" + ] + }, + { + "api_name": "Volume service availability zone operations with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_availability_zone.AvailabilityZoneV2TestJSON.test_get_availability_zone_list" + ] + }, + { + "api_name": "Volume cloning operations with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete_as_clone" + ] + }, + { + "api_name": "Image copy-to-volume operations with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_bootable", + "tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete_from_image" + ] + }, + { + "api_name": "Volume creation and deletion operations with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_invalid_size", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_source_volid", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_volume_type", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_out_passing_size", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_size_negative", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_size_zero" + ] + }, + { + "api_name": "Volume service extension listing operations with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_extensions.ExtensionsV2TestJSON.test_list_extensions" + ] + }, + { + "api_name": "Volume GET operations with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_get_invalid_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_get_volume_without_passing_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_volume_get_nonexistent_volume_id" + ] + }, + { + "api_name": "Volume listing operations with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_by_name", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_by_name", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_param_display_name_and_status", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_detail_param_display_name_and_status", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_detail_param_metadata", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_details", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_param_metadata", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_availability_zone", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_status", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_details_by_availability_zone", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_details_by_status", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_detail_with_invalid_status", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_detail_with_nonexistent_name", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_with_invalid_status", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_with_nonexistent_name", + "tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_pagination", + "tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_with_multiple_params", + "tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_pagination" + ] + }, + { + "api_name": "Volume metadata operations with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_create_get_delete_volume_metadata", + "tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_update_volume_metadata_item" + ] + }, + { + "api_name": "Verification of read-only status on volumes with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_readonly_update" + ] + }, + { + "api_name": "Volume reservation operations with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_reserve_unreserve_volume", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_reserve_volume_with_negative_volume_status", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_reserve_volume_with_nonexistent_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_unreserve_volume_with_nonexistent_volume_id" + ] + }, + { + "api_name": "Volume snapshot creation/deletion operations with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_create_get_delete_snapshot_metadata", + "tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_update_snapshot_metadata_item", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_snapshot_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_delete_invalid_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_delete_volume_without_passing_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_volume_delete_nonexistent_volume_id", + "tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshot_create_get_list_update_delete", + "tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_volume_from_snapshot", + "tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshots_list_details_with_params", + "tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshots_list_with_params", + "tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_with_nonexistent_volume_id", + "tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_without_passing_volume_id" + ] + }, + { + "api_name": "Volume update operations with the Cinder v2 API", + "value": [ + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_empty_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_invalid_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_nonexistent_volume_id" + ] + } + ] + }, + { + "area_name": "Test Area High Availability", + "value": [ + { + "api_name": "Verify high availability of OpenStack controller services", + "value": [ + "opnfv.ha.tc001.nova-api_service_down", + "opnfv.ha.tc003.neutron-server_service_down", + "opnfv.ha.tc004.keystone_service_down", + "opnfv.ha.tc005.glance-api_service_down", + "opnfv.ha.tc006.cinder-api_service_down", + "opnfv.ha.tc009.cpu_overload", + "opnfv.ha.tc010.disk_I/O_block", + "opnfv.ha.tc011.load_balance_service_down" + ] + } + ] + }, + { + "area_name": "Test Area vPing - Basic VNF Connectivity", + "value": [ + { + "api_name": "Verify basic VNF connectivity with ICMP ping packets", + "value": [ + "opnfv.vping.userdata", + "opnfv.vping.ssh" + ] + } + ] + } + ] + }, + "optional": { + "name": "Optional CVP Test Areas", + "value": [ + { + "area_name": "Test Area BGP VPN", + "value": [ + { + "api_name": "Verify association and dissasocitation of node using route targets", + "value": [ + "opnfv.sdnvpn.subnet_connectivity", + "opnfv.sdnvpn.tenant separation", + "opnfv.sdnvpn.router_association", + "opnfv.sdnvpn.router_association_floating_ip" + ] + } + ] + }, + { + "area_name": "Test Area IPv6 Compliance Testing Methodology and Test Cases", + "value": [ + { + "api_name": "Test Case 1: Create and Delete an IPv6 Network, Port and Subnet", + "value": [ + "tempest.api.network.test_networks.BulkNetworkOpsIpV6Test.test_bulk_create_delete_network", + "tempest.api.network.test_networks.BulkNetworkOpsIpV6Test.test_bulk_create_delete_port", + "tempest.api.network.test_networks.BulkNetworkOpsIpV6Test.test_bulk_create_delete_subnet" + ] + }, + { + "api_name": "Test Case 2: Create, Update and Delete an IPv6 Network and Subnet", + "value": [ + "tempest.api.network.test_networks.NetworksIpV6Test.test_create_update_delete_network_subnet" + ] + }, + { + "api_name": "Test Case 3: Check External Network Visibility", + "value": [ + "tempest.api.network.test_networks.NetworksIpV6Test.test_external_network_visibility" + ] + }, + { + "api_name": "Test Case 4: List IPv6 Networks and Subnets of a Tenant", + "value": [ + "tempest.api.network.test_networks.NetworksIpV6Test.test_list_networks", + "tempest.api.network.test_networks.NetworksIpV6Test.test_list_subnets" + ] + }, + { + "api_name": "Test Case 5: Show Information of an IPv6 Network and Subnet", + "value": [ + "tempest.api.network.test_networks.NetworksIpV6Test.test_show_network", + "tempest.api.network.test_networks.NetworksIpV6Test.test_show_subnet" + ] + }, + { + "api_name": "Test Case 6: Create an IPv6 Port in Allowed Allocation Pools", + "value": [ + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_create_port_in_allowed_allocation_pools" + ] + }, + { + "api_name": "Test Case 7: Create an IPv6 Port without Security Groups", + "value": [ + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_create_port_with_no_securitygroups" + ] + }, + { + "api_name": "Test Case 8: Create, Update and Delete an IPv6 Port", + "value": [ + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_create_update_delete_port" + ] + }, + { + "api_name": "Test Case 9: List IPv6 Ports of a Tenant", + "value": [ + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_list_ports" + ] + }, + { + "api_name": "Test Case 10: Show Information of an IPv6 Port", + "value": [ + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_show_port" + ] + }, + { + "api_name": "Test Case 11: Add Multiple Interfaces for an IPv6 Router", + "value": [ + "tempest.api.network.test_routers.RoutersIpV6Test.test_add_multiple_router_interfaces" + ] + }, + { + "api_name": "Test Case 12: Add and Remove an IPv6 Router Interface with port_id", + "value": [ + "tempest.api.network.test_routers.RoutersIpV6Test.test_add_remove_router_interface_with_port_id" + ] + }, + { + "api_name": "Test Case 13: Add and Remove an IPv6 Router Interface with subnet_id", + "value": [ + "tempest.api.network.test_routers.RoutersIpV6Test.test_add_remove_router_interface_with_subnet_id" + ] + }, + { + "api_name": "Test Case 14: Create, Update, Delete, List and Show an IPv6 Router", + "value": [ + "tempest.api.network.test_routers.RoutersIpV6Test.test_create_show_list_update_delete_router" + ] + }, + { + "api_name": "Test Case 15: Create, Update, Delete, List and Show an IPv6 Security Group", + "value": [ + "tempest.api.network.test_security_groups.SecGroupIPv6Test.test_create_list_update_show_delete_security_group" + ] + }, + { + "api_name": "Test Case 16: Create, Delete and Show Security Group Rules", + "value": [ + "tempest.api.network.test_security_groups.SecGroupIPv6Test.test_create_show_delete_security_group_rule" + ] + }, + { + "api_name": "Test Case 17: List All Security Groups", + "value": [ + "tempest.api.network.test_security_groups.SecGroupIPv6Test.test_list_security_groups" + ] + }, + { + "api_name": "Test Case 18: IPv6 Address Assignment - Dual Stack, SLAAC, DHCPv6 Stateless", + "value": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_dhcp6_stateless_from_os" + ] + }, + { + "api_name": "Test Case 19: IPv6 Address Assignment - Dual Net, Dual Stack, SLAAC, DHCPv6 Stateless", + "value": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_dualnet_dhcp6_stateless_from_os" + ] + }, + { + "api_name": "Test Case 20: IPv6 Address Assignment - Multiple Prefixes, Dual Stack, SLAAC, DHCPv6 Stateless", + "value": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_multi_prefix_dhcpv6_stateless" + ] + }, + { + "api_name": "Test Case 21: IPv6 Address Assignment - Dual Net, Multiple Prefixes, Dual Stack, SLAAC, DHCPv6 Stateless", + "value": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_dualnet_multi_prefix_dhcpv6_stateless" + ] + }, + { + "api_name": "Test Case 22: IPv6 Address Assignment - Dual Stack, SLAAC", + "value": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_slaac_from_os" + ] + }, + { + "api_name": "Test Case 23: IPv6 Address Assignment - Dual Net, Dual Stack, SLAAC", + "value": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_dualnet_slaac_from_os" + ] + }, + { + "api_name": "Test Case 24: IPv6 Address Assignment - Multiple Prefixes, Dual Stack, SLAAC", + "value": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_multi_prefix_slaac" + ] + }, + { + "api_name": "Test Case 25: IPv6 Address Assignment - Dual Net, Dual Stack, Multiple Prefixes, SLAAC", + "value": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_dualnet_multi_prefix_slaac" + ] + } + ] + } + ] + } +} diff --git a/3rd_party/static/testapi-ui/components/guidelines/data/gen.py b/3rd_party/static/testapi-ui/components/guidelines/data/gen.py new file mode 100644 index 0000000..34fb694 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/guidelines/data/gen.py @@ -0,0 +1,16 @@ +import json + +with open('danube.json') as f: + data = json.load(f) +mapping = {} +for i in data['mandatory']['value']: + for j in i['value']: + for k in j['value']: + mapping[k] = True +for i in data['optional']['value']: + for j in i['value']: + for k in j['value']: + mapping[k] = False + +with open('mandatory.json', 'w') as f: + f.write(json.dumps(mapping)) diff --git a/3rd_party/static/testapi-ui/components/guidelines/data/mandatory.json b/3rd_party/static/testapi-ui/components/guidelines/data/mandatory.json new file mode 100644 index 0000000..ce2ba85 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/guidelines/data/mandatory.json @@ -0,0 +1,248 @@ +{ + "opnfv.ha.tc001.nova-api_service_down": true, + "opnfv.ha.tc003.neutron-server_service_down": true, + "opnfv.ha.tc004.keystone_service_down": true, + "opnfv.ha.tc005.glance-api_service_down": true, + "opnfv.ha.tc006.cinder-api_service_down": true, + "opnfv.ha.tc009.cpu_overload": true, + "opnfv.ha.tc010.disk_I/O_block": true, + "opnfv.ha.tc011.load_balance_service_down": true, + "opnfv.sdnvpn.router_association": false, + "opnfv.sdnvpn.router_association_floating_ip": false, + "opnfv.sdnvpn.subnet_connectivity": false, + "opnfv.sdnvpn.tenant separation": false, + "tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_delete_image": true, + "tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_image_specify_multibyte_character_image_name": true, + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_host_name_is_same_as_server_name": true, + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers": true, + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers_with_detail": true, + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_created_server_vcpus": true, + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_server_details": true, + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_host_name_is_same_as_server_name": true, + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers": true, + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers_with_detail": true, + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_created_server_vcpus": true, + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_server_details": true, + "tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_get_instance_action": true, + "tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_list_instance_actions": true, + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_flavor": true, + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_image": true, + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_name": true, + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_status": true, + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_limit_results": true, + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_flavor": true, + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_image": true, + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_limit": true, + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_name": true, + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_status": true, + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filtered_by_name_wildcard": true, + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_future_date": true, + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_invalid_date": true, + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits": true, + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_greater_than_actual_count": true, + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_negative_value": true, + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_string": true, + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_flavor": true, + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_image": true, + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_server_name": true, + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_detail_server_is_deleted": true, + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_status_non_existing": true, + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_with_a_deleted_server": true, + "tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_lock_unlock_server": true, + "tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_reboot_server_hard": true, + "tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_rebuild_server": true, + "tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_stop_start_server": true, + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_delete_server_metadata_item": true, + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_get_server_metadata_item": true, + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_list_server_metadata": true, + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata": true, + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata_item": true, + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_update_server_metadata": true, + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_server_with_admin_password": true, + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_specify_keypair": true, + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_with_existing_server_name": true, + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_access_server_address": true, + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_server_name": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_numeric_server_name": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_metadata_exceeds_length_limit": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_name_length_exceeds_256": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_flavor": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_image": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_network_uuid": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_id_exceeding_length_limit": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_negative_id": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_get_non_existent_server": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_invalid_ip_v6_address": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_reboot_non_existent_server": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_deleted_server": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_non_existent_server": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_server_name_blank": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_stop_non_existent_server": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_name_of_non_existent_server": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_name_length_exceeds_256": true, + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_set_empty_name": true, + "tempest.api.compute.test_quotas.QuotasTestJSON.test_get_default_quotas": true, + "tempest.api.compute.test_quotas.QuotasTestJSON.test_get_quotas": true, + "tempest.api.compute.test_versions.TestVersions.test_list_api_versions": true, + "tempest.api.compute.volumes.test_attach_volume.AttachVolumeTestJSON.test_attach_detach_volume": true, + "tempest.api.compute.volumes.test_attach_volume.AttachVolumeTestJSON.test_list_get_volume_attachments": true, + "tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_media_types": true, + "tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_resources": true, + "tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_statuses": true, + "tempest.api.identity.v3.test_tokens.TokensV3Test.test_create_token": true, + "tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_delete_image": true, + "tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_update_image": true, + "tempest.api.image.v2.test_images.ListImagesTest.test_get_image_schema": true, + "tempest.api.image.v2.test_images.ListImagesTest.test_get_images_schema": true, + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_container_format": true, + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_disk_format": true, + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_limit": true, + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_min_max_size": true, + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_size": true, + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_status": true, + "tempest.api.image.v2.test_images.ListImagesTest.test_list_images_param_visibility": true, + "tempest.api.image.v2.test_images.ListImagesTest.test_list_no_params": true, + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_image_null_id": true, + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_non_existing_image": true, + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_delete_deleted_image": true, + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_image_null_id": true, + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_non_existent_image": true, + "tempest.api.image.v2.test_images_tags.ImagesTagsTest.test_update_delete_tags_for_image": true, + "tempest.api.image.v2.test_images_tags_negative.ImagesTagsNegativeTest.test_delete_non_existing_tag": true, + "tempest.api.image.v2.test_images_tags_negative.ImagesTagsNegativeTest.test_update_tags_for_non_existing_image": true, + "tempest.api.network.test_networks.BulkNetworkOpsIpV6Test.test_bulk_create_delete_network": false, + "tempest.api.network.test_networks.BulkNetworkOpsIpV6Test.test_bulk_create_delete_port": false, + "tempest.api.network.test_networks.BulkNetworkOpsIpV6Test.test_bulk_create_delete_subnet": false, + "tempest.api.network.test_networks.NetworksIpV6Test.test_create_update_delete_network_subnet": false, + "tempest.api.network.test_networks.NetworksIpV6Test.test_external_network_visibility": false, + "tempest.api.network.test_networks.NetworksIpV6Test.test_list_networks": false, + "tempest.api.network.test_networks.NetworksIpV6Test.test_list_subnets": false, + "tempest.api.network.test_networks.NetworksIpV6Test.test_show_network": false, + "tempest.api.network.test_networks.NetworksIpV6Test.test_show_subnet": false, + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_all_attributes": true, + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_allocation_pools": true, + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_dhcp_enabled": true, + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_gw": true, + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_gw_and_allocation_pools": true, + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_host_routes_and_dns_nameservers": true, + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_without_gateway": true, + "tempest.api.network.test_networks.NetworksTest.test_create_update_delete_network_subnet": true, + "tempest.api.network.test_networks.NetworksTest.test_delete_network_with_subnet": true, + "tempest.api.network.test_networks.NetworksTest.test_list_networks": true, + "tempest.api.network.test_networks.NetworksTest.test_list_networks_fields": true, + "tempest.api.network.test_networks.NetworksTest.test_list_subnets": true, + "tempest.api.network.test_networks.NetworksTest.test_list_subnets_fields": true, + "tempest.api.network.test_networks.NetworksTest.test_show_network": true, + "tempest.api.network.test_networks.NetworksTest.test_show_network_fields": true, + "tempest.api.network.test_networks.NetworksTest.test_show_subnet": true, + "tempest.api.network.test_networks.NetworksTest.test_show_subnet_fields": true, + "tempest.api.network.test_networks.NetworksTest.test_update_subnet_gw_dns_host_routes_dhcp": true, + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_create_port_in_allowed_allocation_pools": false, + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_create_port_with_no_securitygroups": false, + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_create_update_delete_port": false, + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_list_ports": false, + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_show_port": false, + "tempest.api.network.test_ports.PortsTestJSON.test_create_bulk_port": true, + "tempest.api.network.test_ports.PortsTestJSON.test_create_port_in_allowed_allocation_pools": true, + "tempest.api.network.test_ports.PortsTestJSON.test_create_update_delete_port": true, + "tempest.api.network.test_ports.PortsTestJSON.test_list_ports": true, + "tempest.api.network.test_ports.PortsTestJSON.test_list_ports_fields": true, + "tempest.api.network.test_ports.PortsTestJSON.test_show_port": true, + "tempest.api.network.test_ports.PortsTestJSON.test_show_port_fields": true, + "tempest.api.network.test_ports.PortsTestJSON.test_update_port_with_security_group_and_extra_attributes": true, + "tempest.api.network.test_ports.PortsTestJSON.test_update_port_with_two_security_groups_and_extra_attributes": true, + "tempest.api.network.test_routers.RoutersIpV6Test.test_add_multiple_router_interfaces": false, + "tempest.api.network.test_routers.RoutersIpV6Test.test_add_remove_router_interface_with_port_id": false, + "tempest.api.network.test_routers.RoutersIpV6Test.test_add_remove_router_interface_with_subnet_id": false, + "tempest.api.network.test_routers.RoutersIpV6Test.test_create_show_list_update_delete_router": false, + "tempest.api.network.test_security_groups.SecGroupIPv6Test.test_create_list_update_show_delete_security_group": false, + "tempest.api.network.test_security_groups.SecGroupIPv6Test.test_create_show_delete_security_group_rule": false, + "tempest.api.network.test_security_groups.SecGroupIPv6Test.test_list_security_groups": false, + "tempest.api.network.test_security_groups.SecGroupTest.test_create_list_update_show_delete_security_group": true, + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_additional_args": true, + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_icmp_type_code": true, + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_protocol_integer_value": true, + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_remote_group_id": true, + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_remote_ip_prefix": true, + "tempest.api.network.test_security_groups.SecGroupTest.test_create_show_delete_security_group_rule": true, + "tempest.api.network.test_security_groups.SecGroupTest.test_list_security_groups": true, + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_additional_default_security_group_fails": true, + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_duplicate_security_group_rule_fails": true, + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_ethertype": true, + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_protocol": true, + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_remote_ip_prefix": true, + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_invalid_ports": true, + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_non_existent_remote_groupid": true, + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_non_existent_security_group": true, + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_delete_non_existent_security_group": true, + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_show_non_existent_security_group": true, + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_show_non_existent_security_group_rule": true, + "tempest.api.volume.test_availability_zone.AvailabilityZoneV2TestJSON.test_get_availability_zone_list": true, + "tempest.api.volume.test_extensions.ExtensionsV2TestJSON.test_list_extensions": true, + "tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_create_get_delete_snapshot_metadata": true, + "tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_update_snapshot_metadata_item": true, + "tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_create_get_delete_volume_metadata": true, + "tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_update_volume_metadata_item": true, + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_attach_detach_volume_to_instance": true, + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_get_volume_attachment": true, + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_reserve_unreserve_volume": true, + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_bootable": true, + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_readonly_update": true, + "tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete": true, + "tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete_as_clone": true, + "tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete_from_image": true, + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list": true, + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_by_name": true, + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_by_name": true, + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_param_display_name_and_status": true, + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_detail_param_display_name_and_status": true, + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_detail_param_metadata": true, + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_details": true, + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_param_metadata": true, + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_availability_zone": true, + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_status": true, + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_details_by_availability_zone": true, + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_details_by_status": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_attach_volumes_with_nonexistent_volume_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_invalid_size": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_snapshot_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_source_volid": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_volume_type": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_out_passing_size": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_size_negative": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_size_zero": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_delete_invalid_volume_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_delete_volume_without_passing_volume_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_detach_volumes_with_invalid_volume_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_get_invalid_volume_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_get_volume_without_passing_volume_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_detail_with_invalid_status": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_detail_with_nonexistent_name": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_with_invalid_status": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_with_nonexistent_name": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_reserve_volume_with_negative_volume_status": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_reserve_volume_with_nonexistent_volume_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_unreserve_volume_with_nonexistent_volume_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_empty_volume_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_invalid_volume_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_nonexistent_volume_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_volume_delete_nonexistent_volume_id": true, + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_volume_get_nonexistent_volume_id": true, + "tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshot_create_get_list_update_delete": true, + "tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshots_list_details_with_params": true, + "tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshots_list_with_params": true, + "tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_volume_from_snapshot": true, + "tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_with_nonexistent_volume_id": true, + "tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_without_passing_volume_id": true, + "tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_pagination": true, + "tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_with_multiple_params": true, + "tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_pagination": true, + "tempest.scenario.test_network_v6.TestGettingAddress.test_dhcp6_stateless_from_os": false, + "tempest.scenario.test_network_v6.TestGettingAddress.test_dualnet_dhcp6_stateless_from_os": false, + "tempest.scenario.test_network_v6.TestGettingAddress.test_dualnet_multi_prefix_dhcpv6_stateless": false, + "tempest.scenario.test_network_v6.TestGettingAddress.test_dualnet_multi_prefix_slaac": false, + "tempest.scenario.test_network_v6.TestGettingAddress.test_dualnet_slaac_from_os": false, + "tempest.scenario.test_network_v6.TestGettingAddress.test_multi_prefix_dhcpv6_stateless": false, + "tempest.scenario.test_network_v6.TestGettingAddress.test_multi_prefix_slaac": false, + "tempest.scenario.test_network_v6.TestGettingAddress.test_slaac_from_os": false +} diff --git a/3rd_party/static/testapi-ui/components/guidelines/guidelines.html b/3rd_party/static/testapi-ui/components/guidelines/guidelines.html new file mode 100644 index 0000000..6e138b8 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/guidelines/guidelines.html @@ -0,0 +1,70 @@ +

OPNFV Ready™ Guidelines

+ + +
+
+ Version: + + +
+ +
+ +
+ + +Capability Status: +
+ + +
+ + + +
+
+ + +
+ + diff --git a/3rd_party/static/testapi-ui/components/guidelines/guidelinesController.js b/3rd_party/static/testapi-ui/components/guidelines/guidelinesController.js new file mode 100644 index 0000000..46d2042 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/guidelines/guidelinesController.js @@ -0,0 +1,188 @@ +/* + * 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.showMandatory = true; + ctrl.showOptional = false; + ctrl.version = ''; + ctrl.data = null; + + /** + * The template to load for displaying capability details. + */ + ctrl.detailsTemplate = 'testapi-ui/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() { + ctrl.versionList = ['danube']; + ctrl.update(); + } + + /** + * This will contact the TestAPI API server to retrieve the JSON + * content of the guideline file corresponding to the selected + * version. + */ + function update() { + if (ctrl.version != ''){ + var path = 'testapi-ui/components/guidelines/data/' + ctrl.version + '.json'; + $http.get(path).success(function(data){ + ctrl.data = data; + }).error(function(error){ + }); + } + } + + + 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(); + //getVersionList(); + update(); + } +})(); diff --git a/3rd_party/static/testapi-ui/components/guidelines/partials/guidelineDetails.html b/3rd_party/static/testapi-ui/components/guidelines/partials/guidelineDetails.html new file mode 100644 index 0000000..05a1ef5 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/guidelines/partials/guidelineDetails.html @@ -0,0 +1,90 @@ + + +

{{ctrl.data.mandatory.name}}

+
+

{{area.area_name}}

+
    +
  1. + {{api.api_name}}
    + Area: {{area.area_name}}
    + Status: Mandatory
    + + Tests ({{api.value.length}}) +
      +
    • + + {{test}} +
    • +
    +
  2. +
+
+ +

{{ctrl.data.optional.name}}

+
+

{{area.area_name}}

+
    +
  1. + {{api.api_name}}
    + Status: Optional
    + + Tests ({{api.value.length}}) +
      +
    • + + {{test}} +
    • +
    +
  2. +
+
+ diff --git a/3rd_party/static/testapi-ui/components/guidelines/partials/testListModal.html b/3rd_party/static/testapi-ui/components/guidelines/partials/testListModal.html new file mode 100644 index 0000000..5b1d698 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/guidelines/partials/testListModal.html @@ -0,0 +1,46 @@ + diff --git a/3rd_party/static/testapi-ui/components/home/home.html b/3rd_party/static/testapi-ui/components/home/home.html new file mode 100644 index 0000000..184980b --- /dev/null +++ b/3rd_party/static/testapi-ui/components/home/home.html @@ -0,0 +1,142 @@ +
+
+ + +
+
+
+

OPNFV is offering an OPNFV Verified Program (OVP) that verifies products and services with the "OPNFV Verified" mark.

+
+
+
+ +
+
+

+ The OPNFV Verified program demonstrates the readiness and availability of commercial products based on OPNFV. + Verified products and services submitted by vendors and service providers become compliant by implementing explicitly defined interfaces, + behaviors and key features while retaining distinct and value-added innovations across features and capabilities. + Navigate through the links in the left-hand menu to learn more and get started. You'll find step-step-instructions as well as a participation form. + Use this portal to upload your test results when ready. Please send any questions to verified@opnfv.org. +

+
+
+
+
+
+

OPNFV Verified Products Directory

+ Click on rows for more product verification details per company. +
+
+ + + + + + + + + + + + + + + + + +
CompanyProductCateogryVersion
{{ app.organization_name}}{{ app.product_name}}{{ app.ovp_category}}{{ app.ovp_version}}
+
+ +
+
+
+
diff --git a/3rd_party/static/testapi-ui/components/home/homeController.js b/3rd_party/static/testapi-ui/components/home/homeController.js new file mode 100644 index 0000000..bed86ab --- /dev/null +++ b/3rd_party/static/testapi-ui/components/home/homeController.js @@ -0,0 +1,58 @@ +/* + * 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('HomeController', HomeController); + + HomeController.$inject = [ + '$http', '$scope', '$rootScope', '$state', 'testapiApiUrl' + ]; + + /** + * TestAPI Results Controller + * This controller is for the '/results' page where a user can browse + * a listing of community uploaded results. + */ + function HomeController($http, $scope, $rootScope, $state, testapiApiUrl) { + var ctrl = this; + getApplication(); + + ctrl.height = $(document).height() + 500; + + ctrl.gotoApplication = function(){ + if($rootScope.auth.isAuthenticated){ + $state.go('application'); + }else{ + $rootScope.auth.doSignIn('cas'); + } + } + + function getApplication(){ + $http.get(testapiApiUrl + "/cvp/applications").then(function(response){ + ctrl.applications = response.data.applications; + }, function(error){ + }); + } + + ctrl.getCompany = function(row){ + //console.log(row) + $state.go('directory', {'companyID': row.organization_name, 'logo': row.company_logo}); + } + + } +})(); diff --git a/3rd_party/static/testapi-ui/components/logout/logout.html b/3rd_party/static/testapi-ui/components/logout/logout.html new file mode 100644 index 0000000..38a5c36 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/logout/logout.html @@ -0,0 +1 @@ +
diff --git a/3rd_party/static/testapi-ui/components/logout/logoutController.js b/3rd_party/static/testapi-ui/components/logout/logoutController.js new file mode 100644 index 0000000..1b6d78c --- /dev/null +++ b/3rd_party/static/testapi-ui/components/logout/logoutController.js @@ -0,0 +1,44 @@ +/* + * 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('LogoutController', LogoutController); + + LogoutController.$inject = [ + '$location', '$window', '$timeout' + ]; + + /** + * TestAPI Logout Controller + * This controller handles logging out. In order to fully logout, the + * openstackid_session cookie must also be removed. The way to do that + * is to have the user's browser make a request to the openstackid logout + * page. We do this by placing the logout link as the src for an html + * image. After some time, the user is redirected home. + */ + function LogoutController($location, $window, $timeout) { + var ctrl = this; + + ctrl.openid_logout_url = $location.search().openid_logout; + var img = new Image(0, 0); + img.src = ctrl.openid_logout_url; + ctrl.redirectWait = $timeout(function() { + $window.location.href = '/'; + }, 500); + } +})(); diff --git a/3rd_party/static/testapi-ui/components/profile/importPubKeyModal.html b/3rd_party/static/testapi-ui/components/profile/importPubKeyModal.html new file mode 100644 index 0000000..0f55c27 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/profile/importPubKeyModal.html @@ -0,0 +1,27 @@ + + diff --git a/3rd_party/static/testapi-ui/components/profile/profile.html b/3rd_party/static/testapi-ui/components/profile/profile.html new file mode 100644 index 0000000..98b28df --- /dev/null +++ b/3rd_party/static/testapi-ui/components/profile/profile.html @@ -0,0 +1,40 @@ +
+

User profile

+
+
+ + + + + + + +
User name {{auth.currentUser.fullname}}
User OpenId {{auth.currentUser.openid}}
Email {{auth.currentUser.email}}
Role {{auth.currentUser.role}}
+
+
+
+
+
+

User Public Keys

+
+
+ +
+
+
+ +
+ + + + + + + + +
{{pubKey.format}}{{pubKey.shortKey}}{{pubKey.comment}}
+
+
+
diff --git a/3rd_party/static/testapi-ui/components/profile/profileController.js b/3rd_party/static/testapi-ui/components/profile/profileController.js new file mode 100644 index 0000000..0660e19 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/profile/profileController.js @@ -0,0 +1,219 @@ +/* + * + * 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') + .factory('PubKeys', PubKeys); + + PubKeys.$inject = ['$resource', 'testapiApiUrl']; + + /** + * This is a provider for the user's uploaded public keys. + */ + function PubKeys($resource, testapiApiUrl) { + return $resource(testapiApiUrl + '/profile/pubkeys/:id', null, null); + } + + angular + .module('testapiApp') + .controller('ProfileController', ProfileController); + + ProfileController.$inject = [ + '$scope', '$http', 'testapiApiUrl', 'PubKeys', + '$uibModal', 'raiseAlert', '$state' + ]; + + /** + * TestAPI Profile Controller + * This controller handles user's profile page, where a user can view + * account-specific information. + */ + function ProfileController($scope, $http, testapiApiUrl, + PubKeys, $uibModal, raiseAlert, $state) { + + var ctrl = this; + + ctrl.updatePubKeys = updatePubKeys; + ctrl.openImportPubKeyModal = openImportPubKeyModal; + ctrl.openShowPubKeyModal = openShowPubKeyModal; + + // Must be authenticated to view this page. + if (!$scope.auth.isAuthenticated) { + $state.go('home'); + } + + /** + * This function will fetch all the user's public keys from the + * server and store them in an array. + */ + function updatePubKeys() { + var keys = PubKeys.query(function() { + ctrl.pubkeys = []; + angular.forEach(keys, function (key) { + ctrl.pubkeys.push({ + 'resource': key, + 'format': key.format, + 'shortKey': [ + key.pubkey.slice(0, 10), + '.', + key.pubkey.slice(-10) + ].join('.'), + 'pubkey': key.pubkey, + 'comment': key.comment + }); + }); + }); + } + + /** + * This function will open the modal that will give the user a form + * for importing a public key. + */ + function openImportPubKeyModal() { + $uibModal.open({ + templateUrl: '/components/profile/importPubKeyModal.html', + backdrop: true, + windowClass: 'modal', + controller: 'ImportPubKeyModalController as modal' + }).result.finally(function() { + ctrl.updatePubKeys(); + }); + } + + /** + * This function will open the modal that will give the full + * information regarding a specific public key. + * @param {Object} pubKey resource + */ + function openShowPubKeyModal(pubKey) { + $uibModal.open({ + templateUrl: '/components/profile/showPubKeyModal.html', + backdrop: true, + windowClass: 'modal', + controller: 'ShowPubKeyModalController as modal', + resolve: { + pubKey: function() { + return pubKey; + } + } + }).result.finally(function() { + ctrl.updatePubKeys(); + }); + } + + ctrl.authRequest = $scope.auth.doSignCheck().then(ctrl.updatePubKeys); + } + + angular + .module('testapiApp') + .controller('ImportPubKeyModalController', ImportPubKeyModalController); + + ImportPubKeyModalController.$inject = [ + '$uibModalInstance', 'PubKeys', 'raiseAlert' + ]; + + /** + * Import Pub Key Modal Controller + * This controller is for the modal that appears if a user wants to import + * a public key. + */ + function ImportPubKeyModalController($uibModalInstance, + PubKeys, raiseAlert) { + + var ctrl = this; + + ctrl.importPubKey = importPubKey; + ctrl.cancel = cancel; + + /** + * This function will save a new public key resource to the API server. + */ + function importPubKey() { + var newPubKey = new PubKeys( + {raw_key: ctrl.raw_key, self_signature: ctrl.self_signature} + ); + newPubKey.$save( + function(newPubKey_) { + raiseAlert('success', '', 'Public key saved successfully'); + $uibModalInstance.close(newPubKey_); + }, + function(httpResp) { + raiseAlert('danger', + httpResp.statusText, httpResp.data.title); + ctrl.cancel(); + } + ); + } + + /** + * This function will dismiss the modal. + */ + function cancel() { + $uibModalInstance.dismiss('cancel'); + } + } + + angular + .module('testapiApp') + .controller('ShowPubKeyModalController', ShowPubKeyModalController); + + ShowPubKeyModalController.$inject = [ + '$uibModalInstance', 'raiseAlert', 'pubKey' + ]; + + /** + * Show Pub Key Modal Controller + * This controller is for the modal that appears if a user wants to see the + * full details of one of their public keys. + */ + function ShowPubKeyModalController($uibModalInstance, raiseAlert, pubKey) { + var ctrl = this; + + ctrl.deletePubKey = deletePubKey; + ctrl.cancel = cancel; + + ctrl.pubKey = pubKey.resource; + ctrl.rawKey = [pubKey.format, pubKey.pubkey, pubKey.comment].join('\n'); + + /** + * This function will delete a public key resource. + */ + function deletePubKey() { + ctrl.pubKey.$remove( + {id: ctrl.pubKey.id}, + function() { + raiseAlert('success', + '', 'Public key deleted successfully'); + $uibModalInstance.close(ctrl.pubKey.id); + }, + function(httpResp) { + raiseAlert('danger', + httpResp.statusText, httpResp.data.title); + ctrl.cancel(); + } + ); + } + + /** + * This method will dismiss the modal. + */ + function cancel() { + $uibModalInstance.dismiss('cancel'); + } + } +})(); diff --git a/3rd_party/static/testapi-ui/components/profile/showPubKeyModal.html b/3rd_party/static/testapi-ui/components/profile/showPubKeyModal.html new file mode 100644 index 0000000..5f63a5e --- /dev/null +++ b/3rd_party/static/testapi-ui/components/profile/showPubKeyModal.html @@ -0,0 +1,11 @@ + + diff --git a/3rd_party/static/testapi-ui/components/results-report/data/testcases.json b/3rd_party/static/testapi-ui/components/results-report/data/testcases.json new file mode 100644 index 0000000..858aea6 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/results-report/data/testcases.json @@ -0,0 +1,509 @@ +{ + "mandatory": { + "dovetail.ha.tc001": { + "cases": [ + "opnfv_yardstick_tc019" + ], + "total": 1 + }, + "dovetail.ha.tc002": { + "cases": [ + "opnfv_yardstick_tc045" + ], + "total": 1 + }, + "dovetail.ha.tc003": { + "cases": [ + "opnfv_yardstick_tc046" + ], + "total": 1 + }, + "dovetail.ha.tc004": { + "cases": [ + "opnfv_yardstick_tc047" + ], + "total": 1 + }, + "dovetail.ha.tc005": { + "cases": [ + "opnfv_yardstick_tc048" + ], + "total": 1 + }, + "dovetail.ha.tc006": { + "cases": [ + "opnfv_yardstick_tc051" + ], + "total": 1 + }, + "dovetail.ha.tc007": { + "cases": [ + "opnfv_yardstick_tc052" + ], + "total": 1 + }, + "dovetail.ha.tc008": { + "cases": [ + "opnfv_yardstick_tc053" + ], + "total": 1 + }, + "dovetail.osinterop.tc001": { + "cases": [ + "tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_delete_image", + "tempest.api.compute.images.test_images_oneserver.ImagesOneServerTestJSON.test_create_image_specify_multibyte_character_image_name", + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers", + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_list_servers_with_detail", + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_server_details", + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers", + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_list_servers_with_detail", + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_server_details", + "tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_get_instance_action", + "tempest.api.compute.servers.test_instance_actions.InstanceActionsTestJSON.test_list_instance_actions", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_flavor", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_image", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_name", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_filter_by_server_status", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_detailed_limit_results", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_active_status", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_flavor", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_image", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_limit", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filter_by_server_name", + "tempest.api.compute.servers.test_list_server_filters.ListServerFiltersTestJSON.test_list_servers_filtered_by_name_wildcard", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_future_date", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_changes_since_invalid_date", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_greater_than_actual_count", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_negative_value", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_limits_pass_string", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_flavor", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_image", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_by_non_existing_server_name", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_detail_server_is_deleted", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_status_non_existing", + "tempest.api.compute.servers.test_list_servers_negative.ListServersNegativeTestJSON.test_list_servers_with_a_deleted_server", + "tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_lock_unlock_server", + "tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_stop_start_server", + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_delete_server_metadata_item", + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_get_server_metadata_item", + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_list_server_metadata", + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata", + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_set_server_metadata_item", + "tempest.api.compute.servers.test_server_metadata.ServerMetadataTestJSON.test_update_server_metadata", + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_server_with_admin_password", + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_specify_keypair", + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_create_with_existing_server_name", + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_access_server_address", + "tempest.api.compute.servers.test_servers.ServersTestJSON.test_update_server_name", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_numeric_server_name", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_metadata_exceeds_length_limit", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_server_name_length_exceeds_256", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_flavor", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_image", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_create_with_invalid_network_uuid", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_id_exceeding_length_limit", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_delete_server_pass_negative_id", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_get_non_existent_server", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_invalid_ip_v6_address", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_reboot_non_existent_server", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_deleted_server", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_rebuild_non_existent_server", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_server_name_blank", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_stop_non_existent_server", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_name_of_non_existent_server", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_name_length_exceeds_256", + "tempest.api.compute.servers.test_servers_negative.ServersNegativeTestJSON.test_update_server_set_empty_name", + "tempest.api.compute.test_quotas.QuotasTestJSON.test_get_default_quotas", + "tempest.api.compute.test_quotas.QuotasTestJSON.test_get_quotas", + "tempest.api.compute.test_versions.TestVersions.test_list_api_versions", + "tempest.api.compute.volumes.test_attach_volume.AttachVolumeTestJSON.test_list_get_volume_attachments", + "tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_media_types", + "tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_resources", + "tempest.api.identity.v3.test_api_discovery.TestApiDiscovery.test_api_version_statuses", + "tempest.api.identity.v3.test_tokens.TokensV3Test.test_create_token", + "tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_delete_image", + "tempest.api.image.v2.test_images.BasicOperationsImagesTest.test_update_image", + "tempest.api.image.v2.test_images.ListUserImagesTest.test_get_image_schema", + "tempest.api.image.v2.test_images.ListUserImagesTest.test_get_images_schema", + "tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_container_format", + "tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_disk_format", + "tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_limit", + "tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_min_max_size", + "tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_size", + "tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_status", + "tempest.api.image.v2.test_images.ListUserImagesTest.test_list_images_param_visibility", + "tempest.api.image.v2.test_images.ListUserImagesTest.test_list_no_params", + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_image_null_id", + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_delete_non_existing_image", + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_delete_deleted_image", + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_image_null_id", + "tempest.api.image.v2.test_images_negative.ImagesNegativeTest.test_get_non_existent_image", + "tempest.api.image.v2.test_images_tags.ImagesTagsTest.test_update_delete_tags_for_image", + "tempest.api.image.v2.test_images_tags_negative.ImagesTagsNegativeTest.test_delete_non_existing_tag", + "tempest.api.image.v2.test_images_tags_negative.ImagesTagsNegativeTest.test_update_tags_for_non_existing_image", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_all_attributes", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_allocation_pools", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_dhcp_enabled", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_gw", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_gw_and_allocation_pools", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_with_host_routes_and_dns_nameservers", + "tempest.api.network.test_networks.NetworksTest.test_create_delete_subnet_without_gateway", + "tempest.api.network.test_networks.NetworksTest.test_create_update_delete_network_subnet", + "tempest.api.network.test_networks.NetworksTest.test_delete_network_with_subnet", + "tempest.api.network.test_networks.NetworksTest.test_list_networks", + "tempest.api.network.test_networks.NetworksTest.test_list_networks_fields", + "tempest.api.network.test_networks.NetworksTest.test_list_subnets", + "tempest.api.network.test_networks.NetworksTest.test_list_subnets_fields", + "tempest.api.network.test_networks.NetworksTest.test_show_network", + "tempest.api.network.test_networks.NetworksTest.test_show_network_fields", + "tempest.api.network.test_networks.NetworksTest.test_show_subnet", + "tempest.api.network.test_networks.NetworksTest.test_show_subnet_fields", + "tempest.api.network.test_networks.NetworksTest.test_update_subnet_gw_dns_host_routes_dhcp", + "tempest.api.network.test_ports.PortsTestJSON.test_create_bulk_port", + "tempest.api.network.test_ports.PortsTestJSON.test_create_port_in_allowed_allocation_pools", + "tempest.api.network.test_ports.PortsTestJSON.test_create_update_delete_port", + "tempest.api.network.test_ports.PortsTestJSON.test_list_ports", + "tempest.api.network.test_ports.PortsTestJSON.test_list_ports_fields", + "tempest.api.network.test_ports.PortsTestJSON.test_show_port", + "tempest.api.network.test_ports.PortsTestJSON.test_show_port_fields", + "tempest.api.network.test_ports.PortsTestJSON.test_update_port_with_security_group_and_extra_attributes", + "tempest.api.network.test_ports.PortsTestJSON.test_update_port_with_two_security_groups_and_extra_attributes", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_list_update_show_delete_security_group", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_additional_args", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_icmp_type_code", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_protocol_integer_value", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_remote_group_id", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_security_group_rule_with_remote_ip_prefix", + "tempest.api.network.test_security_groups.SecGroupTest.test_create_show_delete_security_group_rule", + "tempest.api.network.test_security_groups.SecGroupTest.test_list_security_groups", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_additional_default_security_group_fails", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_duplicate_security_group_rule_fails", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_ethertype", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_protocol", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_bad_remote_ip_prefix", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_invalid_ports", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_non_existent_remote_groupid", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_create_security_group_rule_with_non_existent_security_group", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_delete_non_existent_security_group", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_show_non_existent_security_group", + "tempest.api.network.test_security_groups_negative.NegativeSecGroupTest.test_show_non_existent_security_group_rule", + "tempest.api.volume.test_availability_zone.AvailabilityZoneV2TestJSON.test_get_availability_zone_list", + "tempest.api.volume.test_extensions.ExtensionsV2TestJSON.test_list_extensions", + "tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_crud_snapshot_metadata", + "tempest.api.volume.test_snapshot_metadata.SnapshotV2MetadataTestJSON.test_update_snapshot_metadata_item", + "tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_crud_volume_metadata", + "tempest.api.volume.test_volume_metadata.VolumesV2MetadataTest.test_update_volume_metadata_item", + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_attach_detach_volume_to_instance", + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_get_volume_attachment", + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_reserve_unreserve_volume", + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_bootable", + "tempest.api.volume.test_volumes_actions.VolumesV2ActionsTest.test_volume_readonly_update", + "tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete", + "tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete_as_clone", + "tempest.api.volume.test_volumes_get.VolumesV2GetTest.test_volume_create_get_update_delete_from_image", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_by_name", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_by_name", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_param_display_name_and_status", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_detail_param_display_name_and_status", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_detail_param_metadata", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_details", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_with_param_metadata", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_availability_zone", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_by_status", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_details_by_availability_zone", + "tempest.api.volume.test_volumes_list.VolumesV2ListTestJSON.test_volumes_list_details_by_status", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_attach_volumes_with_nonexistent_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_invalid_size", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_snapshot_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_source_volid", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_nonexistent_volume_type", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_size_negative", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_with_size_zero", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_create_volume_without_passing_size", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_delete_invalid_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_delete_volume_without_passing_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_detach_volumes_with_invalid_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_get_invalid_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_get_volume_without_passing_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_detail_with_invalid_status", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_detail_with_nonexistent_name", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_with_invalid_status", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_list_volumes_with_nonexistent_name", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_reserve_volume_with_negative_volume_status", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_reserve_volume_with_nonexistent_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_unreserve_volume_with_nonexistent_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_empty_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_invalid_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_update_volume_with_nonexistent_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_volume_delete_nonexistent_volume_id", + "tempest.api.volume.test_volumes_negative.VolumesV2NegativeTest.test_volume_get_nonexistent_volume_id", + "tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_snapshot_create_get_list_update_delete", + "tempest.api.volume.test_volumes_snapshots.VolumesV2SnapshotTestJSON.test_volume_from_snapshot", + "tempest.api.volume.test_volumes_snapshots_list.VolumesV2SnapshotListTestJSON.test_snapshots_list_details_with_params", + "tempest.api.volume.test_volumes_snapshots_list.VolumesV2SnapshotListTestJSON.test_snapshots_list_with_params", + "tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_with_nonexistent_volume_id", + "tempest.api.volume.test_volumes_snapshots_negative.VolumesV2SnapshotNegativeTestJSON.test_create_snapshot_without_passing_volume_id", + "tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_pagination", + "tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_details_with_multiple_params", + "tempest.api.volume.v2.test_volumes_list.VolumesV2ListTestJSON.test_volume_list_pagination", + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_host_name_is_same_as_server_name", + "tempest.api.compute.servers.test_create_server.ServersTestJSON.test_verify_created_server_vcpus", + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_host_name_is_same_as_server_name", + "tempest.api.compute.servers.test_create_server.ServersTestManualDisk.test_verify_created_server_vcpus", + "tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_reboot_server_hard", + "tempest.api.compute.servers.test_server_actions.ServerActionsTestJSON.test_rebuild_server", + "tempest.api.compute.volumes.test_attach_volume.AttachVolumeTestJSON.test_attach_detach_volume" + ], + "total": 205 + }, + "dovetail.vping.tc001": { + "cases": [ + "vping_userdata" + ], + "total": 1 + }, + "dovetail.vping.tc002": { + "cases": [ + "vping_ssh" + ], + "total": 1 + } + }, + "optional": { + "dovetail.ipv6.tc001": { + "cases": [ + "tempest.api.network.test_networks.BulkNetworkOpsIpV6Test.test_bulk_create_delete_network", + "tempest.api.network.test_networks.BulkNetworkOpsIpV6Test.test_bulk_create_delete_port", + "tempest.api.network.test_networks.BulkNetworkOpsIpV6Test.test_bulk_create_delete_subnet" + ], + "total": 3 + }, + "dovetail.ipv6.tc002": { + "cases": [ + "tempest.api.network.test_networks.NetworksIpV6Test.test_create_update_delete_network_subnet" + ], + "total": 1 + }, + "dovetail.ipv6.tc003": { + "cases": [ + "tempest.api.network.test_networks.NetworksIpV6Test.test_external_network_visibility" + ], + "total": 1 + }, + "dovetail.ipv6.tc004": { + "cases": [ + "tempest.api.network.test_networks.NetworksIpV6Test.test_list_networks", + "tempest.api.network.test_networks.NetworksIpV6Test.test_list_subnets" + ], + "total": 2 + }, + "dovetail.ipv6.tc005": { + "cases": [ + "tempest.api.network.test_networks.NetworksIpV6Test.test_show_network", + "tempest.api.network.test_networks.NetworksIpV6Test.test_show_subnet" + ], + "total": 2 + }, + "dovetail.ipv6.tc006": { + "cases": [ + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_create_port_in_allowed_allocation_pools" + ], + "total": 1 + }, + "dovetail.ipv6.tc007": { + "cases": [ + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_create_port_with_no_securitygroups" + ], + "total": 1 + }, + "dovetail.ipv6.tc008": { + "cases": [ + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_create_update_delete_port" + ], + "total": 1 + }, + "dovetail.ipv6.tc009": { + "cases": [ + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_list_ports" + ], + "total": 1 + }, + "dovetail.ipv6.tc010": { + "cases": [ + "tempest.api.network.test_ports.PortsIpV6TestJSON.test_show_port" + ], + "total": 1 + }, + "dovetail.ipv6.tc011": { + "cases": [ + "tempest.api.network.test_routers.RoutersIpV6Test.test_add_multiple_router_interfaces" + ], + "total": 1 + }, + "dovetail.ipv6.tc012": { + "cases": [ + "tempest.api.network.test_routers.RoutersIpV6Test.test_add_remove_router_interface_with_port_id" + ], + "total": 1 + }, + "dovetail.ipv6.tc013": { + "cases": [ + "tempest.api.network.test_routers.RoutersIpV6Test.test_add_remove_router_interface_with_subnet_id" + ], + "total": 1 + }, + "dovetail.ipv6.tc014": { + "cases": [ + "tempest.api.network.test_routers.RoutersIpV6Test.test_create_show_list_update_delete_router" + ], + "total": 1 + }, + "dovetail.ipv6.tc015": { + "cases": [ + "tempest.api.network.test_security_groups.SecGroupIPv6Test.test_create_list_update_show_delete_security_group" + ], + "total": 1 + }, + "dovetail.ipv6.tc016": { + "cases": [ + "tempest.api.network.test_security_groups.SecGroupIPv6Test.test_create_show_delete_security_group_rule" + ], + "total": 1 + }, + "dovetail.ipv6.tc017": { + "cases": [ + "tempest.api.network.test_security_groups.SecGroupIPv6Test.test_list_security_groups" + ], + "total": 1 + }, + "dovetail.ipv6.tc018": { + "cases": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_dhcp6_stateless_from_os" + ], + "total": 1 + }, + "dovetail.ipv6.tc019": { + "cases": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_dualnet_dhcp6_stateless_from_os" + ], + "total": 1 + }, + "dovetail.ipv6.tc020": { + "cases": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_multi_prefix_dhcpv6_stateless" + ], + "total": 1 + }, + "dovetail.ipv6.tc021": { + "cases": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_dualnet_multi_prefix_dhcpv6_stateless" + ], + "total": 1 + }, + "dovetail.ipv6.tc022": { + "cases": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_slaac_from_os" + ], + "total": 1 + }, + "dovetail.ipv6.tc023": { + "cases": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_dualnet_slaac_from_os" + ], + "total": 1 + }, + "dovetail.ipv6.tc024": { + "cases": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_multi_prefix_slaac" + ], + "total": 1 + }, + "dovetail.ipv6.tc025": { + "cases": [ + "tempest.scenario.test_network_v6.TestGettingAddress.test_dualnet_multi_prefix_slaac" + ], + "total": 1 + }, + "dovetail.sdnvpn.tc001": { + "cases": [ + "functest_testcase_1" + ], + "total": 1 + }, + "dovetail.sdnvpn.tc002": { + "cases": [ + "functest_testcase_2" + ], + "total": 1 + }, + "dovetail.sdnvpn.tc004": { + "cases": [ + "functest_testcase_4" + ], + "total": 1 + }, + "dovetail.sdnvpn.tc008": { + "cases": [ + "functest_testcase_8" + ], + "total": 1 + }, + "dovetail.tempest.tc001": { + "cases": [ + "tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_mtu_sized_frames" + ], + "total": 1 + }, + "dovetail.tempest.tc002": { + "cases": [ + "tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_port_security_macspoofing_port", + "tempest.scenario.test_security_groups_basic_ops.TestSecurityGroupsBasicOps.test_cross_tenant_traffic", + "tempest.scenario.test_security_groups_basic_ops.TestSecurityGroupsBasicOps.test_in_tenant_traffic", + "tempest.scenario.test_security_groups_basic_ops.TestSecurityGroupsBasicOps.test_multiple_security_groups", + "tempest.scenario.test_security_groups_basic_ops.TestSecurityGroupsBasicOps.test_port_security_disable_security_group", + "tempest.scenario.test_security_groups_basic_ops.TestSecurityGroupsBasicOps.test_port_update_new_security_group" + ], + "total": 6 + }, + "dovetail.tempest.tc003": { + "cases": [ + "tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_hotplug_nic", + "tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_network_basic_ops", + "tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_subnet_details", + "tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_update_instance_port_admin_state", + "tempest.scenario.test_network_basic_ops.TestNetworkBasicOps.test_update_router_admin_state" + ], + "total": 5 + }, + "dovetail.tempest.tc004": { + "cases": [ + "tempest.scenario.test_minimum_basic.TestMinimumBasicScenario.test_minimum_basic_scenario", + "tempest.scenario.test_network_advanced_server_ops.TestNetworkAdvancedServerOps.test_server_connectivity_cold_migration", + "tempest.scenario.test_network_advanced_server_ops.TestNetworkAdvancedServerOps.test_server_connectivity_pause_unpause", + "tempest.scenario.test_network_advanced_server_ops.TestNetworkAdvancedServerOps.test_server_connectivity_reboot", + "tempest.scenario.test_network_advanced_server_ops.TestNetworkAdvancedServerOps.test_server_connectivity_rebuild", + "tempest.scenario.test_network_advanced_server_ops.TestNetworkAdvancedServerOps.test_server_connectivity_resize", + "tempest.scenario.test_network_advanced_server_ops.TestNetworkAdvancedServerOps.test_server_connectivity_stop_start", + "tempest.scenario.test_network_advanced_server_ops.TestNetworkAdvancedServerOps.test_server_connectivity_suspend_resume", + "tempest.scenario.test_server_advanced_ops.TestServerAdvancedOps.test_resize_volume_backed_server_confirm", + "tempest.scenario.test_server_advanced_ops.TestServerAdvancedOps.test_server_sequence_suspend_resume", + "tempest.scenario.test_shelve_instance.TestShelveInstance.test_shelve_instance", + "tempest.scenario.test_shelve_instance.TestShelveInstance.test_shelve_volume_backed_instance" + ], + "total": 12 + }, + "dovetail.tempest.tc005": { + "cases": [ + "tempest.scenario.test_server_multinode.TestServerMultinode.test_schedule_to_all_nodes", + "tempest.api.compute.servers.test_server_group.ServerGroupTestJSON.test_create_delete_multiple_server_groups_with_same_name_policy", + "tempest.api.compute.servers.test_server_group.ServerGroupTestJSON.test_create_delete_server_group_with_affinity_policy", + "tempest.api.compute.servers.test_server_group.ServerGroupTestJSON.test_create_delete_server_group_with_anti_affinity_policy", + "tempest.api.compute.servers.test_server_group.ServerGroupTestJSON.test_list_server_groups", + "tempest.api.compute.servers.test_server_group.ServerGroupTestJSON.test_show_server_group" + ], + "total": 6 + } + } +} diff --git a/3rd_party/static/testapi-ui/components/results-report/partials/editTestModal.html b/3rd_party/static/testapi-ui/components/results-report/partials/editTestModal.html new file mode 100644 index 0000000..583c9b9 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/results-report/partials/editTestModal.html @@ -0,0 +1,65 @@ + diff --git a/3rd_party/static/testapi-ui/components/results-report/partials/fullTestListModal.html b/3rd_party/static/testapi-ui/components/results-report/partials/fullTestListModal.html new file mode 100644 index 0000000..6db198b --- /dev/null +++ b/3rd_party/static/testapi-ui/components/results-report/partials/fullTestListModal.html @@ -0,0 +1,13 @@ + diff --git a/3rd_party/static/testapi-ui/components/results-report/partials/reportDetails.html b/3rd_party/static/testapi-ui/components/results-report/partials/reportDetails.html new file mode 100644 index 0000000..e363289 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/results-report/partials/reportDetails.html @@ -0,0 +1,52 @@ + + +Test Filters:
+ + + + + {{ type }}: (Total: 3 test areas, {{ ctrl.statistics[type].total }} tests) + + +
    +
  1. + + + {{ area }} + [{{ value.pass }}/{{ value.total }}] + [{{ value.pass }}] + [{{ value.fail }}] + + + +
  2. +
+
diff --git a/3rd_party/static/testapi-ui/components/results-report/resultsReport.html b/3rd_party/static/testapi-ui/components/results-report/resultsReport.html new file mode 100644 index 0000000..bc049f3 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/results-report/resultsReport.html @@ -0,0 +1,45 @@ +
+

Test Run Results

+ +
+
+
+
+ Test ID: {{ctrl.testId}}
+
+
+
+
+ +Total: {{ctrl.statistics.total}}, Pass: {{ ctrl.statistics.pass}}, Rate: {{ ctrl.statistics.pass / ctrl.statistics.total * 100 | number:2 }}%
+Mandatory Total: {{ctrl.statistics.mandatory.total}}, Pass: {{ ctrl.statistics.mandatory.pass }}, Rate: {{ ctrl.statistics.mandatory.pass / ctrl.statistics.mandatory.total * 100 | number:2 }}%
+Optional Total: {{ctrl.statistics.optional.total}}, Pass: {{ ctrl.statistics.optional.pass }}, Rate: {{ ctrl.statistics.optional.pass / ctrl.statistics.optional.total * 100 | number:2 }}%
+
+{{ ctrl.validation }}
+ +
+
+

Test Result Overview

+ + + + + +
+
+
+
+ + diff --git a/3rd_party/static/testapi-ui/components/results-report/resultsReportController.js b/3rd_party/static/testapi-ui/components/results-report/resultsReportController.js new file mode 100644 index 0000000..65ce151 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/results-report/resultsReportController.js @@ -0,0 +1,247 @@ +/* + * 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('ResultsReportController', ResultsReportController); + + ResultsReportController.$inject = [ + '$scope', '$http', '$stateParams', '$window', + '$uibModal', 'testapiApiUrl', 'raiseAlert' + ]; + + /** + * TestAPI Results Report Controller + * This controller is for the '/results/' page where a user can + * view details for a specific test run. + */ + function ResultsReportController($scope, $http, $stateParams, $window, + $uibModal, testapiApiUrl, raiseAlert) { + + var ctrl = this; + + ctrl.testStatus = 'total'; + ctrl.case_list = []; + ctrl.data = {}; + ctrl.statistics = { + 'total': 0, 'pass': 0, 'fail': 0, + 'mandatory': {'total': 0, 'pass': 0, 'fail': 0, 'area': 0}, + 'optional': {'total': 0, 'pass': 0, 'fail': 0, 'area': 0} + }; + + ctrl.gotoDoc = gotoDoc; + ctrl.openAll = openAll; + ctrl.folderAll = folderAll; + ctrl.gotoResultLog = gotoResultLog; + ctrl.changeStatus = changeStatus; + + /** The testID extracted from the URL route. */ + ctrl.testId = $stateParams.testID; + ctrl.innerId = $stateParams.innerID; + ctrl.validation = ''; + + /** The HTML template that all accordian groups will use. */ + ctrl.detailsTemplate = 'testapi-ui/components/results-report/partials/' + + 'reportDetails.html'; + + $scope.load_finish = false; + + function changeStatus(value){ + ctrl.testStatus = value; + } + + function extend(case_list) { + angular.forEach(case_list, function(ele){ + ctrl.case_list.push(ele); + }); + } + + function strip(word) { + return word.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + } + + function gotoResultLog(case_name) { + var case_area = case_name.split(".")[1]; + var log_url = "/logs/"+ctrl.testId+"/results/"; + if (case_area == "vping") { + log_url += "functest.log"; + } else if (case_area == "ha") { + log_url += "yardstick.log"; + } else { + log_url += case_area+"_logs/"+case_name+".log"; + } + var is_reachable = false; + + $.ajax({ + url: log_url, + async: false, + success: function (response) { + is_reachable = true; + }, + error: function (response){ + alert("Log file could not be found. Please confirm this case has been executed successfully."); + } + }); + + if(is_reachable == true){ + window.open(log_url); + } + } + + $scope.$watch('load_finish', function(){ + if($scope.load_finish == true){ + var case_url = 'testapi-ui/components/results-report/data/testcases.json' + $http.get(case_url).then(function(response){ + ctrl.data = response.data; + + angular.forEach(ctrl.data.mandatory, function(value, name){ + ctrl.data.mandatory[name].folder = true; + ctrl.data.mandatory[name].pass = 0; + ctrl.data.mandatory[name].fail = 0; + angular.forEach(value.cases, function(sub_case){ + ctrl.statistics.total += 1; + ctrl.statistics.mandatory.total += 1; + if(ctrl.case_list.indexOf(sub_case) > -1){ + ctrl.data.mandatory[name].pass += 1; + ctrl.statistics.mandatory.pass += 1; + ctrl.statistics.pass += 1; + }else{ + ctrl.data.mandatory[name].fail += 1; + ctrl.statistics.mandatory.fail += 1; + ctrl.statistics.fail += 1; + } + + }); + }); + + angular.forEach(ctrl.data.optional, function(value, name){ + ctrl.data.optional[name].folder = true; + ctrl.data.optional[name].pass = 0; + ctrl.data.optional[name].fail = 0; + angular.forEach(value.cases, function(sub_case){ + ctrl.statistics.total += 1; + ctrl.statistics.optional.total += 1; + if(ctrl.case_list.indexOf(sub_case) > -1){ + ctrl.data.optional[name].pass += 1; + ctrl.statistics.optional.pass += 1; + ctrl.statistics.pass += 1; + }else{ + ctrl.data.optional[name].fail += 1; + ctrl.statistics.optional.fail += 1; + ctrl.statistics.fail += 1; + } + + }); + }); + + ctrl.statistics.mandatory.area = Object.keys(ctrl.data.mandatory).length; + ctrl.statistics.optional.area = Object.keys(ctrl.data.optional).length; + }, function(error){ + alert('error to get test case info'); + }); + } + }); + + function generate_format_data() { + var test_url = testapiApiUrl + '/tests/' + ctrl.innerId; + $http.get(test_url).then(function(test_resp){ + ctrl.validation = test_resp.data.validation; + angular.forEach(test_resp.data.results, function(result, index){ + var result_url = testapiApiUrl + '/results/' + result; + $http.get(result_url).then(function(result_resp){ + var sub_case_list = get_sub_case_list(result_resp.data); + extend(sub_case_list); + if(index == test_resp.data.results.length - 1){ + $scope.load_finish = true; + } + }, function(result_error){ + }); + }); + + }, function(test_error){ + alert('Error when get test record'); + }); + } + + function get_sub_case_list(result) { + if(result.project_name == 'yardstick'){ + return yardstickPass(result); + }else{ + return functestPass(result); + } + } + + function yardstickPass(result) { + var case_list = []; + angular.forEach(result.details.results, function(ele){ + if(ele.benchmark){ + if(ele.benchmark.data.sla_pass == 1){ + case_list.push(result.case_name); + return case_list; + } + } + }); + return case_list; + } + + function functestPass(result){ + var case_list = []; + if(result.case_name == 'refstack_defcore'){ + angular.forEach(result.details.success, function(ele){ + if(strip(ele) == 'tempest.api.identity.v3.test_t'){ + case_list.push('tempest.api.identity.v3.test_tokens.TokensV3Test.test_create_token'); + }else{ + case_list.push(ele.split(' ')[ele.split(' ').length - 2]); + } + }); + }else if(result.case_name == 'tempest_custom'){ + angular.forEach(result.details.success, function(ele){ + case_list.push(ele.split(' ')[ele.split(' ').length - 1]); + }); + }else{ + if(result.criteria == 'PASS'){ + case_list.push(result.case_name); + } + } + return case_list; + } + + function gotoDoc(sub_case){ + } + + function openAll(){ + angular.forEach(ctrl.data.mandatory, function(ele, id){ + ele.folder = false; + }); + angular.forEach(ctrl.data.optional, function(ele, id){ + ele.folder = false; + }); + } + + function folderAll(){ + angular.forEach(ctrl.data.mandatory, function(ele, id){ + ele.folder = true; + }); + angular.forEach(ctrl.data.optional, function(ele, id){ + ele.folder = true; + }); + } + + generate_format_data(); + } + +})(); diff --git a/3rd_party/static/testapi-ui/components/results/modal/sharedModal.html b/3rd_party/static/testapi-ui/components/results/modal/sharedModal.html new file mode 100644 index 0000000..2f50b0c --- /dev/null +++ b/3rd_party/static/testapi-ui/components/results/modal/sharedModal.html @@ -0,0 +1,19 @@ +
+ +

Enter user name or email

+ + +
+ +
+ +
+ + + diff --git a/3rd_party/static/testapi-ui/components/results/results.html b/3rd_party/static/testapi-ui/components/results/results.html new file mode 100644 index 0000000..719e689 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/results/results.html @@ -0,0 +1,106 @@ +
+

{{ctrl.pageHeader}}

+

{{ctrl.pageParagraph}}

+
+

Upload Results

+
+ +
+ +
+{{ctrl.uploadState}} +
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Upload DateTest IDOwnerFile NameLabelStatusLogSUTSUT VersionOperationShare List
{{ result.upload_date | limitTo:19}}{{ result.id | limitTo:8 }}{{ result.owner }}{{ result.filename || "None"}}{{ result.status }}logsinfo + + +
+ + Share List + + +
+
+ +
+ + +
+
+ +
+ + + + diff --git a/3rd_party/static/testapi-ui/components/results/resultsController.js b/3rd_party/static/testapi-ui/components/results/resultsController.js new file mode 100644 index 0000000..aa593dc --- /dev/null +++ b/3rd_party/static/testapi-ui/components/results/resultsController.js @@ -0,0 +1,515 @@ +/* + * 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('ResultsController', ResultsController); + + angular + .module('testapiApp') + .directive('fileModel', ['$parse', function ($parse) { + return { + restrict: 'A', + link: function(scope, element, attrs) { + var model = $parse(attrs.fileModel); + var modelSetter = model.assign; + + element.bind('change', function(){ + scope.$apply(function(){ + modelSetter(scope, element[0].files[0]); + }); + }); + } + }; + }]); + + ResultsController.$inject = [ + '$scope', '$http', '$filter', '$state', 'testapiApiUrl','raiseAlert', 'ngDialog', '$resource' + ]; + + /** + * TestAPI Results Controller + * This controller is for the '/results' page where a user can browse + * a listing of community uploaded results. + */ + function ResultsController($scope, $http, $filter, $state, testapiApiUrl, raiseAlert, ngDialog, $resource) { + var ctrl = this; + + ctrl.uploadFile=uploadFile; + ctrl.update = update; + ctrl.open = open; + ctrl.clearFilters = clearFilters; + ctrl.associateMeta = associateMeta; + ctrl.getVersionList = getVersionList; + ctrl.getUserProducts = getUserProducts; + ctrl.associateProductVersion = associateProductVersion; + ctrl.getProductVersions = getProductVersions; + ctrl.prepVersionEdit = prepVersionEdit; + ctrl.gotoSUT = gotoSUT; + ctrl.gotoResultDetail = gotoResultDetail; + ctrl.toggleCheck = toggleCheck; + ctrl.changeLabel = changeLabel; + ctrl.toReview = toReview; + ctrl.toPrivate = toPrivate; + ctrl.removeSharedUser = removeSharedUser; + ctrl.addSharedUser = addSharedUser; + ctrl.openSharedModal = openSharedModal; + ctrl.downloadLogs = downloadLogs; + ctrl.deleteTest = deleteTest; + + /** Mappings of Interop WG components to marketing program names. */ + ctrl.targetMappings = { + 'platform': 'Openstack Powered Platform', + 'compute': 'OpenStack Powered Compute', + 'object': 'OpenStack Powered Object Storage' + }; + + /** Initial page to be on. */ + ctrl.currentPage = 1; + + /** + * How many results should display on each page. Since pagination + * is server-side implemented, this value should match the + * 'results_per_page' configuration of the TestAPI server which + * defaults to 20. + */ + ctrl.itemsPerPage = 20; + + /** + * How many page buttons should be displayed at max before adding + * the '...' button. + */ + ctrl.maxSize = 5; + + /** The upload date lower limit to be used in filtering results. */ + ctrl.startDate = ''; + + /** The upload date upper limit to be used in filtering results. */ + ctrl.endDate = ''; + + /** The date format for the date picker. */ + ctrl.format = 'yyyy-MM-dd'; + + ctrl.userName = null; + + /** Check to see if this page should display user-specific results. */ + // ctrl.isUserResults = $state.current.name === 'userResults'; + // need auth to browse + ctrl.isUserResults = $state.current.name === 'userResults'; + + ctrl.currentUser = $scope.auth.name; + console.log($scope.auth); + + // Should only be on user-results-page if authenticated. + if (ctrl.isUserResults && !$scope.auth.isAuthenticated) { + $state.go('home'); + } + + ctrl.pageHeader = ctrl.isUserResults ? + 'Private test results' : 'Community test results'; + + ctrl.pageParagraph = ctrl.isUserResults ? + 'Your most recently uploaded test results are listed here.' : + 'The most recently uploaded community test results are listed ' + + 'here.'; + + ctrl.uploadState = ''; + + if (ctrl.isUserResults) { + ctrl.authRequest = $scope.auth.doSignCheck() + .then(ctrl.update); + // ctrl.getUserProducts(); + } else { + ctrl.update(); + } + + function downloadLogs(id) { + // var logsUrl = testapiApiUrl + "/logs/log_" + id+".tar.gz"; + var logsUrl = "/logs/" + id+"/results/"; + window.location.href = logsUrl; + // $http.get(logsUrl); + } + + function deleteTest(inner_id) { + var resp = confirm('Are you sure to delete this test?'); + if (!resp) + return; + + var delUrl = testapiApiUrl + "/tests/" + inner_id; + $http.get(delUrl) + .then( function(resp) { + var results = resp.data.results; + $http.delete(delUrl) + .then( function(ret) { + if(ret.data.code && ret.data.code != 0) { + alert(ret.data.msg); + return; + } + ctrl.update(); + angular.forEach(results, function(ele) { + delUrl = testapiApiUrl + "/results/" + ele; + $http.delete(delUrl); + }); + }); + }); + } + + function toggleCheck(result, item, newValue) { + var id = result._id; + var updateUrl = testapiApiUrl + "/tests/"+ id; + + var data = {}; + data['item'] = item; + data[item] = newValue; + + $http.put(updateUrl, JSON.stringify(data), { + transformRequest: angular.identity, + headers: {'Content-Type': 'application/json'}}).then(function(ret){ + if(ret.data.code && ret.data.code != 0) { + alert(ret.data.msg); + } + else { + result[item] = newValue; + console.log('update success'); + } + }, function(error){ + alert("Error when update data"); + }); + } + + function changeLabel(result, key, data){ + toggleCheck(result, key, data); + } + + function toReview(result, value){ + var resp = confirm('Once you submit a test result for review, it will become readable to all OVP reviewers. Do you want to proceed?'); + if(resp){ + toggleCheck(result, 'status', value); + } + } + + function toPrivate(result, value){ + var resp = confirm('Do you want to proceed?'); + if(resp){ + toggleCheck(result, 'status', value); + } + } + + function openSharedModal(result){ + ctrl.tempResult = result; + ngDialog.open({ + preCloseCallback: function(value) { + }, + template: 'testapi-ui/components/results/modal/sharedModal.html', + scope: $scope, + className: 'ngdialog-theme-default', + width: 950, + showClose: true, + closeByDocument: true + }); + } + + function addSharedUser(result, userId){ + var tempList = copy(result.shared); + tempList.push(userId); + toggleCheck(result, 'shared', tempList); + ngDialog.close(); + } + + function removeSharedUser(result, userId){ + var tempList = copy(result.shared); + var idx = tempList.indexOf(userId); + if(idx != -1){ + tempList.splice(idx, 1); + toggleCheck(result, 'shared', tempList); + } + } + + function copy(arrList){ + var tempList = []; + angular.forEach(arrList, function(ele){ + tempList.push(ele); + }); + return tempList; + } + + function uploadFileToUrl(file, uploadUrl){ + var fd = new FormData(); + fd.append('file', file); + + $http.post(uploadUrl, fd, { + transformRequest: angular.identity, + headers: {'Content-Type': undefined} + }).then(function(data){ + + if(data.data.code && data.data.code != 0){ + alert(data.data.msg); + return; + } + + ctrl.uploadState = ""; + data.data.filename = file.name; + var createTestUrl = testapiApiUrl + "/tests" + + $http.post(createTestUrl, data.data).then(function(data){ + if (data.data.code && data.data.code != 0) { + alert(data.data.msg); + } else { + ctrl.update(); + } + }, function(error){ + }); + + }, function(error){ + ctrl.uploadState = "Upload failed. Error code is " + error.status; + }); + } + + function uploadFile(){ + var file = $scope.resultFile; + console.log('file is ' ); + console.dir(file); + + var uploadUrl = testapiApiUrl + "/results/upload"; + uploadFileToUrl(file, uploadUrl); + }; + + /** + * This will contact the TestAPI API to get a listing of test run + * results. + */ + function update() { + ctrl.showError = false; + // Construct the API URL based on user-specified filters. + var content_url = testapiApiUrl + '/tests' + + '?page=' + ctrl.currentPage; + var start = $filter('date')(ctrl.startDate, 'yyyy-MM-dd'); + if (start) { + content_url = + content_url + '&from=' + start + ' 00:00:00'; + } + var end = $filter('date')(ctrl.endDate, 'yyyy-MM-dd'); + if (end) { + content_url = content_url + '&to=' + end + ' 23:59:59'; + } + if (ctrl.isUserResults) { + content_url = content_url + '&signed'+'&per_page='+ ctrl.itemsPerPage; + } + ctrl.resultsRequest = + $http.get(content_url).success(function (data) { + ctrl.data = data; + ctrl.totalItems = ctrl.data.pagination.total_pages * ctrl.itemsPerPage; + ctrl.currentPage = ctrl.data.pagination.current_page; + ctrl.numPages = ctrl.data.pagination.total_pages; + console.log(ctrl.data); + }).error(function (error) { + ctrl.data = null; + ctrl.totalItems = 0; + ctrl.showError = true; + ctrl.error = + 'Error retrieving results listing from server: ' + + angular.toJson(error); + }); + } + + /** + * 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.startDate = null; + ctrl.endDate = null; + ctrl.update(); + } + + /** + * This will send an API request in order to associate a metadata + * key-value pair with the given testId + * @param {Number} index - index of the test object in the results list + * @param {String} key - metadata key + * @param {String} value - metadata value + */ + function associateMeta(index, key, value) { + var testId = ctrl.data.results[index].id; + var metaUrl = [ + testapiApiUrl, '/results/', testId, '/meta/', key + ].join(''); + + var editFlag = key + 'Edit'; + if (value) { + ctrl.associateRequest = $http.post(metaUrl, value) + .success(function () { + ctrl.data.results[index][editFlag] = false; + }).error(function (error) { + raiseAlert('danger', error.title, error.detail); + }); + } + else { + ctrl.unassociateRequest = $http.delete(metaUrl) + .success(function () { + ctrl.data.results[index][editFlag] = false; + }).error(function (error) { + if (error.code == 404) { + // Key doesn't exist, so count it as a success, + // and don't raise an alert. + ctrl.data.results[index][editFlag] = false; + } + else { + raiseAlert('danger', error.title, error.detail); + } + }); + } + } + + /** + * Retrieve an array of available capability files from the TestAPI + * API server, sort this array reverse-alphabetically, and store it in + * a scoped variable. + * Sample API return array: ["2015.03.json", "2015.04.json"] + */ + function getVersionList() { + if (ctrl.versionList) { + return; + } + var content_url = testapiApiUrl + '/guidelines'; + ctrl.versionsRequest = + $http.get(content_url).success(function (data) { + ctrl.versionList = data.sort().reverse(); + }).error(function (error) { + raiseAlert('danger', error.title, + 'Unable to retrieve version list'); + }); + } + + /** + * Get products user has management rights to or all products depending + * on the passed in parameter value. + */ + function getUserProducts() { + if (ctrl.products) { + return; + } + var contentUrl = testapiApiUrl + '/products'; + ctrl.productsRequest = + $http.get(contentUrl).success(function (data) { + ctrl.products = {}; + angular.forEach(data.products, function(prod) { + if (prod.can_manage) { + ctrl.products[prod.id] = prod; + } + }); + }).error(function (error) { + ctrl.products = null; + ctrl.showError = true; + ctrl.error = + 'Error retrieving Products listing from server: ' + + angular.toJson(error); + }); + } + + /** + * Send a PUT request to the API server to associate a product with + * a test result. + */ + function associateProductVersion(result) { + var verId = (result.selectedVersion ? + result.selectedVersion.id : null); + var testId = result.id; + var url = testapiApiUrl + '/results/' + testId; + ctrl.associateRequest = $http.put(url, {'product_version_id': + verId}) + .success(function (data) { + result.product_version = result.selectedVersion; + if (result.selectedVersion) { + result.product_version.product_info = + result.selectedProduct; + } + result.productEdit = false; + }).error(function (error) { + raiseAlert('danger', error.title, error.detail); + }); + } + + /** + * Get all versions for a product. + */ + function getProductVersions(result) { + if (!result.selectedProduct) { + result.productVersions = []; + result.selectedVersion = null; + return; + } + + var url = testapiApiUrl + '/products/' + + result.selectedProduct.id + '/versions'; + ctrl.getVersionsRequest = $http.get(url) + .success(function (data) { + result.productVersions = data; + + // If the test result isn't already associated to a + // version, default it to the null version. + if (!result.product_version) { + angular.forEach(data, function(ver) { + if (!ver.version) { + result.selectedVersion = ver; + } + }); + } + }).error(function (error) { + raiseAlert('danger', error.title, error.detail); + }); + } + + /** + * Instantiate variables needed for editing product/version + * associations. + */ + function prepVersionEdit(result) { + result.productEdit = true; + if (result.product_version) { + result.selectedProduct = + ctrl.products[result.product_version.product_info.id]; + } + result.selectedVersion = result.product_version; + ctrl.getProductVersions(result); + } + + + + function gotoResultDetail(testId, innerID) { + $state.go('resultsDetail', {'testID': testId, 'innerID': innerID}); + } + + function gotoSUT(testId) { + $state.go('sut', {'testID': testId}); + } + + } +})(); diff --git a/3rd_party/static/testapi-ui/components/sut/sut.html b/3rd_party/static/testapi-ui/components/sut/sut.html new file mode 100644 index 0000000..3426894 --- /dev/null +++ b/3rd_party/static/testapi-ui/components/sut/sut.html @@ -0,0 +1,42 @@ + + + + +
+

Endpoints

+
+ + + + + + + + + + + + + + + + + +
Service NameService TypeURLEnabled
{{ endpoint['Service Name'] }}{{ endpoint['Service Type'] }}{{ endpoint['URL'] }}{{ endpoint['Enabled'] }}
+
+ +

Hosts

+
+
+ + + + + + + +
{{ record[0] }}{{ record[1] }}
+
+
+
diff --git a/3rd_party/static/testapi-ui/components/sut/sutController.js b/3rd_party/static/testapi-ui/components/sut/sutController.js new file mode 100644 index 0000000..3d662ff --- /dev/null +++ b/3rd_party/static/testapi-ui/components/sut/sutController.js @@ -0,0 +1,48 @@ +/* + * 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('SutController', SutController); + + SutController.$inject = [ + '$http', '$stateParams', 'testapiApiUrl' + ]; + + /** + */ + function SutController($http, $stateParams, testapiApiUrl) { + + var ctrl = this; + + function init(){ + ctrl.sutData = {"hardware_info": {}, "endpoint_info": {}}; + ctrl.testID = $stateParams.testID; + ctrl.getSutData(); + } + + ctrl.getSutData = function(){ + $http.get(testapiApiUrl + "/suts/hardware/" + ctrl.testID).then(function(resp){ + ctrl.sutData = resp.data; + }, function(error){ + alert('Error when get SUT data'); + }); + } + + init(); + } +})(); -- cgit 1.2.3-korg