summaryrefslogtreecommitdiffstats
path: root/testapi/opnfv_testapi/ui/components/results-report/resultsReport.html
diff options
context:
space:
mode:
Diffstat (limited to 'testapi/opnfv_testapi/ui/components/results-report/resultsReport.html')
-rw-r--r--testapi/opnfv_testapi/ui/components/results-report/resultsReport.html185
1 files changed, 185 insertions, 0 deletions
diff --git a/testapi/opnfv_testapi/ui/components/results-report/resultsReport.html b/testapi/opnfv_testapi/ui/components/results-report/resultsReport.html
new file mode 100644
index 0000000..5527121
--- /dev/null
+++ b/testapi/opnfv_testapi/ui/components/results-report/resultsReport.html
@@ -0,0 +1,185 @@
+<h3>Test Run Results</h3>
+
+<div ng-show="ctrl.resultsData" class="container-fluid">
+ <div class="row">
+ <div class="pull-left">
+ <div class="test-report">
+ <strong>Test ID:</strong> {{ctrl.testId}}<br />
+ <div ng-if="ctrl.isResultAdmin()"><strong>Cloud ID:</strong> {{ctrl.resultsData.cpid}}<br /></div>
+ <strong>Upload Date:</strong> {{ctrl.resultsData.created_at}} UTC<br />
+ <strong>Duration:</strong> {{ctrl.resultsData.duration_seconds}} seconds<br />
+ <strong>Total Number of Passed Tests:</strong>
+ <a title="See all passed tests" ng-click="ctrl.openFullTestListModal()">
+ {{ctrl.resultsData.results.length}}
+ </a>
+ </div>
+ <hr>
+ <div ng-show="ctrl.isResultAdmin()">
+ <strong>Publicly Shared:</strong>
+ <span ng-if="ctrl.resultsData.meta.shared">Yes</span>
+ <span ng-if="!ctrl.resultsData.meta.shared">No</span>
+ <br />
+ </div>
+ <div ng-show="ctrl.resultsData.product_version">
+ <strong>Product:</strong>
+ {{ctrl.resultsData.product_version.product_info.name}}
+ <span ng-if="ctrl.resultsData.product_version.version">
+ ({{ctrl.resultsData.product_version.version}})
+ </span><br />
+ </div>
+ <div ng-show="ctrl.resultsData.meta.guideline">
+ <strong>Associated Guideline:</strong>
+ {{ctrl.resultsData.meta.guideline.slice(0, -5)}}
+ </div>
+ <div ng-show="ctrl.resultsData.meta.target">
+ <strong>Associated Target Program:</strong>
+ {{ctrl.targetMappings[ctrl.resultsData.meta.target]}}
+ </div>
+ <div ng-show="ctrl.resultsData.verification_status">
+ <strong>Verified:</strong>
+ <span class="yes">YES</span>
+ </div>
+ <hr>
+ </div>
+
+ <div class="pull-right">
+ <div ng-show="ctrl.isResultAdmin() && !ctrl.resultsData.verification_status">
+ <button class="btn btn-info" ng-click="ctrl.openEditTestModal()">Edit</button>
+ <button type="button" class="btn btn-danger" ng-click="ctrl.deleteTestRun()" confirm="Are you sure you want to delete these test run results?">Delete</button>
+ </div>
+ <div ng-show="ctrl.resultsData.user_role === 'foundation'">
+ <hr>
+ <div class="checkbox checkbox-verified">
+ <label><input type="checkbox"
+ ng-model="ctrl.isVerified"
+ ng-change="ctrl.updateVerificationStatus()"
+ ng-true-value="1"
+ ng-false-value="0">
+ <strong>Verified</strong>
+ </label>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div ng-show="ctrl.resultsData">
+ <p>See how these results stack up against Interop Working Group capabilities and OpenStack
+ <a target="_blank" href="http://www.openstack.org/brand/interop/">target marketing programs.</a>
+ </p>
+
+ <!-- User Options -->
+ <div class="row">
+ <div class="col-md-3">
+ <strong>Guideline Version:</strong>
+ <!-- Slicing the version file name here gets rid of the '.json' file extension -->
+ <select ng-model="ctrl.version"
+ ng-change="ctrl.updateGuidelines()"
+ class="form-control"
+ ng-options="versionFile.slice(0,-5) for versionFile in ctrl.versionList">
+ </select>
+ </div>
+ <div class="col-md-4">
+ <strong>Target Program:</strong>
+ <select ng-model="ctrl.target" class="form-control" ng-change="ctrl.buildCapabilitiesObject()">
+ <option value="platform">OpenStack Powered Platform</option>
+ <option value="compute">OpenStack Powered Compute</option>
+ <option value="object">OpenStack Powered Object Storage</option>
+ </select>
+ </div>
+ </div>
+ <!-- End User Options -->
+
+ <br />
+ <div ng-if="ctrl.guidelineData">
+ <strong>Guideline Status:</strong>
+ {{ctrl.guidelineData.status | capitalize}}
+ </div>
+
+ <strong>Corresponding OpenStack Releases:</strong>
+ <ul class="list-inline">
+ <li ng-repeat="release in ctrl.guidelineData.releases">
+ {{release | capitalize}}
+ </li>
+ </ul>
+ <hr >
+
+ <div ng-show="ctrl.guidelineData">
+ <strong>Status:</strong>
+ <p>This cloud passes <strong>{{ctrl.requiredPassPercent | number:1}}% </strong>
+ ({{ctrl.caps.required.passedCount}}/{{ctrl.caps.required.count}})
+ of the tests in the <strong>{{ctrl.version.slice(0, -5)}}</strong> <em>required</em> capabilities for the
+ <strong>{{ctrl.targetMappings[target]}}</strong> program. <br />
+ Excluding flagged tests, this cloud passes
+ <strong>{{ctrl.nonFlagRequiredPassPercent | number:1}}%</strong>
+ ({{ctrl.nonFlagPassCount}}/{{ctrl.totalNonFlagCount}})
+ of the <em>required</em> tests.
+ </p>
+
+ <p>Compliance with <strong>{{ctrl.version.slice(0, -5)}}</strong>:
+ <strong>
+ <span ng-if="ctrl.nonFlagPassCount === ctrl.totalNonFlagCount" class="yes">YES</span>
+ <span ng-if="ctrl.nonFlagPassCount !== ctrl.totalNonFlagCount" class="no">NO</span>
+ </strong>
+ </p>
+
+ <hr>
+ <h4>Capability Overview</h4>
+
+ Test Filters:<br />
+ <div class="btn-group button-margin" data-toggle="buttons">
+ <label class="btn btn-default" ng-class="{'active': ctrl.testStatus === 'total'}">
+ <input type="radio" ng-model="ctrl.testStatus" value="total">
+ <span class="text-primary">All</span>
+ </label>
+ <label class="btn btn-default" ng-class="{'active': ctrl.testStatus === 'passed'}">
+ <input type="radio" ng-model="ctrl.testStatus" value="passed">
+ <span class="text-success">Passed</span>
+ </label>
+ <label class="btn btn-default" ng-class="{'active': ctrl.testStatus === 'not passed'}">
+ <input type="radio" ng-model="ctrl.testStatus" value="not passed">
+ <span class="text-danger">Not Passed</span>
+ </label>
+ <label class="btn btn-default" ng-class="{'active': ctrl.testStatus === 'flagged'}">
+ <input type="radio" ng-model="ctrl.testStatus" value="flagged">
+ <span class="text-warning">Flagged</span>
+ </label>
+ </div>
+
+ <uib-accordion close-others=false>
+ <!-- The ng-repeat is used to pass in a local variable to the template. -->
+ <ng-include
+ ng-repeat="status in ['required']"
+ src="ctrl.detailsTemplate"
+ onload="isOpen = true">
+ </ng-include>
+ <br />
+ <ng-include
+ ng-repeat="status in ['advisory']"
+ src="ctrl.detailsTemplate">
+ </ng-include>
+ <br />
+ <ng-include
+ ng-repeat="status in ['deprecated']"
+ src="ctrl.detailsTemplate">
+ </ng-include>
+ <br />
+ <ng-include
+ ng-repeat="status in ['removed']"
+ src="ctrl.detailsTemplate">
+ </ng-include>
+ </uib-accordion>
+ </div>
+</div>
+
+<div class="loading">
+ <div cg-busy="{promise:versionsRequest,message:'Loading versions'}"></div>
+ <div cg-busy="{promise:capsRequest,message:'Loading capabilities'}"></div>
+ <div cg-busy="{promise:resultsRequest,message:'Loading results'}"></div>
+</div>
+
+<div ng-show="ctrl.showError" class="alert alert-danger" role="alert">
+ <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
+ <span class="sr-only">Error:</span>
+ {{ctrl.error}}
+</div>