[ARVADOS] updated: bff8478af0503196b18446f8b909949b618e363f

git at public.curoverse.com git at public.curoverse.com
Mon Sep 15 20:41:31 EDT 2014


Summary of changes:
 .../app/assets/javascripts/application.js          |   5 +-
 apps/workbench/app/assets/javascripts/dates.js     |  20 ++-
 apps/workbench/app/assets/javascripts/selection.js |   9 +-
 .../app/assets/stylesheets/projects.css.scss       |  33 +++-
 .../app/controllers/actions_controller.rb          |   8 +-
 .../app/controllers/application_controller.rb      |   6 +-
 apps/workbench/app/models/job.rb                   |   4 +
 .../application/_pipeline_status_label.html.erb    |   2 +
 .../app/views/collections/_show_files.html.erb     |  45 ++++-
 .../app/views/collections/_show_recent.html.erb    |  21 +++
 .../collections/_show_source_summary.html.erb      |   7 +-
 .../_show_components_running.html.erb              |  17 +-
 .../views/projects/_compute_node_status.html.erb   |  58 ++-----
 .../views/projects/_compute_node_summary.html.erb  |  23 +++
 .../app/views/projects/_show_tab_contents.html.erb |  12 +-
 apps/workbench/app/views/projects/index.html.erb   | 189 ++++++++++++++++-----
 apps/workbench/config/application.default.yml      |   3 +
 apps/workbench/config/routes.rb                    |   1 +
 .../test/functional/actions_controller_test.rb     |  30 ++++
 .../workbench/test/integration/collections_test.rb |  70 ++++++++
 apps/workbench/test/integration/projects_test.rb   |  27 +++
 services/api/Gemfile                               |   4 +-
 services/api/Gemfile.lock                          |   8 +-
 .../app/controllers/arvados/v1/jobs_controller.rb  |   8 +-
 services/api/config/routes.rb                      |   1 +
 25 files changed, 485 insertions(+), 126 deletions(-)
 create mode 100644 apps/workbench/app/views/projects/_compute_node_summary.html.erb

       via  bff8478af0503196b18446f8b909949b618e363f (commit)
       via  07a3aa9651168756a6f108821f6ef10ea4ba8144 (commit)
       via  195b1b9f5b683110b4cef2ebd4e7cc3401317334 (commit)
       via  bf243e064a7a2ee4e69a87dc3ba46e949a545150 (commit)
       via  9a88a95c52bf3b1da8152ab382de5b78be8568eb (commit)
       via  f43a783466bf8257781bac0acfa14008b2d532a1 (commit)
       via  b53be4b88fce28f4aa08da8d869653fcb7edb062 (commit)
       via  e5152a25b9f9803522c15ff6397545f68d1d07a2 (commit)
       via  132db914689be8338c16ea3d6748d073af2a6240 (commit)
       via  2109516cd314190311d837fcf40576c87dd38cd1 (commit)
       via  bc8c85ca59ff590ae2e336fc4552ec265d5ebb50 (commit)
       via  a9619cd9d563b5c434da6a11566517cacb410124 (commit)
       via  2d911a46e2698f18200bf2170bdb4c18452439a1 (commit)
       via  35bee4f8071099b57925a49fc56554ceda900c81 (commit)
       via  a3615da860d1d78d0ecb7e2890eea26963b5c01e (commit)
       via  960925be39948cda7f6ff0775887ba411a4e82ea (commit)
       via  300729d2ef4d0e7b9d86444c4a784b7e0b3beb6d (commit)
       via  7e3496abb1b8c70607df37b6f096c8acd42d714d (commit)
       via  2b96f0945cfdbda223227b96393a5f77aff477a4 (commit)
       via  43d6c4e398e53a43f5b52c556128a33c8f84f5a3 (commit)
       via  e386cf444082ac341978887fb8d2b3b13cbba060 (commit)
       via  2e255fb4aa0a1b7e0acfb1298a1625629ca18846 (commit)
       via  08b394b0df66374a75dab082ca858dda6e4beae3 (commit)
       via  852573d60776116bed4e86431667abf8c77d3f9a (commit)
       via  5faed0c0ad219bd32182ecf5029a363587d4e863 (commit)
       via  e7a9c2edbf0b3843940446077a45ad4c911727ab (commit)
       via  34081b99f265f9baaabcd791f7c520c3f5b37f19 (commit)
       via  a6a9e10686e3ffc8c56b0aad61633524be7e5cc4 (commit)
       via  9564076de96d8c0084cf00f47348c41d6abfe673 (commit)
       via  74ac5edcb6ecff4003ec70cf904c900392a31814 (commit)
       via  8c4233dae52c96ceb629d2be1be73b518118863a (commit)
       via  e322205a65bdc3a0565997eb68c86e74cd191762 (commit)
       via  fd910ade561ddec093ec29a79a216259e53bef90 (commit)
       via  c90d8145634022d2d0c66b36bfb99e4c21248fed (commit)
       via  498f3130928f58e830be3abe74b20d06904af3cd (commit)
       via  33710e325a775d8f52ce89ce365b4a5153a68b18 (commit)
      from  177a1468e06674e7ff0ff0730b8607fbbd78000b (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit bff8478af0503196b18446f8b909949b618e363f
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date:   Mon Sep 15 20:41:26 2014 -0400

    3605: Getting jobs/queue_size from API server works.  Fixed server-side
    sorting.  Date rendering improvements.

diff --git a/apps/workbench/app/assets/javascripts/dates.js b/apps/workbench/app/assets/javascripts/dates.js
index 9e484ce..eeb6ede 100644
--- a/apps/workbench/app/assets/javascripts/dates.js
+++ b/apps/workbench/app/assets/javascripts/dates.js
@@ -1,11 +1,23 @@
+jQuery(function($){
 $(document).on('ajax:complete arv:pane:loaded ready', function() {
-    console.log("woble!");
     $('[data-utc-date]').each(function(i, elm) {
-        var re = /(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d) UTC/;
-        var v = $(elm).attr('data-utc-date').match(re);
+            console.log("woble!");
+        var v = $(elm).attr('data-utc-date').match(/(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d) UTC/);
+        if (!v) {
+            v = $(elm).attr('data-utc-date').match(/(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)Z/);
+        }
+
         if (v) {
             var ts = new Date(Date.UTC(v[1], v[2]-1, v[3], v[4], v[5], v[6]));
-            $(elm).text(ts.toLocaleTimeString() + " " + ts.toLocaleDateString());
+            if ($(elm).attr('data-utc-date-opts') && $(elm).attr('data-utc-date-opts').match(/noseconds/)) {
+                $(elm).text((ts.getHours() > 12 ? (ts.getHours()-12) : ts.getHours())
+                            + ":" + (ts.getMinutes() < 10 ? '0' : '') + ts.getMinutes()
+                            + (ts.getHours() > 12 ? " PM " : " AM ")
+                            + ts.toLocaleDateString());
+            } else {
+                $(elm).text(ts.toLocaleTimeString() + " " + ts.toLocaleDateString());
+            }
         }
     });
 });
+});
diff --git a/apps/workbench/app/assets/stylesheets/projects.css.scss b/apps/workbench/app/assets/stylesheets/projects.css.scss
index 600a7a3..d9edfd8 100644
--- a/apps/workbench/app/assets/stylesheets/projects.css.scss
+++ b/apps/workbench/app/assets/stylesheets/projects.css.scss
@@ -54,5 +54,15 @@ div.scroll-20em {
 }
 
 .dashboard-panel-info-row {
-  margin-bottom: .5em
+  padding: .5em;
+  border-radius: .3em;
+}
+
+.x-ellip {
+  overflow-x: hide;
+  text-overflow: ellipsis;
+}
+
+.dashboard-panel-info-row:hover {
+  background-color: #D9EDF7;
 }
\ No newline at end of file
diff --git a/apps/workbench/app/controllers/application_controller.rb b/apps/workbench/app/controllers/application_controller.rb
index 3c067fa..756339e 100644
--- a/apps/workbench/app/controllers/application_controller.rb
+++ b/apps/workbench/app/controllers/application_controller.rb
@@ -694,17 +694,17 @@ class ApplicationController < ActionController::Base
 
   helper_method :running_pipelines
   def running_pipelines
-    PipelineInstance.order([["started_at", "asc"]]).filter([["state", "=", "RunningOnServer"]]).all.results.reverse
+    PipelineInstance.order(["started_at asc", "created_at asc"]).filter([["state", "in", ["RunningOnServer", "RunningOnClient"]]])
   end
 
   helper_method :finished_pipelines
   def finished_pipelines lim
-    PipelineInstance.limit(lim).order([["finished_at", "asc"]]).filter([["state", "in", ["Completed", "Failed", "Cancelled"]]])
+    PipelineInstance.limit(lim).order(["finished_at desc"]).filter([["state", "in", ["Complete", "Failed", "Paused"]], ["finished_at", "!=", nil]])
   end
 
   helper_method :recent_collections
   def recent_collections lim
-    c = Collection.limit(lim).order([["modified_at", "asc"]]).filter([["owner_uuid", "is_a", "arvados#group"]])
+    c = Collection.limit(lim).order(["modified_at desc"]).filter([["owner_uuid", "is_a", "arvados#group"]])
     own = {}
     Group.filter([["uuid", "in", c.map(&:owner_uuid)]]).each do |g|
       own[g[:uuid]] = g
diff --git a/apps/workbench/app/models/job.rb b/apps/workbench/app/models/job.rb
index 309cade..ff2eb00 100644
--- a/apps/workbench/app/models/job.rb
+++ b/apps/workbench/app/models/job.rb
@@ -34,6 +34,10 @@ class Job < ArvadosBase
     arvados_api_client.api "jobs/#{self.uuid}/", "cancel", {}
   end
 
+  def self.queue_size
+    arvados_api_client.api("jobs/", "queue_size", {"_method"=> "GET"})[:queue_size] rescue 0
+  end
+
   def state
     Job::state(self)
   end
diff --git a/apps/workbench/app/views/application/_pipeline_status_label.html.erb b/apps/workbench/app/views/application/_pipeline_status_label.html.erb
index 8abf65b..9e5b710 100644
--- a/apps/workbench/app/views/application/_pipeline_status_label.html.erb
+++ b/apps/workbench/app/views/application/_pipeline_status_label.html.erb
@@ -4,6 +4,8 @@
   <span class="label label-danger">failed</span>
 <% elsif p.state == 'RunningOnServer' || p.state == 'RunningOnClient' %>
   <span class="label label-info">running</span>
+<% elsif p.state == 'Paused'  %>
+  <span class="label label-default">paused</span>
 <% else %>
   <% if not p.components.values.any? { |c| c[:job] rescue false } %>
     <span class="label label-default">not started</span>
diff --git a/apps/workbench/app/views/collections/_show_source_summary.html.erb b/apps/workbench/app/views/collections/_show_source_summary.html.erb
index ba9e9df..51f9348 100644
--- a/apps/workbench/app/views/collections/_show_source_summary.html.erb
+++ b/apps/workbench/app/views/collections/_show_source_summary.html.erb
@@ -7,10 +7,12 @@
     <% pipelines = PipelineInstance.filter([["components", "like", "%#{@object.uuid}%"]]).each do |pipeline| %>
       <% pipeline.components.each do |cname, c| %>
         <% if c[:output_uuid] == @object.uuid %>
-          <b><%= cname %></b> component of pipeline <b><%= link_to_if_arvados_object(pipeline, friendly_name: true) %></b>
+          <b><%= cname %></b> component of <b><%= link_to_if_arvados_object(pipeline, friendly_name: true) %></b>
           <% if c.andand[:job].andand[:finished_at] %>
-            <b>finished at <%= c[:job][:finished_at] %></b>
+            finished at <span class="utc-date"
+                                 data-utc-date="<%= c[:job][:finished_at] %>"><%= c[:job][:finished_at] %></span>
           <% end %>
+          <br>
         <% end %>
       <% end %>
     <% end %>
diff --git a/apps/workbench/app/views/projects/_compute_node_summary.html.erb b/apps/workbench/app/views/projects/_compute_node_summary.html.erb
new file mode 100644
index 0000000..9a58d09
--- /dev/null
+++ b/apps/workbench/app/views/projects/_compute_node_summary.html.erb
@@ -0,0 +1,23 @@
+<div class="compute-summary-numbers">
+    <table>
+      <colgroup>
+        <col width="25%">
+        <col width="25%">
+        <col width="25%">
+        <col width="25%">
+
+      </colgroup>
+      <tr>
+        <td><%= Job.queue_size %></td>
+        <td><%= nodes.select {|n| n.crunch_worker_state.in? ["busy", "idle"] }.size %></td>
+        <td><%= nodes.select {|n| n.crunch_worker_state == "busy" }.size %></td>
+        <td><%= nodes.select {|n| n.crunch_worker_state == "idle" }.size %></td>
+      </tr>
+      <tr>
+        <th>Queue</th>
+        <th>Nodes</th>
+        <th>Busy</th>
+        <th>Idle</th>
+      </tr>
+    </table>
+</div>
diff --git a/apps/workbench/app/views/projects/index.html.erb b/apps/workbench/app/views/projects/index.html.erb
index fad7204..e7e8736 100644
--- a/apps/workbench/app/views/projects/index.html.erb
+++ b/apps/workbench/app/views/projects/index.html.erb
@@ -2,7 +2,7 @@
   <div class="row">
     <div class="col-md-6">
       <div class="panel panel-default">
-        <div class="panel-heading"><span class="panel-title">Pipelines running</span>
+        <div class="panel-heading"><span class="panel-title">Active pipelines</span>
           <span class="pull-right">
     <%= link_to(
 	  choose_pipeline_templates_path(
@@ -17,7 +17,7 @@
     </span>
         </div>
 
-        <div class="panel-body" style="overflow-x: scroll;">
+        <div class="panel-body">
           <% if running_pipelines.empty? %>
             No pipelines are currently running.
           <% end %>
@@ -67,7 +67,8 @@
               </div>
 
               <div class="clearfix">
-                Started at <span class="utc-date" data-utc-date="<%= p[:started_at] || p[:created_at] %>"><%= p[:created_at] %></span>.
+                Started at <span class="utc-date" data-utc-date="<%= p[:started_at] || p[:created_at] %>"
+                                 data-utc-date-opts="noseconds"><%= p[:created_at] %></span>.
                 <% pipeline_time = Time.now - (p[:started_at] || p[:created_at]) %>
                 Active for <%= runtime(pipeline_time, false) %>.
 
@@ -87,44 +88,64 @@
 
       <div class="panel panel-default">
         <div class="panel-heading"><span class="panel-title">Recently finished pipelines</span></div>
-        <div class="panel-body" style="overflow-x: scroll;">
+        <div class="panel-body">
           <% finished_pipelines(8).each do |p| %>
             <div class="dashboard-panel-info-row">
               <div class="row">
-                <div class="col-md-4">
+                <div class="col-md-6 x-ellip">
                 <%= link_to_if_arvados_object p, friendly_name: true %>
               </div>
-              <div class="col-md-4">
+              <div class="col-md-2">
                 <%= render partial: "pipeline_status_label", locals: {p: p}%>
               </div>
               <div class="col-md-4">
-                <% outputs = [] %>
-                <% p.components.each do |k, c| %>
-                  <% outputs << c[:output_uuid] if c[:output_uuid] %>
-                <% end %>
-                <%= outputs %>
+                <span class="utc-date" data-utc-date="<%= p[:finished_at] || p[:modified_at] %>"
+                      data-utc-date-opts="noseconds"><%= p[:modified_at] %></span>
               </div>
               </div>
-
               <div class="row">
                 <div class="col-md-12">
-                  Finished at <span class="utc-date" data-utc-date="<%= p[:finished_at] || p[:modified_at] %>"><%= p[:modified_at] %></span>.
                   <% if p[:started_at] and p[:finished_at] %>
                     <% pipeline_time = p[:finished_at] - p[:started_at] %>
-                    Active for <%= runtime(pipeline_time, false) %>.
+                    Active for <%= runtime(pipeline_time, false) %>
                   <% end %>
+
+                  <span class="pull-right">
+                    <% outputs = [] %>
+                    <% p.components.each do |k, c| %>
+                      <% outputs << c[:output_uuid] if c[:output_uuid] %>
+                    <% end %>
+                    <% if outputs.size == 0 %>
+                      No output.
+                    <% elsif outputs.size == 1 %>
+                      <i class="fa fa-fw fa-archive"></i> <%= link_to_if_arvados_object outputs[0], friendly_name: true %>
+                    <% else %>
+                      <a href="#<%= p[:uuid] %>" data-toggle="collapse">Outputs <span class="caret"></span></a>
+                    <% end %>
+                  </span>
                 </div>
               </div>
+
+                <div class="row collapse" id="<%= p[:uuid] %>" >
+                  <div class="col-md-offset-3 col-md-10">
+                    <% outputs.each do |out| %>
+                      <div>
+                        <i class="fa fa-fw fa-archive"></i> <%= link_to_if_arvados_object out, friendly_name: true %>
+                      </div>
+                    <% end %>
+                  </div>
+                </div>
+
             </div>
           <% end %>
         </div>
       </div>
-        </div>
+    </div>
 
     <div class="col-md-6">
       <% nodes = Node.all %>
       <div class="panel panel-default">
-        <div class="panel-heading"><span class="panel-title"><a data-toggle="collapse" href="#compute_node_status">Compute node status</a></span></div>
+        <div class="panel-heading"><span class="panel-title"><a data-toggle="collapse" href="#compute_node_status">Compute node status <span class="caret"></span></a></span></div>
         <div class="panel-body">
           <div class="compute-node-summary" data-toggle="collapse" href="#compute_node_status">
             <%= render partial: 'compute_node_summary', locals: {nodes: nodes} %>
@@ -136,15 +157,17 @@
       </div>
       <div class="panel panel-default">
         <div class="panel-heading"><span class="panel-title">Recent collections</span></div>
-        <div class="panel-body" style="overflow-x: scroll;">
+        <div class="panel-body">
           <% r = recent_collections(8) %>
           <% r[:collections].each do |p| %>
             <div class="dashboard-panel-info-row">
             <div>
               <i class="fa fa-fw fa-folder-o"></i><%= link_to_if_arvados_object r[:owners][p[:owner_uuid]], friendly_name: true %>/
-              <span class="pull-right"><span class="utc-date" data-utc-date="<%= p[:modified_at] %>">p[:modified_at]</span></span>
+              <span class="pull-right"><span class="utc-date"
+                                             data-utc-date="<%= p[:modified_at] %>"
+                                             data-utc-date-opts="noseconds"><%= p[:modified_at]%></span></span>
             </div>
-            <div style="margin-left: 1em"><%= link_to_if_arvados_object p, friendly_name: true %>
+            <div class="x-ellip" style="margin-left: 1em"><%= link_to_if_arvados_object p, friendly_name: true %>
             </div>
             </div>
           <% end %>
diff --git a/services/api/app/controllers/arvados/v1/jobs_controller.rb b/services/api/app/controllers/arvados/v1/jobs_controller.rb
index afb516b..5a571d4 100644
--- a/services/api/app/controllers/arvados/v1/jobs_controller.rb
+++ b/services/api/app/controllers/arvados/v1/jobs_controller.rb
@@ -2,8 +2,8 @@ class Arvados::V1::JobsController < ApplicationController
   accept_attribute_as_json :script_parameters, Hash
   accept_attribute_as_json :runtime_constraints, Hash
   accept_attribute_as_json :tasks_summary, Hash
-  skip_before_filter :find_object_by_uuid, :only => :queue
-  skip_before_filter :render_404_if_no_object, :only => :queue
+  skip_before_filter :find_object_by_uuid, :only => [:queue, :queue_size]
+  skip_before_filter :render_404_if_no_object, :only => [:queue, :queue_size]
 
   def create
     [:repository, :script, :script_version, :script_parameters].each do |r|
@@ -163,7 +163,7 @@ class Arvados::V1::JobsController < ApplicationController
   end
 
   def queue_size
-    render :json => {:queue_size => Job.queue.size}
+          render :json => {:queue_size => Job.queue.size}
   end
 
   def self._create_requires_parameters

commit 07a3aa9651168756a6f108821f6ef10ea4ba8144
Merge: 195b1b9 bf243e0
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date:   Mon Sep 15 15:08:19 2014 -0400

    Merge remote-tracking branch 'origin/master' into 3605-improved-dashboard


commit 195b1b9f5b683110b4cef2ebd4e7cc3401317334
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date:   Mon Sep 15 15:08:08 2014 -0400

    3605: Finally settled on a layout.  Adding in remaining information and fixing bugs.

diff --git a/apps/workbench/app/assets/javascripts/application.js b/apps/workbench/app/assets/javascripts/application.js
index 950ee50..39e8cf9 100644
--- a/apps/workbench/app/assets/javascripts/application.js
+++ b/apps/workbench/app/assets/javascripts/application.js
@@ -206,8 +206,11 @@ jQuery(function($){
     });
 
     $(document).on('click', '.compute-detail', function(e) {
-        console.log("woble");
         $(e.target).collapse('hide');
     });
 
+    $(document).on('click', '.compute-node-summary', function(e) {
+        $(e.target.href).collapse('toggle');
+    });
+
 });
diff --git a/apps/workbench/app/assets/stylesheets/projects.css.scss b/apps/workbench/app/assets/stylesheets/projects.css.scss
index 724c40a..600a7a3 100644
--- a/apps/workbench/app/assets/stylesheets/projects.css.scss
+++ b/apps/workbench/app/assets/stylesheets/projects.css.scss
@@ -12,7 +12,8 @@ div.scroll-20em {
 }
 
 .compute-summary {
-    margin: 0.1em;
+    margin: 0.15em 0em 0.15em 0em;
+    display: inline-block;
 }
 
 .compute-summary-head {
@@ -29,9 +30,29 @@ div.scroll-20em {
     background: white;
 }
 
+.compute-detail:hover {
+   cursor: pointer;
+}
+
+.compute-node-summary:hover {
+  cursor: pointer;
+}
+
+.compute-summary-numbers .panel {
+  margin-bottom: 0px;
+}
+
 .compute-summary-numbers table {
   width: 100%;
   td,th {
     text-align: center;
   }
+}
+
+.compute-summary-nodelist {
+  margin-bottom: 10px
+}
+
+.dashboard-panel-info-row {
+  margin-bottom: .5em
 }
\ No newline at end of file
diff --git a/apps/workbench/app/controllers/application_controller.rb b/apps/workbench/app/controllers/application_controller.rb
index a0ed2ea..3c067fa 100644
--- a/apps/workbench/app/controllers/application_controller.rb
+++ b/apps/workbench/app/controllers/application_controller.rb
@@ -694,17 +694,17 @@ class ApplicationController < ActionController::Base
 
   helper_method :running_pipelines
   def running_pipelines
-    PipelineInstance.filter([["state", "=", "RunningOnServer"]]).sort_by { |x| (x.started_at rescue x.modified_at) }
+    PipelineInstance.order([["started_at", "asc"]]).filter([["state", "=", "RunningOnServer"]]).all.results.reverse
   end
 
   helper_method :finished_pipelines
   def finished_pipelines lim
-    PipelineInstance.limit(lim).filter([["state", "in", ["Completed", "Failed", "Cancelled"]]]).sort_by { |x| (x.finished_at rescue x.modified_at) }.reverse
+    PipelineInstance.limit(lim).order([["finished_at", "asc"]]).filter([["state", "in", ["Completed", "Failed", "Cancelled"]]])
   end
 
   helper_method :recent_collections
   def recent_collections lim
-    c = Collection.limit(lim).filter([["owner_uuid", "is_a", "arvados#group"]]).sort_by { |x| x.modified_at }.reverse
+    c = Collection.limit(lim).order([["modified_at", "asc"]]).filter([["owner_uuid", "is_a", "arvados#group"]])
     own = {}
     Group.filter([["uuid", "in", c.map(&:owner_uuid)]]).each do |g|
       own[g[:uuid]] = g
diff --git a/apps/workbench/app/views/pipeline_instances/_show_components_running.html.erb b/apps/workbench/app/views/pipeline_instances/_show_components_running.html.erb
index 0d27566..18ae9b0 100644
--- a/apps/workbench/app/views/pipeline_instances/_show_components_running.html.erb
+++ b/apps/workbench/app/views/pipeline_instances/_show_components_running.html.erb
@@ -9,17 +9,15 @@
 
 <p>
   <% if @object.started_at %>
-    Started at <span data-utc-date="<%= @object.started_at %>"><%= @object.started_at %></span> and
-  <% else %>
-    Has not started.
+    Started at <span data-utc-date="<%= @object.started_at %>"><%= @object.started_at %></span>.
   <% end %>
 
   <% if @object.state == 'Complete' %>
-    completed in
+    Completed in
   <% elsif @object.state == 'Failed' %>
-    failed after
-  <% elsif @object.started_at %>
-    has been active for
+    Failed after
+  <% else %>
+    Has been active for
   <% end %>
 
   <% walltime = if @object.started_at
@@ -76,7 +74,7 @@
         <div class="row">
           <div class="col-md-3">
             <h4 class="panel-title">
-              <a data-toggle="collapse" data-parent="#accordion" href="#collapse<%= i %>">
+              <a data-toggle="collapse" href="#collapse<%= i %>">
                 <%= pj[:name] %> <span class="caret"></span>
               </a>
             </h4>
@@ -127,6 +125,7 @@
             <div class="col-md-5">
               <% queuetime = Time.now - current_job[:created_at] %>
               Queued for <%= runtime(queuetime, true) %>.
+              <% begin %>
               <% if current_job.queue_position == 0 %>
                 This job is next in the queue to run.
               <% elsif current_job.queue_position == 1 %>
@@ -134,6 +133,8 @@
               <% else  %>
                 There are <%= current_job.queue_position %> jobs in the queue ahead of this one.
               <% end %>
+              <% rescue %>
+          <% end %>
             </div>
           <% end %>
         <% else %>
diff --git a/apps/workbench/app/views/projects/_compute_node_status.html.erb b/apps/workbench/app/views/projects/_compute_node_status.html.erb
index db7326e..528d0ea 100644
--- a/apps/workbench/app/views/projects/_compute_node_status.html.erb
+++ b/apps/workbench/app/views/projects/_compute_node_status.html.erb
@@ -1,48 +1,18 @@
-<div class="row">
 
-  <% nodes = Node.all %>
-
-  <div class="col-sm-3 compute-summary-numbers">
-    <div class="panel panel-default">
-    <table>
-      <colgroup>
-        <col width="25%">
-        <col width="25%">
-        <col width="25%">
-        <col width="25%">
-      </colgroup>
-      <tr>
-        <td>0</td>
-        <td><%= nodes.select {|n| n.crunch_worker_state.in? ["busy", "idle"] }.size %></td>
-        <td><%= nodes.select {|n| n.crunch_worker_state == "busy" }.size %></td>
-        <td><%= nodes.select {|n| n.crunch_worker_state == "idle" }.size %></td>
-      </tr>
-      <tr>
-        <th>Queue</th>
-        <th>Nodes</th>
-        <th>Busy</th>
-        <th>Idle</th>
-      </tr>
-    </table>
-    </div>
-  </div>
-  <div class="col-sm-9">
-    <div class="clearfix" style="margin-top:0.5em; margin-bottom:0.5em">
-      <% nodes.sort_by { |n| n.hostname || "" }.each do |n| %>
-        <% if n.crunch_worker_state.in? ["busy", "idle"] %>
-          <div class="pull-left compute-summary">
-            <a data-toggle="collapse" href="#detail_<%= n.hostname %>" class="compute-summary-head label label-<%= if n.crunch_worker_state == 'busy' then 'primary' else 'default' end %>">
-              <%= n.hostname %>
-            </a>
-            <div id="detail_<%= n.hostname %>" class="collapse compute-detail">
-              state: <%= n.crunch_worker_state %><br>
-              <% [:total_cpu_cores, :total_ram_mb, :total_scratch_mb].each do |i| %>
-                <%= i.to_s.gsub '_', ' ' %>: <%= n.info[i] %><br>
-              <% end %>
-            </div>
+<div class="compute-summary-nodelist">
+    <% nodes.sort_by { |n| n.hostname || "" }.each do |n| %>
+      <% if n.crunch_worker_state.in? ["busy", "idle"] %>
+        <div class="compute-summary">
+          <a data-toggle="collapse" href="#detail_<%= n.hostname %>" class="compute-summary-head label label-<%= if n.crunch_worker_state == 'busy' then 'primary' else 'default' end %>">
+            <%= n.hostname %>
+          </a>
+          <div id="detail_<%= n.hostname %>" class="collapse compute-detail">
+            state: <%= n.crunch_worker_state %><br>
+            <% [:total_cpu_cores, :total_ram_mb, :total_scratch_mb].each do |i| %>
+              <%= i.to_s.gsub '_', ' ' %>: <%= n.info[i] %><br>
+            <% end %>
           </div>
-        <% end %>
+        </div>
       <% end %>
-    </div>
-  </div>
+    <% end %>
 </div>
diff --git a/apps/workbench/app/views/projects/index.html.erb b/apps/workbench/app/views/projects/index.html.erb
index 1e6b333..fad7204 100644
--- a/apps/workbench/app/views/projects/index.html.erb
+++ b/apps/workbench/app/views/projects/index.html.erb
@@ -1,72 +1,156 @@
-<div>
-
-  <%= render partial: 'compute_node_status' %>
 
   <div class="row">
     <div class="col-md-6">
       <div class="panel panel-default">
-        <div class="panel-heading">Pipelines running</div>
+        <div class="panel-heading"><span class="panel-title">Pipelines running</span>
+          <span class="pull-right">
+    <%= link_to(
+	  choose_pipeline_templates_path(
+	    title: 'Choose a pipeline to run:',
+	    action_name: 'Next: choose inputs <i class="fa fa-fw fa-arrow-circle-right"></i>',
+	    action_href: pipeline_instances_path,
+	    action_method: 'post',
+	    action_data: {'selection_param' => 'pipeline_instance[pipeline_template_uuid]', 'pipeline_instance[owner_uuid]' => current_user.uuid, 'success' => 'redirect-to-created-object'}.to_json),
+	  { class: "btn btn-primary btn-xs", remote: true, method: 'get' }) do %>
+      <i class="fa fa-fw fa-gear"></i> Run a pipeline...
+    <% end %>
+    </span>
+        </div>
+
         <div class="panel-body" style="overflow-x: scroll;">
+          <% if running_pipelines.empty? %>
+            No pipelines are currently running.
+          <% end %>
           <% running_pipelines.each do |p| %>
-            <div>
-            <%= link_to_if_arvados_object p, friendly_name: true %>
-            </div>
-            <div>
-              [Progress] <span class="pull-right"><%= p[:modified_at] %></span>
+            <div class="dashboard-panel-info-row">
+              <div class="clearfix">
+                <%= link_to_if_arvados_object p, friendly_name: true %>
+
+                <div class="pull-right" style="width: 40%">
+                  <div class="progress" style="margin-bottom: 0px">
+                    <% running = [] %>
+                    <% failed = [] %>
+                    <% completed = [] %>
+                    <% queued = [] %>
+                    <% p.components.each do |k, v| %>
+                      <% if v[:job] %>
+                        <% if Job::state(v[:job]) == "Running" %>
+                          <% running << k %>
+                        <% elsif Job::state(v[:job]) == "Failed" or Job::state(v[:job]) == "Canceled" %>
+                          <% failed << k %>
+                        <% elsif Job::state(v[:job]) == "Completed" %>
+                          <% completed << k %>
+                        <% elsif Job::state(v[:job]) == "Queued" %>
+                          <% queued << k %>
+                        <% end %>
+                      <% end %>
+                    <% end %>
+                    <% completed_pct = (completed.size * 100) / p.components.size %>
+                    <% failed_pct = (failed.size * 100) / p.components.size %>
+                    <% running_pct = (running.size * 100) / p.components.size %>
+                    <% queued_pct = (queued.size * 100) / p.components.size %>
+
+                    <div class="progress-bar progress-bar-success" style="width: <%= completed_pct %>%">
+                      <span class="sr-only"></span>
+                    </div>
+                    <div class="progress-bar progress-bar-warning" style="width: <%= failed_pct %>%">
+                      <span class="sr-only"></span>
+                    </div>
+                    <div class="progress-bar progress-bar-primary" style="width: <%= running_pct %>%">
+                      <span class="sr-only"></span>
+                    </div>
+                    <div class="progress-bar progress-bar-default" style="width: <%= queued_pct %>%">
+                      <span class="sr-only"></span>
+                    </div>
+                  </div>
+                </div>
+              </div>
+
+              <div class="clearfix">
+                Started at <span class="utc-date" data-utc-date="<%= p[:started_at] || p[:created_at] %>"><%= p[:created_at] %></span>.
+                <% pipeline_time = Time.now - (p[:started_at] || p[:created_at]) %>
+                Active for <%= runtime(pipeline_time, false) %>.
+
+                <div class="pull-right">
+                  <% running.each do |k| %>
+                    <span class="label label-primary"><%= k %></span>
+                  <% end %>
+                  <% queued.each do |k| %>
+                    <span class="label label-default"><%= k %></span>
+                  <% end %>
+                </div>
+              </div>
             </div>
           <% end %>
-        </div>
+          </div>
       </div>
 
       <div class="panel panel-default">
-        <div class="panel-heading">Recently finished pipelines</div>
+        <div class="panel-heading"><span class="panel-title">Recently finished pipelines</span></div>
         <div class="panel-body" style="overflow-x: scroll;">
           <% finished_pipelines(8).each do |p| %>
-            <div>
-              <%= link_to_if_arvados_object p, friendly_name: true %>
+            <div class="dashboard-panel-info-row">
+              <div class="row">
+                <div class="col-md-4">
+                <%= link_to_if_arvados_object p, friendly_name: true %>
+              </div>
+              <div class="col-md-4">
+                <%= render partial: "pipeline_status_label", locals: {p: p}%>
+              </div>
+              <div class="col-md-4">
+                <% outputs = [] %>
+                <% p.components.each do |k, c| %>
+                  <% outputs << c[:output_uuid] if c[:output_uuid] %>
+                <% end %>
+                <%= outputs %>
+              </div>
+              </div>
+
+              <div class="row">
+                <div class="col-md-12">
+                  Finished at <span class="utc-date" data-utc-date="<%= p[:finished_at] || p[:modified_at] %>"><%= p[:modified_at] %></span>.
+                  <% if p[:started_at] and p[:finished_at] %>
+                    <% pipeline_time = p[:finished_at] - p[:started_at] %>
+                    Active for <%= runtime(pipeline_time, false) %>.
+                  <% end %>
+                </div>
+              </div>
             </div>
           <% end %>
         </div>
       </div>
-    </div>
+        </div>
+
     <div class="col-md-6">
+      <% nodes = Node.all %>
       <div class="panel panel-default">
-        <div class="panel-heading">Recent collections</div>
+        <div class="panel-heading"><span class="panel-title"><a data-toggle="collapse" href="#compute_node_status">Compute node status</a></span></div>
+        <div class="panel-body">
+          <div class="compute-node-summary" data-toggle="collapse" href="#compute_node_status">
+            <%= render partial: 'compute_node_summary', locals: {nodes: nodes} %>
+          </div>
+          <div id="compute_node_status" class="collapse">
+            <%= render partial: 'compute_node_status', locals: {nodes: nodes} %>
+          </div>
+        </div>
+      </div>
+      <div class="panel panel-default">
+        <div class="panel-heading"><span class="panel-title">Recent collections</span></div>
         <div class="panel-body" style="overflow-x: scroll;">
           <% r = recent_collections(8) %>
           <% r[:collections].each do |p| %>
+            <div class="dashboard-panel-info-row">
             <div>
               <i class="fa fa-fw fa-folder-o"></i><%= link_to_if_arvados_object r[:owners][p[:owner_uuid]], friendly_name: true %>/
-              <span class="pull-right"><%= p[:modified_at] %></span>
+              <span class="pull-right"><span class="utc-date" data-utc-date="<%= p[:modified_at] %>">p[:modified_at]</span></span>
             </div>
             <div style="margin-left: 1em"><%= link_to_if_arvados_object p, friendly_name: true %>
             </div>
+            </div>
           <% end %>
         </div>
       </div>
     </div>
   </div>
 
-  <div class="row">
-    <div class="col-sm-12">
-      <div class="panel panel-default">
-        <div class="panel-heading">
-          <div class="pull-right">
-            <%= link_to jobs_path, class: 'btn btn-default btn-xs' do %>
-              All jobs <i class="fa fa-fw fa-arrow-circle-right"></i>
-            <% end %>
-            <%= link_to pipeline_instances_path, class: 'btn btn-default btn-xs' do %>
-              All pipelines <i class="fa fa-fw fa-arrow-circle-right"></i>
-            <% end %>
-          </div>
-          <h3 class="panel-title">
-            Recent jobs and pipelines
-          </h3>
-        </div>
-        <div class="panel-body">
-          <%= render partial: 'index_jobs_and_pipelines' %>
-        </div>
-      </div>
-    </div>
-  </div>
 </div>
diff --git a/services/api/app/controllers/arvados/v1/jobs_controller.rb b/services/api/app/controllers/arvados/v1/jobs_controller.rb
index 55e2d73..afb516b 100644
--- a/services/api/app/controllers/arvados/v1/jobs_controller.rb
+++ b/services/api/app/controllers/arvados/v1/jobs_controller.rb
@@ -162,6 +162,10 @@ class Arvados::V1::JobsController < ApplicationController
     index
   end
 
+  def queue_size
+    render :json => {:queue_size => Job.queue.size}
+  end
+
   def self._create_requires_parameters
     (super rescue {}).
       merge({
diff --git a/services/api/config/routes.rb b/services/api/config/routes.rb
index 74d2aea..bcfe9b8 100644
--- a/services/api/config/routes.rb
+++ b/services/api/config/routes.rb
@@ -22,6 +22,7 @@ Server::Application.routes.draw do
       resources :job_tasks
       resources :jobs do
         get 'queue', on: :collection
+        get 'queue_size', on: :collection
         post 'cancel', on: :member
       end
       resources :keep_disks do

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list