[ARVADOS] updated: a0187bc7327e7abfc759a43cee81cb77fe063bf0

Git user git at public.curoverse.com
Mon May 30 20:43:48 EDT 2016


Summary of changes:
 apps/workbench/app/models/job_work_unit.rb         | 30 ++------
 .../app/models/pipeline_instance_work_unit.rb      | 31 +-------
 apps/workbench/app/models/proxy_work_unit.rb       | 71 ++++++++++++++++++
 apps/workbench/app/models/work_unit.rb             |  4 +
 .../app/views/work_unit/_show_child.html.erb       | 13 +---
 .../app/views/work_unit/_show_component.html.erb   | 19 +++--
 apps/workbench/test/integration/jobs_test.rb       | 85 +++++++++++++---------
 apps/workbench/test/unit/work_unit_test.rb         |  2 +-
 services/api/test/fixtures/links.yml               | 15 ++++
 9 files changed, 166 insertions(+), 104 deletions(-)

       via  a0187bc7327e7abfc759a43cee81cb77fe063bf0 (commit)
      from  bbbf60994bf4fc2733d3395b870359b5a96df227 (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 a0187bc7327e7abfc759a43cee81cb77fe063bf0
Author: radhika <radhika at curoverse.com>
Date:   Mon May 30 20:41:32 2016 -0400

    8876: For jobs also, compute progress from it's children if present; otherwise, use task_summary.

diff --git a/apps/workbench/app/models/job_work_unit.rb b/apps/workbench/app/models/job_work_unit.rb
index 8fc3285..2560037 100644
--- a/apps/workbench/app/models/job_work_unit.rb
+++ b/apps/workbench/app/models/job_work_unit.rb
@@ -1,9 +1,9 @@
 class JobWorkUnit < ProxyWorkUnit
   def children
-    uuid = get(:uuid)
-    items = []
+    return self.my_children if self.my_children
 
     # Jobs components
+    items = []
     components = get(:components)
     uuids = components.andand.collect {|_, v| v}
     return items if (!uuids or uuids.empty?)
@@ -19,26 +19,8 @@ class JobWorkUnit < ProxyWorkUnit
         items << obj.work_unit(components.key(obj.uuid))
       end
     end
-    items
-  end
-
-  def progress
-    state = get(:state)
-    if state == 'Complete'
-      return 1.0
-    end
 
-    tasks_summary = get(:tasks_summary)
-    failed = tasks_summary[:failed] || 0 rescue 0
-    done = tasks_summary[:done] || 0 rescue 0
-    running = tasks_summary[:running] || 0 rescue 0
-    todo = tasks_summary[:todo] || 0 rescue 0
-    if done + running + failed + todo > 0
-      total_tasks = done + running + failed + todo
-      (done+failed).to_f / total_tasks
-    else
-      0.0
-    end
+    self.my_children = items
   end
 
   def docker_image
@@ -62,7 +44,11 @@ class JobWorkUnit < ProxyWorkUnit
   end
 
   def child_summary
-    get(:tasks_summary)
+    if children.any?
+      super
+    else
+      get(:tasks_summary)
+    end
   end
 
   def can_cancel?
diff --git a/apps/workbench/app/models/pipeline_instance_work_unit.rb b/apps/workbench/app/models/pipeline_instance_work_unit.rb
index 578e193..8285424 100644
--- a/apps/workbench/app/models/pipeline_instance_work_unit.rb
+++ b/apps/workbench/app/models/pipeline_instance_work_unit.rb
@@ -1,5 +1,7 @@
 class PipelineInstanceWorkUnit < ProxyWorkUnit
   def children
+    return self.my_children if self.my_children
+
     items = []
 
     jobs = {}
@@ -27,34 +29,7 @@ class PipelineInstanceWorkUnit < ProxyWorkUnit
       end
     end
 
-    items
-  end
-
-  def progress
-    state = get(:state)
-    if state == 'Complete'
-      return 1.0
-    end
-
-    done = 0
-    failed = 0
-    todo = 0
-    children.each do |c|
-      if c.success?.nil?
-        todo = todo+1
-      elsif c.success?
-        done = done+1
-      else
-        failed = failed+1
-      end
-    end
-
-    if done + failed + todo > 0
-      total = done + failed + todo
-      (done+failed).to_f / total
-    else
-      0.0
-    end
+    self.my_children = items
   end
 
   def uri
diff --git a/apps/workbench/app/models/proxy_work_unit.rb b/apps/workbench/app/models/proxy_work_unit.rb
index 9798361..b8680a6 100644
--- a/apps/workbench/app/models/proxy_work_unit.rb
+++ b/apps/workbench/app/models/proxy_work_unit.rb
@@ -3,6 +3,7 @@ class ProxyWorkUnit < WorkUnit
 
   attr_accessor :lbl
   attr_accessor :proxied
+  attr_accessor :my_children
   attr_accessor :unreadable_children
 
   def initialize proxied, label
@@ -74,6 +75,76 @@ class ProxyWorkUnit < WorkUnit
     end
   end
 
+  def child_summary
+    done = 0
+    failed = 0
+    todo = 0
+    running = 0
+    children.each do |c|
+      case c.state_label
+      when 'Complete'
+        done = done+1
+      when 'Failed', 'Cancelled'
+        failed = failed+1
+      when 'Running'
+        running = running+1
+      else
+        todo = todo+1
+      end
+    end
+
+    summary = {}
+    summary[:done] = done
+    summary[:failed] = failed
+    summary[:todo] = todo
+    summary[:running] = running
+    summary
+  end
+
+  def child_summary_str
+    summary = child_summary
+    summary_txt = ''
+
+    if state_label == 'Running'
+      if summary[:done]
+        summary_txt += "#{summary[:done]} #{'child'.pluralize(summary[:done])} done,"
+      end
+      if summary[:failed]
+        summary_txt += "#{summary[:failed]} failed,"
+      end
+      if summary[:running]
+        summary_txt += "#{summary[:running]} running,"
+      end
+      if summary[:todo]
+        summary_txt += "#{summary[:todo]} pending"
+      end
+    end
+    summary_txt
+  end
+
+  def progress
+    state = get(:state)
+    if state == 'Complete'
+      return 1.0
+    elsif state == 'Failed' or state== 'Cancelled'
+      return 0.0
+    end
+
+    summary = child_summary
+    return 0.0 if summary.nil?
+
+    done = summary[:done] || 0
+    running = summary[:running] || 0
+    failed = summary[:failed] || 0
+    todo = summary[:todo] || 0
+    total = done + running + failed + todo
+    if total > 0
+      (done+failed).to_f / total
+    else
+      0.0
+    end
+  end
+
   def parameters
     get(:script_parameters)
   end
diff --git a/apps/workbench/app/models/work_unit.rb b/apps/workbench/app/models/work_unit.rb
index 7439128..fba9015 100644
--- a/apps/workbench/app/models/work_unit.rb
+++ b/apps/workbench/app/models/work_unit.rb
@@ -95,6 +95,10 @@ class WorkUnit
     # summary status of any children of this work unit
   end
 
+  def child_summary_str
+    # textual representation of child summary
+  end
+
   def can_cancel?
     # returns true if this work unit can be canceled
   end
diff --git a/apps/workbench/app/views/work_unit/_show_child.html.erb b/apps/workbench/app/views/work_unit/_show_child.html.erb
index 0824871..64881a1 100644
--- a/apps/workbench/app/views/work_unit/_show_child.html.erb
+++ b/apps/workbench/app/views/work_unit/_show_child.html.erb
@@ -63,17 +63,8 @@
               <%# column offset 8 %>
               <div class="col-md-3">
                 <span class="task-summary-status">
-                  <% if current_obj.child_summary[:done] %>
-                    <%= current_obj.child_summary[:done] %> <%= "child".pluralize(current_obj.child_summary[:done]) %> done,
-                  <% end %>
-                  <% if current_obj.child_summary[:failed] %>
-                    <%= current_obj.child_summary[:failed] %> failed,
-                  <% end %>
-                  <% if current_obj.child_summary[:running] %>
-                    <%= current_obj.child_summary[:running] %> running,
-                  <% end %>
-                  <% if current_obj.child_summary[:todo] %>
-                    <%= current_obj.child_summary[:todo] %> pending
+                  <% if current_obj.child_summary_str %>
+                    <%= current_obj.child_summary_str %>
                   <% end %>
                 </span>
               </div>
diff --git a/apps/workbench/app/views/work_unit/_show_component.html.erb b/apps/workbench/app/views/work_unit/_show_component.html.erb
index 23ac3d3..dbf1c11 100644
--- a/apps/workbench/app/views/work_unit/_show_component.html.erb
+++ b/apps/workbench/app/views/work_unit/_show_component.html.erb
@@ -4,10 +4,18 @@
   <div class="row-fluid">
     <%# Need additional handling for main object display  %>
     <% if @object.uuid == wu.uuid %>
-      <div class="col-md-2 pull-right">
+    <div class="container-fluid">
+      <div class="pull-right">
         <div class="container-fluid">
-          <div class="row-fluid">
-            <%# column offset 0 %>
+          <div class="row-fulid pipeline-instance-spacing">
+            <% if wu.state_label == 'Running' and wu.child_summary_str %>
+              <div class="col-md-8">
+                <%= wu.child_summary_str %>
+              </div>
+            <% end %>
+            <div class="col-md-3">
+              <%= render partial: 'work_unit/progress', locals: {wu: wu} %>
+            </div>
             <% if wu.state_label.in? ["Queued", "Running"] and wu.can_cancel? and @object.editable? %>
                 <div class="col-md-1">
                   <%= form_tag "#{wu.uri}/cancel", remote: true, style: "display:inline; padding-left: 1em" do |f| %>
@@ -16,13 +24,10 @@
                   <% end %>
                 </div>
             <% end %>
-            <%# column offset 1 %>
-            <div class="pull-right col-md-5 pipeline-instance-spacing">
-              <%= render partial: 'work_unit/progress', locals: {wu: wu} %>
-            </div>
           </div>
         </div>
       </div>
+    </div>
     <% end %>
 
     <div class="col-md-10" >
diff --git a/apps/workbench/test/integration/jobs_test.rb b/apps/workbench/test/integration/jobs_test.rb
index de04aa8..1ad3296 100644
--- a/apps/workbench/test/integration/jobs_test.rb
+++ b/apps/workbench/test/integration/jobs_test.rb
@@ -127,44 +127,59 @@ class JobsTest < ActionDispatch::IntegrationTest
     end
   end
 
-  test 'view job with components' do
-    job = api_fixture('jobs')['running_job_with_components']
-    component1 = api_fixture('jobs')['completed_job_in_publicly_accessible_project']
-    component2 = api_fixture('pipeline_instances')['running_pipeline_with_complete_job']
-    component2_child1 = api_fixture('jobs')['previous_job_run']
-    component2_child2 = api_fixture('jobs')['running']
-
-    visit page_with_token("active", "/jobs/#{job['uuid']}")
-    assert page.has_text? job['script_version']
-    assert page.has_no_text? 'script_parameters'
+  [
+    ['active', true],
+    ['job_reader', false],
+  ].each do |user, readable|
+    test "view job with components as #{user} user" do
+      job = api_fixture('jobs')['running_job_with_components']
+      component1 = api_fixture('jobs')['completed_job_in_publicly_accessible_project']
+      component2 = api_fixture('pipeline_instances')['running_pipeline_with_complete_job']
+      component2_child1 = api_fixture('jobs')['previous_job_run']
+      component2_child2 = api_fixture('jobs')['running']
+
+      visit page_with_token(user, "/jobs/#{job['uuid']}")
+      assert page.has_text? job['script_version']
+      assert page.has_no_text? 'script_parameters'
+
+      if readable
+        assert page.has_link? 'component1'
+        assert page.has_link? 'component2'
+      else
+        # children are not readable by user
+        assert page.has_no_link? 'component1'
+        assert page.has_no_link? 'component2'
+        return
+      end
 
-    click_link('component1')
-    within('#collapse1') do
-      assert(has_text? component1['uuid'])
-      assert(has_text? component1['script_version'])
-      assert(has_text? 'script_parameters')
-    end
-    click_link('component1')
-
-    click_link('component2')
-    within('#collapse2') do
-      assert(has_text? component2['uuid'])
-      assert(has_text? component2['script_version'])
-      assert(has_no_text? 'script_parameters')
-      assert(has_link? 'previous')
-      assert(has_link? 'running')
-
-      click_link('previous')
-      within('#collapse3') do
-        assert(has_text? component2_child1['uuid'])
-        assert(has_text? component2_child1['script_version'])
+      click_link('component1')
+      within('#collapse1') do
+        assert(has_text? component1['uuid'])
+        assert(has_text? component1['script_version'])
+        assert(has_text? 'script_parameters')
       end
-      click_link('previous')
+      click_link('component1')
+
+      click_link('component2')
+      within('#collapse2') do
+        assert(has_text? component2['uuid'])
+        assert(has_text? component2['script_version'])
+        assert(has_no_text? 'script_parameters')
+        assert(has_link? 'previous')
+        assert(has_link? 'running')
+
+        click_link('previous')
+        within('#collapse3') do
+          assert(has_text? component2_child1['uuid'])
+          assert(has_text? component2_child1['script_version'])
+        end
+        click_link('previous')
 
-      click_link('running')
-      within('#collapse4') do
-        assert(has_text? component2_child2['uuid'])
-        assert(has_text? component2_child2['script_version'])
+        click_link('running')
+        within('#collapse4') do
+          assert(has_text? component2_child2['uuid'])
+          assert(has_text? component2_child2['script_version'])
+        end
       end
     end
   end
diff --git a/apps/workbench/test/unit/work_unit_test.rb b/apps/workbench/test/unit/work_unit_test.rb
index 63f6a5a..a1de629 100644
--- a/apps/workbench/test/unit/work_unit_test.rb
+++ b/apps/workbench/test/unit/work_unit_test.rb
@@ -2,7 +2,7 @@ require 'test_helper'
 
 class WorkUnitTest < ActiveSupport::TestCase
   [
-    [Job, 'running_job_with_components', "jwu", 2, "Running", nil, 0.2],
+    [Job, 'running_job_with_components', "jwu", 2, "Running", nil, 0.5],
     [PipelineInstance, 'pipeline_in_running_state', nil, 1, "Running", nil, 0.0],
     [PipelineInstance, 'has_component_with_completed_jobs', nil, 3, "Complete", true, 1.0],
     [PipelineInstance, 'pipeline_with_tagged_collection_input', "pwu", 1, "Ready", nil, 0.0],
diff --git a/services/api/test/fixtures/links.yml b/services/api/test/fixtures/links.yml
index 7ed7f6b..96e82cc 100644
--- a/services/api/test/fixtures/links.yml
+++ b/services/api/test/fixtures/links.yml
@@ -702,6 +702,21 @@ job_reader_can_read_previous_job_run:
   tail_uuid: zzzzz-tpzed-905b42d1dd4a354
   head_uuid: zzzzz-8i9sb-cjs4pklxxjykqqq
 
+job_reader_can_read_job_with_components:
+  # Permission link giving job_reader permission
+  # to read running_job_with_components
+  uuid: zzzzz-o0j2j-jobcomps4jobrdr
+  owner_uuid: zzzzz-tpzed-000000000000000
+  created_at: 2014-06-13 20:42:26 -0800
+  modified_by_client_uuid: zzzzz-tpzed-000000000000000
+  modified_by_user_uuid: zzzzz-tpzed-000000000000000
+  modified_at: 2014-06-13 20:42:26 -0800
+  updated_at: 2014-06-13 20:42:26 -0800
+  link_class: permission
+  name: can_read
+  tail_uuid: zzzzz-tpzed-905b42d1dd4a354
+  head_uuid: zzzzz-8i9sb-with2components
+
 job_reader_can_read_foo_repo:
   # Permission link giving job_reader permission
   # to read foo_repo

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


hooks/post-receive
-- 




More information about the arvados-commits mailing list