github.com/abayer/test-infra@v0.0.5/mungegithub/submit-queue/www/index.html (about) 1 <!DOCTYPE html> 2 <html lang="en" ng-app="SubmitQueueModule" ng-controller="SQCntl as cntl"> 3 4 <head> 5 <link rel="stylesheet" href="https://cdn.gitcdn.link/cdn/angular/bower-material/v1.0.7/angular-material.min.css" type="text/css"> 6 <link rel="stylesheet" href="md-data-table.min.css" type="text/css"> 7 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=RobotoDraft:300,400,500,700,400italic" type="text/css"> 8 <link rel="stylesheet" href="style.css" type="text/css"> 9 <link rel="shortcut icon" href="https://raw.githubusercontent.com/kubernetes/kubernetes/master/logo/logo.png"> 10 <meta name="viewport" content="initial-scale=1"> 11 12 <title ng-bind-template="{{cntl.metadata.ProjectName}} Submit Queue">Submit Queue</title> 13 14 </head> 15 16 <body> 17 <!-- Indent the whole thing --> 18 <md-content class="md-padding" layout="column"> 19 <!-- Display the white border around the indented portion --> 20 <md-content class="md-whiteframe-z2"> 21 <md-toolbar layout="row" layout-align="space-around center"> 22 <h1 class="md-display-2">{{cntl.metadata.ProjectName}} Submit Queue Status</h1> 23 <a ng-href="https://k8s.io"><img src="https://raw.githubusercontent.com/kubernetes/kubernetes/master/logo/logo.png" alt="kubernetes logo" class="titleLogo"></a> 24 </md-toolbar> 25 <md-content class="md-padding"> 26 <md-tabs md-selected="cntl.selected" md-dynamic-height md-border-bottom> 27 28 <md-tab label="PRs" md-on-select="cntl.selectTab('prs')"> 29 <md-content class="md-whiteframe-z2"> 30 <md-toolbar> 31 <h2 class="md-toolbar-tools">Pull Requests ({{cntl.prsCount}})</h2> 32 </md-toolbar> 33 <form ng-submit="$event.preventDefault()"> 34 <md-autocomplete md-selected-item="cntl.prSelectedItem" md-search-text="cntl.prDisplayValue" md-items="item in cntl.prQuerySearch(cntl.prDisplayValue)" md-item-text="item.display" md-min-length="0" placeholder="Enter username or PR number"> 35 <md-item-template> 36 <span md-highlight-text="cntl.prDisplayValue" md-highlight-flags="^i">{{item.display}}</span> 37 </md-item-template> 38 <md-not-found> 39 No matches found for "{{cntl.prDisplayValue}}". 40 </md-not-found> 41 </md-autocomplete> 42 </form> 43 </md-content> 44 <md-list> 45 <md-list-item class="md-3-line" ng-repeat="pr in cntl.prs | loginOrPR:cntl.prDisplayValue | orderBy:'Number' track by pr.Number"> 46 <a class="md-avatar" ng-href="{{cntl.metadata.RepoPullURL}}{{pr.Login}}"> 47 <img ng-src="{{pr.AvatarURL}}" alt="{{pr.Login}}"> 48 </a> 49 <md-content class="md-list-item-text" layout="column"> 50 <h3 class="md-body-1"> 51 <a ng-href="{{pr.URL}}">#{{pr.Number}}: {{pr.Title}}</a> 52 </h3> 53 <h4 class="md-body-2">{{pr.Reason}}</h4> 54 <p>{{pr.Time | date:'medium'}} (<span style="color: green">+{{pr.Additions}}</span>/<span style="color: red">-{{pr.Deletions}}</span>)</p> 55 </md-content> 56 <md-divider md-inset ng-if="!$last"></md-divider> 57 </md-list-item> 58 </md-list> 59 </md-tab> 60 61 <md-tab label="Queue" md-on-select="cntl.selectTab('queue')"> 62 <md-content class="md-whiteframe-z2"> 63 <md-toolbar class="md-whiteframe-z2"> 64 <h2 class="md-toolbar-tools">Queued For Retest And Merge ({{cntl.e2equeue.length}})</h2> 65 </md-toolbar> 66 <md-subheader class="md-primary">Estimated Merging {{cntl.sqStats.MergeRate}} PRs per day.</md-subheader> 67 </md-content> 68 <md-divider></md-divider> 69 <section> 70 <md-subheader class="md-primary">CURRENTLY RUNNING</md-subheader> 71 <md-list layout-padding> 72 <md-list-item class="md-2-line" ng-repeat="pr in cntl.e2erunning track by pr.Number"> 73 <a class="md-avatar" ng-href="{{cntl.metadata.RepoPullURL}}{{pr.Login}}"> 74 <img ng-src="{{pr.AvatarURL}}" alt="{{pr.Login}}"> 75 </a> 76 <md-content class="md-list-item-text" layout="column"> 77 <h3 class="md-body-1"> 78 <a ng-href="{{pr.URL}}">#{{pr.Number}}: {{pr.Title}}</a> (<span style="color: green">+{{pr.Additions}}</span>/<span style="color: red">-{{pr.Deletions}}</span>) 79 </h3> 80 <h4 class="md-body-2"> 81 {{pr.ExtraInfo}} 82 </h4> 83 </md-content> 84 </md-list-item> 85 </md-list> 86 </section> 87 88 <section ng-if="cntl.batch.Running"> 89 <md-subheader class="md-primary">CURRENTLY RUNNING BATCH</md-subheader> 90 <md-content layout-padding> 91 <div class="md-body-1" layout-padding> 92 <a href="{{ cntl.metadata.ProwURL }}/?type=batch">{{(cntl.batch.Running.refs | refToPRs).join(" ")}}</a> 93 </div> 94 </md-content> 95 </section> 96 97 <section> 98 <md-subheader class="md-primary">QUEUE</md-subheader> 99 <md-list layout-padding> 100 <md-list-item class="md-2-line" ng-repeat="pr in cntl.e2equeue track by pr.Number"> 101 <a class="md-avatar" ng-href="{{cntl.metadata.RepoPullURL}}{{pr.Login}}"> 102 <img ng-src="{{pr.AvatarURL}}" alt="{{pr.Login}}"> 103 </a> 104 <md-content class="md-list-item-text" layout="column"> 105 <h3 class="md-body-1"> 106 <a ng-href="{{pr.URL}}">#{{pr.Number}}: {{pr.Title}}</a> (<span style="color: green">+{{pr.Additions}}</span>/<span style="color: red">-{{pr.Deletions}}</span>) 107 </h3> 108 <h4 class="md-body-2"> 109 {{pr.ExtraInfo}} 110 </h4> 111 </md-content> 112 <md-divider md-inset ng-if="!$last"></md-divider> 113 </md-list-item> 114 </md-list> 115 </section> 116 </md-tab> 117 118 <md-tab label="History" md-on-select="cntl.selectTab('history')"> 119 <md-content class="md-whiteframe-z2"> 120 <md-toolbar> 121 <h2 class="md-toolbar-tools">Historic Merge Bot Decisions</h2> 122 <form ng-submit="$event.preventDefault()"> 123 <md-autocomplete md-selected-item="cntl.historySelectedItem" md-search-text="cntl.historyDisplayValue" md-items="item in cntl.historyQuerySearch(cntl.historyDisplayValue)" md-item-text="item.display" md-min-length="0" placeholder="Enter username or PR number"> 124 <md-item-template> 125 <span md-highlight-text="cntl.historyDisplayValue" md-highlight-flags="^i">{{item.display}}</span> 126 </md-item-template> 127 <md-not-found> 128 No matches found for "{{cntl.historyDisplayValue}}". 129 </md-not-found> 130 </md-autocomplete> 131 </form> 132 </md-toolbar> 133 </md-content> 134 <md-list> 135 <md-list-item class="md-3-line" ng-repeat="pr in cntl.historyPRs | loginOrPR:cntl.historyDisplayValue | orderBy: '-Time' track by pr.Time"> 136 <a class="md-avatar" ng-href="{{cntl.metadata.RepoPullURL}}{{pr.Login}}"> 137 <img ng-src="{{pr.AvatarURL}}" alt="{{pr.Login}}"> 138 </a> 139 <md-content class="md-list-item-text" layout="column"> 140 <h3 class="md-body-1"> 141 <a ng-href="{{pr.URL}}">#{{pr.Number}}: {{pr.Title}}</a> 142 </h3> 143 <h4 class="md-body-2">{{pr.Reason}}</h4> 144 <p class="md-body-3">{{pr.Time | date:'medium'}}</p> 145 </md-content> 146 <md-divider md-inset ng-if="!$last"></md-divider> 147 </md-list-item> 148 </md-list> 149 </md-tab> 150 151 <md-tab md-on-select="cntl.selectTab('ci')"> 152 <md-tab-label> 153 <span ng-class="">CI</span> 154 </md-tab-label> 155 <md-tab-body> 156 <md-toolbar class="md-whiteframe-z2"> 157 <h2 class="md-toolbar-tools">Presubmit Results</h2> 158 </md-toolbar> 159 <h2 class="md-title" ng-show="cntl.ciStatus.batch$requiredretest.length > 0">Batch Builds</h2> 160 <md-chips ng-model="cntl.ciStatus.batch$requiredretest" readonly="true"> 161 <md-chip-template title="{{$chip.msg}}"> 162 <span style="color: {{$chip.color}}">{{$chip.state}}</span> <a ng-href="{{$chip.url}}">{{$chip.name}}</a> 163 </md-chip-template> 164 </md-chips> 165 <h2 class="md-title" ng-show="cntl.ciStatus.presubmit$single.length > 0">Single Builds</h2> 166 <md-chips ng-model="cntl.ciStatus.presubmit$single" readonly="true"> 167 <md-chip-template title="{{$chip.msg}}"> 168 <span style="color: {{$chip.color}}">{{$chip.state}}</span> <a ng-href="{{$chip.url}}">{{$chip.name}}</a> 169 </md-chip-template> 170 </md-chips> 171 <br> 172 <md-toolbar class="md-whiteframe-z2"> 173 <h2 class="md-toolbar-tools">End-to-End Results</h2> 174 </md-toolbar> 175 <h2 class="md-title" ng-show="cntl.ciStatus.nonblocking.length > 0">Non-Queue-Blocking Builds</h2> 176 <md-chips ng-model="cntl.ciStatus.nonblocking" readonly="true"> 177 <md-chip-template title="{{$chip.msg}}"> 178 <span style="color: {{$chip.color}}">{{$chip.state}}</span> <a ng-href="{{$chip.url}}">{{$chip.name}}</a> 179 </md-chip-template> 180 </md-chips> 181 <br> 182 <br> 183 <p>Health percents are the fraction of the time that a given job is stable for the last day, or since the submit queue restarted ({{ cntl.sqStats.StartTime | date:'medium'}})</span>, whichever is shorter. 184 </p> 185 <p> 186 <img ng-src="{{cntl.metadata.ChartURL}}" style="max-width: 100%"/> 187 </p> 188 </md-tab-body> 189 </md-tab> 190 191 <md-tab label="Info" md-on-select="cntl.selectTab('info')"> 192 <md-content class="md-padding"> 193 <md-tabs md-dynamic-height md-border-bottom> 194 195 <md-tab label="Queue Order"> 196 <md-toolbar class="md-whiteframe-z2"> 197 <h2 class="md-toolbar-tools">How PRs get ordered in the queue</h2> 198 </md-toolbar> 199 <md-content class="md-padding"> 200 <span id="priority-info"></span> 201 </md-content> 202 </md-tab> 203 204 <md-tab label="Merge Requirements"> 205 <md-toolbar class="md-whiteframe-z2"> 206 <h2 class="md-toolbar-tools">Requirements for a PR to get automatically merged </h2> 207 </md-toolbar> 208 <md-content class="md-padding"> 209 <span id="merge-info"></span> 210 </md-content> 211 </md-tab> 212 213 <md-tab label="Bot Stats"> 214 <md-content class="md-whiteframe-z2"> 215 <md-toolbar> 216 <h2 class="md-toolbar-tools">Statistics About the Bot</h2> 217 </md-toolbar> 218 </md-content> 219 <br> 220 <h3 class=md-title>Bot Started: {{ cntl.sqStats.StartTime | date:'medium' }}</h3> 221 <h3 class=md-title>Next Sync Loop: {{ cntl.botStats.NextLoopTime | date:'medium' }}</h3> 222 <h3 class=md-title>API Calls Per Second: {{ cntl.botStats.APIPerSec }}</h3> 223 <h3 class=md-title>Github Rate Limit Count: {{ cntl.botStats.LimitRemaining }}</h3> 224 <h3 class=md-title>Github Rate Limit Next Reset: {{ cntl.botStats.LimitResetTime | date:'medium' }}</h3> 225 <h3 class=md-title>Retests avoided because of e2e test flakes: {{ cntl.sqStats.RetestsAvoided }}</h3> 226 <h3 class=md-title>Flakes ignored: {{ cntl.sqStats.FlakesIgnored }}</h3> 227 <md-content class="md-whiteframe-z2"> 228 <md-data-table-container> 229 <md-data-table-toolbar> 230 <h2 class="md-title">API Calls During Last Loop</h2> 231 </md-data-table-toolbar> 232 <table md-data-table class="md-primary"> 233 <thead md-order="cntl.StatOrder"> 234 <tr> 235 <th order-by="$key" name="Call"></th> 236 <th order-by="Count" name="Count ({{ cntl.botStats.APICount }})" numeric descend-first></th> 237 <th order-by="CachedCount" name="Cached Count ({{ cntl.botStats.CachedAPICount }})" numeric descend-first></th> 238 <th order-by="UncachedCount" name="Uncached Count ({{ cntl.botStats.UncachedAPICount }})" numeric descend-first></th> 239 </tr> 240 </thead> 241 <tbody> 242 <tr ng-repeat="stat in cntl.botStats.Analytics | toArray | orderBy: cntl.StatOrder track by stat.$key"> 243 <td>{{stat.$key}}</td> 244 <td>{{stat.Count}}</td> 245 <td>{{stat.CachedCount}}</td> 246 <td>{{stat.UncachedCount}}</td> 247 </tr> 248 </tbody> 249 </table> 250 </md-data-table-container> 251 </md-content> 252 </md-tab> 253 254 <md-tab label="Health"> 255 <md-toolbar class="md-whiteframe-z2"> 256 <h2 class="md-toolbar-tools">Health chart for the past week</h2> 257 </md-toolbar> 258 <md-content class="md-padding"> 259 <span><img ng-src="{{cntl.metadata.ChartURL}}" style="max-width: 100%"/></span> 260 </md-content> 261 </md-tab> 262 263 <md-tab label="Bot Commands"> 264 <md-toolbar class="md-whiteframe-z2"> 265 <h2 class="md-toolbar-tools">Communicating with the Bot</h2> 266 </md-toolbar> 267 <md-content class="md-padding"> 268 <span> 269 Authors, reviewers, and owners can communicate with <code>k8s-ci-robot</code> by commenting on a PR with the 270 various commands entered in comments.<br/>Specific syntax is available 271 <a href="https://go.k8s.io/bot-commands">here</a>. 272 </span> 273 </md-content> 274 </md-tab> 275 </md-tabs> 276 </md-content> 277 </md-tab> 278 279 </md-tabs> 280 </md-content> 281 </md-content> 282 </md-content> 283 <!-- Angular Material Dependencies --> 284 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js" type="text/javascript"></script> 285 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-animate.min.js" type="text/javascript"></script> 286 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-aria.min.js" type="text/javascript"></script> 287 <!-- 288 Local copy of angular-material.js with the fix in https://github.com/angular/material/issues/5681 applied. 289 This makes rendering the PR tab ~2X faster. 290 --> 291 <script src="angular-material.js" type="text/javascript"></script> 292 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.min.js" type="text/javascript"></script> 293 <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-moment/1.0.0-beta.5/angular-moment.min.js" type="text/javascript"></script> 294 <script src="md-data-table.min.js" type="text/javascript"></script> 295 <script src="toArrayFilter.js" type="text/javascript"></script> 296 <script src="script.js" type="text/javascript"></script> 297 </body> 298 299 </html>