omf_rc 6.0.0.pre.7 → 6.0.0.pre.8
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 +13 -1
- data/lib/omf_rc/resource_proxy/abstract_resource.rb +76 -35
- data/lib/omf_rc/resource_proxy/application.rb +82 -61
- data/lib/omf_rc/resource_proxy/net.rb +1 -0
- data/lib/omf_rc/resource_proxy/node.rb +1 -31
- data/lib/omf_rc/resource_proxy/virtual_machine.rb +388 -0
- data/lib/omf_rc/resource_proxy/virtual_machine_factory.rb +52 -0
- data/lib/omf_rc/resource_proxy/wlan.rb +1 -0
- data/lib/omf_rc/resource_proxy_dsl.rb +1 -1
- data/lib/omf_rc/util/ip.rb +8 -0
- data/lib/omf_rc/util/iw.rb +2 -0
- data/lib/omf_rc/util/libvirt.rb +118 -0
- data/lib/omf_rc/util/sysfs.rb +40 -0
- data/lib/omf_rc/util/vmbuilder.rb +181 -0
- data/lib/omf_rc/version.rb +1 -1
- data/test/omf_rc/resource_proxy/abstract_resource_spec.rb +6 -4
- data/test/omf_rc/util/ip_spec.rb +3 -1
- metadata +47 -39
data/bin/omf_rc
CHANGED
@@ -35,12 +35,16 @@ begin
|
|
35
35
|
opts.on("-d", "--debug", "Debug mode") do
|
36
36
|
options[:debug] = true
|
37
37
|
end
|
38
|
+
|
39
|
+
opts.on("-l LOG_FILE_DIR", "Write log file to this folder") do |file_dir|
|
40
|
+
options[:log_file_dir] = file_dir
|
41
|
+
end
|
38
42
|
end
|
39
43
|
rescue => e
|
40
44
|
# Right now OML4R does not raise proper exceptions :(
|
41
45
|
# OML4R requires --oml-noop to be set if we want to run without doing any
|
42
46
|
# measurements... this is too restrictive here, we want to run without OML
|
43
|
-
# if no OML parameters were set and this even if --oml-noop is not set.
|
47
|
+
# if no OML parameters were set and this even if --oml-noop is not set.
|
44
48
|
if e.message.include?('OML4R: Missing values for parameters :expID ')
|
45
49
|
puts "Warning: Missing some OML options to instrument this RC, so it will "+
|
46
50
|
"run without instrumentation. (see --oml-help)"
|
@@ -60,6 +64,14 @@ end
|
|
60
64
|
Logging.logger.root.level = :debug if options[:debug]
|
61
65
|
Blather.logger = logger
|
62
66
|
|
67
|
+
if options[:log_file_dir] && File.exist?(options[:log_file_dir])
|
68
|
+
Logging.logger.root.add_appenders(
|
69
|
+
Logging.appenders.file(
|
70
|
+
"#{options[:log_file_dir]}/omf_rc.log",
|
71
|
+
:layout => Logging.layouts.pattern(:date_pattern => '%F %T %z',
|
72
|
+
:pattern => '[%d] %-5l %c: %m\n')))
|
73
|
+
end
|
74
|
+
|
63
75
|
OmfRc::ResourceFactory.load_default_resource_proxies
|
64
76
|
|
65
77
|
EM.run do
|
@@ -7,7 +7,7 @@ require 'hashie'
|
|
7
7
|
# This MP is for measurements about messages published by the Resource Proxy
|
8
8
|
class OmfRc::ResourceProxy::MPPublished < OML4R::MPBase
|
9
9
|
name :proxy_published
|
10
|
-
param :time, :type => :double # Time (s) when this message was published
|
10
|
+
param :time, :type => :double # Time (s) when this message was published
|
11
11
|
param :uid, :type => :string # UID for this Resource Proxy
|
12
12
|
param :topic, :type => :string # Pubsub topic to publish this message to
|
13
13
|
param :msg_id, :type => :string # Unique ID this message
|
@@ -17,7 +17,7 @@ end
|
|
17
17
|
# This MP is for measurements about messages received by the Resource Proxy
|
18
18
|
class OmfRc::ResourceProxy::MPReceived < OML4R::MPBase
|
19
19
|
name :proxy_received
|
20
|
-
param :time, :type => :double # Time (s) when this message was received
|
20
|
+
param :time, :type => :double # Time (s) when this message was received
|
21
21
|
param :uid, :type => :string # UID for this Resource Proxy
|
22
22
|
param :topic, :type => :string # Pubsub topic where this message came from
|
23
23
|
param :msg_id, :type => :string # Unique ID this message
|
@@ -45,7 +45,7 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
45
45
|
# @option opts [String] :password pubsub user password
|
46
46
|
# @option opts [String] :server pubsub server domain
|
47
47
|
# @option opts [String] :property A hash for keeping internal state
|
48
|
-
# @option opts [hash] :instrument A hash for keeping instrumentation-related state
|
48
|
+
# @option opts [hash] :instrument A hash for keeping instrumentation-related state
|
49
49
|
# @param [Comm] comm communicator instance, pass this to new resource proxy instance if want to use a common communicator instance.
|
50
50
|
def initialize(type, opts = nil, comm = nil)
|
51
51
|
@opts = Hashie::Mash.new(opts)
|
@@ -66,7 +66,12 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
66
66
|
@comm.create_topic(uid) do |s|
|
67
67
|
# Creating topic failed, no point to continue; clean up and disconnect
|
68
68
|
# Otherwise go subscribe to this pubsub topic
|
69
|
-
s.error?
|
69
|
+
if s.error?
|
70
|
+
warn "Could not create topic '#{uid}', will shutdown, trying to clean up old topics. Please start it again once it has been shutdown."
|
71
|
+
disconnect
|
72
|
+
else
|
73
|
+
@comm.subscribe(uid)
|
74
|
+
end
|
70
75
|
end
|
71
76
|
end
|
72
77
|
|
@@ -86,14 +91,18 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
86
91
|
# If method missing, try the property mash
|
87
92
|
def method_missing(method_name, *args)
|
88
93
|
if (method_name =~ /request_(.+)/)
|
89
|
-
property.key?($1) ? property.send($1) : (raise OmfRc::UnknownPropertyError)
|
94
|
+
property.key?($1) ? property.send($1) : (raise OmfRc::UnknownPropertyError, method_name.to_s)
|
90
95
|
elsif (method_name =~ /configure_(.+)/)
|
91
|
-
property.key?($1) ? property.send("[]=", $1, *args) : (raise OmfRc::UnknownPropertyError)
|
96
|
+
property.key?($1) ? property.send("[]=", $1, *args) : (raise OmfRc::UnknownPropertyError, method_name.to_s)
|
92
97
|
else
|
93
98
|
super
|
94
99
|
end
|
95
100
|
end
|
96
101
|
|
102
|
+
def get_binding
|
103
|
+
binding
|
104
|
+
end
|
105
|
+
|
97
106
|
# Connect to pubsub server
|
98
107
|
def connect
|
99
108
|
@comm.connect(opts.user, opts.password, opts.server)
|
@@ -101,17 +110,8 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
101
110
|
|
102
111
|
# Try to clean up pubsub topics, and wait for DISCONNECT_WAIT seconds, then shutdown event machine loop
|
103
112
|
def disconnect
|
104
|
-
@comm.
|
105
|
-
|
106
|
-
if my_pubsub_topics > 0
|
107
|
-
logger.info "Cleaning #{my_pubsub_topics} pubsub topic(s)"
|
108
|
-
a[:owner].each { |topic| @comm.delete_topic(topic) }
|
109
|
-
else
|
110
|
-
logger.info "Disconnecting now"
|
111
|
-
@comm.disconnect
|
112
|
-
end
|
113
|
-
end
|
114
|
-
logger.info "Disconnecting in #{DISCONNECT_WAIT} seconds"
|
113
|
+
@comm.disconnect(delete_affiliations: true)
|
114
|
+
logger.info "Disconnecting #{hrn}(#{uid}) in #{DISCONNECT_WAIT} seconds"
|
115
115
|
EM.add_timer(DISCONNECT_WAIT) do
|
116
116
|
@comm.disconnect
|
117
117
|
end
|
@@ -137,15 +137,19 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
137
137
|
#
|
138
138
|
def release(resource_id)
|
139
139
|
obj = children.find { |v| v.uid == resource_id }
|
140
|
-
|
140
|
+
if obj.nil?
|
141
|
+
warn "#{resource_id} does not belong to #{self.uid}(#{self.hrn})"
|
142
|
+
nil
|
143
|
+
else
|
144
|
+
# Release children resource recursively
|
145
|
+
obj.children.each do |c|
|
146
|
+
obj.release(c.uid)
|
147
|
+
end
|
148
|
+
obj.before_release if obj.respond_to? :before_release
|
141
149
|
|
142
|
-
|
143
|
-
|
144
|
-
obj.release(c.uid)
|
150
|
+
@comm.delete_topic(obj.uid)
|
151
|
+
children.delete(obj)
|
145
152
|
end
|
146
|
-
obj.before_release if obj.respond_to? :before_release
|
147
|
-
|
148
|
-
children.delete(obj)
|
149
153
|
end
|
150
154
|
|
151
155
|
# Return a list of all properties can be requested and configured
|
@@ -168,6 +172,14 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
168
172
|
hrn
|
169
173
|
end
|
170
174
|
|
175
|
+
alias_method :request_name, :request_hrn
|
176
|
+
alias_method :name, :hrn
|
177
|
+
alias_method :name=, :hrn=
|
178
|
+
|
179
|
+
def request_type(*args)
|
180
|
+
type
|
181
|
+
end
|
182
|
+
|
171
183
|
# Make hrn configurable through pubsub interface
|
172
184
|
def configure_hrn(hrn)
|
173
185
|
@hrn = hrn
|
@@ -180,13 +192,27 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
180
192
|
# @param [Array] name of group topics
|
181
193
|
def configure_membership(*args)
|
182
194
|
new_membership = [args[0]].flatten
|
183
|
-
|
195
|
+
new_membership.each do |n_m|
|
196
|
+
@membership << n_m unless @membership.include?(n_m)
|
197
|
+
end
|
184
198
|
@membership.each do |m|
|
185
|
-
@comm.subscribe(m)
|
199
|
+
@comm.subscribe(m) do |stanza|
|
200
|
+
if stanza.error?
|
201
|
+
warn "Group #{m} disappeared"
|
202
|
+
EM.next_tick do
|
203
|
+
@membership.delete(m)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
186
207
|
end
|
187
208
|
@membership
|
188
209
|
end
|
189
210
|
|
211
|
+
# Query resource's membership
|
212
|
+
def request_membership(*args)
|
213
|
+
@membership
|
214
|
+
end
|
215
|
+
|
190
216
|
# Request child resources
|
191
217
|
# @return [Hashie::Mash] child resource mash with uid and hrn
|
192
218
|
def request_child_resources(*args)
|
@@ -303,25 +329,36 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
303
329
|
begin
|
304
330
|
default_response = {
|
305
331
|
operation: message.operation,
|
306
|
-
context_id: message.
|
332
|
+
context_id: message.msg_id,
|
307
333
|
inform_to: inform_to_address(obj, message.publish_to)
|
308
334
|
}
|
309
335
|
|
336
|
+
guard = message.read_element("guard").first
|
337
|
+
|
338
|
+
unless guard.nil? || guard.element_children.empty?
|
339
|
+
guard_check = guard.element_children.all? do |g|
|
340
|
+
obj.__send__("request_#{g.attr('key')}") == g.content.ducktype
|
341
|
+
end
|
342
|
+
next nil unless guard_check
|
343
|
+
end
|
344
|
+
|
310
345
|
case message.operation
|
311
346
|
when :create
|
312
|
-
|
347
|
+
new_name = message.read_property(:name) || message.read_property(:hrn)
|
348
|
+
new_opts = opts.dup.merge(uid: nil, hrn: new_name)
|
313
349
|
new_obj = obj.create(message.read_property(:type), new_opts)
|
314
350
|
message.each_property do |p|
|
315
|
-
unless p.attr('key')
|
351
|
+
unless %w(type hrn name).include?(p.attr('key'))
|
316
352
|
method_name = "configure_#{p.attr('key')}"
|
317
|
-
|
353
|
+
p_value = message.read_property(p.attr('key'), new_obj.get_binding)
|
354
|
+
new_obj.__send__(method_name, p_value)
|
318
355
|
end
|
319
356
|
end
|
320
357
|
new_obj.after_initial_configured if new_obj.respond_to? :after_initial_configured
|
321
358
|
default_response.merge(resource_id: new_obj.uid)
|
322
359
|
when :request, :configure
|
323
360
|
result = Hashie::Mash.new.tap do |mash|
|
324
|
-
properties = message.read_element("
|
361
|
+
properties = message.read_element("property")
|
325
362
|
if message.operation == :request && properties.empty?
|
326
363
|
obj.request_available_properties.request.each do |r_p|
|
327
364
|
method_name = "request_#{r_p.to_s}"
|
@@ -330,14 +367,18 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
330
367
|
else
|
331
368
|
properties.each do |p|
|
332
369
|
method_name = "#{message.operation.to_s}_#{p.attr('key')}"
|
333
|
-
|
370
|
+
p_value = message.read_property(p.attr('key'), obj.get_binding)
|
371
|
+
mash[p.attr('key')] ||= obj.__send__(method_name, p_value)
|
334
372
|
end
|
335
373
|
end
|
336
374
|
end
|
375
|
+
# Always return uid
|
376
|
+
result.uid = obj.uid
|
337
377
|
default_response.merge(status: result)
|
338
378
|
when :release
|
339
379
|
resource_id = message.resource_id
|
340
|
-
|
380
|
+
released_obj = obj.release(resource_id)
|
381
|
+
released_obj ? default_response.merge(resource_id: released_obj.uid) : nil
|
341
382
|
when :inform
|
342
383
|
nil # We really don't care about inform messages which created from here
|
343
384
|
else
|
@@ -348,8 +389,8 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
348
389
|
end
|
349
390
|
rescue => e
|
350
391
|
if (e.kind_of? OmfRc::UnknownPropertyError) && (message.operation == :configure || message.operation == :request)
|
351
|
-
msg = "Cannot #{message.operation} unknown property "+
|
352
|
-
"'#{message.read_element("
|
392
|
+
msg = "Cannot #{message.operation} unknown property '#{e.message}' for resource '#{obj.type}'. Original message fragment: " +
|
393
|
+
"'#{message.read_element("property")}'"
|
353
394
|
logger.warn msg
|
354
395
|
raise OmfRc::MessageProcessError.new(message.context_id, inform_to_address(obj, message.publish_to), msg)
|
355
396
|
else
|
@@ -20,7 +20,8 @@
|
|
20
20
|
# THE SOFTWARE.
|
21
21
|
|
22
22
|
#
|
23
|
-
# This module defines a Resource Proxy (RP) for an Application
|
23
|
+
# This module defines a Resource Proxy (RP) for an Application.
|
24
|
+
# For a detailed usage tutorial see {file:doc/RESOURCE\_PROXY.mkd Resource Proxy tutorial}
|
24
25
|
#
|
25
26
|
# Utility dependencies: platform_toos, common_tools
|
26
27
|
#
|
@@ -31,35 +32,35 @@
|
|
31
32
|
# - pkg_ubuntu (String) the name of the Ubuntu package for this app
|
32
33
|
# - pkg_fedora (String) the name of the Fedora package for this app
|
33
34
|
# - state (String) the state of this Application RP
|
34
|
-
#
|
35
|
+
# (stop, run, pause, install)
|
35
36
|
# - installed (Boolean) is this application installed? (default false)
|
36
37
|
# - force_tarball_install (Boolean) if true then force the installation
|
37
|
-
#
|
38
|
-
#
|
38
|
+
# from tarball even if other distribution-specific installation are
|
39
|
+
# available (default false)
|
39
40
|
# - map_err_to_out (Boolean) if true then map StdErr to StdOut for this
|
40
|
-
#
|
41
|
+
# app (default false)
|
41
42
|
# - platform (Symbol) the OS platform where this app is running
|
42
|
-
# - environment (Hash) the environment variables to set prior to starting
|
43
|
-
#
|
44
|
-
#
|
43
|
+
# - environment (Hash) the environment variables to set prior to starting
|
44
|
+
# this app. { k1 => v1, ... } will result in "env -i K1=v1 ... "
|
45
|
+
# (with k1 being either a String or a Symbol)
|
45
46
|
# - use_oml (Boolean) if true enable OML for this application (default false)
|
46
47
|
# - oml_loglevel (Integer) set a specific OML log level (default unset)
|
47
48
|
# - oml_logfile (String) set a specific path for OML log file (default unset)
|
48
49
|
# - oml_configfile (String) path of the OML config file (optional)
|
49
|
-
# - oml (Hash) OML specific properties (optional), this Hash contains the
|
50
|
-
#
|
51
|
-
# - :available_mps (
|
50
|
+
# - oml (Hash) OML specific properties (optional), this Hash contains the
|
51
|
+
# following keys:
|
52
|
+
# - :available_mps (Array) list of available OML Measurement Points (Hash)
|
52
53
|
# - :collection (Hash) list of required OML Measurement Stream to collect
|
53
|
-
# when this application is running
|
54
|
+
# when this application is running (defined in liboml2.conf manpage)
|
54
55
|
# http://omf.mytestbed.net/doc/oml/html/liboml2.conf.html
|
55
56
|
# - :experiment (String) name of the experiment in which this application
|
56
57
|
# is running
|
57
58
|
# - :id (String) OML id to use for this application when it is running
|
58
59
|
# - parameters (Hash) the command line parameters available for this app.
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
62
|
-
#
|
60
|
+
# This hash is of the form: { :param1 => attribut1, ... }
|
61
|
+
# with param1 being the id of this parameter for this Proxy and
|
62
|
+
# with attribut1 being another Hash with the following possible
|
63
|
+
# keys and values (all are optional):
|
63
64
|
# :cmd (String) the command line for this parameter
|
64
65
|
# :order (Fixnum) the appearance order on the command line, default FIFO
|
65
66
|
# :dynamic (Boolean) parameter can be dynammically changed, default false
|
@@ -87,7 +88,7 @@
|
|
87
88
|
# { :title => {:value => "My First Application"} }
|
88
89
|
#
|
89
90
|
module OmfRc::ResourceProxy::Application
|
90
|
-
include OmfRc::ResourceProxyDSL
|
91
|
+
include OmfRc::ResourceProxyDSL
|
91
92
|
require 'omf_common/exec_app'
|
92
93
|
|
93
94
|
register_proxy :application
|
@@ -97,26 +98,28 @@ module OmfRc::ResourceProxy::Application
|
|
97
98
|
MAX_PARAMETER_NUMBER = 1000
|
98
99
|
DEFAULT_MANDATORY_PARAMETER = false
|
99
100
|
|
101
|
+
property :app_id, :default => nil
|
102
|
+
property :description, :default => ''
|
103
|
+
property :binary_path, :default => nil
|
104
|
+
property :platform, :default => nil
|
105
|
+
property :pkg_tarball, :default => nil
|
106
|
+
property :tarball_install_path, :default => '/'
|
107
|
+
property :force_tarball_install, :default => false
|
108
|
+
property :pkg_ubuntu, :default => nil
|
109
|
+
property :pkg_fedora, :default => nil
|
110
|
+
property :state, :default => :stop
|
111
|
+
property :installed, :default => false
|
112
|
+
property :map_err_to_out, :default => false
|
113
|
+
property :event_sequence, :default => 0
|
114
|
+
property :parameters, :default => Hash.new
|
115
|
+
property :environments, :default => Hash.new
|
116
|
+
property :use_oml, :default => false
|
117
|
+
property :oml_configfile, :default => nil
|
118
|
+
property :oml, :default => Hash.new
|
119
|
+
property :oml_logfile, :default => nil
|
120
|
+
property :oml_loglevel, :default => nil
|
121
|
+
|
100
122
|
hook :before_ready do |res|
|
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 ||= '/'
|
106
|
-
res.property.force_tarball_install ||= false
|
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
|
113
|
-
res.property.parameters ||= Hash.new
|
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
|
120
123
|
define_method("on_app_event") { |*args| process_event(self, *args) }
|
121
124
|
end
|
122
125
|
|
@@ -135,19 +138,24 @@ module OmfRc::ResourceProxy::Application
|
|
135
138
|
"(##{res.property.event_sequence}) - "+
|
136
139
|
"#{event_type}: '#{msg}'"
|
137
140
|
res.property.state = :stop if event_type.to_s.include?('DONE')
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
141
|
+
|
142
|
+
(res.membership + [res.uid]).each do |m|
|
143
|
+
res.inform(:status, {
|
144
|
+
inform_to: m,
|
145
|
+
status: { status_type: 'APP_EVENT',
|
146
|
+
event: event_type.to_s.upcase,
|
147
|
+
app: app_id,
|
148
|
+
msg: msg,
|
149
|
+
seq: res.property.event_sequence,
|
150
|
+
uid: res.uid }
|
151
|
+
})
|
152
|
+
end
|
153
|
+
|
146
154
|
res.property.event_sequence += 1
|
147
155
|
res.property.installed = true if app_id.include?("_INSTALL") &&
|
148
156
|
event_type.to_s.include?('DONE.OK')
|
149
157
|
end
|
150
|
-
|
158
|
+
|
151
159
|
# Request the platform property of this Application RP
|
152
160
|
# @see OmfRc::ResourceProxy::Application
|
153
161
|
#
|
@@ -156,7 +164,7 @@ module OmfRc::ResourceProxy::Application
|
|
156
164
|
res.property.platform.to_s
|
157
165
|
end
|
158
166
|
|
159
|
-
# Configure the environments property of this Application RP
|
167
|
+
# Configure the environments and oml property of this Application RP
|
160
168
|
# @see OmfRc::ResourceProxy::Application
|
161
169
|
#
|
162
170
|
%w(environments oml).each do |prop|
|
@@ -217,7 +225,7 @@ module OmfRc::ResourceProxy::Application
|
|
217
225
|
# application instance is finished or paused. The Application RP can
|
218
226
|
# only enter this state from a previous 'pause' or 'stop' state.
|
219
227
|
# - pause: upon entering this state, the currently running instance of this
|
220
|
-
# application should be paused (it is the responsibility of
|
228
|
+
# application should be paused (it is the responsibility of
|
221
229
|
# specialised Application Proxy to ensure that! The default
|
222
230
|
# Application Proxy does nothing to the application instance when
|
223
231
|
# entering this state). The Application RP can only enter this
|
@@ -451,17 +459,28 @@ module OmfRc::ResourceProxy::Application
|
|
451
459
|
# - if the 'oml_configfile' property is set with a filename, then we use that
|
452
460
|
# file as the OML Configuration file. Thus we add the parameter
|
453
461
|
# "--oml-config filename" to this application's command line
|
454
|
-
# - if the 'oml' property is set with a Hash holding an OML configuration,
|
462
|
+
# - if the 'oml' property is set with a Hash holding an OML configuration,
|
455
463
|
# 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
|
459
|
-
#
|
464
|
+
# it to a temporary file, and add the parameter "--oml-config tmpfile" to
|
465
|
+
# this application's command line. The OML configuration hash is based
|
466
|
+
# on the liboml2.conf man page, an example of which is:
|
467
|
+
# <omlc domain="my_experiment" id="my_source_id">
|
468
|
+
# <collect url="tcp://10.0.0.200">
|
469
|
+
# <stream mp="radiotap" interval="2">
|
470
|
+
# <filter field="sig_strength_dBm" />
|
471
|
+
# <filter field="noise_strength_dBm" />
|
472
|
+
# <filter field="power" />
|
473
|
+
# </stream>
|
474
|
+
# <stream mp="udp" samples="10">
|
475
|
+
# <filter field="udp_len" />
|
476
|
+
# </stream>
|
477
|
+
# </collect>
|
478
|
+
# </omlc>
|
460
479
|
#
|
461
480
|
# The 'oml_configfile' case takes precedence over the 'oml' case above.
|
462
481
|
#
|
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
|
482
|
+
# Regardless of which case is performed, we will always set the
|
483
|
+
# '--oml-log-level' and '--oml-log-file' parameter on the command line if
|
465
484
|
# the corresponsding 'oml_logfile' and 'oml_loglevel' properties are set for
|
466
485
|
# this application resource.
|
467
486
|
#
|
@@ -490,16 +509,18 @@ module OmfRc::ResourceProxy::Application
|
|
490
509
|
s = "interval='#{m.interval}'" if m.interval
|
491
510
|
s = "samples='#{m.samples}'" if m.samples
|
492
511
|
of << " <stream mp='#{m.mp}' #{s}>\n"
|
493
|
-
m.filters.
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
512
|
+
unless m.filters.nil?
|
513
|
+
m.filters.each do |f|
|
514
|
+
line = " <filter field='#{f.field}' "
|
515
|
+
line += "operation='#{f.operation}' " unless f.operation.nil?
|
516
|
+
line += "rename='#{f.rename}' " unless f.rename.nil?
|
517
|
+
line += "/>\n"
|
518
|
+
of << line
|
519
|
+
end
|
499
520
|
end
|
500
521
|
of << " </stream>\n"
|
501
522
|
end
|
502
|
-
of << " </collect>\n"
|
523
|
+
of << " </collect>\n"
|
503
524
|
end
|
504
525
|
of << "</omlc>\n"
|
505
526
|
of.close
|
@@ -4,6 +4,7 @@ module OmfRc::ResourceProxy::Node
|
|
4
4
|
register_proxy :node
|
5
5
|
|
6
6
|
utility :mod
|
7
|
+
utility :sysfs
|
7
8
|
|
8
9
|
request :proxies do
|
9
10
|
OmfRc::ResourceFactory.proxy_list
|
@@ -21,35 +22,4 @@ module OmfRc::ResourceProxy::Node
|
|
21
22
|
end.sort { |x, y| x[:name] <=> y[:name] }
|
22
23
|
end
|
23
24
|
|
24
|
-
request :devices do |resource|
|
25
|
-
devices = []
|
26
|
-
# Support net devices for now
|
27
|
-
category = "net"
|
28
|
-
|
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
|
-
File.exist?("#{v}/device/uevent") && File.open("#{v}/device/uevent") do |f|
|
34
|
-
driver = f.read.match(/DRIVER=(.+)/) && $1
|
35
|
-
device = { name: File.basename(v), driver: driver, category: category }
|
36
|
-
device[:subcategory] = subcategory if subcategory
|
37
|
-
device[:proxy] = proxy if resource.request_proxies.include?(proxy.to_sym)
|
38
|
-
devices << device
|
39
|
-
end
|
40
|
-
end
|
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
|
53
|
-
devices
|
54
|
-
end
|
55
25
|
end
|