[ARVADOS] updated: 795bf007cbe24775bd348fb40fc5c28d93c8f23d

Git user git at public.curoverse.com
Mon May 15 16:09:04 EDT 2017


Summary of changes:
 .../controllers/container_requests_controller.rb   |  55 +++++++-
 apps/workbench/app/helpers/provenance_helper.rb    | 145 ++++++++-------------
 2 files changed, 100 insertions(+), 100 deletions(-)

       via  795bf007cbe24775bd348fb40fc5c28d93c8f23d (commit)
      from  b29ca38e4409fe0149aea28a0e26a84d56ccca17 (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 795bf007cbe24775bd348fb40fc5c28d93c8f23d
Author: Lucas Di Pentima <lucas at curoverse.com>
Date:   Mon May 15 17:08:11 2017 -0300

    10111: Moved the api request related code to the controller.

diff --git a/apps/workbench/app/controllers/container_requests_controller.rb b/apps/workbench/app/controllers/container_requests_controller.rb
index d45e572..6eaed2d 100644
--- a/apps/workbench/app/controllers/container_requests_controller.rb
+++ b/apps/workbench/app/controllers/container_requests_controller.rb
@@ -8,12 +8,55 @@ class ContainerRequestsController < ApplicationController
     return if params['tab_pane'] != "Provenance"
 
     nodes = {cr[:uuid] => cr}
-    @svg = ProvenanceHelper::create_provenance_graph nodes,
-                                                     "provenance_svg",
-                                                     {
-                                                       :request => request,
-                                                       :direction => :top_down,
-                                                     }
+    child_crs = []
+    col_uuids = []
+    col_pdhs = []
+    col_uuids << cr[:output_uuid] if cr[:output_uuid]
+    col_pdhs += ProvenanceHelper::cr_input_pdhs(cr)
+
+    # Search for child CRs
+    if cr[:container_uuid]
+      child_crs = ContainerRequest.where(requesting_container_uuid: cr[:container_uuid])
+
+      child_crs.each do |child|
+        nodes[child[:uuid]] = child
+        col_uuids << child[:output_uuid] if child[:output_uuid]
+        col_pdhs += ProvenanceHelper::cr_input_pdhs(child)
+      end
+    end
+
+    output_cols = {} # Indexed by UUID
+    input_cols = {} # Indexed by PDH
+    output_pdhs = []
+
+    # Batch requests to get all related collections
+    # First fetch output collections by UUID.
+    Collection.filter([['uuid', 'in', col_uuids.uniq]]).each do |c|
+      output_cols[c[:uuid]] = c
+      output_pdhs << c[:portable_data_hash]
+    end
+    # Then, get only input collections by PDH. There could be more than one collection
+    # per PDH: the number of collections is used on the collection node label.
+    Collection.filter(
+      [['portable_data_hash', 'in', col_pdhs - output_pdhs]]).each do |c|
+      if input_cols[c[:portable_data_hash]]
+        input_cols[c[:portable_data_hash]] << c
+      else
+        input_cols[c[:portable_data_hash]] = [c]
+      end
+    end
+
+    @svg = ProvenanceHelper::create_provenance_graph(
+      nodes, "provenance_svg",
+      {
+        :request => request,
+        :direction => :top_down,
+        :output_collections => output_cols,
+        :input_collections => input_cols,
+        :cr_children_of => {
+          cr[:uuid] => child_crs.select{|child| child[:uuid]},
+        },
+      })
   end
 
   def show_pane_list
diff --git a/apps/workbench/app/helpers/provenance_helper.rb b/apps/workbench/app/helpers/provenance_helper.rb
index 3567cba..0b83975 100644
--- a/apps/workbench/app/helpers/provenance_helper.rb
+++ b/apps/workbench/app/helpers/provenance_helper.rb
@@ -110,19 +110,6 @@ module ProvenanceHelper
       gr
     end
 
-    def cr_input_pdhs cr
-      pdhs = []
-      input_obj = cr[:mounts].andand[:"/var/lib/cwl/cwl.input.json"].andand[:content] || cr[:mounts]
-      if input_obj
-        ProvenanceHelper::find_collections input_obj do |col_hash, col_uuid, key|
-          if col_hash
-            pdhs << col_hash
-          end
-        end
-      end
-      pdhs
-    end
-
     def job_edges job, edge_opts={}
       uuid = job_uuid(job)
       gr = ""
@@ -206,92 +193,49 @@ module ProvenanceHelper
         elsif rsc == ContainerRequest
           cr = @pdata[uuid]
           if cr
-            child_crs = []
-            col_uuids = []
-            col_pdhs = []
-            col_uuids << cr[:output_uuid] if cr[:output_uuid]
-            col_pdhs += cr_input_pdhs(cr)
-            # Search for child CRs
-            if cr[:container_uuid]
-              child_crs = ContainerRequest.where(requesting_container_uuid: cr[:container_uuid])
-              child_crs.each do |child|
-                col_uuids << child[:output_uuid] if child[:output_uuid]
-                col_pdhs += cr_input_pdhs(child)
-              end
-            end
-
-            output_cols = {} # Indexed by UUID
-            input_cols = {} # Indexed by PDH
-
-            # Batch requests to get all related collections
-            Collection.filter([['uuid', 'in', col_uuids.uniq]]).each do |c|
-              output_cols[c[:uuid]] = c
-            end
-            output_pdhs = output_cols.values.map{|c| c[:portable_data_hash]}.uniq
-            Collection.filter([['portable_data_hash', 'in',  col_pdhs - output_pdhs]]).each do |c|
-              if input_cols[c[:portable_data_hash]]
-                input_cols[c[:portable_data_hash]] << c
-              else
-                input_cols[c[:portable_data_hash]] = [c]
+            gr += describe_node(cr[:uuid], {href: {controller: 'container_requests',
+                                                   id: cr[:uuid]},
+                                            label: cr[:name],
+                                            shape: 'oval'})
+            # Connect child CRs
+            children = @opts[:cr_children_of].andand[cr[:uuid]]
+            if children
+              children.each do |child|
+                gr += edge(child[:uuid], cr[:uuid], {label: 'child'})
               end
             end
-
-            # Make the graph
-            visited_pdhs = []
-            all_cr_nodes = [cr] + child_crs.results
-
-            # First pass: add the CR nodes with their outputs, because they're
-            # referenced by UUID.
-            all_cr_nodes.each do |cr_node|
-              # CR node
-              gr += describe_node(cr_node[:uuid], {href: {controller: 'container_requests',
-                                                          id: cr_node[:uuid]},
-                                                   label: cr_node[:name],
-                                                   shape: 'oval'})
-              # Connect child CRs with the main one
-              if cr_node != cr
-                gr += edge(cr_node[:uuid], cr[:uuid], {label: 'child'})
-              end
-              # Output collection node
-              if cr_node[:output_uuid] and output_cols[cr_node[:output_uuid]]
-                c = output_cols[cr_node[:output_uuid]]
-                visited_pdhs << c[:portable_data_hash]
-                gr += describe_node(c[:portable_data_hash],
-                                    {
-                                      label: c[:name],
-                                      col_uuid: c[:uuid],
-                                    })
-                gr += edge(cr_node[:uuid],
-                           c[:portable_data_hash],
-                           {label: 'output'})
-              end
+            # Output collection node
+            if cr[:output_uuid] and @opts[:output_collections][cr[:output_uuid]]
+              c = @opts[:output_collections][cr[:output_uuid]]
+              gr += describe_node(c[:portable_data_hash],
+                                  {
+                                    label: c[:name],
+                                    col_uuid: c[:uuid],
+                                  })
+              gr += edge(cr[:uuid],
+                         c[:portable_data_hash],
+                         {label: 'output'})
             end
-
-            # Second pass: add the input collection nodes.
-            all_cr_nodes.each do |cr_node|
-              cr_input_pdhs(cr_node).each do |pdh|
-                if not visited_pdhs.include?(pdh)
-                  visited_pdhs << pdh
-                  if input_cols[pdh]
-                    # First search for collections within the CR project
-                    cols = input_cols[pdh].select{|x| x[:owner_uuid] == cr_node[:owner_uuid]}
-                    if cols.empty?
-                      # Search for any collection with this PDH
-                      cols = input_cols[pdh]
-                    end
-                    names = cols.collect{|x| x[:name]}.uniq
-                    input_name = names.first
-                    if names.length > 1
-                      input_name += " + #{names.length - 1} others"
-                    end
-                  else
-                    # No collection found by this PDH
-                    input_name = pdh
-                  end
-                  gr += describe_node(pdh, {label: input_name})
+            # Input collection nodes
+            output_pdhs = @opts[:output_collections].values.collect{|c|
+              c[:portable_data_hash]}
+            ProvenanceHelper::cr_input_pdhs(cr).each do |pdh|
+              if not output_pdhs.include?(pdh)
+                # Search for collections on the same project first
+                cols = @opts[:input_collections][pdh].andand.select{|c|
+                  c[:owner_uuid] == cr[:owner_uuid]}
+                if not cols or cols.empty?
+                  # Search for any collection with this PDH
+                  cols = @opts[:input_collections][pdh]
+                end
+                names = cols.collect{|x| x[:name]}.uniq
+                input_name = names.first
+                if names.length > 1
+                  input_name += " + #{names.length - 1} more"
                 end
-                gr += edge(pdh, cr_node[:uuid], {label: 'input'})
+                gr += describe_node(pdh, {label: input_name})
               end
+              gr += edge(pdh, cr[:uuid], {label: 'input'})
             end
           end
         end
@@ -439,4 +383,17 @@ edge [fontsize=10,fontname=\"Helvetica,Arial,sans-serif\"];
       end
     end
   end
+
+  def self.cr_input_pdhs cr
+    pdhs = []
+    input_obj = cr[:mounts].andand[:"/var/lib/cwl/cwl.input.json"].andand[:content] || cr[:mounts]
+    if input_obj
+      find_collections input_obj do |col_hash, col_uuid, key|
+        if col_hash
+          pdhs << col_hash
+        end
+      end
+    end
+    pdhs
+  end
 end

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


hooks/post-receive
-- 




More information about the arvados-commits mailing list