nitos_testbed_rc 1.0.0.pre.4 → 1.0.0.pre.5

Sign up to get free protection for your applications and to get access to all the features.
data/bin/omf6 CHANGED
@@ -3,7 +3,10 @@ require 'rubygems'
3
3
  require 'time'
4
4
  require 'omf_common'
5
5
  require 'optparse'
6
+ require 'progress_bar'
6
7
  CONF_PATH = '~/.omf/etc/omf_script_conf.yaml'
8
+ FRISB_PATH = '/etc/nitos_testbed_rc/frisbee_proxy_conf.yaml'
9
+ CM_PATH = '/etc/nitos_testbed_rc/cm_proxy_conf.yaml'
7
10
 
8
11
  @config = YAML.load_file(File.expand_path(CONF_PATH))
9
12
  # @config = YAML.load_file(File.join(File.dirname(File.expand_path(__FILE__)), '.../etc/omf_script_conf.yaml'))
@@ -11,6 +14,11 @@ CONF_PATH = '~/.omf/etc/omf_script_conf.yaml'
11
14
  @xmpp = @config[:xmpp]
12
15
  @omf = @config[:omf_script]
13
16
 
17
+ @fconfig = YAML.load_file(File.expand_path(FRISB_PATH))
18
+ @frisbee = @fconfig[:frisbee]
19
+
20
+ @cmconfig = YAML.load_file(File.expand_path(CM_PATH))
21
+
14
22
  options = {}
15
23
  opt_parser = OptionParser.new do |opts|
16
24
  opts.banner = "Usage: omf6 [COMMAND] [OPTIONS]"
@@ -27,7 +35,7 @@ opt_parser = OptionParser.new do |opts|
27
35
  opts.on('-a', '--status STATUS', 'the status you want to get the node to. Required only on tell command.') { |v| options[:status] = v }
28
36
  opts.on('-t', '--target_nodes NODES', 'target nodes you want to run the command too. Required on commands load, tell and stat.') {|v| options[:target_nodes] = v.split(",") }
29
37
 
30
- options[:last_action] = @omf[:last_action] #actions are reset and shutdown
38
+ options[:last_action] = @omf[:last_action] if ARGV[0] == 'save' || ARGV[0] == 'load'#actions are reset and shutdown
31
39
  opts.on('-l', '--last_action ACTION', "action you want to perform after the commands is executed. Optional on commands load and save (last_action can be reset/shutdown. Default #{options[:last_action]})."){|v| options[:last_action] = v}
32
40
  options[:wait] = false
33
41
  opts.on('-w', '--wait', 'wait until pingable. Used in tell command (default vallue is off)'){|v| options[:wait] = true}
@@ -35,7 +43,8 @@ end
35
43
 
36
44
  entity_cert = File.expand_path(@auth[:entity_cert])
37
45
  entity_key = File.expand_path(@auth[:entity_key])
38
- entity = OmfCommon::Auth::Certificate.create_from_pem(File.read(entity_cert))#, File.read(entity_key))
46
+ entity = OmfCommon::Auth::Certificate.create_from_pem(File.read(entity_cert) + File.read(entity_key))#, File.read(entity_key))
47
+ # entity = OmfCommon::Auth::Certificate.new({cert: entity_cert, key: entity_key})
39
48
 
40
49
  trusted_roots = File.expand_path(@auth[:root_cert_dir])
41
50
 
@@ -50,21 +59,22 @@ def create_frisbeed(comm, fcontroller, port, options)
50
59
  server.on_message do |m|
51
60
  if m.operation == :inform
52
61
  if m.read_content("event") == "STDOUT"
53
- puts m.read_content("msg")
62
+ puts "INFO: #{m.read_content("msg")}"
54
63
  elsif m.read_content("event") == "EXIT"
55
- puts m.read_content("msg")
64
+ puts "INFO: #{m.read_content("msg")}"
56
65
  end
57
66
  end
58
67
  end
59
68
  end
60
69
  else
61
- error ">>> Frisbeed resource creation failed - #{reply_msg[:reason]}"
70
+ puts "ERROR: Frisbeed resource creation failed - #{reply_msg[:reason]}"
71
+ shut_down(comm)
62
72
  end
63
73
  end
64
74
  end
65
75
 
66
76
  #run frisbee client on a node
67
- def create_frisbee(comm, fcontroller, node, port, options)
77
+ def create_frisbee(comm, fcontroller, node, port, options, progress_bar)
68
78
  fcontroller.create(:frisbee, hrn: 'frisbee client', port: port, node_topic: "#{node.to_s}") do |reply_msg|
69
79
  if reply_msg.success?
70
80
  client = reply_msg.resource
@@ -78,9 +88,17 @@ def create_frisbee(comm, fcontroller, node, port, options)
78
88
  # puts "load operation started."
79
89
  # end
80
90
  elsif client_msg.read_property("event") == "STDOUT"
81
- puts "#{client_msg.read_property("node")}: #{client_msg.read_property("msg")}"
91
+ @load_complete[client_msg.read_property("node")] = client_msg.read_property("msg").sub('%', '').to_i
92
+ overall = @load_complete.values.inject(:+)
93
+ progress_bar.count = ( overall / @nodes_up_pxe.length)
94
+ progress_bar.write
82
95
  elsif client_msg.read_property("event") == "EXIT"
83
- puts "#{client_msg.read_property("node")}: #{client_msg.read_property("msg")}"
96
+ @load_complete[client_msg.read_property("node")] = 100
97
+ overall = @load_complete.values.inject(:+)
98
+ progress_bar.count = ( overall / @nodes_up_pxe.length)
99
+ progress_bar.write
100
+ msg = client_msg.read_property("msg").split("\n")
101
+ @load_end_msg += "#{client_msg.read_property("node")}: #{"#{msg[0]} #{msg[1][14..29]}"}\n"
84
102
  comm.subscribe('cm_factory') do |controller|
