{{!
* 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.
}}

<div class="row-fluid host-block">
  <div class="span12">
    <div class="span6">
      {{!components}}
      <div class="box">
        <div class="box-header">
          <h4>{{t common.components}}</h4>
        </div>
        <div class="host-components">
        {{#if view.sortedComponents.length}}

          {{#if view.needToRestartComponentsCount}}
              <div class="alert alert-warning clearfix">
                <i class="icon-refresh"></i> {{view.needToRestartMessage}}
                <br/>
                <button {{bindAttr class=":btn :restart-components :pull-left view.stopComponentsIsDisabled::btn-danger view.stopComponentsIsDisabled:disabled" }} {{action restartComponents view.isStopCommand target="controller"}}>
                  {{t hosts.host.details.needToRestart.stopButton}}
                </button>
                 <span class="restart-components  pull-left">&nbsp</span>
                 <button {{bindAttr class=":btn :restart-components :pull-left view.startComponentsIsDisabled::btn-success view.startComponentsIsDisabled:disabled" }} {{action restartComponents target="controller"}}>
                  {{t hosts.host.details.needToRestart.startButton}}
                 </button>
              </div>
          {{/if}}

          {{#each component in view.sortedComponents}}
          <div class="row-fluid">
          {{#view view.ComponentView contentBinding="component" decommissionDataNodeHostNamesBinding="view.decommissionDataNodeHostNames"}}
            <div class="span7">
              {{#if view.isUpgradeFailed}}
                {{#if App.isAdmin}}
                  <a href="#" {{action "upgradeComponent" view.content target="controller"}} >
                    <i title="Component upgrade failed" class="components-health icon-arrow-up"></i>
                  </a>
                {{/if}}
              {{else}}
                <span {{bindAttr class="view.statusClass :components-health"}}></span>&nbsp;
              {{/if}}
                {{#if component.displayNameAdvanced}}
                  {{component.displayNameAdvanced}}
                {{else}}
                  {{component.displayName}}
                {{/if}}
                &nbsp;/&nbsp;
              <a href="#" {{action routeToService component.service target="controller"  }}>{{component.service.displayName}}</a>
                &nbsp;
              {{#if component.staleConfigs}}
                <i class="text-warning icon-refresh"></i>
              {{/if}}
            </div>
            <div class="span5 pull-right">
              {{#if App.isAdmin}}
              <div class="btn-group pull-right">
                <a {{ bindAttr class="view.disabled :btn :dropdown-toggle"}} data-toggle="dropdown">
                  {{t hosts.host.summary.action}}
                  <span class="caret pull-right"></span>
                </a>
                <ul class="dropdown-menu">
                  <li>
                    <div class="component-text-status">
                      {{view.componentTextStatus}}
                    </div>
                  </li>
                  {{#if view.isDataNode}}
                    {{#if view.isDataNodeDecommissionAvailable}}
                      <li {{bindAttr class="view.noActionAvailable"}}>
                        <a href="javascript:void(null)" data-toggle="modal" {{action "decommission" view.content target="controller"}}>
                          {{t common.decommission}}
                        </a>
                      </li>
                    {{/if}}
                    {{#if view.isDataNodeRecommissionAvailable}}
                      <li {{bindAttr class="view.noActionAvailable"}}>
                        <a href="javascript:void(null)" data-toggle="modal" {{action "recommission" view.content target="controller"}}>
                          {{t common.recommission}}
                        </a>
                      </li>
                    {{/if}}
                  {{/if}}
                  {{#if view.isHBaseMaster}}
                    <li {{bindAttr class="view.isDeleteHBaseMasterDisabled:disabled"}}>
                      <a href="javascript:void(null)" data-toggle="modal" {{action "deleteComponent" view.content target="controller"}}>
                        {{t common.delete}}
                      </a>
                    </li>
                  {{/if}}
                  {{#unless view.isInstalling}}
                    {{#if view.isStart}}
                      <li {{bindAttr class=" view.isDecommissioning:hidden view.noActionAvailable"}}>
                        <a href="javascript:void(null)" data-toggle="modal" {{action "stopComponent" view.content target="controller"}}>
                          {{t common.stop}}
                        </a>
                      </li>
                    {{/if}}
                    {{#unless view.isStart}}
                      <li {{bindAttr class="view.isUpgradeFailed:hidden view.isInstallFailed:hidden view.isDecommissioning:hidden view.noActionAvailable"}}>
                        <a href="javascript:void(null)" data-toggle="modal" {{action "startComponent" view.content target="controller"}}>
                          {{t common.start}}
                        </a>
                      </li>
                    {{/unless}}
                    {{#if view.isUpgradeFailed}}
                      <li {{bindAttr class="view.noActionAvailable"}}>
                        <a href="javascript:void(null)" data-toggle="modal" {{action "upgradeComponent" view.content target="controller"}}>
                          {{t common.reUpgrade}}
                        </a>
                      </li>
                    {{/if}}
                    {{#if view.isInstallFailed}}
                      <li {{bindAttr class="view.noActionAvailable"}}>
                        <a href="javascript:void(null)" data-toggle="modal" {{action "installComponent" view.content target="controller"}}>
                          {{t common.reinstall}}
                        </a>
                      </li>
                    {{/if}}
                    {{#if view.isReassignable}}
                      <li {{bindAttr class="view.noActionAvailable"}}>
                        <a href="javascript:void(null)" data-toggle="modal" {{action "moveComponent" view.content target="controller"}}>
                          {{t common.move}}
                        </a>
                      </li>
                    {{/if}}
                  {{/unless}}
                </ul>
              </div>
              {{/if}}
            </div>
          {{/view}}
          </div>
          {{/each}}
        {{/if}}
          {{!clients and add component button}}
          <div class="clients row-fluid">
            <div class="span7 row">
              {{#if view.clients.length}}
                  <div class="span3 align-right">{{t common.clients}}&nbsp;/</div>
                  <div class="span7">
                    {{#each component in view.clients}}
                      {{component.displayName}}{{#if component.staleConfigs}} <i class="text-warning icon-refresh"></i>{{/if}}{{#unless component.isLast}},{{/unless}}
                    {{/each}}
                </div>
              {{/if}}
            </div>
            <div class="span5 row">
              {{#if App.isAdmin}}
                <div class="btn-group pull-right">
                  <button id="add_component" data-toggle="dropdown" {{bindAttr class="view.addComponentDisabled:disabled :btn :btn-info :dropdown-toggle"}}>
                    {{t hosts.host.summary.addComponent}}
                    <span class="caret pull-right"></span>
                  </button>
                  <ul class="dropdown-menu">
                    {{#each component in view.addableComponents}}
                      <li>
                        <a href="javascript:void(null)" data-toggle="modal" {{action addComponent component target="controller"}}>
                          {{component.displayName}}
                        </a>
                      </li>
                    {{/each}}
                  </ul>
                </div>
              {{/if}}
            </div>
          </div>
        </div>
      </div>
      <div class="host-configuration">
            <div class="box">
                <div class="box-header">
                    <h4>{{t hosts.host.summary.header}}</h4>
                </div>
                <div class="host-summary-content">
                    <dl class="dl-horizontal">
                        <dt>{{t hosts.host.summary.hostname}}:</dt><dd>&nbsp;{{view.content.publicHostName}}</dd>
                        <dt>{{t common.ipAddress}}:</dt><dd>&nbsp;{{view.content.ip}}</dd>
                        <dt>{{t common.os}}:</dt><dd>&nbsp;{{view.content.osType}}&nbsp;({{view.content.osArch}})</dd>
                        <dt>{{t common.cpu}}:</dt><dd>&nbsp;{{view.content.cpu}}</dd>
                        <dt>{{t common.disk}}:</dt><dd>&nbsp;{{view.content.diskInfoBar}}</dd>
                        <dt>{{t common.memory}}:</dt><dd>&nbsp;{{view.content.memoryFormatted}}</dd>
                        <dt>{{t common.loadAvg}}:</dt><dd>&nbsp;{{view.content.loadAvg}}</dd>
                        <dt>{{t hosts.host.summary.agentHeartbeat}}:</dt><dd>{{view.timeSinceHeartBeat}}</dd>
                    </dl>
                </div>
            </div>
        </div>
    </div>
  {{!metrics}}
   <div class="span6">
      <div class="box">
        <div class="box-header">
          <h4>{{t hosts.host.summary.hostMetrics}}</h4>
          <div class="btn-group">
            <a class="btn" rel="tooltip" title="Go to Ganglia" {{action "showGangliaCharts" target="view"}}><i class="icon-link"></i></a>
          </div>
        </div>
        <div>
         {{view App.MainHostMetricsView contentBinding="view.content"}}
        </div>
      </div>
    </div>
  </div>
</div>
