omf_rc 6.0.0.pre.6 → 6.0.0.pre.7
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/omf_rc +34 -26
- data/config/omf_rc.yml +10 -10
- data/lib/omf_rc/{message_process_error.rb → omf_error.rb} +8 -0
- data/lib/omf_rc/resource_factory.rb +4 -0
- data/lib/omf_rc/resource_proxy/abstract_resource.rb +107 -44
- data/lib/omf_rc/resource_proxy/{generic_application.rb → application.rb} +189 -142
- data/lib/omf_rc/resource_proxy/node.rb +33 -21
- data/lib/omf_rc/resource_proxy_dsl.rb +51 -9
- data/lib/omf_rc/util/iw.rb +10 -6
- data/lib/omf_rc/util/mod.rb +30 -2
- data/lib/omf_rc/util/openflow_tools.rb +8 -8
- data/lib/omf_rc/util/platform_tools.rb +13 -13
- data/lib/omf_rc/version.rb +1 -1
- data/test/fixture/iw/help +6 -6
- data/test/fixture/lsmod +56 -56
- data/test/fixture/oml.hash +30 -0
- data/test/fixture/oml.spec +15 -0
- data/test/fixture/oml.xml +17 -0
- data/test/omf_rc/resource_proxy/abstract_resource_spec.rb +4 -2
- data/test/omf_rc/resource_proxy/{generic_application_spec.rb → application_spec.rb} +73 -34
- data/test/omf_rc/resource_proxy/node_spec.rb +33 -17
- data/test/omf_rc/resource_proxy_dsl_spec.rb +7 -0
- data/test/omf_rc/util/common_tools_spec.rb +1 -1
- data/test/omf_rc/util/mod_spec.rb +9 -3
- metadata +8 -6
@@ -20,63 +20,77 @@
|
|
20
20
|
# THE SOFTWARE.
|
21
21
|
|
22
22
|
#
|
23
|
-
# This module defines a Resource Proxy (RP) for
|
23
|
+
# This module defines a Resource Proxy (RP) for an Application
|
24
24
|
#
|
25
25
|
# Utility dependencies: platform_toos, common_tools
|
26
26
|
#
|
27
|
-
# This
|
27
|
+
# This Application Proxy has the following properties:
|
28
28
|
#
|
29
29
|
# - binary_path (String) the path to the binary of this app
|
30
|
-
# - pkg_tarball (String) the URI of the installation tarball of this app
|
30
|
+
# - pkg_tarball (String) the URI of the installation tarball of this app
|
31
31
|
# - pkg_ubuntu (String) the name of the Ubuntu package for this app
|
32
32
|
# - pkg_fedora (String) the name of the Fedora package for this app
|
33
|
-
# - state (String) the state of this Application RP
|
33
|
+
# - state (String) the state of this Application RP
|
34
34
|
# (stop, run, pause, install)
|
35
35
|
# - installed (Boolean) is this application installed? (default false)
|
36
|
-
# - force_tarball_install (Boolean) if true then force the installation
|
37
|
-
# from tarball even if other distribution-specific
|
36
|
+
# - force_tarball_install (Boolean) if true then force the installation
|
37
|
+
# from tarball even if other distribution-specific
|
38
38
|
# installation are available (default false)
|
39
|
-
# - map_err_to_out (Boolean) if true then map StdErr to StdOut for this
|
39
|
+
# - map_err_to_out (Boolean) if true then map StdErr to StdOut for this
|
40
40
|
# app (default false)
|
41
41
|
# - platform (Symbol) the OS platform where this app is running
|
42
|
-
#
|
43
42
|
# - environment (Hash) the environment variables to set prior to starting
|
44
43
|
# this app. {k1 => v1, ...} will result in "env -i K1=v1 ... "
|
45
44
|
# (with k1 being either a String or a Symbol)
|
46
|
-
#
|
45
|
+
# - use_oml (Boolean) if true enable OML for this application (default false)
|
46
|
+
# - oml_loglevel (Integer) set a specific OML log level (default unset)
|
47
|
+
# - oml_logfile (String) set a specific path for OML log file (default unset)
|
48
|
+
# - oml_configfile (String) path of the OML config file (optional)
|
49
|
+
# - oml (Hash) OML specific properties (optional), this Hash contains the
|
50
|
+
# following keys:
|
51
|
+
# - :available_mps (Hash) list of available OML Measurement Points
|
52
|
+
# - :collection (Hash) list of required OML Measurement Stream to collect
|
53
|
+
# when this application is running, as defined at
|
54
|
+
# http://omf.mytestbed.net/doc/oml/html/liboml2.conf.html
|
55
|
+
# - :experiment (String) name of the experiment in which this application
|
56
|
+
# is running
|
57
|
+
# - :id (String) OML id to use for this application when it is running
|
47
58
|
# - parameters (Hash) the command line parameters available for this app.
|
48
59
|
# This hash is of the form: { :param1 => attribut1, ... }
|
49
60
|
# with param1 being the id of this parameter for this Proxy and
|
50
61
|
# with attribut1 being another Hash with the following possible
|
51
62
|
# keys and values (all are optional):
|
52
|
-
# :cmd (String) the command line for this parameter
|
53
|
-
# :order (Fixnum) the appearance order on the command line, default FIFO
|
63
|
+
# :cmd (String) the command line for this parameter
|
64
|
+
# :order (Fixnum) the appearance order on the command line, default FIFO
|
54
65
|
# :dynamic (Boolean) parameter can be dynammically changed, default false
|
55
66
|
# :type (Numeric|String|Boolean) this parameter's type
|
56
|
-
# :default value given by default to this parameter
|
67
|
+
# :default value given by default to this parameter
|
57
68
|
# :value value to set for this parameter
|
58
69
|
# :mandatory (Boolean) this parameter is mandatory, default false
|
59
70
|
#
|
71
|
+
# Note: this application proxy will merge new Hash values for the properties
|
72
|
+
# environment, oml, and parameters properties with the old Hash values.
|
73
|
+
#
|
60
74
|
# Two examples of valid parameters definition are:
|
61
75
|
#
|
62
|
-
# { :host => {:default => 'localhost', :type => 'String',
|
76
|
+
# { :host => {:default => 'localhost', :type => 'String',
|
63
77
|
# :mandatory => true, :order => 2},
|
64
|
-
# :port => {:default => 5000, :type => 'Numeric', :cmd => '-p',
|
65
|
-
# :mandatory => true, :order => 1},
|
66
|
-
# :size => {:default => 512, :type => 'Numeric', :cmd => '--pkt-size',
|
78
|
+
# :port => {:default => 5000, :type => 'Numeric', :cmd => '-p',
|
79
|
+
# :mandatory => true, :order => 1},
|
80
|
+
# :size => {:default => 512, :type => 'Numeric', :cmd => '--pkt-size',
|
67
81
|
# :mandatory => true, :dynamic => true}
|
68
|
-
# :title => {:type => 'String', :mandatory => false}
|
82
|
+
# :title => {:type => 'String', :mandatory => false}
|
69
83
|
# }
|
70
|
-
#
|
84
|
+
#
|
71
85
|
# and
|
72
86
|
#
|
73
|
-
# { :title => {:value => "My First Application"} }
|
87
|
+
# { :title => {:value => "My First Application"} }
|
74
88
|
#
|
75
|
-
module OmfRc::ResourceProxy::
|
89
|
+
module OmfRc::ResourceProxy::Application
|
76
90
|
include OmfRc::ResourceProxyDSL
|
77
91
|
require 'omf_common/exec_app'
|
78
92
|
|
79
|
-
register_proxy :
|
93
|
+
register_proxy :application
|
80
94
|
utility :platform_tools
|
81
95
|
utility :common_tools
|
82
96
|
|
@@ -84,27 +98,32 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
84
98
|
DEFAULT_MANDATORY_PARAMETER = false
|
85
99
|
|
86
100
|
hook :before_ready do |res|
|
87
|
-
res.property.app_id ||= nil
|
88
|
-
res.property.binary_path ||= nil
|
89
|
-
res.property.platform ||= nil
|
90
|
-
res.property.pkg_tarball ||= nil
|
91
|
-
res.property.tarball_install_path ||= '/'
|
101
|
+
res.property.app_id ||= nil
|
102
|
+
res.property.binary_path ||= nil
|
103
|
+
res.property.platform ||= nil
|
104
|
+
res.property.pkg_tarball ||= nil
|
105
|
+
res.property.tarball_install_path ||= '/'
|
92
106
|
res.property.force_tarball_install ||= false
|
93
|
-
res.property.pkg_ubuntu ||= nil
|
94
|
-
res.property.pkg_fedora ||= nil
|
95
|
-
res.property.state ||= :stop
|
96
|
-
res.property.installed ||= false
|
97
|
-
res.property.map_err_to_out ||= false
|
98
|
-
res.property.event_sequence ||= 0
|
107
|
+
res.property.pkg_ubuntu ||= nil
|
108
|
+
res.property.pkg_fedora ||= nil
|
109
|
+
res.property.state ||= :stop
|
110
|
+
res.property.installed ||= false
|
111
|
+
res.property.map_err_to_out ||= false
|
112
|
+
res.property.event_sequence ||= 0
|
99
113
|
res.property.parameters ||= Hash.new
|
100
114
|
res.property.environments ||= Hash.new
|
115
|
+
res.property.use_oml ||= false
|
116
|
+
res.property.oml_configfile ||= nil
|
117
|
+
res.property.oml ||= Hash.new
|
118
|
+
res.property.oml_logfile ||= nil
|
119
|
+
res.property.oml_loglevel ||= nil
|
101
120
|
define_method("on_app_event") { |*args| process_event(self, *args) }
|
102
121
|
end
|
103
122
|
|
104
123
|
# This method processes an event coming from the application instance, which
|
105
124
|
# was started by this Resource Proxy (RP). It is a callback, which is usually
|
106
125
|
# called by the ExecApp class in OMF
|
107
|
-
#
|
126
|
+
#
|
108
127
|
# @param [AbstractResource] res this RP
|
109
128
|
# @param [String] event_type the type of event from the app instance
|
110
129
|
# (STARTED, DONE.OK, DONE.ERROR, STDOUT, STDERR)
|
@@ -128,46 +147,32 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
128
147
|
res.property.installed = true if app_id.include?("_INSTALL") &&
|
129
148
|
event_type.to_s.include?('DONE.OK')
|
130
149
|
end
|
131
|
-
|
132
|
-
# Request the basic properties of this Generic Application RP.
|
133
|
-
# @see OmfRc::ResourceProxy::GenericApplication
|
134
|
-
#
|
135
|
-
%w(binary_path pkg_tarball pkg_ubuntu pkg_fedora state installed \
|
136
|
-
force_tarball_install map_err_to_out tarball_install_path).each do |prop|
|
137
|
-
request(prop) { |res| res.property[prop].to_s }
|
138
|
-
end
|
139
150
|
|
140
|
-
# Request the platform property of this
|
141
|
-
# @see OmfRc::ResourceProxy::
|
151
|
+
# Request the platform property of this Application RP
|
152
|
+
# @see OmfRc::ResourceProxy::Application
|
142
153
|
#
|
143
154
|
request :platform do |res|
|
144
155
|
res.property.platform = detect_platform if res.property.platform.nil?
|
145
156
|
res.property.platform.to_s
|
146
157
|
end
|
147
158
|
|
148
|
-
# Configure the
|
149
|
-
# @see OmfRc::ResourceProxy::
|
150
|
-
#
|
151
|
-
%w(binary_path pkg_tarball pkg_ubuntu pkg_fedora force_tarball_install \
|
152
|
-
map_err_to_out tarball_install_path).each do |prop|
|
153
|
-
configure(prop) { |res, value| res.property[prop] = value }
|
154
|
-
end
|
155
|
-
|
156
|
-
# Configure the environments property of this Generic Application RP
|
157
|
-
# @see OmfRc::ResourceProxy::GenericApplication
|
159
|
+
# Configure the environments property of this Application RP
|
160
|
+
# @see OmfRc::ResourceProxy::Application
|
158
161
|
#
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
"
|
162
|
+
%w(environments oml).each do |prop|
|
163
|
+
configure(prop) do |res, value|
|
164
|
+
if value.kind_of? Hash
|
165
|
+
res.property[prop] = res.property[prop].merge(value)
|
166
|
+
else
|
167
|
+
res.log_inform_error "Configuration failed for '#{prop}'! "+
|
168
|
+
"Value not passed as Hash (#{value.inspect})"
|
169
|
+
end
|
170
|
+
res.property[prop]
|
165
171
|
end
|
166
|
-
res.property.environments
|
167
172
|
end
|
168
173
|
|
169
|
-
# Configure the parameters property of this
|
170
|
-
# @see OmfRc::ResourceProxy::
|
174
|
+
# Configure the parameters property of this Application RP
|
175
|
+
# @see OmfRc::ResourceProxy::Application
|
171
176
|
#
|
172
177
|
configure :parameters do |res, params|
|
173
178
|
if params.kind_of? Hash
|
@@ -178,10 +183,9 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
178
183
|
v[:order] = MAX_PARAMETER_NUMBER if v[:order].nil?
|
179
184
|
# if this param has no set mandatory field, assign it a default one
|
180
185
|
v[:mandatory] = DEFAULT_MANDATORY_PARAMETER if v[:mandatory].nil?
|
181
|
-
|
182
|
-
new_val = res.sanitize_parameter(p,merged_val)
|
186
|
+
new_val = res.property.parameters[p].nil? ? v : res.property.parameters[p].merge(v)
|
183
187
|
# only set this new parameter if it passes the type check
|
184
|
-
if res.pass_type_checking?(new_val)
|
188
|
+
if res.pass_type_checking?(new_val)
|
185
189
|
res.property.parameters[p] = new_val
|
186
190
|
res.dynamic_parameter_update(p,new_val)
|
187
191
|
else
|
@@ -202,32 +206,32 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
202
206
|
res.property.parameters[p]
|
203
207
|
end
|
204
208
|
|
205
|
-
# Configure the state of this
|
209
|
+
# Configure the state of this Application RP. The valid states are
|
206
210
|
# stop, run, pause, install. The semantic of each states are:
|
207
211
|
#
|
208
|
-
# - stop: the initial state for an Application RP, and the final state for
|
209
|
-
#
|
210
|
-
#
|
211
|
-
# - run: upon entering in this state, a new instance of the application is
|
212
|
-
#
|
213
|
-
#
|
214
|
-
#
|
212
|
+
# - stop: the initial state for an Application RP, and the final state for
|
213
|
+
# an applicaiton RP, for which the application instance finished
|
214
|
+
# its execution or its installation
|
215
|
+
# - run: upon entering in this state, a new instance of the application is
|
216
|
+
# started, the Application RP stays in this state until the
|
217
|
+
# application instance is finished or paused. The Application RP can
|
218
|
+
# only enter this state from a previous 'pause' or 'stop' state.
|
215
219
|
# - pause: upon entering this state, the currently running instance of this
|
216
|
-
#
|
217
|
-
#
|
218
|
-
#
|
219
|
-
#
|
220
|
-
#
|
220
|
+
# application should be paused (it is the responsibility of
|
221
|
+
# specialised Application Proxy to ensure that! The default
|
222
|
+
# Application Proxy does nothing to the application instance when
|
223
|
+
# entering this state). The Application RP can only enter this
|
224
|
+
# state from a previous 'run' state.
|
221
225
|
# - install: upon entering in this state, a new installation of the
|
222
|
-
#
|
223
|
-
#
|
224
|
-
#
|
225
|
-
#
|
226
|
-
#
|
227
|
-
#
|
228
|
-
#
|
226
|
+
# application will be performed by the Application RP, which will
|
227
|
+
# stay in this state until the installation is finished. The
|
228
|
+
# Application RP can only enter this state from a previous 'stop'
|
229
|
+
# state, and can only enter a 'stop' state once the installation
|
230
|
+
# is finished.
|
231
|
+
# Supported install methods are: Tarball, Ubuntu, and Fedora
|
232
|
+
#
|
229
233
|
# @yieldparam [String] value the state to set this app into
|
230
|
-
#
|
234
|
+
#
|
231
235
|
configure :state do |res, value|
|
232
236
|
case value.to_s.downcase.to_sym
|
233
237
|
when :install then res.switch_to_install
|
@@ -249,19 +253,19 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
249
253
|
# Select the proper installation method based on the platform
|
250
254
|
# and the value of 'force_tarball_install'
|
251
255
|
res.property.state = :install
|
252
|
-
if res.property.force_tarball_install ||
|
256
|
+
if res.property.force_tarball_install ||
|
253
257
|
(res.property.platform == :unknown)
|
254
|
-
installing = res.install_tarball(res.property.pkg_tarball,
|
258
|
+
installing = res.install_tarball(res.property.pkg_tarball,
|
255
259
|
res.property.tarball_install_path)
|
256
|
-
elsif res.property.platform == :ubuntu
|
260
|
+
elsif res.property.platform == :ubuntu
|
257
261
|
installing = res.install_ubuntu(res.property.pkg_ubuntu)
|
258
|
-
elsif res.property.platform == :fedora
|
262
|
+
elsif res.property.platform == :fedora
|
259
263
|
installing = res.install_fedora(res.property.pkg_fedora)
|
260
264
|
end
|
261
265
|
res.property.state = :stop unless installing
|
262
266
|
end
|
263
267
|
else
|
264
|
-
# cannot install as we are not stopped
|
268
|
+
# cannot install as we are not stopped
|
265
269
|
res.log_inform_warn "Not in STOP state. Cannot switch to INSTALL state!"
|
266
270
|
end
|
267
271
|
end
|
@@ -298,15 +302,15 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
298
302
|
# (see the description of configure :state)
|
299
303
|
#
|
300
304
|
work('switch_to_run') do |res|
|
301
|
-
if res.property.state == :stop
|
302
|
-
# start a new instance of this app
|
303
|
-
res.property.app_id = res.hrn.nil? ? res.uid : res.hrn
|
305
|
+
if res.property.state == :stop
|
306
|
+
# start a new instance of this app
|
307
|
+
res.property.app_id = res.hrn.nil? ? res.uid : res.hrn
|
304
308
|
# we need at least a defined binary path to run an app...
|
305
309
|
if res.property.binary_path.nil?
|
306
310
|
res.log_inform_warn "Binary path not set! No Application to run!"
|
307
311
|
else
|
308
|
-
ExecApp.new(res.property.app_id, res,
|
309
|
-
res.build_command_line,
|
312
|
+
ExecApp.new(res.property.app_id, res,
|
313
|
+
res.build_command_line,
|
310
314
|
res.property.map_err_to_out)
|
311
315
|
res.property.state = :run
|
312
316
|
end
|
@@ -324,7 +328,7 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
324
328
|
# (see the description of configure :state)
|
325
329
|
#
|
326
330
|
work('switch_to_pause') do |res|
|
327
|
-
if res.property.state == :run
|
331
|
+
if res.property.state == :run
|
328
332
|
# pause this app
|
329
333
|
res.property.state = :pause
|
330
334
|
# do more things here...
|
@@ -336,7 +340,7 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
336
340
|
#
|
337
341
|
# @yieldparam [String] name the parameter id as known by this app
|
338
342
|
# @yieldparam [Hash] att the Hash holding the parameter's attributs
|
339
|
-
# @see OmfRc::ResourceProxy::
|
343
|
+
# @see OmfRc::ResourceProxy::Application
|
340
344
|
#
|
341
345
|
work('dynamic_parameter_update') do |res,name,att|
|
342
346
|
# Only update a parameter if it is dynamic and the application is running
|
@@ -351,44 +355,15 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
351
355
|
end
|
352
356
|
end
|
353
357
|
|
354
|
-
#
|
355
|
-
# :dynamic attributs of a given parameter into TrueClass or FalseClass
|
356
|
-
# instances.
|
357
|
-
# Second, if that parameter is of a type Boolean, then perform the same
|
358
|
-
# conversion on the assigned default and value of this parameter
|
359
|
-
#
|
360
|
-
# @yieldparam [String] name the parameter id as known by this app
|
361
|
-
# @yieldparam [Hash] att the Hash holding the parameter's attributs
|
362
|
-
#
|
363
|
-
# [Hash] a copy of the input Hash with the above conversion performed in it
|
364
|
-
#
|
365
|
-
work('sanitize_parameter') do |res,name,att|
|
366
|
-
begin
|
367
|
-
if !att[:mandatory].nil? && !res.boolean?(att[:mandatory])
|
368
|
-
att[:mandatory] = eval(att[:mandatory].downcase)
|
369
|
-
end
|
370
|
-
if !att[:dynamic].nil? && !res.boolean?(att[:dynamic])
|
371
|
-
att[:dynamic] = eval(att[:dynamic].downcase)
|
372
|
-
end
|
373
|
-
if (att[:type] == 'Boolean')
|
374
|
-
att[:value] = eval(att[:value].downcase) if !att[:value].nil? && !res.boolean?(att[:value])
|
375
|
-
att[:default] = eval(att[:default].downcase) if !att[:default].nil? && !res.boolean?(att[:default])
|
376
|
-
end
|
377
|
-
rescue Exception => ex
|
378
|
-
res.log_inform_error "Cannot sanitize the parameter '#{name}' (#{att.inspect})"
|
379
|
-
end
|
380
|
-
att
|
381
|
-
end
|
382
|
-
|
383
|
-
# Check if a requested value or default for a parameter has the same
|
358
|
+
# Check if a configured value or default for a parameter has the same
|
384
359
|
# type as the type defined for that parameter
|
385
360
|
# The checking procedure is as follows:
|
386
361
|
# - first check if a type was set for this parameter, if not then return true
|
387
|
-
#
|
388
|
-
# regardless of the type of the given value or default
|
362
|
+
# (thus if no type was defined for this parameter then return true
|
363
|
+
# regardless of the type of the given value or default)
|
389
364
|
# - second check if a value is given, if so check if it has the same type as
|
390
365
|
# the defined type, if so then return true, if not then return false.
|
391
|
-
# - third if no value is given but a default is given, then perform the same
|
366
|
+
# - third if no value is given but a default is given, then perform the same
|
392
367
|
# check as above but using the default in-place of the value
|
393
368
|
#
|
394
369
|
# @yieldparam [Hash] att the Hash holding the parameter's attributs
|
@@ -404,11 +379,11 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
404
379
|
elsif att[:default].nil? && att[:value].nil?
|
405
380
|
passed = true
|
406
381
|
elsif att[:default].nil?
|
407
|
-
passed = true if res.boolean?(att[:value])
|
382
|
+
passed = true if res.boolean?(att[:value])
|
408
383
|
elsif att[:value].nil?
|
409
|
-
passed = true if res.boolean?(att[:default])
|
384
|
+
passed = true if res.boolean?(att[:default])
|
410
385
|
end
|
411
|
-
else #
|
386
|
+
else # Now for all other types...
|
412
387
|
klass = Module.const_get(att[:type].capitalize.to_sym)
|
413
388
|
if !att[:default].nil? && !att[:value].nil?
|
414
389
|
passed = true if att[:default].kind_of?(klass) && att[:value].kind_of?(klass)
|
@@ -426,13 +401,15 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
426
401
|
passed
|
427
402
|
end
|
428
403
|
|
429
|
-
# Build the command line, which will be used to start this app
|
404
|
+
# Build the command line, which will be used to start this app.
|
405
|
+
#
|
430
406
|
# This command line will be of the form:
|
431
|
-
# "env -i VAR1=value1 ... application_path parameterA valueA ..."
|
407
|
+
# "env -i VAR1=value1 ... application_path parameterA valueA ..."
|
432
408
|
#
|
433
|
-
# The environment variables and the parameters in that command line are
|
409
|
+
# The environment variables and the parameters in that command line are
|
434
410
|
# taken respectively from the 'environments' and 'parameters' properties of
|
435
|
-
# this
|
411
|
+
# this Application Resource Proxy. If the 'use_oml' property is set, then
|
412
|
+
# add to the command line the necessary oml parameters.
|
436
413
|
#
|
437
414
|
# [String] the full command line
|
438
415
|
#
|
@@ -449,13 +426,12 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
449
426
|
needed = false
|
450
427
|
needed = att[:mandatory] if res.boolean?(att[:mandatory])
|
451
428
|
# For mandatory parameter without a value, take the default one
|
452
|
-
val = att[:value]
|
453
|
-
val = att[:default] if needed && att[:value].nil?
|
429
|
+
val = (needed && att[:value].nil?) ? att[:default] : att[:value]
|
454
430
|
# Finally add the parameter if is value/default is not nil
|
455
431
|
unless val.nil?
|
456
432
|
if att[:type] == "Boolean"
|
457
|
-
# for Boolean param, only the command is printed if value==true
|
458
|
-
cmd_line += "#{att[:cmd]} " if val == true
|
433
|
+
# for Boolean param, only the command is printed if value==true
|
434
|
+
cmd_line += "#{att[:cmd]} " if val == true
|
459
435
|
else
|
460
436
|
# for all other type of param, we print "cmd value"
|
461
437
|
# with a user-provided prefix/suffix if defined
|
@@ -465,7 +441,78 @@ module OmfRc::ResourceProxy::GenericApplication
|
|
465
441
|
end
|
466
442
|
end
|
467
443
|
end
|
444
|
+
# Add OML parameters if required
|
445
|
+
cmd_line = res.build_oml_config(cmd_line) if res.property.use_oml
|
468
446
|
cmd_line
|
469
447
|
end
|
470
448
|
|
449
|
+
# Add the required OML parameter to the command line for this application
|
450
|
+
#
|
451
|
+
# - if the 'oml_configfile' property is set with a filename, then we use that
|
452
|
+
# file as the OML Configuration file. Thus we add the parameter
|
453
|
+
# "--oml-config filename" to this application's command line
|
454
|
+
# - if the 'oml' property is set with a Hash holding an OML configuration,
|
455
|
+
# then we write turn it into OML's XML configuration representation, write
|
456
|
+
# it to a temporary file, and add the parameter "--oml-config tmpfile" to
|
457
|
+
# this application's command line. The OML configuration hash is based
|
458
|
+
# on the liboml2.conf man page here:
|
459
|
+
# http://omf.mytestbed.net/doc/oml/latest/liboml2.conf.html
|
460
|
+
#
|
461
|
+
# The 'oml_configfile' case takes precedence over the 'oml' case above.
|
462
|
+
#
|
463
|
+
# Regardless of which case is performed, we will always set the
|
464
|
+
# '--oml-log-level' and '--oml-log-file' parameter on the command line if
|
465
|
+
# the corresponsding 'oml_logfile' and 'oml_loglevel' properties are set for
|
466
|
+
# this application resource.
|
467
|
+
#
|
468
|
+
# @yieldparam [String] cmd the String to which OML parameters will be added
|
469
|
+
#
|
470
|
+
# [String] the resulting command line
|
471
|
+
#
|
472
|
+
work('build_oml_config') do |res, cmd|
|
473
|
+
if !res.property.oml_configfile.nil?
|
474
|
+
if File.exist?(res.property.oml_configfile)
|
475
|
+
cmd += "--oml-config #{res.property.oml_configfile} "
|
476
|
+
else
|
477
|
+
res.log_inform_warn "OML enabled but OML config file does not exist"+
|
478
|
+
"(file: '#{res.property.oml_configfile}')"
|
479
|
+
end
|
480
|
+
elsif !res.property.oml.collection.nil?
|
481
|
+
o = res.property.oml
|
482
|
+
ofile = "/tmp/#{res.uid}-#{Time.now.to_i}.xml"
|
483
|
+
of = File.open(ofile,'w')
|
484
|
+
of << "<omlc experiment='#{o.experiment}' id='#{o.id}'>\n"
|
485
|
+
o.collection.each do |c|
|
486
|
+
of << " <collect url='#{c.url}'>\n"
|
487
|
+
c.streams.each do |m|
|
488
|
+
# samples as precedence over interval
|
489
|
+
s = ''
|
490
|
+
s = "interval='#{m.interval}'" if m.interval
|
491
|
+
s = "samples='#{m.samples}'" if m.samples
|
492
|
+
of << " <stream mp='#{m.mp}' #{s}>\n"
|
493
|
+
m.filters.each do |f|
|
494
|
+
line = " <filter field='#{f.field}' "
|
495
|
+
line += "operation='#{f.operation}' " unless f.operation.nil?
|
496
|
+
line += "rename='#{f.rename}' " unless f.rename.nil?
|
497
|
+
line += "/>\n"
|
498
|
+
of << line
|
499
|
+
end
|
500
|
+
of << " </stream>\n"
|
501
|
+
end
|
502
|
+
of << " </collect>\n"
|
503
|
+
end
|
504
|
+
of << "</omlc>\n"
|
505
|
+
of.close
|
506
|
+
cmd += "--oml-config #{ofile}"
|
507
|
+
else
|
508
|
+
res.log_inform_warn "OML enabled but no OML configuration was given"+
|
509
|
+
"(file: '#{res.property.oml_configfile}' - "+
|
510
|
+
"config: '#{res.property.oml.inspect}')"
|
511
|
+
end
|
512
|
+
cmd += "--oml-log-level #{res.property.oml_loglevel} " unless res.property.oml_loglevel.nil?
|
513
|
+
cmd += "--oml-log-file #{res.property.oml_logfile} " unless res.property.oml_logfile.nil?
|
514
|
+
cmd
|
515
|
+
end
|
516
|
+
|
517
|
+
|
471
518
|
end
|
@@ -3,41 +3,53 @@ module OmfRc::ResourceProxy::Node
|
|
3
3
|
|
4
4
|
register_proxy :node
|
5
5
|
|
6
|
+
utility :mod
|
7
|
+
|
6
8
|
request :proxies do
|
7
9
|
OmfRc::ResourceFactory.proxy_list
|
8
10
|
end
|
9
11
|
|
12
|
+
request :interfaces do |node|
|
13
|
+
node.children.find_all { |v| v.type == 'net' || v.type == 'wlan' }.map do |v|
|
14
|
+
{ name: v.hrn, type: v.type, uid: v.uid }
|
15
|
+
end.sort { |x, y| x[:name] <=> y[:name] }
|
16
|
+
end
|
17
|
+
|
18
|
+
request :applications do |node|
|
19
|
+
node.children.find_all { |v| v.type =~ /application/ }.map do |v|
|
20
|
+
{ name: v.hrn, type: v.type, uid: v.uid }
|
21
|
+
end.sort { |x, y| x[:name] <=> y[:name] }
|
22
|
+
end
|
23
|
+
|
10
24
|
request :devices do |resource|
|
11
25
|
devices = []
|
12
|
-
|
13
|
-
|
14
|
-
category = "net"
|
15
|
-
|
16
|
-
Dir.glob("net/eth*").each do |v|
|
17
|
-
File.exist?("#{v}/uevent") && File.open("#{v}/uevent") do |f|
|
18
|
-
subcategory = f.read.match(/DEVTYPE=(.+)/) && $1
|
19
|
-
proxy = "net"
|
20
|
-
File.exist?("#{v}/device/uevent") && File.open("#{v}/device/uevent") do |f|
|
21
|
-
driver = f.read.match(/DRIVER=(.+)/) && $1
|
22
|
-
device = { name: File.basename(v), driver: driver, category: category }
|
23
|
-
device[:subcategory] = subcategory if subcategory
|
24
|
-
device[:proxy] = proxy if resource.request_proxies.include?(proxy.to_sym)
|
25
|
-
devices << device
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
26
|
+
# Support net devices for now
|
27
|
+
category = "net"
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
Dir.glob("/sys/class/net/eth*").each do |v|
|
30
|
+
File.exist?("#{v}/uevent") && File.open("#{v}/uevent") do |f|
|
31
|
+
subcategory = f.read.match(/DEVTYPE=(.+)/) && $1
|
32
|
+
proxy = "net"
|
33
33
|
File.exist?("#{v}/device/uevent") && File.open("#{v}/device/uevent") do |f|
|
34
34
|
driver = f.read.match(/DRIVER=(.+)/) && $1
|
35
|
-
device = { name: File.basename(v), driver: driver, category: category
|
35
|
+
device = { name: File.basename(v), driver: driver, category: category }
|
36
|
+
device[:subcategory] = subcategory if subcategory
|
36
37
|
device[:proxy] = proxy if resource.request_proxies.include?(proxy.to_sym)
|
37
38
|
devices << device
|
38
39
|
end
|
39
40
|
end
|
40
41
|
end
|
42
|
+
|
43
|
+
Dir.glob("/sys/class/ieee80211/*").each do |v|
|
44
|
+
subcategory = "wlan"
|
45
|
+
proxy = "wlan"
|
46
|
+
File.exist?("#{v}/device/uevent") && File.open("#{v}/device/uevent") do |f|
|
47
|
+
driver = f.read.match(/DRIVER=(.+)/) && $1
|
48
|
+
device = { name: File.basename(v), driver: driver, category: category, subcategory: subcategory }
|
49
|
+
device[:proxy] = proxy if resource.request_proxies.include?(proxy.to_sym)
|
50
|
+
devices << device
|
51
|
+
end
|
52
|
+
end
|
41
53
|
devices
|
42
54
|
end
|
43
55
|
end
|