85
103
  controller.on_message do |cm_msg|
86
104
  if cm_msg.operation == :inform
@@ -91,48 +109,42 @@ def create_frisbee(comm, fcontroller, node, port, options)
91
109
  n = cm_msg.read_property("node")
92
110
  @nodes_up_without_pxe << n
93
111
  if @nodes_up_pxe.length == (@nodes_up_without_pxe.length + @nodes_failed_without_pxe.length)
94
- puts "load proccess completed."
95
- fcontroller.release(@@server) do |reply_msg|
96
- comm.disconnect
97
- end
112
+ # puts "INFO: Load proccess completed."
113
+ # fcontroller.release(@@server) do |reply_msg|
114
+ # shut_down(comm)
115
+ # end
116
+ stop_loading(comm, fcontroller)
98
117
  end
99
118
  end
100
119
  end
101
120
  when 'ERROR'
102
121
  case cm_msg.read_property("event_type")
103
122
  when "AUTH"
104
- logger.info "#{cm_msg.read_property("msg")}, exit code: #{cm_msg.read_property("exit_code")}"
123
+ puts "ERROR AUTH: #{cm_msg.read_property("msg")}"
105
124
  n = cm_msg.read_property("node_name")
106
125
  @nodes_failed_without_pxe << n
107
126
  if (@nodes_up_without_pxe.length + @nodes_failed_without_pxe.length) == options[:target_nodes].length
108
- puts "load proccess completed."
109
- fcontroller.release(@@server) do |reply_msg|
110
- comm.disconnect
111
- end
127
+ stop_loading(comm, fcontroller)
112
128
  end
113
129
  when "HTTP"
114
- logger.info "#{cm_msg.read_property("msg")}, exit code: #{cm_msg.read_property("exit_code")}"
130
+ puts "ERROR HTTP: #{cm_msg.read_property("msg")}"
115
131
  n = cm_msg.read_property("node_name")
116
132
  if @nodes_retrying_without_pxe.include?(n)
117
133
  @nodes_retrying_without_pxe.delete(n)
118
134
  @nodes_failed_without_pxe << n
119
135
  if (@nodes_up_without_pxe.length + @nodes_failed_without_pxe.length) == options[:target_nodes].length
120
- fcontroller.release(@@server) do |reply_msg|
121
- comm.disconnect
122
- end
136
+ stop_loading(comm)
123
137
  end
124
138
  else
125
139
  @nodes_retrying_without_pxe << n
126
140
  controller.configure(state: {node: n.to_sym, status: :start_on_pxe})
127
141
  end
128
142
  when "TIME_OUT"
129
- logger.info "#{cm_msg.read_property("msg")}, exit code: #{cm_msg.read_property("exit_code")}"
143
+ puts "ERROR TIME_OUT: #{cm_msg.read_property("msg")}"
130
144
  n = cm_msg.read_property("node_name")
131
145
  @nodes_failed_without_pxe << n
132
146
  if (@nodes_up_without_pxe.length + @nodes_failed_without_pxe.length) == options[:target_nodes].length
133
- fcontroller.release(@@server) do |reply_msg|
134
- comm.disconnect
135
- end
147
+ stop_loading(comm)
136
148
  end
137
149
  else
138
150
  error cm_msg.read_content('reason') if cm_msg.read_content("reason")
@@ -142,8 +154,21 @@ def create_frisbee(comm, fcontroller, node, port, options)
142
154
  end
143
155
  end
144
156
  end
145
- puts "#{options[:last_action]} node '#{client_msg.read_property("node")}' out of PXE."
146
- controller.configure(state: {node: node.to_sym, status: :start_without_pxe, last_action: options[:last_action]})
157
+ unless options[:wait]
158
+ controller.configure(state: {node: node.to_sym, status: options[:last_action].to_sym, wait: options[:wait]})
159
+ @nodes_reset += 1
160
+ if @nodes_reset == @nodes_up_pxe.length
161
+ @load_end_msg.split("\n").each {|line| puts "INFO: #{line}"}
162
+ stop_loading(comm)
163
+ end
164
+ else
165
+ puts "INFO: Trying to #{options[:last_action]} node '#{client_msg.read_property("node")}' out of PXE."
166
+ controller.configure(state: {node: node.to_sym, status: :start_without_pxe, last_action: options[:last_action]})
167
+ @nodes_reset += 1
168
+ if @nodes_reset == @nodes_up_pxe.length
169
+ @load_end_msg.split("\n").each {|line| puts "INFO: #{line}"}
170
+ end
171
+ end
147
172
  end
148
173
  end
149
174
  end
@@ -155,6 +180,93 @@ def create_frisbee(comm, fcontroller, node, port, options)
155
180
  end
156
181
  end
157
182
 
