<!--
  Copyright 2019 The Go Authors. All rights reserved.
  Use of this source code is governed by a BSD-style
  license that can be found in the LICENSE file.
-->

<!DOCTYPE html>
<html lang="en">
<meta charset="utf-8">
<link href="/static/worker/worker.css" rel="stylesheet">
<title>{{.Env}} Worker</title>

<body>
  <h1>{{.Env}} Worker</h1>
  <p>All times in America/New_York.</p>

  <p>
    <a href="/">
      Home
    </a> |
    <a href="/versions">
      Recent Versions
    </a> |
    <a href="https://cloud.google.com/console/cloudtasks/queue/{{.LocationID}}/{{.ResourcePrefix}}fetch-tasks?project={{.Config.ProjectID}}"
    target="_blank" rel="noreferrer">
     Task Queue
    </a> |
    <a href="https://cloud.google.com/console/cloudscheduler?project={{.Config.ProjectID}}"
    target="_blank" rel="noreferrer">
     Scheduler
    </a> |
    <a href="{{.LogsURL}}"
    target="_blank" rel="noreferrer">
     Logs
    </a>
  </p>

  <div>
    <form action="/poll" method="post" name="pollForm">
      <button title="Poll the module index for up to 2000 new versions."
        onclick="submitForm('pollForm', false); return false">Poll Module Index</button>
      <input type="number" name="limit" value="10"></input>
      <output name="result"></output>
    </form>
    <form action="/enqueue" method="post" name="enqueueForm">
      <button title="Query the discovery database for new or failed versions, and enqueue them for processing."
        onclick="submitForm('enqueueForm', true); return false">Enqueue New and Failed Versions</button>
      <input type="number" name="limit" value="10">
      <output name="result"></output>
    </form>
    <form action="/reprocess" method="post" name="reprocessForm">
      <button title="Mark all versions created before the specified app_version to be reprocessed."
        onclick="submitForm('reprocessForm', true); return false">Reprocess Versions</button>
      <input type="text" name="app_version">
      <output name="result"></output>
    </form>
    <form action="/populate-stdlib" method="post" name="populateStdlibForm">
      <button title="Populates the database with all supported versions of the Go standard library."
        onclick="submitForm('populateStdlibForm', false); return false">Populate Standard Library</button>
      <output name="result"></output>
    </form>
    <form action="/clear-cache" method="get" name="clearCacheForm">
      <button title="Clears the Redis cache."
        onclick="submitForm('clearCacheForm', false); return false">Clear Cache</button>
      <output name="result"></output>
    </form>
  </div>

  <div>
    <h3>Config</h3>
    <table>
      <tr><td>App Version</td><td>{{.Config.VersionID}}</td></tr>
      <tr><td>Zone</td><td>{{.Config.ZoneID}}</td></tr>
      <tr><td>DB Host</td><td>{{.Config.DBHost}}</td></tr>
      <tr><td>Redis Cache Host</td><td>{{.Config.RedisCacheHost}}</td></tr>
      <tr><td>Hostname (Pod)</td><td>{{.Hostname}}</td></tr>
      <tr><td>Age</td><td>{{timeSince .StartTime}}</td></tr>
    </table>
  </div>

  <div class="Experiments">
    <h3>Experiments</h3>
    {{if .Experiments}}
      <table>
        <thead>
          <tr>
            <th>Name</th>
            <th>Description</th>
            <th>Rollout</th>
          </tr>
        </thead>
        <tbody>
        {{range .Experiments}}
            <tr>
              <td>{{.Name}}</td>
              <td>{{.Description}}</td>
              <td>{{.Rollout}}</td>
            </tr>
        {{end}}
        </tbody>
      </table>
      <p>To update experiments, modify the {{.Env}}-config.yaml file and deploy with
        the <code>-config-only</code> flag.</p>
    {{else}}
      <p>No experiments.</p>
    {{end}}
    <iframe class="Experiments-updateResult" name="experimentUpdateResult" id="experimentUpdateResult"></iframe>
  </div>

  <div>
    <h3>Memory (all values in Mi)</h3>
    <table>
      <tr>
        <td>Go Heap</td>
        <td>
          {{.GoMemStats.HeapAlloc | bytesToMi}} Alloc /
          {{.GoMemStats.HeapInuse | bytesToMi}} In Use /
          {{.GoMemStats.HeapIdle | bytesToMi}} Idle /
          {{.GoMemStats.HeapReleased | bytesToMi}} Released
        </td>
      </tr>
      <tr>
        <td>Container</td>
        <td>
          {{index .CgroupStats "limit" | bytesToMi}} Limit /
          {{index .CgroupStats "trueRSS" | bytesToMi}} RSS /
          {{index .CgroupStats "usage" | bytesToMi}} Used /
          {{index .CgroupStats "workingSet" | bytesToMi}} Working Set
        </td>
      </tr>
    </table>
  </div>

  <div>
    <h3>Load Shedding</h3>
    <table>
      <tr><td>Fetches In Flight</td><td>{{.LoadShedStats.RequestsInFlight}}</td></tr>
      <tr>
        <td>Zip Bytes In Flight</td>
        <td>{{.LoadShedStats.SizeInFlight | bytesToMi}} /
          {{.LoadShedStats.MaxSizeInFlight | bytesToMi}} Mi
          ({{pct .LoadShedStats.SizeInFlight .LoadShedStats.MaxSizeInFlight}}%) </td>
      </tr>
      {{with .DBInfo}}
        <tr>
          <td>DB Processes (waiting/total)</td>
          <td>{{.NumWaiting}} / {{.NumTotal}}</td>
        </tr>
      {{end}}
      <tr>
        <td>Shedded Requests</td>
        <td>{{.LoadShedStats.RequestsShed}} / {{.LoadShedStats.RequestsTotal}}
          ({{pct .LoadShedStats.RequestsShed .LoadShedStats.RequestsTotal}}%)</td>
      </tr>
    </table>
  </div>

  <div>
    <h3>Fetches In Flight</h3>
    <table>
      <thead>
        <tr>
          <th>Path</th>
          <th>Version</th>
          <th>Zip Size (Mi)</th>
          <th>Age</th>
        </tr>
      </thead>
      <tbody>
        {{range .Fetches}}
          {{if eq .Status 0}}
            <tr>
              <td>{{.ModulePath}}</td>
              <td>{{.Version}}</td>
              <td>{{.ZipSize | bytesToMi}}</td>
              <td>{{timeSince .Start}}</td>
            </tr>
          {{end}}
        {{end}}
      </tbody>
    </table>
  </div>

  <div>
    <h3>Excluded Prefixes</h3>
    {{if .Excluded}}
      <table>
        <thead>
          <tr><th>Prefix</th></tr>
        </thead>
        <tbody>
        {{range .Excluded}}
          <tr><td>{{.}}</td></tr>
        {{end}}
        </tbody>
      </table>
    {{else}}
      <p>No excluded prefixes.</p>
    {{end}}
  </div>
</body>

<script>
  function loadScript(src) {
      let s = document.createElement("script");
      s.src = src;
      document.head.appendChild(s);
  }
  loadScript("/static/worker/worker.js");
</script>
