Checkpoint, draws a somewhat useful graph, needs a lot of work though.
authorPeter Amstutz <peter.amstutz@curoverse.com>
Fri, 24 Jan 2014 22:10:24 +0000 (17:10 -0500)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Fri, 24 Jan 2014 22:10:24 +0000 (17:10 -0500)
apps/workbench/app/controllers/collections_controller.rb
apps/workbench/app/models/arvados_base.rb
apps/workbench/app/views/collections/show.html.erb

index 447b34d1ffaf514678f3603bbeeeaa115f44555c..e7d29e45f9c66e92cfbaaff758a37bc23346ea5a 100644 (file)
@@ -56,6 +56,54 @@ class CollectionsController < ApplicationController
     self.response_body = FileStreamer.new opts
   end
 
+  def generate_edges(gr, uuid, edge_added = false)
+    m = /([a-f0-9]{32}(\+[0-9]+)?)(\+.*)?/.match(uuid)
+    if m  
+      # uuid is a collection
+      uuid = m[1]
+      gr += "\"#{uuid}\" [href=\"#{collection_path uuid}\"];"
+
+      Job.where(output: uuid).each do |job|
+        gr += "\"#{job.uuid}\" [href=\"#{job_path job.uuid}\"];"
+        gr += "\"#{uuid}\" -> \"#{job.uuid}\" [label=\" output\"];"
+        gr = generate_edges(gr, job.uuid)
+      end
+
+      Job.where(log: uuid).each do |job|
+        gr += "\"#{job.uuid}\" [href=\"#{job_path job.uuid}\"];"
+        gr += "\"#{uuid}\" -> \"#{job.uuid}\" [label=\" log\"];"
+        gr = generate_edges(gr, job.uuid)
+      end
+      
+    else
+      # uuid is something else
+      rsc = ArvadosBase::resource_class_for_uuid uuid
+      gr += "\"#{uuid}\" [href=\"#{rsc}/#{uuid}\"];"
+      
+      if rsc.to_s == "Job"
+        Job.where(uuid: uuid).each do |job|
+          job.script_parameters.each do |k, v|
+            gr += "\"#{job.uuid}\" [href=\"#{job_path job.uuid}\"];"
+            gr += "\"#{job.uuid}\" -> \"#{v}\" [label=\" #{k}\"];"
+            gr = generate_edges(gr, v)
+          end
+        end
+      end
+     
+      gr
+    end
+
+    Link.where(head_uuid: uuid, link_class: "provenance", name: "provided").each do |link|
+      rsc = ArvadosBase::resource_class_for_uuid link.tail_uuid
+      puts "rsc is #{rsc}"
+      gr += "\"#{link.tail_uuid}\" [href=\"#{rsc}/#{link.tail_uuid}\"];"
+      gr += "\"#{link.head_uuid}\" -> \"#{link.tail_uuid}\" [label=\" provided\"];"
+      generate_edges(gr, link.tail_uuid)
+    end
+
+    gr
+  end
+
   def show
     return super if !@object
     @provenance = []
@@ -100,6 +148,28 @@ class CollectionsController < ApplicationController
         @sourcedata[collection.uuid][:collection] = collection
       end
     end
+
+    require 'open3'
+    
+    gr = "digraph {"
+    gr += "node [fontsize=8];"
+    gr += "edge [dir=back,fontsize=8];"
+    
+    gr = generate_edges(gr, @object.uuid)
+
+    gr += "}"
+    @prov_svg = ""
+
+    Open3.popen2("dot", "-Tsvg") do |stdin, stdout, wait_thr|
+      stdin.print(gr)
+      stdin.close
+      wait_thr.value
+      @prov_svg = stdout.read()
+      stdout.close()
+    end
+
+    @prov_svg = @prov_svg.sub(/<\?xml.*?\?>/m, "")
+    @prov_svg = @prov_svg.sub(/<!DOCTYPE.*?>/m, "")
   end
 
   protected
index a648a8f07d26ffee805a9577cdd4e21c95b915fa..4a3a6629042ce0b7fbb2bf67638fad6df624415e 100644 (file)
@@ -16,7 +16,8 @@ class ArvadosBase < ActiveRecord::Base
       'd1hrv' => 'arvados#pipeline_instance',
       'uo14g' => 'arvados#pipeline_instance', # legacy PipelineInstance objects
       'j7d0g' => 'arvados#group',
-      'ldvyl' => 'arvados#group' # only needed for legacy Project objects
+      'ldvyl' => 'arvados#group', # only needed for legacy Project objects
+      '7a9it' => 'arvados#human'
     }
   end
 
index 0c5795d509d79747b59a87559d6c400e5fc78448..85fdeede491bb0f5241acca2e744bda4c1764bc3 100644 (file)
@@ -23,6 +23,8 @@
   <li><a href="#jobs" data-toggle="tab">Jobs (<%= @provenance.size %>)</a></li>
   <li><a href="#sourcedata" data-toggle="tab">Source data (<%= @sourcedata.size %>)</a></li>
   <li><a href="#owner-groups-resources" data-toggle="tab">Owner, groups, resources</a></li>
+  <li><a href="#provenance2" data-toggle="tab">Provenance graph</a></li>
+  <li><a href="#used-by" data-toggle="tab">Used by</a></li>
 </ul>
 
 <div class="tab-content">
       </tbody>
     </table>
   </div>
+  <div id="provenance2" class="tab-pane fade">
+    <%= raw(@prov_svg) %>
+  </div>
   <div id="jobs" class="tab-pane fade">
     <table class="topalign table table-bordered">
       <thead>