8876: work unit views
[arvados.git] / apps / workbench / app / models / pipeline_instance_work_unit.rb
1 class PipelineInstanceWorkUnit < ProxyWorkUnit
2   def children
3     items = []
4
5     jobs = {}
6     results = Job.where(uuid: self.proxied.job_ids.values).results
7     results.each do |j|
8       jobs[j.uuid] = j
9     end
10
11     components = (self.proxied.components if self.proxied.respond_to?(:components)) || self.proxied[:components]
12     components.each do |name, c|
13       if c.is_a?(Hash)
14         job = c[:job]
15         if job
16           if job[:uuid] and jobs[job[:uuid]]
17             items << jobs[job[:uuid]].work_unit(name)
18           else
19             items << JobWorkUnit.new(job, name)
20           end
21         else
22           items << ProxyWorkUnit.new(c, name)
23         end
24       else
25         break
26       end
27     end
28
29     items
30   end
31
32   def progress
33     state = (self.proxied.state if self.proxied.respond_to?(:state)) || self.proxied[:state]
34     if state == 'Complete'
35       return 1.0
36     end
37
38     done = 0
39     failed = 0
40     todo = 0
41     children.each do |c|
42       if c.success?.nil?
43         todo = todo+1
44       elsif c.success?
45         done = done+1
46       else
47         failed = failed+1
48       end
49     end
50
51     if done + failed + todo > 0
52       total = done + failed + todo
53       (done+failed).to_f / total
54     else
55       0.0
56     end
57   end
58
59   def can_cancel?
60     true
61   end
62
63   def uri
64     uuid = (self.proxied.uuid if self.proxied.respond_to?(:uuid)) || self.proxied[:uuid]
65     "/pipeline_instances/#{uuid}"
66   end
67
68   def title
69     "pipeline"
70   end
71 end