183
+ def loading?
184
+ @loading
185
+ end
186
+
187
+ def start_loading
188
+ @loading = true
189
+ end
190
+
191
+ def stop_loading(comm)
192
+ @loading = false
193
+ puts "INFO: Load proccess completed."
194
+ @fcontroller.release(@@server) do |reply_msg|
195
+ shut_down(comm)
196
+ end
197
+ sleep 2
198
+ end
199
+
200
+
201
+ def start_load(comm, options, node)
202
+ if @nodes_up_pxe.length == 0
203
+ puts "ERROR: ALL Nodes failled to boot on PXE."
204
+ shut_down(comm)
205
+ end
206
+ @nodes_reset = 0
207
+ if @nof_nodes == (@nodes_up_pxe.length + @nodes_failed_pxe.length) #all nodes are up and running on pxe
208
+ stop_waiting()
209
+ comm.subscribe('frisbee_factory') do |fcontroller|
210
+ puts "INFO: Requesting available port"
211
+ @fcontroller = fcontroller
212
+ @fcontroller.request([:ports]) do |m|
213
+ port = m.read_property("ports")
214
+ puts "INFO: Starting Loading Procedure on port '#{port}'"
215
+ start_loading()
216
+ create_frisbeed(comm, @fcontroller, port, options)
217
+ @load_complete = {}
218
+ prog_bar = ProgressBar.new(100, :bar, :percentage, :elapsed, :eta, :rate)
219
+ @load_end_msg = ''
220
+ @nodes_up_pxe.each do |node|
221
+ puts "INFO: Starting Loading Procedure on node '#{node}'"
222
+ @load_complete[node] = 0
223
+ create_frisbee(comm, @fcontroller, node, port, options, prog_bar) #frisbee client
224
+ end
225
+ prog_bar.count = 0
226
+ prog_bar.write
227
+ # puts "DEBUG: load_complete: #{@load_complete}"
228
+ @nodes_failed_pxe.each do |node|
229
+ puts "INFO: Node '#{node}' failed to boot on PXE."
230
+ end
231
+ end
232
+ end
233
+ end
234
+ end
235
+
236
+ def waiting?
237
+ @waiting
238
+ end
239
+
240
+ def stop_waiting
241
+ puts "INFO: All nodes are up and running on PXE."
242
+ @waiting = false
243
+ sleep 1
244
+ end
245
+
246
+ def print_until_timeout(msg = '')
247
+ print "\r"
248
+ print " "
249
+ print "\r"
250
+ puts msg
251
+ end
252
+
253
+ def wait_until_timeout(fps=1)
254
+ delay = 1.0/fps
255
+ iter = 0
256
+ spinner = Thread.new do
257
+ while iter do # Keep spinning until told otherwise
258
+ print "INFO: #{@time} / #{@cmconfig[:timeout]} seconds until TIMEOUT!"
259
+ sleep delay
260
+ print "\r"
261
+ STDOUT.flush
262
+ end
263
+ end
264
+ yield.tap{ # After yielding to the block, save the return value
265
+ iter = false # Tell the thread to exit, cleaning up after itself…
266
+ spinner.join # …and wait for it to do so.
267
+ } # Use the block's return value as the method's
268
+ end
269
+
158
270
  def load(comm, options)
159
271
  comm.subscribe('cm_factory') do |controller|
160
272
  #TODO handle the case some nodes are not up and running
@@ -164,7 +276,7 @@ def load(comm, options)
164
276
  @nodes_failed_without_pxe = []
165
277
  @nodes_retrying_without_pxe = []
166
278
  @nodes_up_pxe = []
167
- nodes_failed_pxe = []
279
+ @nodes_failed_pxe = []
168
280
  nodes_retrying_pxe = []
169
281
  port = nil
170
282
  controller.on_message do |m|
@@ -175,111 +287,97 @@ def load(comm, options)
175
287
  if m.read_property("current").to_sym == :pxe_on && m.read_property("desired").to_sym == :pxe_on
176
288
  n = m.read_property("node_name")
177
289
  @nodes_up_pxe << n
178
- if @nof_nodes == (@nodes_up_pxe.length + nodes_failed_pxe.length) #all nodes are up and running on pxe
179
- puts "all nodes are up and running on pxe."
180
- comm.subscribe('frisbee_factory') do |fcontroller|
181
- puts "requesting available port"
182
- fcontroller.request([:ports]) do |m|
183
- port = m.read_property("ports")
184
- puts "running frisbee server on port '#{port}'"
185
- create_frisbeed(comm, fcontroller, port, options)
186
- @nodes_up_pxe.each do |node|
187
- create_frisbee(comm, fcontroller, node, port, options) #frisbee client
188
- end
189
- puts "running frisbee client on specified nodes."
190
- end
191
- end
192
- end
290
+ print_until_timeout "INFO: Node '#{n}' has booted on PXE."
291
+ start_load(comm, options, n)
193
292
  else
194
- error "exit code: #{m.read_content('exit_code')}" if m.read_content('exit_code')
293
+ print_until_timeout "ERROR: exit code: #{m.read_content('exit_code')}" if m.read_content('exit_code')
195
294
  end
196
295
  end
197
296
  when 'ERROR'
198
297
  case m.read_property("event_type")
199
298
  when "AUTH"
200
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
299
+ print_until_timeout "ERROR AUTH: #{m.read_property("msg")}"
201
300
  n = m.read_property("node_name")
202
- nodes_failed_pxe << n
203
- if @nof_nodes == (@nodes_up_pxe.length + nodes_failed_pxe.length) #all nodes are up and running on pxe
204
- puts "all nodes are up and running on pxe."
205
- comm.subscribe('frisbee_factory') do |fcontroller|
206
- puts "requesting available port"
207
- fcontroller.request([:ports]) do |m|
208
- port = m.read_property("ports")
209
- puts "running frisbee server on port '#{port}'"
210
- create_frisbeed(comm, fcontroller, port, options)
211
- @nodes_up_pxe.each do |node|
212
- create_frisbee(comm, fcontroller, node, port, options) #frisbee client
213
- end
214
- puts "running frisbee client on specified nodes."
215
- end
216
- end
217
- end
301
+ @nodes_failed_pxe << n
302
+ start_load(comm, options, n)
218
303
  when "HTTP"
219
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
304
+ print_until_timeout "ERROR HTTP: #{m.read_property("msg")}"
220
305
  n = m.read_property("node_name")
221
306
  if nodes_retrying_pxe.include?(n)
222
307
  nodes_retrying_pxe.delete(n)
