Merge branch 'master' into 8876-work-unit
[arvados.git] / apps / workbench / app / models / proxy_work_unit.rb
1 class ProxyWorkUnit < WorkUnit
2   require 'time'
3
4   attr_accessor :lbl
5   attr_accessor :proxied
6   attr_accessor :my_children
7   attr_accessor :unreadable_children
8
9   def initialize proxied, label
10     self.lbl = label
11     self.proxied = proxied
12   end
13
14   def label
15     self.lbl
16   end
17
18   def uuid
19     get(:uuid)
20   end
21
22   def modified_by_user_uuid
23     get(:modified_by_user_uuid)
24   end
25
26   def created_at
27     t = get(:created_at)
28     t = Time.parse(t) if (t.andand.class == String)
29     t
30   end
31
32   def started_at
33     t = get(:started_at)
34     t = Time.parse(t) if (t.andand.class == String)
35     t
36   end
37
38   def finished_at
39     t = get(:finished_at)
40     t = Time.parse(t) if (t.andand.class == String)
41     t
42   end
43
44   def state_label
45     state = get(:state)
46     if ["Running", "RunningOnServer", "RunningOnClient"].include? state
47       "Running"
48     else
49       state
50     end
51   end
52
53   def state_bootstrap_class
54     state = get(:state)
55     case state
56     when 'Complete'
57       'success'
58     when 'Failed', 'Cancelled'
59       'danger'
60     when 'Running', 'RunningOnServer', 'RunningOnClient'
61       'info'
62     else
63       'default'
64     end
65   end
66
67   def success?
68     state = get(:state)
69     if state == 'Complete'
70       true
71     elsif state == 'Failed'
72       false
73     else
74       nil
75     end
76   end
77
78   def child_summary
79     done = 0
80     failed = 0
81     todo = 0
82     running = 0
83     children.each do |c|
84       case c.state_label
85       when 'Complete'
86         done = done+1
87       when 'Failed', 'Cancelled'
88         failed = failed+1
89       when 'Running'
90         running = running+1
91       else
92         todo = todo+1
93       end
94     end
95
96     summary = {}
97     summary[:done] = done
98     summary[:failed] = failed
99     summary[:todo] = todo
100     summary[:running] = running
101     summary
102   end
103
104   def child_summary_str
105     summary = child_summary
106     summary_txt = ''
107
108     if state_label == 'Running'
109       if summary[:done]
110         summary_txt += "#{summary[:done]} #{'child'.pluralize(summary[:done])} done,"
111       end
112       if summary[:failed]
113         summary_txt += "#{summary[:failed]} failed,"
114       end
115       if summary[:running]
116         summary_txt += "#{summary[:running]} running,"
117       end
118       if summary[:todo]
119         summary_txt += "#{summary[:todo]} pending"
120       end
121     end
122     summary_txt
123   end
124
125   def progress
126     state = get(:state)
127     if state == 'Complete'
128       return 1.0
129     elsif state == 'Failed' or state== 'Cancelled'
130       return 0.0
131     end
132
133     summary = child_summary
134     return 0.0 if summary.nil?
135
136     done = summary[:done] || 0
137     running = summary[:running] || 0
138     failed = summary[:failed] || 0
139     todo = summary[:todo] || 0
140     total = done + running + failed + todo
141     if total > 0
142       (done+failed).to_f / total
143     else
144       0.0
145     end
146   end
147
148   def parameters
149     get(:script_parameters)
150   end
151
152   def repository
153     get(:repository)
154   end
155
156   def script
157     get(:script)
158   end
159
160   def script_version
161     get(:script_version)
162   end
163
164   def supplied_script_version
165     get(:supplied_script_version)
166   end
167
168   def runtime_constraints
169     get(:runtime_constraints)
170   end
171
172   def children
173     []
174   end
175
176   def title
177     "work unit"
178   end
179
180   def has_unreadable_children
181     self.unreadable_children
182   end
183
184   def readable?
185     resource_class = ArvadosBase::resource_class_for_uuid(uuid)
186     resource_class.where(uuid: [uuid]).first rescue nil
187   end
188
189   protected
190
191   def get key
192     if self.proxied.respond_to? key
193       self.proxied.send(key)
194     elsif self.proxied.is_a?(Hash)
195       self.proxied[key]
196     end
197   end
198 end