flink-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From se...@apache.org
Subject [01/26] flink git commit: [FLINK-2358] [dashboard] Add first stub of angular.js based dashboard.
Date Tue, 21 Jul 2015 19:10:40 GMT
Repository: flink
Updated Branches:
  refs/heads/master 1d373a7de -> 148395bcd


http://git-wip-us.apache.org/repos/asf/flink/blob/d59cebd8/flink-runtime-web/web-dashboard/web/partials/jobs/completed-jobs.html
----------------------------------------------------------------------
diff --git a/flink-runtime-web/web-dashboard/web/partials/jobs/completed-jobs.html b/flink-runtime-web/web-dashboard/web/partials/jobs/completed-jobs.html
new file mode 100644
index 0000000..de0edcc
--- /dev/null
+++ b/flink-runtime-web/web-dashboard/web/partials/jobs/completed-jobs.html
@@ -0,0 +1,35 @@
+
+<nav class="navbar navbar-default navbar-fixed-top navbar-main">
+  <div id="fold-button" ng-click="showSidebar()" class="btn btn-default navbar-btn pull-left"><i
class="fa fa-navicon"></i></div>
+  <div class="navbar-title">Completed Jobs</div>
+</nav>
+<div id="content-inner">
+  <table class="table table-hover table-clickable">
+    <thead>
+      <tr>
+        <th>Start Time</th>
+        <th>End Time</th>
+        <th>Duration</th>
+        <th>Job Name</th>
+        <th>Job ID</th>
+        <th>Tasks</th>
+        <th>Status</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr ng-repeat="job in jobs" ui-sref="single-job.plan({ jobid: job.jid })">
+        <td>{{job['start-time']}}</td>
+        <td>{{job['end-time']}}</td>
+        <td>{{job.duration}}</td>
+        <td>{{job.name}}</td>
+        <td>{{job.jid}}</td>
+        <td class="label-group">
+          <bs-label status="{{status}}" ng-repeat="(status, value) in job.operators">{{value}}</bs-label>
+        </td>
+        <td> 
+          <bs-label status="{{job.state}}">{{job.state}}</bs-label>
+        </td>
+      </tr>
+    </tbody>
+  </table>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flink/blob/d59cebd8/flink-runtime-web/web-dashboard/web/partials/jobs/job.exceptions.html
----------------------------------------------------------------------
diff --git a/flink-runtime-web/web-dashboard/web/partials/jobs/job.exceptions.html b/flink-runtime-web/web-dashboard/web/partials/jobs/job.exceptions.html
new file mode 100644
index 0000000..8fac436
--- /dev/null
+++ b/flink-runtime-web/web-dashboard/web/partials/jobs/job.exceptions.html
@@ -0,0 +1,52 @@
+
+<pre>org.apache.flink.client.program.ProgramInvocationException: The
+program execution failed: java.lang.Exception: The data preparation
+for task 'Reduce (SUM(2))' , caused an error: Error obtaining the
+sorted input: Thread 'SortMerger spilling thread' terminated due to an
+exception: The user-defined combiner failed in its 'open()' method.
+  at org.apache.flink.runtime.operators.RegularPactTask.run(RegularPactTask.java:472)
+  at org.apache.flink.runtime.operators.RegularPactTask.invoke(RegularPactTask.java:360)
+  at org.apache.flink.runtime.execution.RuntimeEnvironment.run(RuntimeEnvironment.java:204)
+  at java.lang.Thread.run(Thread.java:745)
+Caused by: java.lang.RuntimeException: Error obtaining the sorted
+input: Thread 'SortMerger spilling thread' terminated due to an
+exception: The user-defined combiner failed in its 'open()' method.
+  at org.apache.flink.runtime.operators.sort.UnilateralSortMerger.getIterator(UnilateralSortMerger.java:607)
+  at org.apache.flink.runtime.operators.RegularPactTask.getInput(RegularPactTask.java:1133)
+  at org.apache.flink.runtime.operators.GroupReduceDriver.prepare(GroupReduceDriver.java:94)
+  at org.apache.flink.runtime.operators.RegularPactTask.run(RegularPactTask.java:466)
+  ... 3 more
+Caused by: java.io.IOException: Thread 'SortMerger spilling thread'
+terminated due to an exception: The user-defined combiner failed in
+its 'open()' method.
+  at org.apache.flink.runtime.operators.sort.UnilateralSortMerger$ThreadBase.run(UnilateralSortMerger.java:785)
+Caused by: java.io.IOException: The user-defined combiner failed in
+its 'open()' method.
+  at org.apache.flink.runtime.operators.sort.CombiningUnilateralSortMerger$CombiningSpillingThread.go(CombiningUnilateralSortMerger.java:264)
+  at org.apache.flink.runtime.operators.sort.UnilateralSortMerger$ThreadBase.run(UnilateralSortMerger.java:781)
+Caused by: java.lang.IllegalStateException: The runtime context has
+not been initialized.
+  at org.apache.flink.api.common.functions.AbstractRichFunction.getRuntimeContext(AbstractRichFunction.java:49)
+  at org.apache.flink.api.scala.operators.ScalaAggregateOperator$AggregatingUdf.open(ScalaAggregateOperator.java:261)
+  at org.apache.flink.api.common.functions.util.FunctionUtils.openFunction(FunctionUtils.java:33)
+  at org.apache.flink.runtime.operators.sort.CombiningUnilateralSortMerger$CombiningSpillingThread.go(CombiningUnilateralSortMerger.java:261)
+  ... 1 more
+ 
+  at org.apache.flink.client.program.Client.run(Client.java:345)
+  at org.apache.flink.client.program.Client.run(Client.java:304)
+  at org.apache.flink.client.program.Client.run(Client.java:298)
+  at org.apache.flink.client.program.ContextEnvironment.execute(ContextEnvironment.java:55)
+  at org.apache.flink.api.scala.ExecutionEnvironment.execute(ExecutionEnvironment.scala:530)
+  at com.gmp.MyJob$.main(MyJob.scala:33)
+  at com.gmp.MyJob.main(MyJob.scala)
+  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+  at java.lang.reflect.Method.invoke(Method.java:483)
+  at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:437)
+  at org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:353)
+  at org.apache.flink.client.program.Client.run(Client.java:250)
+  at org.apache.flink.client.CliFrontend.executeProgram(CliFrontend.java:374)
+  at org.apache.flink.client.CliFrontend.run(CliFrontend.java:347)
+  at org.apache.flink.client.CliFrontend.parseParameters(CliFrontend.java:1088)
+  at org.apache.flink.client.CliFrontend.main(CliFrontend.java:1115)</pre>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flink/blob/d59cebd8/flink-runtime-web/web-dashboard/web/partials/jobs/job.html
----------------------------------------------------------------------
diff --git a/flink-runtime-web/web-dashboard/web/partials/jobs/job.html b/flink-runtime-web/web-dashboard/web/partials/jobs/job.html
new file mode 100644
index 0000000..252f58a
--- /dev/null
+++ b/flink-runtime-web/web-dashboard/web/partials/jobs/job.html
@@ -0,0 +1,30 @@
+
+<nav ng-if="job" class="navbar navbar-default navbar-fixed-top navbar-main">
+  <div id="fold-button" ng-click="showSidebar()" class="btn btn-default navbar-btn pull-left"><i
class="fa fa-navicon"></i></div>
+  <div class="navbar-title">
+    <indicator-primary status="{{job.state}}"></indicator-primary>{{ job.name
}}
+  </div>
+  <div class="navbar-info first last hidden-xs hidden-sm">{{ job.jid }}</div>
+  <div class="navbar-info first last">
+    <div class="label-group">
+      <bs-label status="{{status}}" ng-repeat="(status, value) in job.operators">{{value}}</bs-label>
+    </div>
+  </div>
+  <div class="navbar-info first last hidden-xs hidden-sm">
+    {{ job['start-time'] }}
+    - 
+    {{ job['end-time'] }}
+  </div>
+  <div class="navbar-info last first">{{job.duration}}</div>
+</nav>
+<nav ng-if="job" class="navbar navbar-default navbar-fixed-top navbar-main-additional">
+  <ul class="nav nav-tabs">
+    <li ui-sref-active="active"><a ui-sref=".plan">Plan</a></li>
+    <li ui-sref-active="active"><a ui-sref=".statistics">Job Accumulators / Statistics</a></li>
+    <li ui-sref-active="active"><a ui-sref=".timeline">Timeline</a></li>
+    <li ui-sref-active="active"><a ui-sref=".exceptions">Exceptions</a></li>
+  </ul>
+</nav>
+<div id="content-inner" class="has-navbar-main-additional">
+  <div ui-view="details"></div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flink/blob/d59cebd8/flink-runtime-web/web-dashboard/web/partials/jobs/job.plan.html
----------------------------------------------------------------------
diff --git a/flink-runtime-web/web-dashboard/web/partials/jobs/job.plan.html b/flink-runtime-web/web-dashboard/web/partials/jobs/job.plan.html
new file mode 100644
index 0000000..b70c387
--- /dev/null
+++ b/flink-runtime-web/web-dashboard/web/partials/jobs/job.plan.html
@@ -0,0 +1,5 @@
+
+<div class="canvas-wrapper">
+  <div job-plan="job-plan" plan="plan" jobid="{{jobid}}" class="main-canvas"></div>
+</div>
+<div ui-view="node"></div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flink/blob/d59cebd8/flink-runtime-web/web-dashboard/web/partials/jobs/job.plan.node.html
----------------------------------------------------------------------
diff --git a/flink-runtime-web/web-dashboard/web/partials/jobs/job.plan.node.html b/flink-runtime-web/web-dashboard/web/partials/jobs/job.plan.node.html
new file mode 100644
index 0000000..017b161
--- /dev/null
+++ b/flink-runtime-web/web-dashboard/web/partials/jobs/job.plan.node.html
@@ -0,0 +1,157 @@
+
+<div ng-if="node" class="panel panel-default panel-multi">
+  <div class="panel-heading clearfix">
+    <div class="panel-title">{{ node.pact }}</div>
+    <div class="panel-info first">ID: {{ node.id }}</div>
+    <div ng-if="node.contents" class="panel-info">
+      <div class="label-group">
+        <bs-label status="{{status}}" ng-repeat="(index, status) in stateList">{{node.vertex.groupvertex[status]}}</bs-label>
+      </div>
+    </div>
+  </div>
+  <div class="panel-heading clearfix">
+    <div ng-if="node.contents" class="panel-info first last"><span>{{ node.contents
}}</span></div>
+  </div>
+  <div class="panel-body">
+    <table class="table table-hover table-clickable">
+      <thead>
+        <tr>
+          <th>Name</th>
+          <th>Status</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr colspan="2">
+          <td>
+            <center><i>WARNING! This is a sample</i></center>
+          </td>
+        </tr>
+        <tr ng-repeat="vertex in node.vertex.groupvertex.groupmembers">
+          <td>{{vertex.vertexname}}</td>
+          <td> 
+            <bs-label status="{{vertex.vertexstatus}}">{{vertex.vertexstatus}}</bs-label>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</div>
+<div ng-if="node" class="row">
+  <div class="col-sm-6 col-md-4">
+    <table ng-if="node.global_properties" class="table table-properties">
+      <thead>
+        <tr>
+          <th colspan="2">Global Data Properties</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr ng-repeat="property in node.global_properties">
+          <td>{{property.name}}</td>
+          <td table-property="table-property" value="property.value"></td>
+        </tr>
+      </tbody>
+    </table>
+    <table ng-if="node.local_properties" class="table table-properties">
+      <thead>
+        <tr>
+          <th colspan="2">Local Data Properties</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr ng-repeat="property in node.local_properties">
+          <td>{{property.name}}</td>
+          <td table-property="table-property" value="property.value"></td>
+        </tr>
+      </tbody>
+    </table>
+    <div class="visible-xs visible-sm">
+      <table class="table table-properties">
+        <thead>
+          <tr>
+            <th colspan="2">Pact Properties</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>Operator</td>
+            <td table-property="table-property" value="node.driver_strategy"></td>
+          </tr>
+          <tr>
+            <td>Parallelism</td>
+            <td table-property="table-property" value="node.parallelism"></td>
+          </tr>
+          <tr>
+            <td>Subtasks-per-instance</td>
+            <td table-property="table-property" value="node.subtasks_per_instance"></td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+  <div class="hidden-sm col-md-4">
+    <table class="table table-properties">
+      <thead>
+        <tr>
+          <th colspan="2">Pact Properties</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr>
+          <td>Operator</td>
+          <td table-property="table-property" value="node.driver_strategy"></td>
+        </tr>
+        <tr>
+          <td>Parallelism</td>
+          <td table-property="table-property" value="node.parallelism"></td>
+        </tr>
+        <tr>
+          <td>Subtasks-per-instance</td>
+          <td table-property="table-property" value="node.subtasks_per_instance"></td>
+        </tr>
+      </tbody>
+    </table>
+    <table ng-if="node.estimates" class="table table-properties">
+      <thead>
+        <tr>
+          <th colspan="2">Size Estimates</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr ng-repeat="property in node.estimates">
+          <td>{{property.name}}</td>
+          <td table-property="table-property" value="property.value"></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+  <div class="col-sm-6 col-md-4">
+    <div class="visible-xs visible-sm">
+      <table ng-if="node.estimates" class="table table-properties">
+        <thead>
+          <tr>
+            <th colspan="2">Size Estimates</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr ng-repeat="property in node.estimates">
+            <td>{{property.name}}</td>
+            <td table-property="table-property" value="property.value"></td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <table ng-if="node.costs" class="table table-properties">
+      <thead>
+        <tr>
+          <th colspan="2">Cost Estimates</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr ng-repeat="property in node.costs">
+          <td>{{property.name}}</td>
+          <td table-property="table-property" value="property.value"></td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flink/blob/d59cebd8/flink-runtime-web/web-dashboard/web/partials/jobs/job.statistics.html
----------------------------------------------------------------------
diff --git a/flink-runtime-web/web-dashboard/web/partials/jobs/job.statistics.html b/flink-runtime-web/web-dashboard/web/partials/jobs/job.statistics.html
new file mode 100644
index 0000000..669dae7
--- /dev/null
+++ b/flink-runtime-web/web-dashboard/web/partials/jobs/job.statistics.html
@@ -0,0 +1,22 @@
+
+<table class="table table-properties">
+  <thead>
+    <tr>
+      <th colspan="2">Some statistics</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>Operator</td>
+      <td>1</td>
+    </tr>
+    <tr>
+      <td>Parallelism</td>
+      <td>2</td>
+    </tr>
+    <tr>
+      <td>Subtasks-per-instance</td>
+      <td>3</td>
+    </tr>
+  </tbody>
+</table>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flink/blob/d59cebd8/flink-runtime-web/web-dashboard/web/partials/jobs/job.timeline.html
----------------------------------------------------------------------
diff --git a/flink-runtime-web/web-dashboard/web/partials/jobs/job.timeline.html b/flink-runtime-web/web-dashboard/web/partials/jobs/job.timeline.html
new file mode 100644
index 0000000..dc67ead
--- /dev/null
+++ b/flink-runtime-web/web-dashboard/web/partials/jobs/job.timeline.html
@@ -0,0 +1,5 @@
+
+<div class="canvas-wrapper">
+  <div timeline="timeline" job="job" class="timeline-canvas"></div>
+</div>
+<div ui-view="vertex"></div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flink/blob/d59cebd8/flink-runtime-web/web-dashboard/web/partials/jobs/job.timeline.vertex.html
----------------------------------------------------------------------
diff --git a/flink-runtime-web/web-dashboard/web/partials/jobs/job.timeline.vertex.html b/flink-runtime-web/web-dashboard/web/partials/jobs/job.timeline.vertex.html
new file mode 100644
index 0000000..da5326a
--- /dev/null
+++ b/flink-runtime-web/web-dashboard/web/partials/jobs/job.timeline.vertex.html
@@ -0,0 +1,12 @@
+
+<div ng-if="vertex" class="panel panel-default panel-multi">
+  <div class="panel-heading clearfix">
+    <div class="panel-title">{{ vertex.groupvertex.groupvertexname }}</div>
+  </div>
+  <div class="panel-body">
+    <div class="canvas-wrapper">
+      <div vertex="vertex" data="vertex" class="timeline-canvas"></div>
+    </div>
+    <div id="timeline1"></div>
+  </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flink/blob/d59cebd8/flink-runtime-web/web-dashboard/web/partials/jobs/running-jobs.html
----------------------------------------------------------------------
diff --git a/flink-runtime-web/web-dashboard/web/partials/jobs/running-jobs.html b/flink-runtime-web/web-dashboard/web/partials/jobs/running-jobs.html
new file mode 100644
index 0000000..224b0c2
--- /dev/null
+++ b/flink-runtime-web/web-dashboard/web/partials/jobs/running-jobs.html
@@ -0,0 +1,35 @@
+
+<nav class="navbar navbar-default navbar-fixed-top navbar-main">
+  <div id="fold-button" ng-click="showSidebar()" class="btn btn-default navbar-btn pull-left"><i
class="fa fa-navicon"></i></div>
+  <div class="navbar-title">Running Jobs</div>
+</nav>
+<div id="content-inner">
+  <table class="table table-hover table-clickable">
+    <thead>
+      <tr>
+        <th>Start Time</th>
+        <th>End Time</th>
+        <th>Duration</th>
+        <th>Job Name</th>
+        <th>Job ID</th>
+        <th>Tasks</th>
+        <th>Status</th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr ng-repeat="job in jobs" ui-sref="single-job.plan({ jobid: job.jid })">
+        <td>{{job['start-time']}}</td>
+        <td>{{job['end-time']}}</td>
+        <td>{{job.duration}}</td>
+        <td>{{job.name}}</td>
+        <td>{{job.jid}}</td>
+        <td class="label-group">
+          <bs-label status="{{status}}" ng-repeat="(status, value) in job.operators">{{value}}</bs-label>
+        </td>
+        <td> 
+          <bs-label status="{{job.state}}">{{job.state}}</bs-label>
+        </td>
+      </tr>
+    </tbody>
+  </table>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flink/blob/d59cebd8/flink-runtime-web/web-dashboard/web/partials/overview.html
----------------------------------------------------------------------
diff --git a/flink-runtime-web/web-dashboard/web/partials/overview.html b/flink-runtime-web/web-dashboard/web/partials/overview.html
new file mode 100644
index 0000000..8307cb8
--- /dev/null
+++ b/flink-runtime-web/web-dashboard/web/partials/overview.html
@@ -0,0 +1,129 @@
+
+<nav class="navbar navbar-default navbar-fixed-top navbar-main">
+  <div id="fold-button" ng-click="showSidebar()" class="btn btn-default navbar-btn pull-left"><i
class="fa fa-navicon"></i></div>
+  <div class="navbar-title">Overview</div>
+</nav>
+<div id="content-inner">
+  <div class="row">
+    <div class="col-md-6">
+      <div class="panel panel-default panel-dashboard">
+        <div class="panel-heading">
+          <div class="row">
+            <div class="col-xs-3"><i class="fa fa-tasks fa-3x"></i></div>
+            <div class="col-xs-9 text-right">
+              <div class="huge">3</div>
+              <div>Task Managers</div>
+            </div>
+          </div>
+        </div>
+        <div class="panel-heading">
+          <div class="row">
+            <div class="col-xs-3"><i class="fa fa-folder fa-3x"></i></div>
+            <div class="col-xs-9 text-right">
+              <div class="huge">5</div>
+              <div>Task Slots</div>
+            </div>
+          </div>
+        </div>
+        <div class="panel-heading">
+          <div class="row">
+            <div class="col-xs-3"><i class="fa fa-folder-o fa-3x"></i></div>
+            <div class="col-xs-9 text-right">
+              <div class="huge">2</div>
+              <div>Available Task Slots</div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-6">
+      <div class="panel panel-default panel-lg">
+        <div class="panel-heading">Total Jobs</div>
+        <div class="list-group">
+          <div class="list-group-item">
+            <div class="badge badge-primary">3</div>Running
+          </div>
+          <div class="list-group-item">
+            <div class="badge badge-success">6</div>Finished
+          </div>
+          <div class="list-group-item">
+            <div class="badge badge-info">0</div>Canceled
+          </div>
+          <div class="list-group-item">
+            <div class="badge badge-danger">2</div>Failed
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div class="panel panel-default">
+    <div class="panel-heading">
+      <h3 class="panel-title">Running Jobs</h3>
+    </div>
+    <div class="panel-body">
+      <table class="table table-hover table-clickable">
+        <thead>
+          <tr>
+            <th>Start Time</th>
+            <th>End Time</th>
+            <th>Duration</th>
+            <th>Job Name</th>
+            <th>Job ID</th>
+            <th>Tasks</th>
+            <th>Status</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr ng-repeat="job in runningJobs" ui-sref="single-job.plan({ jobid: job.jid
})">
+            <td>{{job['start-time']}}</td>
+            <td>{{job['end-time']}}</td>
+            <td>{{job.duration}}</td>
+            <td>{{job.jobname}}</td>
+            <td>{{job.jid}}</td>
+            <td class="label-group">
+              <bs-label status="{{status}}" ng-repeat="(status, value) in job.operators">{{value}}</bs-label>
+            </td>
+            <td> 
+              <bs-label status="{{job.state}}">{{job.state}}</bs-label>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+  <div class="panel panel-default">
+    <div class="panel-heading">
+      <h3 class="panel-title">Completed Jobs</h3>
+    </div>
+    <div class="panel-body">
+      <table class="table table-hover table-clickable">
+        <thead>
+          <tr>
+            <th>Start Time</th>
+            <th>End Time</th>
+            <th>Duration</th>
+            <th>Job Name</th>
+            <th>Job ID</th>
+            <th>Tasks</th>
+            <th>Status</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr ng-repeat="job in finishedJobs" ui-sref="single-job.plan({ jobid: job.jid
})">
+            <td>{{job['start-time']}}</td>
+            <td>{{job['end-time']}}</td>
+            <td>{{job.duration}}</td>
+            <td>{{job.jobname}}</td>
+            <td>{{job.jid}}</td>
+            <td class="label-group">
+              <bs-label status="{{status}}" ng-repeat="(status, value) in job.operators">{{value}}</bs-label>
+            </td>
+            <td> 
+              <bs-label status="{{job.state}}">{{job.state}}</bs-label>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+</div>
\ No newline at end of file


Mime
View raw message