223
- nodes_failed_pxe << n
224
- if @nof_nodes == (@nodes_up_pxe.length + nodes_failed_pxe.length) #all nodes are up and running on pxe
225
- puts "all nodes are up and running on pxe."
226
- comm.subscribe('frisbee_factory') do |fcontroller|
227
- puts "requesting available port"
228
- fcontroller.request([:ports]) do |m|
229
- port = m.read_property("ports")
230
- puts "running frisbee server on port '#{port}'"
231
- create_frisbeed(comm, fcontroller, port, options)
232
- @nodes_up_pxe.each do |node|
233
- create_frisbee(comm, fcontroller, node, port, options) #frisbee client
234
- end
235
- puts "running frisbee client on specified nodes."
236
- end
237
- end
238
- end
308
+ @nodes_failed_pxe << n
309
+ start_load(comm, options, n)
239
310
  else
240
311
  nodes_retrying_pxe << n
241
312
  controller.configure(state: {node: n.to_sym, status: :start_on_pxe})
242
313
  end
243
314
  when "TIME_OUT"
244
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
315
+ print_until_timeout "ERROR TIME_OUT: #{m.read_property("msg")}"
245
316
  n = m.read_property("node_name")
246
- nodes_failed_pxe << n
247
- if @nof_nodes == (@nodes_up_pxe.length + nodes_failed_pxe.length) #all nodes are up and running on pxe
248
- puts "all nodes are up and running on pxe."
249
- comm.subscribe('frisbee_factory') do |fcontroller|
250
- puts "requesting available port"
251
- fcontroller.request([:ports]) do |m|
252
- port = m.read_property("ports")
253
- puts "running frisbee server on port '#{port}'"
254
- create_frisbeed(comm, fcontroller, port, options)
255
- @nodes_up_pxe.each do |node|
256
- create_frisbee(comm, fcontroller, node, port, options) #frisbee client
257
- end
258
- puts "running frisbee client on specified nodes."
259
- end
260
- end
261
- end
317
+ @nodes_failed_pxe << n
318
+ start_load(comm, options, n)
262
319
  else
263
- error m.read_content('reason') if m.read_content("reason")
320
+ print_until_timeout "ERROR: #{ m.read_content('reason')}" if m.read_content("reason")
264
321
  end
265
322
  when 'WARN'
266
- warn cm_msg.read_content('reason') if m.read_content("reason")
323
+ print_until_timeout "WARN: #{ cm_msg.read_content('reason')}" if m.read_content("reason")
267
324
  end
268
325
  end
269
326
  end
270
327
  options[:target_nodes].each do |node|
271
328
  controller.configure(state: {node: node.to_sym, status: :start_on_pxe})
272
329
  end
273
- puts "waiting for target nodes to boot on PXE."
330
+ puts "INFO: Waiting for target nodes to boot on PXE."
331
+ @waiting = true
332
+ @time = 0
333
+ wait_until_timeout(1){
334
+ while waiting?
335
+ sleep 1 # Simulate a task taking an unknown amount of time
336
+ @time += 1
337
+ end
338
+ }
274
339
  else
275
340
  error controller.inspect
276
341
  end
277
342
  end
278
343
  end
279
344
 
345
+ @saving = true
346
+ def saving?
347
+ @saving
348
+ end
349
+
350
+ def start_saving
351
+ @saving = true
352
+ end
353
+
354
+ def stop_saving
355
+ @saving = false
356
+ sleep 1
357
+ end
358
+
359
+ def show_wait_spinner(fps=10)
360
+ chars = %w[| / - \\]
361
+ delay = 1.0/fps
362
+ iter = 0
363
+ spinner = Thread.new do
364
+ while iter do # Keep spinning until told otherwise
365
+ print chars[(iter+=1) % chars.length]
366
+ sleep delay
367
+ print "\b"
368
+ end
369
+ end
370
+ yield.tap{ # After yielding to the block, save the return value
371
+ iter = false # Tell the thread to exit, cleaning up after itself…
372
+ spinner.join # …and wait for it to do so.
373
+ } # Use the block's return value as the method's
374
+ end
375
+
280
376
  #run imagezip server
281
377
  def create_imagezip_server(comm, fcontroller, port, options)
282
- fcontroller.create(:imagezip_server, {hrn: 'imagezip server', image: options[:image], port: port}) do |reply_msg|
378
+ user = `echo $USER`.strip!
379
+ @image = "#{user}-node-#{options[:node]}-#{Time.now.strftime("%d_%m_%Y_%H:%M")}.ndz"
380
+ fcontroller.create(:imagezip_server, {hrn: 'imagezip server', image_name: @image, port: port}) do |reply_msg|
283
381
  if reply_msg.success?
284
382
  server = reply_msg.resource
285
383
  @@server = server
@@ -287,15 +385,15 @@ def create_imagezip_server(comm, fcontroller, port, options)
287
385
  server.on_message do |m|
288
386
  if m.operation == :inform
289
387
  if m.read_content("event") == "STDOUT"
290
- puts m.read_content("msg")
388
+ puts "INFO: #{puts m.read_content("msg")}"
291
389
  elsif m.read_content("event") == "EXIT"
292
- puts m.read_content("msg")
390
+ puts "INFO: #{m.read_content("msg")}"
293
391
  end
294
392
  end
295
393
  end
296
394
  end
297
395
  else
298
- error ">>> Imagezip Server resource creation failed - #{reply_msg[:reason]}"
396
+ puts "ERROR: Imagezip Server resource creation failed - #{reply_msg[:reason]}"
299
397
  end
300
398
  end
301
399
  end
@@ -309,9 +407,15 @@ def create_imagezip_client(comm, fcontroller, node, port, options)
309
407
  client.on_message do |client_msg|
310
408
  if client_msg.operation == :inform
311
409
  if client_msg.read_property("event") == "STDOUT"
