{{!
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
}}

<table id="app-attempt-table" class="table table-striped table-bordered" cellspacing="0" width="100%" height="100%">
  <tbody>
    <tr>
      <td>Application Attempt Id</td>
      <td title="{{attempt.id}}">{{attempt.id}}</td>
    </tr>
    <tr>
      <td>Started Time</td>
      <td>{{attempt.attemptStartedTime}}</td>
    </tr>
    {{#if attempt.validatedFinishedTs}}
    <tr>
      <td>Finished Time</td>
      <td>{{attempt.validatedFinishedTs}}</td>
    </tr>
    {{/if}}
    <tr>
      <td>Elapsed Time</td>
      <td>{{attempt.elapsedTime}}</td>
    </tr>
    <tr>
      <td>AM Container Id</td>
      <td title="{{attempt.appMasterContainerId}}">{{attempt.appMasterContainerId}}</td>
    </tr>
    <tr>
      <td>AM Node Id</td>
      <td title="{{attempt.amNodeId}}">{{attempt.amNodeId}}</td>
    </tr>
    {{#if attempt.attemptState}}
    <tr>
      <td>Attempt State</td>
      <td>{{attempt.attemptState}}</td>
    </tr>
    {{/if}}
    {{#if attempt.nodeHttpAddress}}
    <tr>
      <td>AM Node Web UI</td>
      <td title="{{attempt.nodeHttpAddress}}"><a href="{{prepend-protocol attempt.nodeHttpAddress}}" target="_blank">{{attempt.nodeHttpAddress}}</a></td>
    </tr>
    {{/if}}
    {{#if attempt.logsLink}}
    <tr>
      <td>Log</td>
      <td><a href="{{prepend-protocol attempt.logsLink}}" target="_blank">Link</a></td>
    </tr>
    {{/if}}
  </tbody>
</table>
