1 <h3>Test Run Results</h3>
3 <div ng-show="ctrl.resultsData" class="container-fluid">
5 <div class="pull-left">
6 <div class="test-report">
7 <strong>Test ID:</strong> {{ctrl.testId}}<br />
8 <div ng-if="ctrl.isResultAdmin()"><strong>Cloud ID:</strong> {{ctrl.resultsData.cpid}}<br /></div>
9 <strong>Upload Date:</strong> {{ctrl.resultsData.created_at}} UTC<br />
10 <strong>Duration:</strong> {{ctrl.resultsData.duration_seconds}} seconds<br />
11 <strong>Total Number of Passed Tests:</strong>
12 <a title="See all passed tests" ng-click="ctrl.openFullTestListModal()">
13 {{ctrl.resultsData.results.length}}
17 <div ng-show="ctrl.isResultAdmin()">
18 <strong>Publicly Shared:</strong>
19 <span ng-if="ctrl.resultsData.meta.shared">Yes</span>
20 <span ng-if="!ctrl.resultsData.meta.shared">No</span>
23 <div ng-show="ctrl.resultsData.product_version">
24 <strong>Product:</strong>
25 {{ctrl.resultsData.product_version.product_info.name}}
26 <span ng-if="ctrl.resultsData.product_version.version">
27 ({{ctrl.resultsData.product_version.version}})
30 <div ng-show="ctrl.resultsData.meta.guideline">
31 <strong>Associated Guideline:</strong>
32 {{ctrl.resultsData.meta.guideline.slice(0, -5)}}
34 <div ng-show="ctrl.resultsData.meta.target">
35 <strong>Associated Target Program:</strong>
36 {{ctrl.targetMappings[ctrl.resultsData.meta.target]}}
38 <div ng-show="ctrl.resultsData.verification_status">
39 <strong>Verified:</strong>
40 <span class="yes">YES</span>
45 <div class="pull-right">
46 <div ng-show="ctrl.isResultAdmin() && !ctrl.resultsData.verification_status">
47 <button class="btn btn-info" ng-click="ctrl.openEditTestModal()">Edit</button>
48 <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>
50 <div ng-show="ctrl.resultsData.user_role === 'foundation'">
52 <div class="checkbox checkbox-verified">
53 <label><input type="checkbox"
54 ng-model="ctrl.isVerified"
55 ng-change="ctrl.updateVerificationStatus()"
58 <strong>Verified</strong>
66 <div ng-show="ctrl.resultsData">
67 <p>See how these results stack up against Interop Working Group capabilities and OpenStack
68 <a target="_blank" href="http://www.openstack.org/brand/interop/">target marketing programs.</a>
73 <div class="col-md-3">
74 <strong>Guideline Version:</strong>
75 <!-- Slicing the version file name here gets rid of the '.json' file extension -->
76 <select ng-model="ctrl.version"
77 ng-change="ctrl.updateGuidelines()"
79 ng-options="versionFile.slice(0,-5) for versionFile in ctrl.versionList">
82 <div class="col-md-4">
83 <strong>Target Program:</strong>
84 <select ng-model="ctrl.target" class="form-control" ng-change="ctrl.buildCapabilitiesObject()">
85 <option value="platform">OpenStack Powered Platform</option>
86 <option value="compute">OpenStack Powered Compute</option>
87 <option value="object">OpenStack Powered Object Storage</option>
91 <!-- End User Options -->
94 <div ng-if="ctrl.guidelineData">
95 <strong>Guideline Status:</strong>
96 {{ctrl.guidelineData.status | capitalize}}
99 <strong>Corresponding OpenStack Releases:</strong>
100 <ul class="list-inline">
101 <li ng-repeat="release in ctrl.guidelineData.releases">
102 {{release | capitalize}}
107 <div ng-show="ctrl.guidelineData">
108 <strong>Status:</strong>
109 <p>This cloud passes <strong>{{ctrl.requiredPassPercent | number:1}}% </strong>
110 ({{ctrl.caps.required.passedCount}}/{{ctrl.caps.required.count}})
111 of the tests in the <strong>{{ctrl.version.slice(0, -5)}}</strong> <em>required</em> capabilities for the
112 <strong>{{ctrl.targetMappings[target]}}</strong> program. <br />
113 Excluding flagged tests, this cloud passes
114 <strong>{{ctrl.nonFlagRequiredPassPercent | number:1}}%</strong>
115 ({{ctrl.nonFlagPassCount}}/{{ctrl.totalNonFlagCount}})
116 of the <em>required</em> tests.
119 <p>Compliance with <strong>{{ctrl.version.slice(0, -5)}}</strong>:
121 <span ng-if="ctrl.nonFlagPassCount === ctrl.totalNonFlagCount" class="yes">YES</span>
122 <span ng-if="ctrl.nonFlagPassCount !== ctrl.totalNonFlagCount" class="no">NO</span>
127 <h4>Capability Overview</h4>
130 <div class="btn-group button-margin" data-toggle="buttons">
131 <label class="btn btn-default" ng-class="{'active': ctrl.testStatus === 'total'}">
132 <input type="radio" ng-model="ctrl.testStatus" value="total">
133 <span class="text-primary">All</span>
135 <label class="btn btn-default" ng-class="{'active': ctrl.testStatus === 'passed'}">
136 <input type="radio" ng-model="ctrl.testStatus" value="passed">
137 <span class="text-success">Passed</span>
139 <label class="btn btn-default" ng-class="{'active': ctrl.testStatus === 'not passed'}">
140 <input type="radio" ng-model="ctrl.testStatus" value="not passed">
141 <span class="text-danger">Not Passed</span>
143 <label class="btn btn-default" ng-class="{'active': ctrl.testStatus === 'flagged'}">
144 <input type="radio" ng-model="ctrl.testStatus" value="flagged">
145 <span class="text-warning">Flagged</span>
149 <uib-accordion close-others=false>
150 <!-- The ng-repeat is used to pass in a local variable to the template. -->
152 ng-repeat="status in ['required']"
153 src="ctrl.detailsTemplate"
154 onload="isOpen = true">
158 ng-repeat="status in ['advisory']"
159 src="ctrl.detailsTemplate">
163 ng-repeat="status in ['deprecated']"
164 src="ctrl.detailsTemplate">
168 ng-repeat="status in ['removed']"
169 src="ctrl.detailsTemplate">
175 <div class="loading">
176 <div cg-busy="{promise:versionsRequest,message:'Loading versions'}"></div>
177 <div cg-busy="{promise:capsRequest,message:'Loading capabilities'}"></div>
178 <div cg-busy="{promise:resultsRequest,message:'Loading results'}"></div>
181 <div ng-show="ctrl.showError" class="alert alert-danger" role="alert">
182 <span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
183 <span class="sr-only">Error:</span>