312
- print "#{client_msg.read_property("msg")}"
410
+ # print "#{client_msg.read_property("msg")}"
313
411
  elsif client_msg.read_property("event") == "EXIT"
314
- puts "#{client_msg.read_property("node")}: #{client_msg.read_property("msg")}"
412
+ stop_saving()
413
+ puts "INFO:"
414
+ client_msg.read_property("msg").split("\n").each do |line|
415
+ puts "INFO: #{line}"
416
+ end
417
+ puts "INFO: Image was saved in '#{@frisbee[:imageDir]}/#{@image}'"
418
+ puts "INFO:"
315
419
  comm.subscribe('cm_factory') do |controller|
316
420
  controller.on_message do |cm_msg|
317
421
  if cm_msg.operation == :inform
@@ -319,33 +423,35 @@ def create_imagezip_client(comm, fcontroller, node, port, options)
319
423
  when 'STATUS'
320
424
  unless cm_msg.read_property("current").nil? && cm_msg.read_property("desired").nil?
321
425
  if cm_msg.read_property("current").to_sym == :pxe_off && cm_msg.read_property("desired").to_sym == :pxe_off
322
- puts "save proccess completed. Image was saved in directory '/var/lib/omf-images-6'"
426
+ puts "INFO: Save proccess completed."
323
427
  fcontroller.release(@@server) do |reply_msg|
324
- comm.disconnect
428
+ shut_down(comm)
325
429
  end
326
430
  end
327
431
  end
328
432
  when 'ERROR'
329
433
  case cm_msg.read_property("event_type")
330
434
  when "AUTH"
331
- logger.info "#{cm_msg.read_property("msg")}, exit code: #{cm_msg.read_property("exit_code")}"
435
+ puts "ERROR AUTH: #{cm_msg.read_property("msg")}"
332
436
  fcontroller.release(@@server) do |reply_msg|
333
- comm.disconnect
437
+ shut_down(comm)
334
438
  end
335
439
  when "HTTP"
336
- logger.info "#{cm_msg.read_property("msg")}, exit code: #{cm_msg.read_property("exit_code")}"
440
+ puts "ERROR HTTP: #{cm_msg.read_property("msg")}"
337
441
  if @retried
338
442
  fcontroller.release(@@server) do |reply_msg|
339
- comm.disconnect
443
+ shut_down(comm)
340
444
  end
341
445
  else
342
446
  @retried = true
343
447
  controller.configure(state: {node: node.to_sym, status: :start_without_pxe, last_action: options[:last_action]})
344
448
  end
345
449
  when "TIME_OUT"
346
- logger.info "#{cm_msg.read_property("msg")}, exit code: #{cm_msg.read_property("exit_code")}"
450
+ puts "ERROR TIME_OUT: #{cm_msg.read_property("msg")}"
347
451
  fcontroller.release(@@server) do |reply_msg|
348
- comm.disconnect
452
+ puts "INFO: #{client_msg.read_property("node")}: #{client_msg.read_property("msg")}"
453
+ puts "INFO: Image was saved in '#{@frisbee[:imageDir]}/#{@image}'"
454
+ shut_down(comm)
349
455
  end
350
456
  else
351
457
  error cm_msg.read_content('reason') if cm_msg.read_content("reason")
@@ -355,15 +461,22 @@ def create_imagezip_client(comm, fcontroller, node, port, options)
355
461
  end
356
462
  end
357
463
  end
358
- puts "#{options[:last_action]} node '#{client_msg.read_property("node")}' out of PXE."
359
- controller.configure(state: {node: node.to_sym, status: :start_without_pxe, last_action: options[:last_action]})
464
+ puts "INFO: Trying to #{options[:last_action]} node '#{client_msg.read_property("node")}' out of PXE."
465
+ unless options[:wait]
466
+ controller.configure(state: {node: node.to_sym, status: options[:last_action].to_sym, wait: options[:wait]})
467
+ puts "INFO: Save proccess completed."
468
+ shut_down(comm)
469
+ else
470
+ # puts "INFO: Trying to #{options[:last_action]} node '#{client_msg.read_property("node")}' out of PXE."
471
+ controller.configure(state: {node: node.to_sym, status: :start_without_pxe, last_action: options[:last_action]})
472
+ end
360
473
  end
361
474
  end
362
475
  end
363
476
  end
364
477
  end
365
478
  else
366
- error ">>> Frisbee resource creation failed - #{reply_msg[:reason]}"
479
+ puts "ERROR: Imagezip Client resource creation failed - #{reply_msg[:reason]}"
367
480
  end
368
481
  end
369
482
  end
@@ -375,57 +488,66 @@ def save(comm, options)
375
488
  port = nil
376
489
  controller.on_message do |m|
377
490
  if m.operation == :inform
378
- puts m.inspect
379
491
  case m.read_content("itype")
380
492
  when 'STATUS'
381
493
  unless m.read_property("current").nil? && m.read_property("desired").nil?
382
- logger.info "#{m.read_property("node_name")}, current: #{m.read_property("current")}, desired: #{m.read_property("desired")}"
494
+ # logger.info "#{m.read_property("node_name")}, current: #{m.read_property("current")}, desired: #{m.read_property("desired")}"
383
495
  if m.read_property("current").to_sym == :pxe_on && m.read_property("desired").to_sym == :pxe_on
384
- puts "node is up and running on pxe."
496
+ puts "INFO: Node '#{options[:node]}' is up and running on pxe."
385
497
  comm.subscribe('frisbee_factory') do |fcontroller|
386
- puts "requesting available port"
498
+ puts "INFO: Requesting available port"
387
499
  fcontroller.request([:ports]) do |m|
388
500
  port = m.read_property("ports")
