[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