Merge branch 'master' into 10645-cr-mounts-display
authorradhika <radhika@curoverse.com>
Mon, 8 May 2017 16:42:10 +0000 (12:42 -0400)
committerradhika <radhika@curoverse.com>
Mon, 8 May 2017 16:42:10 +0000 (12:42 -0400)
apps/workbench/app/models/container_work_unit.rb
apps/workbench/app/models/work_unit.rb
apps/workbench/app/views/work_units/_component_detail.html.erb
apps/workbench/app/views/work_units/_show_table_data.html.erb [new file with mode: 0644]
apps/workbench/test/controllers/container_requests_controller_test.rb
services/api/test/fixtures/container_requests.yml

index 16462f77d817b89aa2c24853caf2dd628772f235..84fc1f8f0978e16a86bd34fde8d07a6d2d9cd7c1 100644 (file)
@@ -53,6 +53,10 @@ class ContainerWorkUnit < ProxyWorkUnit
     get(:container_uuid)
   end
 
+  def requesting_container_uuid
+    get(:requesting_container_uuid)
+  end
+
   def priority
     @proxied.priority
   end
@@ -166,6 +170,13 @@ class ContainerWorkUnit < ProxyWorkUnit
 
   protected
   def get_combined key
-    get(key, @container) || get(key, @proxied)
+    from_container = get(key, @container)
+    from_proxied = get(key, @proxied)
+
+    if from_container.is_a? Hash or from_container.is_a? Array
+      if from_container.any? then from_container else from_proxied end
+    else
+      from_container || from_proxied
+    end
   end
 end
index e10f8b7f5f005c7e6e2730cf040e16f4bb2efcce..37554469c3f89b3f91c00300c603e3856a096dcd 100644 (file)
@@ -188,6 +188,10 @@ class WorkUnit
     # container_uuid of a container_request
   end
 
+  def requesting_container_uuid
+    # requesting_container_uuid of a container_request
+  end
+
   def log_object_uuids
     # object uuids for live log
   end
index bb5b913dfe4b85bdb28429b422fb611dd1b59a4f..99ac759503492394305867a73584fe1bd9991b31 100644 (file)
@@ -15,7 +15,7 @@
               No <%= current_obj.title %> has been submitted yet.
             <% else %>
             <table>
-              <% keys = [:uuid, :modified_by_user_uuid, :created_at, :started_at, :finished_at, :container_uuid, :priority] %>
+              <% keys = [:uuid, :modified_by_user_uuid, :created_at, :started_at, :finished_at, :container_uuid] %>
               <% keys << :log_collection if @object.uuid != current_obj.uuid %>
               <% keys << :outputs %>
               <% keys.each do |k| %>
                          object_for_dataclass(Repository, current_obj.repository, :name))
                  repo = nil unless repo.andand.http_fetch_url
                  %>
-              <% [:script, :repository, :script_version, :supplied_script_version, :nondeterministic,
-                  :command, :cwd, :environment, :mounts, :output_path].each do |k| %>
+              <% [:priority, :script, :repository, :script_version, :supplied_script_version, :nondeterministic,
+                  :runtime_constraints, :requesting_container_uuid].each do |k| %>
                 <% val = current_obj.send(k) if current_obj.respond_to?(k) %>
                 <% if val %>
-                <tr>
+                <tr valign="top">
                   <td style="padding-right: 1em">
                     <%= k.to_s %>:
                   </td>
                       <%= link_to val, show_repository_blob_path(id: repo.uuid, commit: current_obj.script_version, path: 'crunch_scripts/'+current_obj.script) %>
                     <% elsif repo and k == :script_version %>
                       <%= link_to val, show_repository_commit_path(id: repo.uuid, commit: current_obj.script_version) %>
+                    <% elsif k == :runtime_constraints and val.any? %>
+                      <%= render partial: 'work_units/show_table_data', locals: {id: current_obj.uuid, name: k, data_map: val} %>
+                    <% elsif k.to_s.end_with? 'uuid' %>
+                      <%= link_to_arvados_object_if_readable(val, val, friendly_name: true) %>
                     <% else %>
                       <%= val %>
                     <% end %>
                 </tr>
                 <% end %>
               <% end %>
+
+              <%
+                mounts = current_obj.send(:mounts) if current_obj.respond_to?(:mounts)
+                mount_wf = mounts.andand[:"/var/lib/cwl/workflow.json"]
+                mount_wf = mount_wf[5..-1] if mount_wf.andand.is_a?(String) and mount_wf.start_with?('keep:')
+                mount_wf_cls = resource_class_for_uuid(mount_wf) if mount_wf
+              %>
+              <tr>
+                <% if mount_wf_cls == Collection %>
+                  <td style="padding-right: 1em">
+                    workflow.json:
+                  </td>
+                  <td>
+                    <%= link_to_if_arvados_object mount_wf, friendly_name: true %>
+                  </td>
+                <% end %>
+              </tr>
+
               <% if current_obj.runtime_constraints.andand[:docker_image] and current_obj.docker_image %>
                 <tr>
                   <td style="padding-right: 1em">
               <% end %>
             </table>
           </div>