389
- puts "running imagezip server on port #{port}."
501
+ start_saving()
502
+ puts "INFO: Starting Imagezip Server on port '#{port}'"
390
503
  create_imagezip_server(comm, fcontroller, port, options)
391
504
  sleep 2
392
- puts "running imagezip client on node."
505
+ puts "INFO: Starting Imagezip Client on node '#{options[:node]}'"
393
506
  create_imagezip_client(comm, fcontroller, options[:node], port, options)
507
+ print "INFO: Saving Image for node '#{options[:node]}'..."
508
+ show_wait_spinner(5){
509
+ while saving?
510
+ sleep 1
511
+ end
512
+ print "\b"
513
+ print "done!"
514
+ puts "\n"
515
+ }
394
516
  end
395
517
  end
396
518
  else
397
- error "exit code: #{m.read_content('exit_code')}" if m.read_content('exit_code')
519
+ puts "ERROR: exit code: #{m.read_content('exit_code')}" if m.read_content('exit_code')
398
520
  end
399
521
  end
400
522
  when 'ERROR'
401
523
  case m.read_property("event_type")
402
524
  when "AUTH"
403
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
404
- comm.disconnect
525
+ puts "ERROR AUTH: #{m.read_property("msg")}"
526
+ shut_down(comm)
405
527
  when "HTTP"
406
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
528
+ puts "ERROR HTTP: #{m.read_property("msg")}"
407
529
  if @retried
408
- comm.disconnect
530
+ shut_down(comm)
409
531
  else
410
532
  @retried = true
411
533
  controller.configure(state: {node: options[:node].to_sym, status: :start_on_pxe})
412
534
  end
413
535
  when "TIME_OUT"
414
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
415
- comm.disconnect
536
+ puts "ERROR TIME_OUT: #{m.read_property("msg")}"
537
+ shut_down(comm)
416
538
  else
417
- error m.read_content('reason') if m.read_content("reason")
539
+ puts "ERROR: #{m.read_content('reason')}" if m.read_content("reason")
418
540
  end
419
541
  when 'WARN'
420
- warn m.read_content('reason') if m.read_content("reason")
542
+ puts "WARN: #{m.read_content('reason')}" if m.read_content("reason")
421
543
  end
422
544
  end
423
545
  end
424
546
 
425
547
  controller.configure(state: {node: options[:node].to_sym, status: :start_on_pxe})
426
- puts "waiting for node to boot on PXE."
548
+ puts "INFO: Waiting for Node '#{options[:node]}' to boot on PXE."
427
549
  else
428
- error controller.inspect
550
+ puts "ERROR: #{controller.inspect}"
429
551
  end
430
552
  end
431
553
  end
@@ -433,6 +555,8 @@ end
433
555
  def tell(comm, options)
434
556
  comm.subscribe('cm_factory') do |controller|
435
557
  unless controller.error?
558
+ puts "\nINFO: Executing tell #{options[:status]} command on all nodes."
559
+ puts "INFO: ------------------------------------------------------" if options[:wait]
436
560
  nodes_failed = []
437
561
  nodes_ok = []
438
562
  nodes_retrying = []
@@ -443,61 +567,69 @@ def tell(comm, options)
443
567
  unless m.read_property("current").nil? && m.read_property("desired").nil?
444
568
  if m.read_property("current") != m.read_property("desired")
445
569
  if options[:wait]
446
- puts "Waiting for node '#{m.read_property("node_name")}'."
447
- logger.info "#{m.read_property("node_name")} is #{m.read_property("current")}."
570
+ puts "INFO: Waiting for node '#{m.read_property("node_name")}'."
448
571
  else
449
572
  n = m.read_property("node_name")
450
573
  nodes_ok << n
451
574
  if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
452
- puts "all nodes are running." #TODO messages for failed nodes
453
- comm.disconnect
575
+ tell_complete_msg(options[:status], nodes_ok, nodes_failed) if options[:wait]
576
+ shut_down(comm)
454
577
  end
455
578
  end
456
579
  else
457
580
  n = m.read_property("node_name")
458
581
  nodes_ok << n
459
582
  if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
460
- puts "all nodes are #{m.read_property("desired")}." #TODO messages for failed nodes
461
- comm.disconnect
583
+ tell_complete_msg(options[:status], nodes_ok, nodes_failed) if options[:wait]
584
+ puts "INFO: Proccess complete. "
585
+ shut_down(comm)
462
586
  end
463
587
  end
464
588
  end
465
589
  when 'ERROR'
466
590
  case m.read_property("event_type")
467
591
  when "AUTH"
468
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
592
+ puts "ERROR AUTH: #{m.read_property("msg")}"
469
593
  n = m.read_property("node_name")
470
594
  nodes_failed << n
471
595
  if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
472
- comm.disconnect
596
+ tell_complete_msg(options[:status], nodes_ok, nodes_failed) if options[:wait]
597
+ puts "INFO: Proccess complete. "
598
+ shut_down(comm)
473
599
  end
474
600
  when "HTTP"
475
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
601
+ puts "ERROR HTTP: #{m.read_property("msg")}"
476
602
  n = m.read_property("node_name")
477
603
  if nodes_retrying.include?(n)
478
604
  nodes_retrying.delete(n)
479
605
  nodes_failed << n
480
606
  if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
481
- comm.disconnect
607
+ tell_complete_msg(options[:status], nodes_ok, nodes_failed) if options[:wait]
608
+ puts "INFO: Proccess complete. "
609
+ shut_down(comm)
482
610
  end
483
611
  else
484
612
  nodes_retrying << n
485
- info "retrying to send message #{options[:status]} to node #{n}"
613
+ puts "INFO: Failed to reach Node '#{n}', retrying to get the status of the node."
486
614
  controller.configure(state: {node: n.to_sym, status: options[:status].to_sym})
