omf_ec 6.0.0.pre.3 → 6.0.0.pre.4
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/Rakefile +1 -0
- data/bin/omf_ec +264 -0
- data/example/engine_oedl.rb +52 -0
- data/example/engine_test.rb +90 -0
- data/example/test_exp/test00.rb +12 -0
- data/example/test_exp/test01.rb +22 -0
- data/example/test_exp/test02.rb +30 -0
- data/{exp_repo/test/exp → example/test_exp}/test03.rb +2 -42
- data/{exp_repo/test/exp → example/test_exp}/test04.rb +2 -2
- data/{exp_repo/test/exp → example/test_exp}/test05.rb +4 -4
- data/{exp_repo/test/exp → example/test_exp}/test06.rb +6 -6
- data/example/test_exp/test07.rb +65 -0
- data/lib/omf_ec/app_definition.rb +57 -0
- data/lib/omf_ec/backward/app_definition.rb +35 -0
- data/lib/omf_ec/backward/core_ext/array.rb +19 -0
- data/lib/omf_ec/backward/default_events.rb +71 -0
- data/lib/omf_ec/backward/dsl.rb +83 -0
- data/lib/omf_ec/backward/exp/testbed.rb +47 -0
- data/lib/omf_ec/backward/group.rb +72 -0
- data/lib/omf_ec/context/app_context.rb +54 -0
- data/lib/omf_ec/context/def_app_context.rb +6 -0
- data/lib/omf_ec/context/group_context.rb +88 -0
- data/lib/omf_ec/context/net_context.rb +46 -0
- data/lib/omf_ec/context.rb +10 -0
- data/lib/omf_ec/dsl.rb +159 -0
- data/lib/omf_ec/experiment.rb +71 -0
- data/lib/omf_ec/group.rb +158 -0
- data/lib/omf_ec/version.rb +1 -1
- data/lib/omf_ec.rb +34 -1
- data/omf_ec.gemspec +2 -3
- data/test/omf_ec/context_spec.rb +19 -0
- data/test/omf_ec/group_spec.rb +14 -0
- data/test/test_helper.rb +19 -0
- metadata +44 -89
- data/bin/omf +0 -147
- data/bin/omf_pre +0 -76
- data/bin/omf_test +0 -161
- data/example/net_devices.rb +0 -75
- data/exp_repo/system/exp/eventlib.rb +0 -96
- data/exp_repo/system/exp/imageNode.rb +0 -283
- data/exp_repo/system/exp/reset.rb +0 -21
- data/exp_repo/system/exp/saveNode.rb +0 -99
- data/exp_repo/system/exp/stat.rb +0 -49
- data/exp_repo/system/exp/stdlib.rb +0 -122
- data/exp_repo/system/exp/tell.rb +0 -53
- data/exp_repo/system/exp/testlib.rb +0 -12
- data/exp_repo/system/exp/winlib.rb +0 -154
- data/exp_repo/system/topo/active.rb +0 -9
- data/exp_repo/system/topo/all.rb +0 -10
- data/exp_repo/system/topo/circle.rb +0 -23
- data/exp_repo/test/app/aodvd.rb +0 -73
- data/exp_repo/test/app/appDef1.rb +0 -102
- data/exp_repo/test/app/athstats.rb +0 -76
- data/exp_repo/test/app/echo.rb +0 -36
- data/exp_repo/test/app/gennyReceiverAppDef.rb +0 -100
- data/exp_repo/test/app/gennySenderAppDef.rb +0 -106
- data/exp_repo/test/app/itgdec.rb +0 -79
- data/exp_repo/test/app/itgr.rb +0 -77
- data/exp_repo/test/app/itgs.rb +0 -105
- data/exp_repo/test/app/nop.rb +0 -36
- data/exp_repo/test/app/otg2.rb +0 -68
- data/exp_repo/test/app/otg2_mp.rb +0 -56
- data/exp_repo/test/app/otr2.rb +0 -56
- data/exp_repo/test/app/otr2_mp.rb +0 -51
- data/exp_repo/test/app/trace_oml2.rb +0 -62
- data/exp_repo/test/app/wlanconfig_oml2.rb +0 -42
- data/exp_repo/test/exp/conf-room-demo.rb +0 -118
- data/exp_repo/test/exp/planetlab.rb +0 -82
- data/exp_repo/test/exp/test01.rb +0 -42
- data/exp_repo/test/exp/test02.rb +0 -60
- data/exp_repo/test/exp/tutorial/hello-world-wired.rb +0 -79
- data/exp_repo/test/exp/tutorial/hello-world-wireless.rb +0 -87
- data/exp_repo/test/exp/tutorial/using-filters.rb +0 -69
- data/exp_repo/test/exp/tutorial/using-groups.rb +0 -64
- data/exp_repo/test/exp/tutorial/using-properties.rb +0 -93
- data/exp_repo/test/exp/tutorial/using-prototypes.rb +0 -111
- data/exp_repo/test/proto/aodvrouter.rb +0 -55
- data/exp_repo/test/proto/driverqueryapp.rb +0 -59
- data/exp_repo/test/proto/forwarder.rb +0 -73
- data/exp_repo/test/proto/itgcbrsender.rb +0 -70
- data/exp_repo/test/proto/itgdecoder.rb +0 -64
- data/exp_repo/test/proto/itgreceiver.rb +0 -55
- data/exp_repo/test/proto/itgvoipsender.rb +0 -64
- data/exp_repo/test/proto/listener2.rb +0 -62
- data/exp_repo/test/proto/nop.rb +0 -47
- data/exp_repo/test/proto/probelink.rb +0 -48
- data/exp_repo/test/proto/raw_receiver.rb +0 -64
- data/exp_repo/test/proto/receiver2_mp.rb +0 -48
- data/exp_repo/test/proto/sender2_mp.rb +0 -54
- data/exp_repo/test/proto/udp_receiver.rb +0 -55
- data/exp_repo/test/proto/udp_sender.rb +0 -61
data/Rakefile
CHANGED
data/bin/omf_ec
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#
|
|
3
|
+
require 'gli'
|
|
4
|
+
require 'omf_ec'
|
|
5
|
+
$stdout.sync = true
|
|
6
|
+
|
|
7
|
+
include GLI::App
|
|
8
|
+
include OmfEc
|
|
9
|
+
|
|
10
|
+
program_desc "Run a command on the testbed(s)"
|
|
11
|
+
version OmfEc::VERSION
|
|
12
|
+
|
|
13
|
+
desc "Debug mode (printing debug logging messages)"
|
|
14
|
+
switch [:d, :debug]
|
|
15
|
+
|
|
16
|
+
desc "Debug XMPP traffic mode (include XMPP debug logging messages under debug mode)."
|
|
17
|
+
switch [:x, :xmpp]
|
|
18
|
+
|
|
19
|
+
desc "XMPP user name"
|
|
20
|
+
arg_name "user"
|
|
21
|
+
flag [:u, :user]
|
|
22
|
+
|
|
23
|
+
desc "XMPP user password"
|
|
24
|
+
arg_name "password"
|
|
25
|
+
flag [:p, :password]
|
|
26
|
+
|
|
27
|
+
desc "XMPP server domain"
|
|
28
|
+
arg_name "domain"
|
|
29
|
+
default_value "localhost"
|
|
30
|
+
flag [:s, :server]
|
|
31
|
+
|
|
32
|
+
desc "Private key file"
|
|
33
|
+
arg_name "key", :optional
|
|
34
|
+
flag [:private_key]
|
|
35
|
+
|
|
36
|
+
desc "Log file directory"
|
|
37
|
+
arg_name "directory"
|
|
38
|
+
default_value "/tmp"
|
|
39
|
+
flag [:log_file_dir]
|
|
40
|
+
|
|
41
|
+
config_file(".config/omf_ec.yml")
|
|
42
|
+
|
|
43
|
+
desc "Execute an experiment script"
|
|
44
|
+
arg_name "path_to_script_file [-- --experiment_property value]"
|
|
45
|
+
command :exec do |c|
|
|
46
|
+
c.desc "Experiment name"
|
|
47
|
+
c.arg_name "experiment_name"
|
|
48
|
+
c.flag [:e, :experiment]
|
|
49
|
+
|
|
50
|
+
c.desc "Default OML URI to use for collecting measurements"
|
|
51
|
+
c.arg_name "uri"
|
|
52
|
+
c.flag [:oml_uri]
|
|
53
|
+
|
|
54
|
+
c.desc "Check script version (you need to define OMF_VERSIONS in your script"
|
|
55
|
+
c.switch "version_check"
|
|
56
|
+
|
|
57
|
+
c.action do |global_options, options, args|
|
|
58
|
+
help_now! "Missing experiment script" if args[0].nil?
|
|
59
|
+
help_now! "Experiment script not found" unless File.exist?(args[0])
|
|
60
|
+
|
|
61
|
+
# User provided exp properties
|
|
62
|
+
if args.size > 1
|
|
63
|
+
exp_properties = args[1..-1]
|
|
64
|
+
|
|
65
|
+
exp_properties.in_groups_of(2) do |p|
|
|
66
|
+
unless p[0] =~ /^--(.+)/ && !p[1].nil?
|
|
67
|
+
help_now! "Malformatted properties '#{exp_properties.join(' ')}'"
|
|
68
|
+
else
|
|
69
|
+
OmfEc.exp.property[$1.to_sym] = p[1].ducktype
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# FIXME this loading script is way too simple
|
|
75
|
+
load_exp(args[0], global_options, options)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
desc "Load an image onto the nodes"
|
|
80
|
+
command :load do |c|
|
|
81
|
+
#c.desc "use this testbed configuration in OMF 5 EC config file"
|
|
82
|
+
#c.arg_name "AGGREGATE"
|
|
83
|
+
#c.flag [:c, :config], :default_value => "default"
|
|
84
|
+
|
|
85
|
+
c.desc "comma-separated list of nodes to image"
|
|
86
|
+
c.arg_name "TOPOLOGY"
|
|
87
|
+
c.flag [:t, :topology], :default_value => "system:topo:all"
|
|
88
|
+
|
|
89
|
+
c.desc "disk image to load"
|
|
90
|
+
c.arg_name "IMAGE"
|
|
91
|
+
c.flag [:i, :image], :default_value => "baseline.ndz"
|
|
92
|
+
|
|
93
|
+
c.desc "seconds to wait for the imaging process to complete"
|
|
94
|
+
c.arg_name "TIMEOUT"
|
|
95
|
+
c.flag [:o, :timeout], :default_value => "800"
|
|
96
|
+
|
|
97
|
+
c.desc "resize the first partition to SIZE GB or to maximum size if SIZE=0 "+
|
|
98
|
+
"or leave x percent of free space if SIZE=x%"
|
|
99
|
+
c.arg_name "SIZE"
|
|
100
|
+
c.flag [:r, :resize]
|
|
101
|
+
|
|
102
|
+
c.desc "Path where the resulting Topologies should be saved"
|
|
103
|
+
c.arg_name "PATH"
|
|
104
|
+
c.flag [:outpath], :default_value => "/tmp"
|
|
105
|
+
|
|
106
|
+
c.desc "Prefix to use for naming the resulting Topologies (default is your experiment ID)"
|
|
107
|
+
c.arg_name "PREFIX"
|
|
108
|
+
c.flag [:outprefix]
|
|
109
|
+
|
|
110
|
+
c.action do |global_options, options, args|
|
|
111
|
+
@cmd = "omf-5.4 load -t #{options[:t]} -i #{options[:i]} "
|
|
112
|
+
@cmd += "-o #{options[:o]} --outpath #{options[:outpath]} "
|
|
113
|
+
@cmd += "-r #{options[:r]} " if options[:r]
|
|
114
|
+
@cmd += "--outprefix #{options[:outprefix]} " if options[:outprefix]
|
|
115
|
+
load_exp(@testbed_exp_path, global_options, options)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
desc "Save an image of a node"
|
|
120
|
+
command :save do |c|
|
|
121
|
+
#c.desc "use this testbed configuration in OMF 5 EC config file"
|
|
122
|
+
#c.arg_name "AGGREGATE"
|
|
123
|
+
#c.flag [:c, :config], :default_value => "default"
|
|
124
|
+
|
|
125
|
+
c.desc "node to save from"
|
|
126
|
+
c.arg_name "NODE"
|
|
127
|
+
c.flag [:n, :node]
|
|
128
|
+
|
|
129
|
+
c.desc "resize the first partition to SIZE GB or to maximum size if SIZE=0 "+
|
|
130
|
+
"or leave x percent of free space if SIZE=x%"
|
|
131
|
+
c.arg_name "SIZE"
|
|
132
|
+
c.flag [:r, :resize]
|
|
133
|
+
|
|
134
|
+
c.action do |global_options, options, args|
|
|
135
|
+
@cmd = "omf-5.4 save "
|
|
136
|
+
@cmd += "-n #{options[:n]} " if options[:n]
|
|
137
|
+
@cmd += "-r #{options[:r]} " if options[:r]
|
|
138
|
+
load_exp(@testbed_exp_path, global_options, options)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
desc "Return the status of the nodes"
|
|
143
|
+
command :stat do |c|
|
|
144
|
+
c.desc "use this testbed configuration in OMF 5 EC config file"
|
|
145
|
+
c.arg_name "AGGREGATE"
|
|
146
|
+
c.flag [:c, :config], :default_value => "default"
|
|
147
|
+
|
|
148
|
+
c.desc "comma-separated list of nodes to image"
|
|
149
|
+
c.arg_name "TOPOLOGY"
|
|
150
|
+
c.flag [:t, :topology], :default_value => "system:topo:all"
|
|
151
|
+
|
|
152
|
+
c.desc "print a summary of the node status for the testbed"
|
|
153
|
+
c.switch [:s, :summary]
|
|
154
|
+
|
|
155
|
+
c.action do |global_options, options, args|
|
|
156
|
+
@cmd = "omf-5.4 stat -c #{options[:c]} -t #{options[:t]} "
|
|
157
|
+
@cmd += "-s" if options[:s]
|
|
158
|
+
load_exp(@testbed_exp_path, global_options, options)
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
desc "Power on/off, reset or reboot the nodes"
|
|
163
|
+
command :tell do |c|
|
|
164
|
+
c.desc "use this testbed configuration in OMF 5 EC config file"
|
|
165
|
+
c.arg_name "AGGREGATE"
|
|
166
|
+
c.flag [:c, :config], :default_value => "default"
|
|
167
|
+
|
|
168
|
+
c.desc "comma-separated list of nodes to image"
|
|
169
|
+
c.arg_name "TOPOLOGY"
|
|
170
|
+
c.flag [:t, :topology], :default_value => "system:topo:all"
|
|
171
|
+
|
|
172
|
+
c.desc "
|
|
173
|
+
'on' turn node(s) ON -
|
|
174
|
+
'offs' turn node(s) OFF (soft) -
|
|
175
|
+
'offh' turn node(s) OFF (hard) -
|
|
176
|
+
'reboot' reboots node(s) (soft) -
|
|
177
|
+
'reset' resets node(s) (hard)"
|
|
178
|
+
c.arg_name "ACTION"
|
|
179
|
+
c.flag [:a, :action]
|
|
180
|
+
|
|
181
|
+
c.action do |global_options, options, args|
|
|
182
|
+
@cmd = "omf-5.4 tell -c #{options[:c]} -t #{options[:t]} "
|
|
183
|
+
@cmd += "-a #{options[:a]} " if options[:a]
|
|
184
|
+
load_exp(@testbed_exp_path, global_options, options)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
on_error do |exception|
|
|
189
|
+
true
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
pre do |global_options, command, options, args|
|
|
193
|
+
unless global_options[:user] && global_options[:password] && global_options[:server]
|
|
194
|
+
help_now! "Incomplete options"
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
if global_options[:xmpp]
|
|
198
|
+
Blather.logger = logger
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
if global_options[:debug]
|
|
202
|
+
Logging.logger.root.level = :debug
|
|
203
|
+
else
|
|
204
|
+
Logging.consolidate 'OmfCommon', 'OmfEc', 'OmfRc'
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Import private key
|
|
208
|
+
if global_options[:private_key]
|
|
209
|
+
OmfCommon::Key.instance.import(global_options[:private_key])
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# Check version
|
|
213
|
+
if options[:check]
|
|
214
|
+
File.open(args[0], 'r') do |f|
|
|
215
|
+
f.read.chomp.match(/OMF_VERSIONS\W*=\W*(.*)/)
|
|
216
|
+
versions = $1
|
|
217
|
+
unless versions && versions.split(',').include?(OmfCommon::PROTOCOL_VERSION)
|
|
218
|
+
raise StandardError, "Could not find compatibile protocol version number in your script"
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
include OmfEc::DSL
|
|
224
|
+
|
|
225
|
+
OmfEc.exp.name = options[:experiment] if options[:experiment]
|
|
226
|
+
OmfEc.exp.oml_uri = options[:oml_uri] if options[:oml_uri]
|
|
227
|
+
|
|
228
|
+
if global_options[:log_file_dir] && File.exist?(global_options[:log_file_dir])
|
|
229
|
+
Logging.logger.root.add_appenders(
|
|
230
|
+
Logging.appenders.file(
|
|
231
|
+
"#{global_options[:log_file_dir]}/#{OmfEc.exp.id}.log",
|
|
232
|
+
:layout => Logging.layouts.pattern(:date_pattern => '%F %T %z',
|
|
233
|
+
:pattern => '[%d] %-5l %c: %m\n')))
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
@testbed_exp_path = File.join(OmfEc.lib_root, "omf_ec/backward/exp/testbed.rb")
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def load_exp(exp_path, global_options = {} , options = {})
|
|
240
|
+
begin
|
|
241
|
+
OmfEc.comm.when_ready do
|
|
242
|
+
logger.info "Connected: #{OmfEc.comm.jid.inspect}"
|
|
243
|
+
logger.info "Start experiment: #{OmfEc.exp.id}"
|
|
244
|
+
begin
|
|
245
|
+
include OmfEc::Backward::DefaultEvents
|
|
246
|
+
load exp_path
|
|
247
|
+
rescue => e
|
|
248
|
+
logger.error e.message
|
|
249
|
+
logger.error e.backtrace.join("\n")
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
EM.run do
|
|
254
|
+
OmfEc.comm.connect(global_options[:user], global_options[:password], global_options[:server])
|
|
255
|
+
trap(:INT) { Experiment.done }
|
|
256
|
+
trap(:TERM) { Experiment.done }
|
|
257
|
+
end
|
|
258
|
+
rescue => e
|
|
259
|
+
logger.fatal e.message
|
|
260
|
+
logger.fatal e.backtrace.join("\n")
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
exit run(ARGV)
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# OMF_VERSIONS = 6.0
|
|
2
|
+
#
|
|
3
|
+
# :num_of_garage can be passed in from EC command line
|
|
4
|
+
defProperty('num_of_garage', 1, 'Number of garage to start')
|
|
5
|
+
|
|
6
|
+
garages = (1..prop.num_of_garage).map { |i| "garage_#{i}" }
|
|
7
|
+
|
|
8
|
+
defEvent :all_engines_up do |state|
|
|
9
|
+
# state holds list of resources, and automatically updated once OMF inform messages received.
|
|
10
|
+
state.find_all do |v|
|
|
11
|
+
v[:type] == 'engine'
|
|
12
|
+
end.size >= prop.num_of_garage
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
defEvent :rpm_reached do |state|
|
|
16
|
+
state.find_all do |v|
|
|
17
|
+
v[:type] == 'engine' && v[:rpm] && v[:rpm] >= 4000
|
|
18
|
+
end.size >= prop.num_of_garage
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Define a group and add garages to it.
|
|
22
|
+
defGroup('many_garages', *garages)
|
|
23
|
+
|
|
24
|
+
# :ALL_UP is a pre-defined event,
|
|
25
|
+
# triggered when all resources set to be part of groups are available and configured as members of the associated groups.
|
|
26
|
+
onEvent :ALL_UP do
|
|
27
|
+
group('many_garages') do |g|
|
|
28
|
+
g.create_resource('primary_engine', type: 'engine', sn: "<%= rand(1000) %>")
|
|
29
|
+
|
|
30
|
+
onEvent :all_engines_up do
|
|
31
|
+
info "Accelerating all engines"
|
|
32
|
+
g.resources[type: 'engine'][name: 'primary_engine'].throttle = 40
|
|
33
|
+
|
|
34
|
+
g.resources[type: 'engine'][name: 'primary_engine'].sn
|
|
35
|
+
|
|
36
|
+
g.resources[type: 'engine'][name: 'primary_engine'].failure
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
onEvent :rpm_reached do
|
|
40
|
+
info "All engines RPM reached 4000"
|
|
41
|
+
info "Release All engines throttle"
|
|
42
|
+
g.resources[type: 'engine'].throttle = 0
|
|
43
|
+
|
|
44
|
+
after 7.seconds do
|
|
45
|
+
info "Shutting ALL engines off"
|
|
46
|
+
g.resources[type: 'engine'].release
|
|
47
|
+
|
|
48
|
+
Experiment.done
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# OMF_VERSIONS = 6.0
|
|
2
|
+
|
|
3
|
+
@comm = OmfEc.comm
|
|
4
|
+
|
|
5
|
+
# @comm is default communicator defined in script runner
|
|
6
|
+
#
|
|
7
|
+
garage_id = "garage_1"
|
|
8
|
+
garage_topic = @comm.get_topic(garage_id)
|
|
9
|
+
|
|
10
|
+
garage_topic.on_message lambda {|m| m.operation == :inform && m.read_content('inform_type') == 'FAILED' } do |message|
|
|
11
|
+
logger.error message
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
msgs = {
|
|
15
|
+
create: @comm.create_message([type: 'mp4']),
|
|
16
|
+
request: @comm.request_message([:max_rpm, {:provider => {country: 'japan'}}, :max_power]),
|
|
17
|
+
request_rpm: @comm.request_message([:rpm]),
|
|
18
|
+
increase_throttle: @comm.configure_message([throttle: 50]),
|
|
19
|
+
reduce_throttle: @comm.configure_message([throttle: 0]),
|
|
20
|
+
test_error_handling: @comm.request_message([:error]),
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
msgs[:test_error_handling].on_inform_failed do |message|
|
|
24
|
+
logger.error message.read_content("reason")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
msgs[:create].on_inform_failed do |message|
|
|
28
|
+
logger.error "Resource creation failed ---"
|
|
29
|
+
logger.error message.read_content("reason")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
msgs[:request].on_inform_status do |message|
|
|
33
|
+
message.each_property do |p|
|
|
34
|
+
logger.info "#{p.attr('key')} => #{p.content.strip}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
msgs[:request].on_inform_failed do |message|
|
|
39
|
+
logger.error message.read_content("reason")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
msgs[:request_rpm].on_inform_status do |message|
|
|
43
|
+
message.each_property do |p|
|
|
44
|
+
logger.info "#{p.attr('key')} => #{p.content.strip}"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Triggered when new messages published to the topics I subscribed to
|
|
49
|
+
msgs[:create].on_inform_created do |message|
|
|
50
|
+
engine_topic = @comm.get_topic(message.resource_id)
|
|
51
|
+
engine_id = engine_topic.id
|
|
52
|
+
|
|
53
|
+
msgs[:release] ||= @comm.release_message { |m| m.element('resource_id', engine_id) }
|
|
54
|
+
|
|
55
|
+
msgs[:release].on_inform_released do |message|
|
|
56
|
+
logger.info "Engine (#{message.resource_id}) turned off (resource released)"
|
|
57
|
+
done!
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
logger.info "Engine #{engine_id} ready for testing"
|
|
61
|
+
|
|
62
|
+
engine_topic.subscribe do
|
|
63
|
+
# Now subscribed to engine topic, we can ask for some information about the engine
|
|
64
|
+
msgs[:request].publish engine_id
|
|
65
|
+
|
|
66
|
+
# We will check engine's RPM
|
|
67
|
+
msgs[:request_rpm].publish engine_id
|
|
68
|
+
|
|
69
|
+
# Now we will apply 50% throttle to the engine
|
|
70
|
+
msgs[:increase_throttle].publish engine_id
|
|
71
|
+
|
|
72
|
+
@comm.add_timer(5) do
|
|
73
|
+
# Some time later, we want to reduce the throttle to 0, to avoid blowing up the engine
|
|
74
|
+
msgs[:reduce_throttle].publish engine_id
|
|
75
|
+
|
|
76
|
+
# Testing error handling
|
|
77
|
+
msgs[:test_error_handling].publish engine_id
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# 10 seconds later, we will 'release' this engine, i.e. shut it down
|
|
81
|
+
@comm.add_timer(10) do
|
|
82
|
+
msgs[:release].publish garage_id
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
garage_topic.subscribe do
|
|
88
|
+
# If subscribed, we publish a 'create' message, 'create' a new engine for testing
|
|
89
|
+
msgs[:create].publish garage_topic.id
|
|
90
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# We can use communicator to interact with XMPP server
|
|
2
|
+
#
|
|
3
|
+
# Find all top level pubsub nodes
|
|
4
|
+
host = "pubsub.#{OmfEc.comm.jid.domain}"
|
|
5
|
+
|
|
6
|
+
OmfEc.comm.discover('items', host, '') do |m|
|
|
7
|
+
m.items.each { |i| info i.node }
|
|
8
|
+
info "Found #{m.items.size} items"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
done!
|
|
12
|
+
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Test 1
|
|
3
|
+
#
|
|
4
|
+
# Testing one node in one group running one exec command for an already installed app
|
|
5
|
+
#
|
|
6
|
+
defProperty('res1', "unconfigured-node-1", "ID of a node")
|
|
7
|
+
defProperty('res2', "unconfigured-node-2", "ID of a node")
|
|
8
|
+
|
|
9
|
+
defGroup('Actor', property.res1, property.res2)
|
|
10
|
+
defGroup('Bob', property.res1, property.res2)
|
|
11
|
+
|
|
12
|
+
onEvent(:ALL_UP) do
|
|
13
|
+
wait 3
|
|
14
|
+
info "TEST - allGroups"
|
|
15
|
+
allGroups.exec("/bin/date")
|
|
16
|
+
|
|
17
|
+
wait 3
|
|
18
|
+
info "TEST - group"
|
|
19
|
+
group("Actor").exec("/bin/hostname -f")
|
|
20
|
+
|
|
21
|
+
Experiment.done
|
|
22
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Test 2
|
|
3
|
+
#
|
|
4
|
+
# Testing 2 nodes in multiple groups running exec commandis for already installed apps
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
defProperty('res1', "node1", "ID of a node")
|
|
8
|
+
defProperty('res2', "node2", "ID of a node")
|
|
9
|
+
|
|
10
|
+
defGroup('Alice', property.res1)
|
|
11
|
+
defGroup('Bob', property.res2)
|
|
12
|
+
defGroup('Couple', property.res1, property.res2)
|
|
13
|
+
defGroup('GroupOfGroup', "Alice", "Bob")
|
|
14
|
+
|
|
15
|
+
onEvent(:ALL_UP) do
|
|
16
|
+
wait 5
|
|
17
|
+
info "-------------"
|
|
18
|
+
info "TEST - Group of 2 (res1,res2)"
|
|
19
|
+
group("Couple").exec("/bin/hostname")
|
|
20
|
+
wait 5
|
|
21
|
+
info "---------------------"
|
|
22
|
+
info "TEST - Group of Group ( (res1) and (res2) )"
|
|
23
|
+
group("GroupOfGroup").exec("/bin/hostname")
|
|
24
|
+
wait 5
|
|
25
|
+
info "---------------"
|
|
26
|
+
info "TEST - allGroup"
|
|
27
|
+
allGroups.exec("/bin/hostname")
|
|
28
|
+
wait 5
|
|
29
|
+
Experiment.done
|
|
30
|
+
end
|
|
@@ -45,51 +45,11 @@ onEvent(:ALL_UP_AND_INSTALLED) do |event|
|
|
|
45
45
|
allGroups.startApplications
|
|
46
46
|
wait 10
|
|
47
47
|
info "TEST - Running ifconfig on Sender"
|
|
48
|
-
group('Sender').exec("ifconfig")
|
|
48
|
+
group('Sender').exec("/sbin/ifconfig")
|
|
49
49
|
wait 15
|
|
50
50
|
info "TEST - Running ifconfig on Receiver"
|
|
51
|
-
group('Receiver').exec("ifconfig")
|
|
51
|
+
group('Receiver').exec("/sbin/ifconfig")
|
|
52
52
|
wait 15
|
|
53
53
|
allGroups.stopApplications
|
|
54
54
|
Experiment.done
|
|
55
55
|
end
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
#
|
|
59
|
-
# Checking the Execution
|
|
60
|
-
# Here you do whatever is required to check that the above experiment went well
|
|
61
|
-
# Then return true if you decided that it did, or false otherwise
|
|
62
|
-
#
|
|
63
|
-
# Experiment log file is at: property.logpath
|
|
64
|
-
# Also you may want to look at system:exp:testlib
|
|
65
|
-
#
|
|
66
|
-
|
|
67
|
-
def check_outcome
|
|
68
|
-
|
|
69
|
-
# Test 03 is successfull if all of the following are true:
|
|
70
|
-
# 1) each resource reports that all its wireless property were configured OK
|
|
71
|
-
# 2) the applications (OTG,OTR,execs) started and finished properly
|
|
72
|
-
# file has a message from the AgentCommands module containing "DONE.OK"
|
|
73
|
-
# 3) a SQ3 database is produced with some entries in the OTG and OTR tables
|
|
74
|
-
logfile = "#{property.logpath}/#{Experiment.ID}.log"
|
|
75
|
-
lines = IO.readlines("#{logfile}")
|
|
76
|
-
# 1)
|
|
77
|
-
match1 = lines.grep(/CONFIGURED\.OK/)
|
|
78
|
-
r1 = (match1.length >= 10) ? true : false
|
|
79
|
-
# 2)
|
|
80
|
-
match1 = lines.grep(/APP_EVENT\ STARTED/)
|
|
81
|
-
r2 = (match1.length == 4) ? true : false
|
|
82
|
-
match1 = lines.grep(/APP_EVENT DONE\.OK/)
|
|
83
|
-
match2 = match1.grep(/AgentCommands/)
|
|
84
|
-
r3 = (match2.length == 4) ? true : false
|
|
85
|
-
# 3)
|
|
86
|
-
cnt1 = cnt2 = 0
|
|
87
|
-
ms('udp_out').project(:oml_ts_server).each { |x| cnt1 =+1 }
|
|
88
|
-
ms('udp_in').project(:oml_ts_server).each { |x| cnt2 =+1 }
|
|
89
|
-
r4 = (cnt1 >= 1) ? true : false
|
|
90
|
-
r5 = (cnt2 >= 1) ? true : false
|
|
91
|
-
|
|
92
|
-
puts "Check Outcome [r1:#{r1} - r2:#{r2} - r3:#{r3} - r4:#{r4} - r5:#{r5}]"
|
|
93
|
-
return true if r1 && r2 && r3 && r4 && r5
|
|
94
|
-
return false
|
|
95
|
-
end
|
|
@@ -79,7 +79,7 @@ def check_outcome
|
|
|
79
79
|
# 1)
|
|
80
80
|
match1 = lines.grep(/CONFIGURED\.OK/)
|
|
81
81
|
r1 = (match1.length >= 10) ? true : false
|
|
82
|
-
# 2)
|
|
82
|
+
# 2)
|
|
83
83
|
match1 = lines.grep(/APP_EVENT\ STARTED/)
|
|
84
84
|
r2 = (match1.length == 2) ? true : false
|
|
85
85
|
match1 = lines.grep(/APP_EVENT DONE\.OK/)
|
|
@@ -93,7 +93,7 @@ def check_outcome
|
|
|
93
93
|
r5 = (cnt2 >= 1) ? true : false
|
|
94
94
|
# 4)
|
|
95
95
|
max = PKTSIZE
|
|
96
|
-
ms('udp_in').project(:pkt_length_max).each do |r|
|
|
96
|
+
ms('udp_in').project(:pkt_length_max).each do |r|
|
|
97
97
|
value = r.tuple
|
|
98
98
|
max = value[0]
|
|
99
99
|
end
|
|
@@ -33,7 +33,7 @@ defGroup('Actor', property.res1) {|n|
|
|
|
33
33
|
app.setProperty('arg2', 'DEF') # Displays "--arg2 DEF"
|
|
34
34
|
app.setProperty('arg3', property.pboolean) # Displays "-b"
|
|
35
35
|
app.setProperty('arg4', true) # Displays "--arg4"
|
|
36
|
-
app.setProperty('arg5', false) # Displays nothing
|
|
36
|
+
app.setProperty('arg5', false) # Displays nothing
|
|
37
37
|
app.setProperty('arg6', property.pinteger) # Displays "-i 123" in second position!
|
|
38
38
|
app.setProperty('arg7', 456) # Displays "--arg7 456"
|
|
39
39
|
app.setProperty('arg8', "ZZZ") # Displays "ZZZ"
|
|
@@ -61,8 +61,8 @@ end
|
|
|
61
61
|
def check_outcome
|
|
62
62
|
|
|
63
63
|
# Test 03 is successfull if all of the following are true:
|
|
64
|
-
# 1) the tarball is installed OK AND the application runs OK
|
|
65
|
-
# 2) the application outputs the correct payload from the tarball
|
|
64
|
+
# 1) the tarball is installed OK AND the application runs OK
|
|
65
|
+
# 2) the application outputs the correct payload from the tarball
|
|
66
66
|
# 3) the application accepts and outputs the correct arguments
|
|
67
67
|
logfile = "#{property.logpath}/#{Experiment.ID}.log"
|
|
68
68
|
lines = IO.readlines("#{logfile}")
|
|
@@ -80,7 +80,7 @@ def check_outcome
|
|
|
80
80
|
match2 = match1.grep(/AgentCommands/)
|
|
81
81
|
r4 = (match2.length == 1) ? true : false
|
|
82
82
|
|
|
83
|
-
puts "Check Outcome [r1:#{r1} - r2:#{r2} - r3:#{r3} - r4:#{r4}]"
|
|
83
|
+
puts "Check Outcome [r1:#{r1} - r2:#{r2} - r3:#{r3} - r4:#{r4}]"
|
|
84
84
|
return true if r1 && r2 && r3 && r4
|
|
85
85
|
return false
|
|
86
86
|
|
|
@@ -18,8 +18,8 @@ defApplication('nmapURI', 'nmap') { |app|
|
|
|
18
18
|
|
|
19
19
|
defGroup('Actor', property.res1) {|n|
|
|
20
20
|
n.addApplication("nmapURI") {|app|
|
|
21
|
-
app.setProperty('target', "127.0.0.1")
|
|
22
|
-
app.setProperty('port', '101-200')
|
|
21
|
+
app.setProperty('target', "127.0.0.1")
|
|
22
|
+
app.setProperty('port', '101-200')
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -49,19 +49,19 @@ def check_outcome
|
|
|
49
49
|
# Test 06 is successfull if:
|
|
50
50
|
# 1) the application nmap has been unpacked on the resource
|
|
51
51
|
# AND
|
|
52
|
-
# 2) for the Actor group, the log file has a message from the AgentCommands
|
|
52
|
+
# 2) for the Actor group, the log file has a message from the AgentCommands
|
|
53
53
|
# module containing "DONE.OK" for the install of the app, and for the app
|
|
54
54
|
# execution
|
|
55
55
|
|
|
56
|
-
# Test 06 is successfull if for each of the 2 exec commands above, the log
|
|
56
|
+
# Test 06 is successfull if for each of the 2 exec commands above, the log
|
|
57
57
|
# file has a message from the AgentCommands module containing "DONE.OK"
|
|
58
58
|
logfile = "#{property.logpath}/#{Experiment.ID}.log"
|
|
59
59
|
lines = IO.readlines("#{logfile}")
|
|
60
|
-
# 1)
|
|
60
|
+
# 1)
|
|
61
61
|
match1 = lines.grep(/Unpacking\ nmap/)
|
|
62
62
|
match2 = match1.grep(/AgentCommands/)
|
|
63
63
|
result1 = (match2.length == 1) ? true : false
|
|
64
|
-
# 2)
|
|
64
|
+
# 2)
|
|
65
65
|
match1 = lines.grep(/DONE\.OK/)
|
|
66
66
|
match2 = match1.grep(/AgentCommands/)
|
|
67
67
|
result2 = (match2.length >= 2) ? true : false
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Test 7
|
|
3
|
+
#
|
|
4
|
+
# Testing one node in one group running two instance of the same app,
|
|
5
|
+
# previously defined with defApplication
|
|
6
|
+
#
|
|
7
|
+
# NOTE: in this example, while the defApp contains measurement point (MP)
|
|
8
|
+
# definitions, these are not collected/enabled in the addApp using this
|
|
9
|
+
# defined app. This is because here we simply use ping, which does not
|
|
10
|
+
# have OML MPs... thus enabling these MPs will result in a command line
|
|
11
|
+
# error when trying to run ping.
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
defProperty('res1', "unconfigured-node-1", "ID of a node")
|
|
15
|
+
|
|
16
|
+
defApplication('ping','ping') do |app|
|
|
17
|
+
app.description = 'Simple App Def for Ping'
|
|
18
|
+
app.binary_path = '/bin/ping'
|
|
19
|
+
|
|
20
|
+
# OMF 5.4 SYNTAX
|
|
21
|
+
#
|
|
22
|
+
app.defProperty('target', "my target", nil, {:type => :string, :default => 'localhost'})
|
|
23
|
+
app.defProperty('count', "my count", "-c", {:type => :integer, :default => 2, :order => 1})
|
|
24
|
+
|
|
25
|
+
app.defMeasurement('ping_delay') do |m|
|
|
26
|
+
m.defMetric('sequence', 'Fixnum')
|
|
27
|
+
m.defMetric('destination', 'String')
|
|
28
|
+
m.defMetric('rtt', 'Fixnum')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
app.defMeasurement('ping_loss') do |m|
|
|
32
|
+
m.defMetric('destination', 'String')
|
|
33
|
+
m.defMetric('probe_count', 'Fixnum')
|
|
34
|
+
m.defMetric('loss', 'Fixnum')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# OMF 6 SYNTAX
|
|
38
|
+
#
|
|
39
|
+
# app.define_parameter(
|
|
40
|
+
# :target => {:type => 'String', :default => 'localhost'},
|
|
41
|
+
# :count => {:type => 'Numeric', :cmd => '-c', :default => 2, :order => 1}
|
|
42
|
+
# )
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
defGroup('Actor', property.res1) do |g|
|
|
46
|
+
g.addApplication("ping") do |app|
|
|
47
|
+
app.setProperty('target', 'www.google.com')
|
|
48
|
+
app.setProperty('count', 1)
|
|
49
|
+
#app.measure('ping_delay', :interval => 3)
|
|
50
|
+
end
|
|
51
|
+
g.addApplication("ping") do |app|
|
|
52
|
+
app.setProperty('target', 'www.nicta.com.au')
|
|
53
|
+
app.setProperty('count', 2)
|
|
54
|
+
#app.measure('ping_loss', :samples => 10)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
onEvent(:ALL_UP_AND_INSTALLED) do |event|
|
|
60
|
+
info "TEST - group"
|
|
61
|
+
group("Actor").startApplications
|
|
62
|
+
after 1.seconds do
|
|
63
|
+
Experiment.done
|
|
64
|
+
end
|
|
65
|
+
end
|