nitos_testbed_rc 1.0.0.pre.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -0
- data/README.md +16 -0
- data/bin/cm_proxy +146 -0
- data/bin/frisbee_proxy +155 -0
- data/bin/install_ntrc +26 -0
- data/bin/omf6 +679 -0
- data/bin/run_proxies +29 -0
- data/bin/user_proxy +58 -0
- data/etc/cm_proxy_conf.yaml +17 -0
- data/etc/frisbee_proxy_conf.yaml +45 -0
- data/etc/omf_script_conf.yaml +14 -0
- data/etc/user_proxy_conf.yaml +12 -0
- data/lib/nitos_testbed_rc/cm_factory.rb +419 -0
- data/lib/nitos_testbed_rc/frisbee.rb +82 -0
- data/lib/nitos_testbed_rc/frisbee_factory.rb +39 -0
- data/lib/nitos_testbed_rc/frisbeed.rb +98 -0
- data/lib/nitos_testbed_rc/imagezip_client.rb +84 -0
- data/lib/nitos_testbed_rc/imagezip_server.rb +65 -0
- data/lib/nitos_testbed_rc/user.rb +133 -0
- data/lib/nitos_testbed_rc/user_factory.rb +13 -0
- data/lib/nitos_testbed_rc.rb +4 -0
- data/lib/version.rb +5 -0
- data/nitos_testbed_rc.gemspec +26 -0
- metadata +139 -0
data/bin/omf6
ADDED
@@ -0,0 +1,679 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'time'
|
4
|
+
require 'omf_common'
|
5
|
+
require 'optparse'
|
6
|
+
|
7
|
+
@config = YAML.load_file('/etc/nitos_testbed_rc/omf_script_conf.yaml')
|
8
|
+
# @config = YAML.load_file(File.join(File.dirname(File.expand_path(__FILE__)), '.../etc/omf_script_conf.yaml'))
|
9
|
+
@auth = @config[:auth]
|
10
|
+
@xmpp = @config[:xmpp]
|
11
|
+
@omf = @config[:omf_script]
|
12
|
+
|
13
|
+
options = {}
|
14
|
+
opt_parser = OptionParser.new do |opts|
|
15
|
+
opts.banner = "Usage: omf6 [COMMAND] [OPTIONS]"
|
16
|
+
opts.separator ""
|
17
|
+
opts.separator "Commands"
|
18
|
+
opts.separator " load : load an image to a group of nodes"
|
19
|
+
opts.separator " save : reate an image from a node"
|
20
|
+
opts.separator " tell : change the status of a group of nodes (status can be on/off/reset)"
|
21
|
+
opts.separator " stat : report the status of a group of nodes"
|
22
|
+
opts.separator "Options"
|
23
|
+
|
24
|
+
opts.on('-i', '--image IMAGE_NAME', 'the image name for load command (if nill default image will be loaded)') { |v| options[:image] = v }
|
25
|
+
opts.on('-n', '--node NODE', 'node name for save command') { |v| options[:node] = v }
|
26
|
+
opts.on('-a', '--status STATUS', 'the status you want to get the node to. Required only on tell command.') { |v| options[:status] = v }
|
27
|
+
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(",") }
|
28
|
+
|
29
|
+
options[:last_action] = @omf[:last_action] #actions are reset and shutdown
|
30
|
+
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}
|
31
|
+
options[:wait] = false
|
32
|
+
opts.on('-w', '--wait', 'wait until pingable. Used in tell command (default vallue is off)'){|v| options[:wait] = true}
|
33
|
+
end
|
34
|
+
|
35
|
+
entity_cert = File.expand_path(@auth[:entity_cert])
|
36
|
+
entity_key = File.expand_path(@auth[:entity_key])
|
37
|
+
entity = OmfCommon::Auth::Certificate.create_from_pem(File.read(entity_cert))#, File.read(entity_key))
|
38
|
+
|
39
|
+
trusted_roots = File.expand_path(@auth[:root_cert_dir])
|
40
|
+
|
41
|
+
#run frisbee server
|
42
|
+
def create_frisbeed(comm, fcontroller, port, options)
|
43
|
+
fcontroller.create(:frisbeed, hrn: 'frisbee server', image: options[:image], port: port) do |reply_msg|
|
44
|
+
#image "/var/lib/omf-images-5.4/baseline.ndz"
|
45
|
+
if reply_msg.success?
|
46
|
+
server = reply_msg.resource
|
47
|
+
@@server = server
|
48
|
+
server.on_subscribed do
|
49
|
+
server.on_message do |m|
|
50
|
+
if m.operation == :inform
|
51
|
+
if m.read_content("event") == "STDOUT"
|
52
|
+
puts m.read_content("msg")
|
53
|
+
elsif m.read_content("event") == "EXIT"
|
54
|
+
puts m.read_content("msg")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
else
|
60
|
+
error ">>> Frisbeed resource creation failed - #{reply_msg[:reason]}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
#run frisbee client on a node
|
66
|
+
def create_frisbee(comm, fcontroller, node, port, options)
|
67
|
+
fcontroller.create(:frisbee, hrn: 'frisbee client', port: port, node_topic: "#{node.to_s}") do |reply_msg|
|
68
|
+
if reply_msg.success?
|
69
|
+
client = reply_msg.resource
|
70
|
+
client.on_subscribed do
|
71
|
+
client.on_message do |client_msg|
|
72
|
+
if client_msg.operation == :inform
|
73
|
+
if client_msg.read_property("event") == "STARTED"#only happens when frisbee runs with :application rc
|
74
|
+
# @nof_nodes_up_frisbee += 1
|
75
|
+
# if @nof_nodes == @nof_nodes_up_frisbee
|
76
|
+
# create_frisbeed(fcontroller, port) #frisbee server
|
77
|
+
# puts "load operation started."
|
78
|
+
# end
|
79
|
+
elsif client_msg.read_property("event") == "STDOUT"
|
80
|
+
puts "#{client_msg.read_property("node")}: #{client_msg.read_property("msg")}"
|
81
|
+
elsif client_msg.read_property("event") == "EXIT"
|
82
|
+
puts "#{client_msg.read_property("node")}: #{client_msg.read_property("msg")}"
|
83
|
+
comm.subscribe('cm_factory') do |controller|
|
84
|
+
controller.on_message do |cm_msg|
|
85
|
+
if cm_msg.operation == :inform
|
86
|
+
case cm_msg.read_content("itype")
|
87
|
+
when 'STATUS'
|
88
|
+
unless cm_msg.read_property("current").nil? || cm_msg.read_property("desired").nil?
|
89
|
+
if cm_msg.read_property("current").to_sym == :pxe_off && cm_msg.read_property("desired").to_sym == :pxe_off
|
90
|
+
n = cm_msg.read_property("node")
|
91
|
+
@nodes_up_without_pxe << n
|
92
|
+
if @nodes_up_pxe.length == (@nodes_up_without_pxe.length + @nodes_failed_without_pxe.length)
|
93
|
+
puts "load proccess completed."
|
94
|
+
fcontroller.release(@@server) do |reply_msg|
|
95
|
+
comm.disconnect
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
when 'ERROR'
|
101
|
+
case cm_msg.read_property("event_type")
|
102
|
+
when "AUTH"
|
103
|
+
logger.info "#{cm_msg.read_property("msg")}, exit code: #{cm_msg.read_property("exit_code")}"
|
104
|
+
n = cm_msg.read_property("node_name")
|
105
|
+
@nodes_failed_without_pxe << n
|
106
|
+
if (@nodes_up_without_pxe.length + @nodes_failed_without_pxe.length) == options[:target_nodes].length
|
107
|
+
puts "load proccess completed."
|
108
|
+
fcontroller.release(@@server) do |reply_msg|
|
109
|
+
comm.disconnect
|
110
|
+
end
|
111
|
+
end
|
112
|
+
when "HTTP"
|
113
|
+
logger.info "#{cm_msg.read_property("msg")}, exit code: #{cm_msg.read_property("exit_code")}"
|
114
|
+
n = cm_msg.read_property("node_name")
|
115
|
+
if @nodes_retrying_without_pxe.include?(n)
|
116
|
+
@nodes_retrying_without_pxe.delete(n)
|
117
|
+
@nodes_failed_without_pxe << n
|
118
|
+
if (@nodes_up_without_pxe.length + @nodes_failed_without_pxe.length) == options[:target_nodes].length
|
119
|
+
fcontroller.release(@@server) do |reply_msg|
|
120
|
+
comm.disconnect
|
121
|
+
end
|
122
|
+
end
|
123
|
+
else
|
124
|
+
@nodes_retrying_without_pxe << n
|
125
|
+
controller.configure(state: {node: n.to_sym, status: :start_on_pxe})
|
126
|
+
end
|
127
|
+
when "TIME_OUT"
|
128
|
+
logger.info "#{cm_msg.read_property("msg")}, exit code: #{cm_msg.read_property("exit_code")}"
|
129
|
+
n = cm_msg.read_property("node_name")
|
130
|
+
@nodes_failed_without_pxe << n
|
131
|
+
if (@nodes_up_without_pxe.length + @nodes_failed_without_pxe.length) == options[:target_nodes].length
|
132
|
+
fcontroller.release(@@server) do |reply_msg|
|
133
|
+
comm.disconnect
|
134
|
+
end
|
135
|
+
end
|
136
|
+
else
|
137
|
+
error cm_msg.read_content('reason') if cm_msg.read_content("reason")
|
138
|
+
end
|
139
|
+
when 'WARN'
|
140
|
+
warn cm_msg.read_content('reason') if cm_msg.read_content("reason")
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
puts "#{options[:last_action]} node '#{client_msg.read_property("node")}' out of PXE."
|
145
|
+
controller.configure(state: {node: node.to_sym, status: :start_without_pxe, last_action: options[:last_action]})
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
else
|
152
|
+
error ">>> Frisbee resource creation failed - #{reply_msg[:reason]}"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def load(comm, options)
|
158
|
+
comm.subscribe('cm_factory') do |controller|
|
159
|
+
#TODO handle the case some nodes are not up and running
|
160
|
+
unless controller.error?
|
161
|
+
@nof_nodes = options[:target_nodes].length
|
162
|
+
@nodes_up_without_pxe = []
|
163
|
+
@nodes_failed_without_pxe = []
|
164
|
+
@nodes_retrying_without_pxe = []
|
165
|
+
@nodes_up_pxe = []
|
166
|
+
nodes_failed_pxe = []
|
167
|
+
nodes_retrying_pxe = []
|
168
|
+
port = nil
|
169
|
+
controller.on_message do |m|
|
170
|
+
if m.operation == :inform
|
171
|
+
case m.read_content("itype")
|
172
|
+
when 'STATUS'
|
173
|
+
unless m.read_property("current").nil? && m.read_property("desired").nil?
|
174
|
+
if m.read_property("current").to_sym == :pxe_on && m.read_property("desired").to_sym == :pxe_on
|
175
|
+
n = m.read_property("node_name")
|
176
|
+
@nodes_up_pxe << n
|
177
|
+
if @nof_nodes == (@nodes_up_pxe.length + nodes_failed_pxe.length) #all nodes are up and running on pxe
|
178
|
+
puts "all nodes are up and running on pxe."
|
179
|
+
comm.subscribe('frisbee_factory') do |fcontroller|
|
180
|
+
puts "requesting available port"
|
181
|
+
fcontroller.request([:ports]) do |m|
|
182
|
+
port = m.read_property("ports")
|
183
|
+
puts "running frisbee server on port '#{port}'"
|
184
|
+
create_frisbeed(comm, fcontroller, port, options)
|
185
|
+
@nodes_up_pxe.each do |node|
|
186
|
+
create_frisbee(comm, fcontroller, node, port, options) #frisbee client
|
187
|
+
end
|
188
|
+
puts "running frisbee client on specified nodes."
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
else
|
193
|
+
error "exit code: #{m.read_content('exit_code')}" if m.read_content('exit_code')
|
194
|
+
end
|
195
|
+
end
|
196
|
+
when 'ERROR'
|
197
|
+
case m.read_property("event_type")
|
198
|
+
when "AUTH"
|
199
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
200
|
+
n = m.read_property("node_name")
|
201
|
+
nodes_failed_pxe << n
|
202
|
+
if @nof_nodes == (@nodes_up_pxe.length + nodes_failed_pxe.length) #all nodes are up and running on pxe
|
203
|
+
puts "all nodes are up and running on pxe."
|
204
|
+
comm.subscribe('frisbee_factory') do |fcontroller|
|
205
|
+
puts "requesting available port"
|
206
|
+
fcontroller.request([:ports]) do |m|
|
207
|
+
port = m.read_property("ports")
|
208
|
+
puts "running frisbee server on port '#{port}'"
|
209
|
+
create_frisbeed(comm, fcontroller, port, options)
|
210
|
+
@nodes_up_pxe.each do |node|
|
211
|
+
create_frisbee(comm, fcontroller, node, port, options) #frisbee client
|
212
|
+
end
|
213
|
+
puts "running frisbee client on specified nodes."
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
when "HTTP"
|
218
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
219
|
+
n = m.read_property("node_name")
|
220
|
+
if nodes_retrying_pxe.include?(n)
|
221
|
+
nodes_retrying_pxe.delete(n)
|
222
|
+
nodes_failed_pxe << n
|
223
|
+
if @nof_nodes == (@nodes_up_pxe.length + nodes_failed_pxe.length) #all nodes are up and running on pxe
|
224
|
+
puts "all nodes are up and running on pxe."
|
225
|
+
comm.subscribe('frisbee_factory') do |fcontroller|
|
226
|
+
puts "requesting available port"
|
227
|
+
fcontroller.request([:ports]) do |m|
|
228
|
+
port = m.read_property("ports")
|
229
|
+
puts "running frisbee server on port '#{port}'"
|
230
|
+
create_frisbeed(comm, fcontroller, port, options)
|
231
|
+
@nodes_up_pxe.each do |node|
|
232
|
+
create_frisbee(comm, fcontroller, node, port, options) #frisbee client
|
233
|
+
end
|
234
|
+
puts "running frisbee client on specified nodes."
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
else
|
239
|
+
nodes_retrying_pxe << n
|
240
|
+
controller.configure(state: {node: n.to_sym, status: :start_on_pxe})
|
241
|
+
end
|
242
|
+
when "TIME_OUT"
|
243
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
244
|
+
n = m.read_property("node_name")
|
245
|
+
nodes_failed_pxe << n
|
246
|
+
if @nof_nodes == (@nodes_up_pxe.length + nodes_failed_pxe.length) #all nodes are up and running on pxe
|
247
|
+
puts "all nodes are up and running on pxe."
|
248
|
+
comm.subscribe('frisbee_factory') do |fcontroller|
|
249
|
+
puts "requesting available port"
|
250
|
+
fcontroller.request([:ports]) do |m|
|
251
|
+
port = m.read_property("ports")
|
252
|
+
puts "running frisbee server on port '#{port}'"
|
253
|
+
create_frisbeed(comm, fcontroller, port, options)
|
254
|
+
@nodes_up_pxe.each do |node|
|
255
|
+
create_frisbee(comm, fcontroller, node, port, options) #frisbee client
|
256
|
+
end
|
257
|
+
puts "running frisbee client on specified nodes."
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
else
|
262
|
+
error m.read_content('reason') if m.read_content("reason")
|
263
|
+
end
|
264
|
+
when 'WARN'
|
265
|
+
warn cm_msg.read_content('reason') if m.read_content("reason")
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
options[:target_nodes].each do |node|
|
270
|
+
controller.configure(state: {node: node.to_sym, status: :start_on_pxe})
|
271
|
+
end
|
272
|
+
puts "waiting for target nodes to boot on PXE."
|
273
|
+
else
|
274
|
+
error controller.inspect
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
#run imagezip server
|
280
|
+
def create_imagezip_server(comm, fcontroller, port, options)
|
281
|
+
fcontroller.create(:imagezip_server, {hrn: 'imagezip server', image: options[:image], port: port}) do |reply_msg|
|
282
|
+
if reply_msg.success?
|
283
|
+
server = reply_msg.resource
|
284
|
+
@@server = server
|
285
|
+
server.on_subscribed do
|
286
|
+
server.on_message do |m|
|
287
|
+
if m.operation == :inform
|
288
|
+
if m.read_content("event") == "STDOUT"
|
289
|
+
puts m.read_content("msg")
|
290
|
+
elsif m.read_content("event") == "EXIT"
|
291
|
+
puts m.read_content("msg")
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
else
|
297
|
+
error ">>> Imagezip Server resource creation failed - #{reply_msg[:reason]}"
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
#run imagezip client on a node
|
303
|
+
def create_imagezip_client(comm, fcontroller, node, port, options)
|
304
|
+
fcontroller.create(:imagezip_client, {hrn: 'imagezip client', port: port, node_topic: "#{node.to_s}"}) do |reply_msg|
|
305
|
+
if reply_msg.success?
|
306
|
+
client = reply_msg.resource
|
307
|
+
client.on_subscribed do
|
308
|
+
client.on_message do |client_msg|
|
309
|
+
if client_msg.operation == :inform
|
310
|
+
if client_msg.read_property("event") == "STDOUT"
|
311
|
+
print "#{client_msg.read_property("msg")}"
|
312
|
+
elsif client_msg.read_property("event") == "EXIT"
|
313
|
+
puts "#{client_msg.read_property("node")}: #{client_msg.read_property("msg")}"
|
314
|
+
comm.subscribe('cm_factory') do |controller|
|
315
|
+
controller.on_message do |cm_msg|
|
316
|
+
if cm_msg.operation == :inform
|
317
|
+
case cm_msg.read_content("itype")
|
318
|
+
when 'STATUS'
|
319
|
+
unless cm_msg.read_property("current").nil? && cm_msg.read_property("desired").nil?
|
320
|
+
if cm_msg.read_property("current").to_sym == :pxe_off && cm_msg.read_property("desired").to_sym == :pxe_off
|
321
|
+
puts "save proccess completed. Image was saved in directory '/var/lib/omf-images-6'"
|
322
|
+
fcontroller.release(@@server) do |reply_msg|
|
323
|
+
comm.disconnect
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
327
|
+
when 'ERROR'
|
328
|
+
case cm_msg.read_property("event_type")
|
329
|
+
when "AUTH"
|
330
|
+
logger.info "#{cm_msg.read_property("msg")}, exit code: #{cm_msg.read_property("exit_code")}"
|
331
|
+
fcontroller.release(@@server) do |reply_msg|
|
332
|
+
comm.disconnect
|
333
|
+
end
|
334
|
+
when "HTTP"
|
335
|
+
logger.info "#{cm_msg.read_property("msg")}, exit code: #{cm_msg.read_property("exit_code")}"
|
336
|
+
if @retried
|
337
|
+
fcontroller.release(@@server) do |reply_msg|
|
338
|
+
comm.disconnect
|
339
|
+
end
|
340
|
+
else
|
341
|
+
@retried = true
|
342
|
+
controller.configure(state: {node: node.to_sym, status: :start_without_pxe, last_action: options[:last_action]})
|
343
|
+
end
|
344
|
+
when "TIME_OUT"
|
345
|
+
logger.info "#{cm_msg.read_property("msg")}, exit code: #{cm_msg.read_property("exit_code")}"
|
346
|
+
fcontroller.release(@@server) do |reply_msg|
|
347
|
+
comm.disconnect
|
348
|
+
end
|
349
|
+
else
|
350
|
+
error cm_msg.read_content('reason') if cm_msg.read_content("reason")
|
351
|
+
end
|
352
|
+
when 'WARN'
|
353
|
+
warn cm_msg.read_content('reason') if cm_msg.read_content("reason")
|
354
|
+
end
|
355
|
+
end
|
356
|
+
end
|
357
|
+
puts "#{options[:last_action]} node '#{client_msg.read_property("node")}' out of PXE."
|
358
|
+
controller.configure(state: {node: node.to_sym, status: :start_without_pxe, last_action: options[:last_action]})
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
362
|
+
end
|
363
|
+
end
|
364
|
+
else
|
365
|
+
error ">>> Frisbee resource creation failed - #{reply_msg[:reason]}"
|
366
|
+
end
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
def save(comm, options)
|
371
|
+
comm.subscribe('cm_factory') do |controller|
|
372
|
+
@retried = false
|
373
|
+
unless controller.error?
|
374
|
+
port = nil
|
375
|
+
controller.on_message do |m|
|
376
|
+
if m.operation == :inform
|
377
|
+
puts m.inspect
|
378
|
+
case m.read_content("itype")
|
379
|
+
when 'STATUS'
|
380
|
+
unless m.read_property("current").nil? && m.read_property("desired").nil?
|
381
|
+
logger.info "#{m.read_property("node_name")}, current: #{m.read_property("current")}, desired: #{m.read_property("desired")}"
|
382
|
+
if m.read_property("current").to_sym == :pxe_on && m.read_property("desired").to_sym == :pxe_on
|
383
|
+
puts "node is up and running on pxe."
|
384
|
+
comm.subscribe('frisbee_factory') do |fcontroller|
|
385
|
+
puts "requesting available port"
|
386
|
+
fcontroller.request([:ports]) do |m|
|
387
|
+
port = m.read_property("ports")
|
388
|
+
puts "running imagezip server on port #{port}."
|
389
|
+
create_imagezip_server(comm, fcontroller, port, options)
|
390
|
+
sleep 2
|
391
|
+
puts "running imagezip client on node."
|
392
|
+
create_imagezip_client(comm, fcontroller, options[:node], port, options)
|
393
|
+
end
|
394
|
+
end
|
395
|
+
else
|
396
|
+
error "exit code: #{m.read_content('exit_code')}" if m.read_content('exit_code')
|
397
|
+
end
|
398
|
+
end
|
399
|
+
when 'ERROR'
|
400
|
+
case m.read_property("event_type")
|
401
|
+
when "AUTH"
|
402
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
403
|
+
comm.disconnect
|
404
|
+
when "HTTP"
|
405
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
406
|
+
if @retried
|
407
|
+
comm.disconnect
|
408
|
+
else
|
409
|
+
@retried = true
|
410
|
+
controller.configure(state: {node: options[:node].to_sym, status: :start_on_pxe})
|
411
|
+
end
|
412
|
+
when "TIME_OUT"
|
413
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
414
|
+
comm.disconnect
|
415
|
+
else
|
416
|
+
error m.read_content('reason') if m.read_content("reason")
|
417
|
+
end
|
418
|
+
when 'WARN'
|
419
|
+
warn m.read_content('reason') if m.read_content("reason")
|
420
|
+
end
|
421
|
+
end
|
422
|
+
end
|
423
|
+
|
424
|
+
controller.configure(state: {node: options[:node].to_sym, status: :start_on_pxe})
|
425
|
+
puts "waiting for node to boot on PXE."
|
426
|
+
else
|
427
|
+
error controller.inspect
|
428
|
+
end
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
432
|
+
def tell(comm, options)
|
433
|
+
comm.subscribe('cm_factory') do |controller|
|
434
|
+
unless controller.error?
|
435
|
+
nodes_failed = []
|
436
|
+
nodes_ok = []
|
437
|
+
nodes_retrying = []
|
438
|
+
controller.on_message do |m|
|
439
|
+
if m.operation == :inform
|
440
|
+
case m.read_content("itype")
|
441
|
+
when 'STATUS'
|
442
|
+
unless m.read_property("current").nil? && m.read_property("desired").nil?
|
443
|
+
if m.read_property("current") != m.read_property("desired")
|
444
|
+
if options[:wait]
|
445
|
+
puts "Waiting for node '#{m.read_property("node_name")}'."
|
446
|
+
logger.info "#{m.read_property("node_name")} is #{m.read_property("current")}."
|
447
|
+
else
|
448
|
+
n = m.read_property("node_name")
|
449
|
+
nodes_ok << n
|
450
|
+
if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
|
451
|
+
puts "all nodes are running." #TODO messages for failed nodes
|
452
|
+
comm.disconnect
|
453
|
+
end
|
454
|
+
end
|
455
|
+
else
|
456
|
+
n = m.read_property("node_name")
|
457
|
+
nodes_ok << n
|
458
|
+
if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
|
459
|
+
puts "all nodes are #{m.read_property("desired")}." #TODO messages for failed nodes
|
460
|
+
comm.disconnect
|
461
|
+
end
|
462
|
+
end
|
463
|
+
end
|
464
|
+
when 'ERROR'
|
465
|
+
case m.read_property("event_type")
|
466
|
+
when "AUTH"
|
467
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
468
|
+
n = m.read_property("node_name")
|
469
|
+
nodes_failed << n
|
470
|
+
if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
|
471
|
+
comm.disconnect
|
472
|
+
end
|
473
|
+
when "HTTP"
|
474
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
475
|
+
n = m.read_property("node_name")
|
476
|
+
if nodes_retrying.include?(n)
|
477
|
+
nodes_retrying.delete(n)
|
478
|
+
nodes_failed << n
|
479
|
+
if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
|
480
|
+
comm.disconnect
|
481
|
+
end
|
482
|
+
else
|
483
|
+
nodes_retrying << n
|
484
|
+
info "retrying to send message #{options[:status]} to node #{n}"
|
485
|
+
controller.configure(state: {node: n.to_sym, status: options[:status].to_sym})
|
486
|
+
end
|
487
|
+
when "TIME_OUT"
|
488
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
489
|
+
n = m.read_property("node_name")
|
490
|
+
nodes_failed << n
|
491
|
+
if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
|
492
|
+
comm.disconnect
|
493
|
+
end
|
494
|
+
else
|
495
|
+
error m.read_content('reason') if m.read_content("reason")
|
496
|
+
comm.disconnect
|
497
|
+
end
|
498
|
+
when 'WARN'
|
499
|
+
warn m.read_content('reason') if m.read_content("reason")
|
500
|
+
end
|
501
|
+
end
|
502
|
+
end
|
503
|
+
if options[:status] == "on"
|
504
|
+
options[:target_nodes].each do |node|
|
505
|
+
controller.configure(state: {node: node.to_sym, status: :on, wait: options[:wait]})
|
506
|
+
end
|
507
|
+
elsif options[:status] == "off"
|
508
|
+
options[:target_nodes].each do |node|
|
509
|
+
controller.configure(state: {node: node.to_sym, status: :off, wait: options[:wait]})
|
510
|
+
end
|
511
|
+
elsif options[:status] == "reset"
|
512
|
+
options[:target_nodes].each do |node|
|
513
|
+
controller.configure(state: {node: node.to_sym, status: :reset, wait: options[:wait]})
|
514
|
+
end
|
515
|
+
else
|
516
|
+
puts "Invalid value for -a, only on/off/reset values are available."
|
517
|
+
puts opt_parser
|
518
|
+
comm.disconnect
|
519
|
+
end
|
520
|
+
unless options[:wait]
|
521
|
+
puts "Proccess complete."
|
522
|
+
comm.disconnect
|
523
|
+
end
|
524
|
+
else
|
525
|
+
error controller.inspect
|
526
|
+
end
|
527
|
+
end
|
528
|
+
end
|
529
|
+
|
530
|
+
def stat(comm, options)
|
531
|
+
comm.subscribe('cm_factory') do |controller|
|
532
|
+
unless controller.error?
|
533
|
+
nodes_failed = []
|
534
|
+
nodes_ok = []
|
535
|
+
nodes_retrying = []
|
536
|
+
controller.on_message do |m|
|
537
|
+
if m.operation == :inform
|
538
|
+
case m.read_content("itype")
|
539
|
+
when 'STATUS'
|
540
|
+
unless m.read_property("current").nil?
|
541
|
+
puts "#{m.read_property("node_name")} is #{m.read_property("current")}"
|
542
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
543
|
+
n = m.read_property("node_name")
|
544
|
+
nodes_ok << n
|
545
|
+
if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
|
546
|
+
comm.disconnect
|
547
|
+
end
|
548
|
+
# elsif m.read_property("event_type") == "EXIT"
|
549
|
+
# puts "ERROR: #{m.read_property("node")} - #{m.read_property("msg")}"
|
550
|
+
# logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
551
|
+
# nof_nodes += 1
|
552
|
+
# if nof_nodes == options[:target_nodes].length
|
553
|
+
# comm.disconnect
|
554
|
+
# end
|
555
|
+
end
|
556
|
+
when 'ERROR'
|
557
|
+
case m.read_property("event_type")
|
558
|
+
when "AUTH"
|
559
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
560
|
+
n = m.read_property("node_name")
|
561
|
+
nodes_failed << n
|
562
|
+
if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
|
563
|
+
comm.disconnect
|
564
|
+
end
|
565
|
+
when "HTTP"
|
566
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
567
|
+
n = m.read_property("node_name")
|
568
|
+
if nodes_retrying.include?(n)
|
569
|
+
nodes_retrying.delete(n)
|
570
|
+
nodes_failed << n
|
571
|
+
if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
|
572
|
+
comm.disconnect
|
573
|
+
end
|
574
|
+
else
|
575
|
+
nodes_retrying << n
|
576
|
+
info "retrying to send message #{options[:status]} to node #{n}"
|
577
|
+
controller.configure(state: {node: n.to_sym, status: :get_status})
|
578
|
+
end
|
579
|
+
when "TIME_OUT"
|
580
|
+
logger.info "#{m.read_property("msg")}, exit code: #{m.read_property("exit_code")}"
|
581
|
+
n = m.read_property("node_name")
|
582
|
+
nodes_failed << n
|
583
|
+
if (nodes_ok.length + nodes_failed.length) == options[:target_nodes].length
|
584
|
+
comm.disconnect
|
585
|
+
end
|
586
|
+
else
|
587
|
+
error m.read_content('reason') if m.read_content("itype") == 'ERROR'
|
588
|
+
comm.disconnect
|
589
|
+
end
|
590
|
+
when 'WARN'
|
591
|
+
warn m.read_content('reason') if m.read_content("itype") == 'WARN'
|
592
|
+
end
|
593
|
+
end
|
594
|
+
end
|
595
|
+
|
596
|
+
options[:target_nodes].each do |node|
|
597
|
+
controller.configure(state: {node: node.to_sym, status: :get_status})
|
598
|
+
end
|
599
|
+
else
|
600
|
+
error controller.inspect
|
601
|
+
comm.disconnect
|
602
|
+
end
|
603
|
+
end
|
604
|
+
end
|
605
|
+
|
606
|
+
opt_parser.parse!
|
607
|
+
|
608
|
+
OmfCommon.init(@config[:operationMode], communication: { url: "xmpp://#{@xmpp[:script_user]}:#{@xmpp[:password]}@#{@xmpp[:server]}", auth: {} }) do
|
609
|
+
OmfCommon.comm.on_connected do |comm|
|
610
|
+
OmfCommon::Auth::CertificateStore.instance.register_default_certs(trusted_roots)
|
611
|
+
entity.resource_id = OmfCommon.comm.local_topic.address
|
612
|
+
OmfCommon::Auth::CertificateStore.instance.register(entity)
|
613
|
+
|
614
|
+
info "Test script >> Connected to XMPP"
|
615
|
+
|
616
|
+
case ARGV[0]
|
617
|
+
when "load"
|
618
|
+
if options[:node].nil? && options[:status].nil? && !options[:target_nodes].nil?
|
619
|
+
if options[:last_action] == "reset" || options[:last_action] == "shutdown"
|
620
|
+
puts "call load on options #{options.inspect}"
|
621
|
+
load(comm, options)
|
622
|
+
else
|
623
|
+
puts "Invalid value for -l, only reset/shutdown values are available."
|
624
|
+
puts opt_parser
|
625
|
+
comm.disconnect
|
626
|
+
end
|
627
|
+
else
|
628
|
+
puts "Invalid arguements."
|
629
|
+
puts opt_parser
|
630
|
+
comm.disconnect
|
631
|
+
end
|
632
|
+
when "save"
|
633
|
+
if options[:image].nil? && !options[:node].nil? && options[:status].nil? && options[:target_nodes].nil?
|
634
|
+
if options[:last_action] == "reset" || options[:last_action] == "shutdown"
|
635
|
+
puts "call save on options #{options.inspect}"
|
636
|
+
save(comm, options)
|
637
|
+
else
|
638
|
+
puts "Invalid value for -l, only reset/shutdown values are available."
|
639
|
+
puts opt_parser
|
640
|
+
comm.disconnect
|
641
|
+
end
|
642
|
+
else
|
643
|
+
puts "Invalid arguements."
|
644
|
+
puts opt_parser
|
645
|
+
comm.disconnect
|
646
|
+
end
|
647
|
+
when "tell"
|
648
|
+
if options[:image].nil? && options[:node].nil? && !options[:status].nil? && !options[:target_nodes].nil?
|
649
|
+
if options[:status] == "on" || options[:status] == "off" || options[:status] == "reset"
|
650
|
+
puts "call tell on options #{options.inspect}"
|
651
|
+
tell(comm, options)
|
652
|
+
else
|
653
|
+
puts "Invalid value for -a, only on/off/reset values are available."
|
654
|
+
puts opt_parser
|
655
|
+
comm.disconnect
|
656
|
+
end
|
657
|
+
else
|
658
|
+
puts "Invalid arguements."
|
659
|
+
puts opt_parser
|
660
|
+
comm.disconnect
|
661
|
+
end
|
662
|
+
when "stat"
|
663
|
+
if options[:image].nil? && options[:node].nil? && options[:status].nil? && !options[:target_nodes].nil?
|
664
|
+
puts "call stat on options #{options.inspect}"
|
665
|
+
stat(comm, options)
|
666
|
+
else
|
667
|
+
puts "Invalid arguements."
|
668
|
+
puts opt_parser
|
669
|
+
comm.disconnect
|
670
|
+
end
|
671
|
+
else
|
672
|
+
puts "Invalid command / options."
|
673
|
+
puts opt_parser
|
674
|
+
comm.disconnect
|
675
|
+
end
|
676
|
+
|
677
|
+
comm.on_interrupted { comm.disconnect }
|
678
|
+
end
|
679
|
+
end
|