487
615
  end
488
616
  when "TIME_OUT"
489
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
617
+ puts "ERROR TIME_OUT: #{m.read_property("msg")}"
490
618
  n = m.read_property("node_name")
491
619
  nodes_failed << n
492
620
  if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
493
- comm.disconnect
621
+ tell_complete_msg(options[:status], nodes_ok, nodes_failed) if options[:wait]
622
+ puts "INFO: Proccess complete. "
623
+ shut_down(comm)
494
624
  end
495
625
  else
496
- error m.read_content('reason') if m.read_content("reason")
497
- comm.disconnect
626
+ puts "ERROR: #{m.read_content('reason')}" if m.read_content("reason")
627
+ tell_complete_msg(options[:status], nodes_ok, nodes_failed) if options[:wait]
628
+ puts "INFO: Proccess complete. "
629
+ shut_down(comm)
498
630
  end
499
631
  when 'WARN'
500
- warn m.read_content('reason') if m.read_content("reason")
632
+ puts "WARN: #{m.read_content('reason')}" if m.read_content("reason")
501
633
  end
502
634
  end
503
635
  end
@@ -514,13 +646,13 @@ def tell(comm, options)
514
646
  controller.configure(state: {node: node.to_sym, status: :reset, wait: options[:wait]})
515
647
  end
516
648
  else
517
- puts "Invalid value for -a, only on/off/reset values are available."
649
+ puts "WARN: Invalid value for -a, only on/off/reset values are available."
518
650
  puts opt_parser
519
- comm.disconnect
651
+ shut_down(comm)
520
652
  end
521
653
  unless options[:wait]
522
- puts "Proccess complete."
523
- comm.disconnect
654
+ puts "\nINFO: Proccess complete. "
655
+ shut_down(comm)
524
656
  end
525
657
  else
526
658
  error controller.inspect
@@ -531,6 +663,8 @@ end
531
663
  def stat(comm, options)
532
664
  comm.subscribe('cm_factory') do |controller|
533
665
  unless controller.error?
666
+ puts "\nINFO: Executing status command on all nodes."
667
+ puts "INFO: ------------------------------------------------------"
534
668
  nodes_failed = []
535
669
  nodes_ok = []
536
670
  nodes_retrying = []
@@ -539,57 +673,46 @@ def stat(comm, options)
539
673
  case m.read_content("itype")
540
674
  when 'STATUS'
541
675
  unless m.read_property("current").nil?
542
- puts "#{m.read_property("node_name")} is #{m.read_property("current")}"
543
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
676
+ puts "INFO: Node '#{m.read_property("node_name")}' reported status is: #{m.read_property("current")}"
544
677
  n = m.read_property("node_name")
545
678
  nodes_ok << n
546
679
  if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
547
- comm.disconnect
680
+ puts "INFO: ------------------------------------------------------"
681
+ shut_down(comm)
548
682
  end
549
- # elsif m.read_property("event_type") == "EXIT"
550
- # puts "ERROR: #{m.read_property("node")} - #{m.read_property("msg")}"
551
- # logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
552
- # nof_nodes += 1
553
- # if nof_nodes == options[:target_nodes].length
554
- # comm.disconnect
555
- # end
556
683
  end
557
684
  when 'ERROR'
558
685
  case m.read_property("event_type")
559
686
  when "AUTH"
560
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
687
+ puts "ERROR AUTH: #{m.read_property("msg")}"
561
688
  n = m.read_property("node_name")
562
689
  nodes_failed << n
563
690
  if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
564
- comm.disconnect
691
+ puts "INFO: ------------------------------------------------------"
692
+ shut_down(comm)
565
693
  end
566
694
  when "HTTP"
567
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
695
+ puts "ERROR HTTP: #{m.read_property("msg")}"
568
696
  n = m.read_property("node_name")
569
697
  if nodes_retrying.include?(n)
570
698
  nodes_retrying.delete(n)
571
699
  nodes_failed << n
572
700
  if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
573
- comm.disconnect
701
+ puts "INFO: ------------------------------------------------------"
702
+ shut_down(comm)
574
703
  end
575
704
  else
576
705
  nodes_retrying << n
577
- info "retrying to send message #{options[:status]} to node #{n}"
706
+ puts "INFO: Failed to reach Node '#{n}', retrying to get the status of the node."
578
707
  controller.configure(state: {node: n.to_sym, status: :get_status})
579
708
  end
580
- when "TIME_OUT"
581
- logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
582
- n = m.read_property("node_name")
583
- nodes_failed << n
584
- if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
585
- comm.disconnect
586
- end
587
709
  else
588
- error m.read_content('reason') if m.read_content("itype") == 'ERROR'
589
- comm.disconnect
710
+ puts "ERROR: #{m.read_content('reason')}" if m.read_content("itype") == 'ERROR'
711
+ puts "INFO: ------------------------------------------------------"
712
+ shut_down(comm)
590
713
  end
591
714
  when 'WARN'
592
- warn m.read_content('reason') if m.read_content("itype") == 'WARN'
715
+ puts "WARN: #{m.read_content('reason')}" if m.read_content("itype") == 'WARN'
593
716
  end
594
717
  end
595
718
  end
@@ -599,82 +722,138 @@ def stat(comm, options)
599
722
  end
600
723
  else
601
724
  error controller.inspect
602
- comm.disconnect
725
+ shut_down(comm)
603
726
  end
604
727
  end
605
728
  end
606
729
 
607
730
  opt_parser.parse!
608
731
 
