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>