omf_rc 6.0.0.pre.6 → 6.0.0.pre.7
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/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
|