732
+ def tell_complete_msg(command, nodes_ok, nodes_failed)
733
+ puts "\nINFO: Domain: #{@xmpp[:server]} - Command: #{command}"
734
+ puts "INFO: -----------------------------------------------"
735
+ nodes_ok.each do |n|
736
+ puts "INFO: Node #{n} \tReply: OK"
737
+ end
738
+ nodes_failed.each do |n|
739
+ puts "INFO: Node #{n} \tReply: FAILED"
740
+ end
741
+ puts "INFO: -----------------------------------------------"
742
+ end
743
+
744
+ def start_up_msg(command, options)
745
+ puts "\nINFO: OMF 6 script started."
746
+ puts "INFO: Message authentication is enabled."
747
+ puts "INFO: Calling #{command} with the following options: "
748
+ options.each do |key, value|
749
+ if value.kind_of? Array
750
+ if value.length == 1
751
+ puts "INFO: \t#{key}:\t{#{value[0]}}"
752
+ next
753
+ end
754
+ out = "INFO: \t#{key}:\t{"
755
+ value.each do |v|
756
+ out += "#{v}, "
757
+ end
758
+ out = out[0...-2]
759
+ out += "}"
760
+ puts out
761
+ else
762
+ if key.size > 7
763
+ puts "INFO: \t#{key}:\t#{value}"
764
+ else
765
+ puts "INFO: \t#{key}:\t\t#{value}"
766
+ end
767
+ end
768
+ end
769
+ end
770
+
771
+ def pxe_fail_msg(comm)
772
+ puts "ALl nodes failed to load on PXE"
773
+ shut_down(comm)
774
+ end
775
+
776
+ def shut_down(comm)
777
+ if saving?
778
+ stop_saving
779
+ end
780
+ if loading?
781
+ stop_loading(comm)
782
+ end
783
+ puts "\nINFO: "
784
+ puts "INFO: Shutting down experiment, please wait..."
785
+ puts "INFO: "
786
+ # sleep 1
787
+ comm.disconnect
788
+ end
789
+
609
790
  OmfCommon.init(@config[:operationMode], communication: { url: "xmpp://#{@xmpp[:script_user]}:#{@xmpp[:password]}@#{@xmpp[:server]}", auth: {} }) do
610
791
  OmfCommon.comm.on_connected do |comm|
611
792
  OmfCommon::Auth::CertificateStore.instance.register_default_certs(trusted_roots)
612
793
  entity.resource_id = OmfCommon.comm.local_topic.address
613
794
  OmfCommon::Auth::CertificateStore.instance.register(entity)
614
795
 
615
- info "Test script >> Connected to XMPP"
796
+ start_up_msg(ARGV[0], options)
616
797
 
617
798
  case ARGV[0]
618
799
  when "load"
619
800
  if options[:node].nil? && options[:status].nil? && !options[:target_nodes].nil?
620
801
  if options[:last_action] == "reset" || options[:last_action] == "shutdown"
621
- puts "call load on options #{options.inspect}"
622
802
  load(comm, options)
623
803
  else
624
- puts "Invalid value for -l, only reset/shutdown values are available."
804
+ puts "WARN: Invalid value for -l, only reset/shutdown values are available."
625
805
  puts opt_parser
626
- comm.disconnect
806
+ shut_down(comm)
627
807
  end
628
808
  else
629
- puts "Invalid arguements."
809
+ puts "WARN: Invalid arguements."
630
810
  puts opt_parser
631
- comm.disconnect
811
+ shut_down(comm)
632
812
  end
633
813
  when "save"
634
814
  if options[:image].nil? && !options[:node].nil? && options[:status].nil? && options[:target_nodes].nil?
635
815
  if options[:last_action] == "reset" || options[:last_action] == "shutdown"
636
- puts "call save on options #{options.inspect}"
637
816
  save(comm, options)
638
817
  else
639
- puts "Invalid value for -l, only reset/shutdown values are available."
818
+ puts "WARN: Invalid value for -l, only reset/shutdown values are available."
640
819
  puts opt_parser
641
- comm.disconnect
820
+ shut_down(comm)
642
821
  end
643
822
  else
644
- puts "Invalid arguements."
823
+ puts "WARN: Invalid arguements."
645
824
  puts opt_parser
646
- comm.disconnect
825
+ shut_down(comm)
647
826
  end
648
827
  when "tell"
649
828
  if options[:image].nil? && options[:node].nil? && !options[:status].nil? && !options[:target_nodes].nil?
650
829
  if options[:status] == "on" || options[:status] == "off" || options[:status] == "reset"
651
- puts "call tell on options #{options.inspect}"
652
830
  tell(comm, options)
653
831
  else
654
- puts "Invalid value for -a, only on/off/reset values are available."
832
+ puts "WARN: Invalid value for -a, only on/off/reset values are available."
655
833
  puts opt_parser
656
- comm.disconnect
834
+ shut_down(comm)
657
835
  end
658
836
  else
659
- puts "Invalid arguements."
837
+ puts "WARN: Invalid arguements."
660
838
  puts opt_parser
661
- comm.disconnect
839
+ shut_down(comm)
662
840
  end
663
841
  when "stat"
664
842
  if options[:image].nil? && options[:node].nil? && options[:status].nil? && !options[:target_nodes].nil?
665
- puts "call stat on options #{options.inspect}"
666
843
  stat(comm, options)
667
844
  else
668
- puts "Invalid arguements."
845
+ puts "WARN: Invalid arguements."
669
846
  puts opt_parser
670
- comm.disconnect
847
+ shut_down(comm)
671
848
  end
672
849
  else
673
- puts "Invalid command / options."
850
+ puts "WARN: Invalid command / options."
674
851
  puts opt_parser
675
- comm.disconnect
852
+ shut_down(comm)
676
853
  end
677
854
 
678
- comm.on_interrupted { comm.disconnect }
855
+ comm.on_interrupted {
856
+ shut_down(comm)
857
+ }
679
858
  end
680
- end
859
+ end