
<!--
Copyright 2017-present Open Networking Foundation

Licensed 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.
-->


 <!--<h1>Dashboard</h1>-->
 <div class="row">
     <div class="col-xs-12">
         <xos-service-graph></xos-service-graph>
     </div>
 </div>
<div class="row">
    <div class="col-xs-12" id="dashboard-component-container"></div>
</div>
<div class="row">
    <div class="col-xs-12">
        <h2>System summary:</h2>
    </div>
    <div class="col-xs-4">
        <div class="panel panel-filled">
            <div class="panel-body text-center">
                <h2 class="m-b-none">
                    {{vm.nodes}}
                    <!--<span class="slight"><i class="fa fa-play fa-rotate-270 text-warning"> </i> +20%</span>-->
                </h2>
                <h4>
                    <a ui-sref="xos.core.nodes">
                        Nodes
                    </a>
                </h4>
                <!--<div class="small">% New Sessions</div>-->
                <!--<div class="slight m-t-sm"><i class="fa fa-clock-o"> </i> Updated: <span class="c-white">10:22pm</span></div>-->
            </div>
        </div>
    </div>

    <div class="col-xs-4">
        <div class="panel panel-filled">
            <div class="panel-body text-center">
                <h2 class="m-b-none">
                    {{vm.slices}}
                </h2>
                <h4>
                    <a ui-sref="xos.core.slices">
                        Slices
                    </a>
                </h4>
            </div>
        </div>
    </div>

    <div class="col-xs-4">
        <div class="panel panel-filled">
            <div class="panel-body text-center">
                <h2 class="m-b-none">
                    {{vm.instances}}
                </h2>
                <h4>
                    <a ui-sref="xos.core.instances">
                        Instances
                    </a>
                </h4>
            </div>
        </div>
    </div>
</div>