{{!
* 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 service-block">
<div class="span6">
{{#if view.service.quickLinks.length}}
{{#view App.QuickViewLinks contentBinding="view.service"}}
<ul class="nav nav-pills move">
  <li class="dropdown">
    <a class="dropdown-toggle" data-toggle="dropdown" href="#">Quick Links<b class="caret"></b></a>
    <ul class="dropdown-menu">
     {{#each view.quickLinks}}
      <a {{bindAttr href="url"}} {{bindAttr target="view.linkTarget"}}>{{label}}</a>
      {{/each}}
    </ul>
  </li>
</ul>
{{/view}}
{{/if}}

<div class="box">
  <div class="box-header">
    <h4>{{controller.content.label}} Summary</h4>
  </div>
  <div class="service-content">
    <table id="summary-info" class="table no-borders table-condensed">
      <tbody>
      {{#unless view.serviceStatus.oozie}}
      {{#unless view.serviceStatus.hive}}
      {{#unless view.serviceStatus.zookeeper}}
      {{#unless view.serviceStatus.hdfs}}
      {{#unless view.serviceStatus.mapreduce}}
      {{#unless view.serviceStatus.hbase}}
      {{#each component in controller.content.components}}
        <tr>
          {{#if component.isMaster}}
            <td class="summary-label">{{component.displayName}}</td>
            <td><a {{action selectHost component.host}} href="javascript:void(null)">{{component.host.publicHostName}}</a></td>
          {{else}}
            <td class="summary-label">{{component.displayName}}s</td>
            <td><a {{action filterHosts component}} href="javascript:void(null)">{{component.displayName}}s</a></td>
          {{/if}}
        </tr>
      {{/each}}
      {{#if view.serviceStatus.ganglia}}
        <tr>
          <td class="summary-label">Ganglia Web UI</td>
          <td><a target=_blank href="http://{{unbound view.gangliaServer}}/ganglia">{{view.gangliaServer}}/ganglia</a></td>
        </tr>
      {{/if}}
      {{#if view.serviceStatus.nagios}}
        <tr>
          <td class="summary-label">Nagios Web UI</td>
          <td><a target=_blank href="http://{{unbound view.nagiosServer}}/nagios">{{view.nagiosServer}}/nagios</a></td>
        </tr>
      {{/if}}
      {{/unless}}
      {{/unless}}
      {{/unless}}
      {{/unless}}
      {{/unless}}
      {{/unless}}
      {{#if view.serviceStatus.hdfs}}
        {{view App.MainDashboardServiceHdfsView showOnlyRows=true serviceBinding="view.service"}}
      {{/if}}
      {{#if view.serviceStatus.mapreduce}}
        {{view App.MainDashboardServiceMapreduceView showOnlyRows=true serviceBinding="view.service"}}
      {{/if}}
      {{#if view.serviceStatus.hbase}}
        {{view App.MainDashboardServiceHbaseView showOnlyRows=true serviceBinding="view.service"}}
      {{/if}}
      {{#if view.serviceStatus.zookeeper}}
        <tr>
          <td class="summary-label">Hosts</td>
          <td>
            {{#each component in controller.content.components}}
              <a {{action selectHost component.host}} href="javascript:void(null)">{{component.host.publicHostName}}</a>
           {{/each}}
          </td>
        </tr>
      {{/if}}
      {{#if view.serviceStatus.oozie}}
        <tr>
          <td class="summary-label">Hosts</td>
          <td>
            {{#each component in controller.content.components}}
              <a {{action selectHost component.host}} href="javascript:void(null)">{{component.host.publicHostName}}</a>
           {{/each}}
          </td>
        </tr>
      {{/if}}
      {{#if view.serviceStatus.hive}}
        <tr>
          <td class="summary-label">Host</td>
          <td>
            {{#each component in controller.content.components}}
              <a {{action selectHost component.host}} href="javascript:void(null)">{{component.host.publicHostName}}</a>
           {{/each}}
          </td>
        </tr>
        <tr>
          <td>Database</td>
          <td>{{view.data.hive.database}}</td>
        </tr>
        <tr>
          <td>Database Name</td>
          <td>{{view.data.hive.databaseName}}</td>
        </tr>
        <tr>
          <td>User</td>
          <td>{{view.data.hive.user}}</td>
        </tr>
      {{/if}}
      </tbody>
    </table>
    {{!view view.moreStatsView}}
  </div>
  {{!
      <div class="box-footer">
      </div>
      }}
</div>
</div>
<div class="span6">
  {{#if view.hasAlertsBox }}
	<div class="box">
		<div class="box-header">
			<h4>Alerts and Health Checks</h4>
			<div class="btn-group">
        <a class="btn" target="_blank" rel="tooltip" title="Go to Nagios" {{bindAttr href="controller.nagiosUrl"}}><i class="icon-link"></i></a>
			</div>
		</div>
		<ul id='summary-alerts-list' class="alerts">
		  {{#if controller.alerts.length}}
				{{#each controller.alerts}}
          {{view view.alertItemView contentBinding="this"}}
				{{/each}}
			{{else}}
		    {{#if controller.isNagiosInstalled}}
			    <div class="alert alert-info">
			      No alerts
			    </div>
			  {{else}}
			    <div class="alert">
			      Nagios service required for viewing alerts
			    </div>
			  {{/if}}
			{{/if}}
		</ul>
	</div>
  {{/if}}
</div>
</div>
{{#if view.serviceMetricGraphs.length}}
<div class="row-fluid">
  <div class="span12">
    <div class="box">
      <div class="box-header">
        <h4>{{controller.content.label}} Metrics</h4>
        <div class="btn-group">
          <a class="btn" target="_blank" rel="tooltip" title="Go to Ganglia" {{bindAttr href="view.gangliaUrl"}}><i class="icon-link"></i></a>
        </div>
      </div>
      
      <div class="summary-metric-graphs row-fluid">
        {{#each graph in view.serviceMetricGraphs}}
          <div class="span3">
            {{view graph}}
          </div> 
        {{/each}}
      </div>
      
    </div>
  </div>
</div>
{{/if}}