+
+          <div class="col-md-12">
+            <table style="width:100%;">
+              <col width="15%" />
+              <col width="85%" />
+              <% [:command].each do |k| %>
+                <% val = current_obj.send(k) if current_obj.respond_to?(k) %>
+                <% if val %>
+                <tr>
+                  <td valign="top">
+                    <%= k.to_s %>:
+                  </td>
+                  <td>
+                    <% if k == :command %>
+                      <div style="max-height:200px; overflow-y:auto;">
+                        <%=val%>
+                      </div>
+                    <% else %>
+                      <%= val %>
+                    <% end %>
+                  </td>
+                </tr>
+                <% end %>
+              <% end %>
+
+              <%
+                mounts = current_obj.send(:mounts) if current_obj.respond_to?(:mounts)
+                input_obj = mounts.andand[:"/var/lib/cwl/cwl.input.json"].andand[:content]
+                mnt_inputs = JSON.pretty_generate(input_obj) if input_obj
+              %>
+              <% if mnt_inputs %>
+                <tr>
+                  <td valign="top">
+                    cwl.input.json:
+                  </td>
+                  <td>
+                    <div style="max-height:200px; overflow:auto;">
+                      <% mnt_inputs.each_line do |l| %>
+                        <% text_part = l %>
+                          <% match = l.match /(.*)(\"keep:.*?\")/ %>
+                          <% if match and match.size == 3 %>
+                            <% text_part = match[1] %>
+                            <% loc_part = match[2][6..-2] %>
+                          <% end %>
+                          <span style="white-space: pre-wrap; margin: none;"><%= text_part %><%= if loc_part then link_to_arvados_object_if_readable(loc_part, loc_part, friendly_name: true) end %> <% if loc_part then %> <br/> <% end %></span>
+                      <% end %>
+                    </div>
+                  </td>
+                </tr>
+              <% end %>
+            </table>
+          </div>
+
         </div>
 
         <% if current_obj.parameters and !current_obj.parameters.empty? %>
diff --git a/apps/workbench/app/views/work_units/_show_table_data.html.erb b/apps/workbench/app/views/work_units/_show_table_data.html.erb
new file mode 100644 (file)
index 0000000..c445f8d
--- /dev/null
@@ -0,0 +1,14 @@
+<div class="data-table <%=name%>-table" id="<%=name%>-table" style="max-height: 150px; overflow-y: auto;">
+  <table>
+    <% data_map.each do |k, v|%>
+      <tr>
+        <td>
+          <%= k.to_s %>
+        </td>
+        <td style="padding-left: 1em; padding-right: 1em">
+          <%= v %>
+        </td>
+      </tr>
+    <% end %>
+  </table>
+</div>
index bd2f6beb6b45a6270825ba16eb34b2a0b00120ad..45be6a151e21b07f5ab41e8632b919529b31091e 100644 (file)
@@ -106,4 +106,20 @@ class ContainerRequestsControllerTest < ActionController::TestCase
       end
     end
   end
+
+  test "container request display" do
+    use_token 'active'
+
+    cr = api_fixture('container_requests')['completed_with_input_mounts']
+
+    get :show, {id: cr['uuid']}, session_for(:active)
+    assert_response :success
+
+    assert_includes @response.body, CGI.escapeHTML(cr['command'].to_s)
+    assert_includes @response.body, "href=\"\/collections/fa7aeb5140e2848d39b416daeef4ffc5+45%2Ffoo" # mount input1
+    assert_includes @response.body, "href=\"\/collections/fa7aeb5140e2848d39b416daeef4ffc5+45%2Fbar" # mount input2
+    assert_includes @response.body, "href=\"\/collections/1fd08fc162a5c6413070a8bd0bffc818+150" # mount workflow
+    assert_includes @response.body, "href=\"#Log\""
+    assert_includes @response.body, "href=\"#Provenance\""
+  end
 end
index d5bb47f6ff30e1bcae98944a47844b01f4d98c99..007e2318b3cb8e90a205a7c4cb4d490e9e0024ec 100644 (file)
@@ -268,6 +268,39 @@ canceled_with_running_container:
     vcpus: 1
     ram: 123
 
+completed_with_input_mounts:
+  uuid: zzzzz-xvhdp-crwithinputmnts
+  owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  name: completed container request
+  state: Final
+  priority: 1
+  created_at: <%= 24.hour.ago.to_s(:db) %>
+  updated_at: <%= 24.hour.ago.to_s(:db) %>
+  modified_at: <%= 24.hour.ago.to_s(:db) %>
+  modified_by_user_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  container_image: test
+  cwd: test
+  output_path: test
+  command: ["echo", "hello"]
+  runtime_constraints:
+    vcpus: 1
+    ram: 123
+  container_uuid: zzzzz-dz642-compltcontainer
+  log_uuid: zzzzz-4zz18-y9vne9npefyxh8g
+  output_uuid: zzzzz-4zz18-znfnqtbbv4spc3w
+  mounts:
+    /var/lib/cwl/cwl.input.json:
+      content:
+        input1:
+          basename: foo
+          class: File
+          location: "keep:fa7aeb5140e2848d39b416daeef4ffc5+45/foo"
+        input2:
+          basename: bar
+          class: File
+          location: "keep:fa7aeb5140e2848d39b416daeef4ffc5+45/bar"
+    /var/lib/cwl/workflow.json: "keep:1fd08fc162a5c6413070a8bd0bffc818+150"
+
 uncommitted:
   uuid: zzzzz-xvhdp-cr4uncommittedc
   owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz