omf_rc 6.0.0.pre.7 → 6.0.0.pre.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
|