omf_rc 6.0.7.1 → 6.0.8.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +14 -6
- data/bin/install_omf_rc +9 -16
- data/bin/omf_rc +2 -208
- data/init/angstrom +47 -0
- data/lib/omf_rc/resource_proxy/abstract_resource.rb +34 -14
- data/lib/omf_rc/resource_proxy/application.rb +3 -2
- data/lib/omf_rc/resource_proxy_dsl.rb +8 -0
- data/lib/omf_rc/runner.rb +180 -0
- data/lib/omf_rc/version.rb +3 -1
- data/omf_rc.gemspec +1 -1
- data/test/fixture/omf_rc.simple.yml +8 -0
- data/test/fixture/omf_rc.yml +92 -0
- data/test/omf_rc/resource_proxy_dsl_spec.rb +16 -1
- data/test/omf_rc/runner_spec.rb +49 -0
- metadata +20 -41
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
Y2JmN2U2NmJlNTc4OGI5OWViYWZjNzdkMDg3MWZkYjFiNWFjMzhkNA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NDk2NTEzZGY4MzYyYmZmNDA5OTY4MzNkOGY3MTBkMmY3M2RhN2NiZA==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
N2M2YmRkNmJjYTVkYWViZjRjOWUwZmQ1MDM4ZmQ3YTFmZWM4YWRiMjUxZTAw
|
10
|
+
OGU2OWI3YzlhNGJkN2IzM2E3YjI2YjRkNTY0ZDk0MmI5ZWNhZjM5NzA2OTky
|
11
|
+
YjE5NGUyMzhmYmI0Y2VlYWY0NDVjZDExOTk3M2ZlYjA3OWU5OTI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
N2Q5YjI4Y2MzYWU5ODgxNTM4NDgyZWZkMjg1NTQyNTU0ZmU3ZjE3MGQ5NGRj
|
14
|
+
NmE4ZDMwZjUxMWNhZGExYTRiMDg2YTQzY2VhZGIxZjM0MzcwNmFlMjU3NmEy
|
15
|
+
MjdkYmU5MzQ4ZDdmYjI4NDYzZGZhYWE5OWRkNWJhYjcxNTMzZTA=
|
data/bin/install_omf_rc
CHANGED
@@ -44,30 +44,23 @@ end
|
|
44
44
|
|
45
45
|
if options[:init]
|
46
46
|
puts "Detecting operating system..."
|
47
|
-
|
47
|
+
FileUtils.cp "#{gem_root}/init/run_omf_rc.sh", "/usr/local/bin/run_omf_rc.sh"
|
48
48
|
if !File.exist?("/etc/issue")
|
49
49
|
abort "Unknown or unsupported operating system. Cannot install init script."
|
50
50
|
end
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
if os.nil?
|
55
|
-
abort "Unknown or unsupported operating system. Cannot install init script."
|
56
|
-
end
|
57
|
-
|
58
|
-
puts "'#{os}' found"
|
59
|
-
|
60
|
-
FileUtils.cp "#{gem_root}/init/run_omf_rc.sh", "/usr/local/bin/run_omf_rc.sh"
|
61
|
-
|
62
|
-
case os
|
63
|
-
when "Ubuntu"
|
51
|
+
issue = File.read("/etc/issue")
|
52
|
+
if issue.include? "Ubuntu"
|
64
53
|
FileUtils.cp "#{gem_root}/init/ubuntu", "/etc/init/omf_rc.conf"
|
65
54
|
puts "Upstart script for Ubuntu has been installed. Execute 'start omf_rc' to run the daemon."
|
66
|
-
|
55
|
+
elsif issue.include? "Debian"
|
67
56
|
FileUtils.cp "#{gem_root}/init/debian", "/etc/init.d/omf_rc"
|
68
57
|
`update-rc.d omf_rc defaults`
|
69
58
|
puts "Init script for Debian has been installed. Execute '/etc/init.d/omf_rc start' to run the daemon."
|
70
|
-
|
59
|
+
elsif issue.include? "Angstrom"
|
60
|
+
FileUtils.cp "#{gem_root}/init/angstrom", "/etc/init.d/omf_rc"
|
61
|
+
`update-rc.d omf_rc defaults`
|
62
|
+
puts "Init script for Angstrom has been installed. Execute '/etc/init.d/omf_rc start' to run the daemon."
|
63
|
+
elsif issue.include? "Fedora"
|
71
64
|
FileUtils.cp "#{gem_root}/init/fedora", "/etc/init.d/omf_rc"
|
72
65
|
`chkconfig --add omf_rc`
|
73
66
|
# older Fedora's don't use systemd
|
data/bin/omf_rc
CHANGED
@@ -12,214 +12,8 @@ require 'socket'
|
|
12
12
|
|
13
13
|
require 'omf_rc'
|
14
14
|
require 'omf_rc/resource_factory'
|
15
|
+
require 'omf_rc/runner'
|
15
16
|
|
16
17
|
$stdout.sync = true
|
17
18
|
|
18
|
-
|
19
|
-
# Class to start an OMF RC. The configuration parameters can be set
|
20
|
-
# in decreasing priority through the command line, configuration
|
21
|
-
# file and default settings (see @def_opts).
|
22
|
-
#
|
23
|
-
# For historic reasons and to make this implementation more interesting
|
24
|
-
# there are two different config file formats. A 'normal' one inherited from
|
25
|
-
# earlier version of OMF, and an 'advanced' one which is identical to the
|
26
|
-
# format accepted by OmfCommon.init(). To maintain some level of sanity,
|
27
|
-
# only one configuration file is accepted.
|
28
|
-
#
|
29
|
-
# Having said that, there is one exception and that relates to the 'oml'
|
30
|
-
# configuration which is stripped out first and handed to the OML4R library
|
31
|
-
# during command line parsing.
|
32
|
-
#
|
33
|
-
class OmfRcRunner
|
34
|
-
def initialize()
|
35
|
-
@options = {}
|
36
|
-
@executable_name = File.basename($PROGRAM_NAME)
|
37
|
-
@oml_enabled = false
|
38
|
-
@gem_version = Gem::Specification.find_by_name('omf_rc').version.to_s
|
39
|
-
|
40
|
-
@node_id = Socket.gethostname
|
41
|
-
|
42
|
-
@def_opts = {
|
43
|
-
uid: @node_id,
|
44
|
-
uri: "xmpp:#{@node_id}-#{Process.pid}:#{@node_id}-#{Process.pid}@localhost",
|
45
|
-
environment: 'production',
|
46
|
-
debug: false
|
47
|
-
}
|
48
|
-
@copts = {}
|
49
|
-
|
50
|
-
@gopts = {
|
51
|
-
config_file: nil,
|
52
|
-
adv_config_file: nil,
|
53
|
-
logging_configfile: nil,
|
54
|
-
environment: nil
|
55
|
-
}
|
56
|
-
|
57
|
-
@opts = {}
|
58
|
-
@omlopts = {appName: @executable_name}
|
59
|
-
end
|
60
|
-
|
61
|
-
def run()
|
62
|
-
setup()
|
63
|
-
OmfCommon::Measure.enable if @oml_enabled
|
64
|
-
|
65
|
-
OmfCommon.init(@gopts[:environment], @opts) do |el|
|
66
|
-
# Load a customised logging set up if provided
|
67
|
-
OmfCommon.load_logging_config(@gopts[:logging_configfile]) if @gopts[:logging_configfile]
|
68
|
-
|
69
|
-
info "Starting OMF Resource Controller version '#{@gem_version}'"
|
70
|
-
|
71
|
-
#el.on_int_signal do # Implementation missing
|
72
|
-
Signal.trap("SIGINT") do
|
73
|
-
# TODO: Should release resources first
|
74
|
-
info "Stopping ..."
|
75
|
-
OmfCommon.comm.disconnect
|
76
|
-
end
|
77
|
-
|
78
|
-
# Load extensions
|
79
|
-
if @opts[:add_default_factories] != false
|
80
|
-
OmfRc::ResourceFactory.load_default_resource_proxies
|
81
|
-
end
|
82
|
-
|
83
|
-
@opts[:factories].each do |f|
|
84
|
-
if (req = f[:require])
|
85
|
-
begin
|
86
|
-
info "Try to load resource module '#{req}'"
|
87
|
-
require(req)
|
88
|
-
rescue LoadError => e
|
89
|
-
error e.message
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
OmfCommon.comm.on_connected do |comm|
|
95
|
-
info "Connected using #{comm.conn_info}"
|
96
|
-
|
97
|
-
#if @opts[:auth] && @optss[:auth][:root_cert_dir]
|
98
|
-
# OmfCommon::Auth::CertificateStore.instance.register_default_certs(@opts[:auth][:root_cert_dir])
|
99
|
-
#end
|
100
|
-
#OmfCommon::Auth::CertificateStore.instance.register(entity) if entity
|
101
|
-
|
102
|
-
@opts[:resources].each do |res_opts|
|
103
|
-
rtype = res_opts.delete(:type)
|
104
|
-
res_creation_opts = res_opts.delete(:creation_opts)
|
105
|
-
res_creation_opts ||= res_opts.delete(:create_opts)
|
106
|
-
res_creation_opts ||= {}
|
107
|
-
#res_opts[:certificate] = entity if entity
|
108
|
-
begin
|
109
|
-
OmfRc::ResourceFactory.create(rtype, res_opts, res_creation_opts)
|
110
|
-
rescue => e
|
111
|
-
error "#{e.message}\n#{e.backtrace.join("\n")}"
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
end
|
116
|
-
end
|
117
|
-
info "Stopping OMF Resource Controller version '#{@gem_version}'"
|
118
|
-
end
|
119
|
-
|
120
|
-
def setup()
|
121
|
-
oml_init() # calls parse_config_files()
|
122
|
-
unless @opts[:communication][:url]
|
123
|
-
puts "Error: Missing parameters to connect to a PubSub Server (see --help)"
|
124
|
-
exit(1)
|
125
|
-
end
|
126
|
-
|
127
|
-
opts = @opts
|
128
|
-
# TODO: This needs to be fixed
|
129
|
-
if opts[:auth]
|
130
|
-
if File.exist?(opts[:auth][:entity_cert]) && File.exist?(opts[:auth][:entity_key])
|
131
|
-
entity = OmfCommon::Auth::Certificate.create_from_x509(File.read(opts[:auth][:entity_cert]),
|
132
|
-
File.read(opts[:auth][:entity_key]))
|
133
|
-
end
|
134
|
-
end
|
135
|
-
opts[:communication][:auth] = {} if entity
|
136
|
-
end
|
137
|
-
|
138
|
-
def parse_config_files()
|
139
|
-
@opts = {communication: {}, resources: [], factories: [], add_default_factories: true}
|
140
|
-
config_file = @gopts[:config_file]
|
141
|
-
adv_config_file = @gopts[:adv_config_file]
|
142
|
-
if config_file && adv_config_file
|
143
|
-
puts "To avoid any unexpected surprises, you should stick to one form of config file"
|
144
|
-
exit(1)
|
145
|
-
end
|
146
|
-
|
147
|
-
if !config_file && !adv_config_file
|
148
|
-
puts "You must specify a config file"
|
149
|
-
exit(1)
|
150
|
-
end
|
151
|
-
|
152
|
-
if config_file
|
153
|
-
cfg_opts = OmfCommon.load_yaml(config_file, symbolize_keys: true, erb_process: true)
|
154
|
-
copts = @def_opts.merge(cfg_opts.merge(@copts))
|
155
|
-
@opts[:communication][:url] = copts[:uri]
|
156
|
-
@opts[:resources] = copts[:resources] || [{ type: :node, uid: copts[:uid] }]
|
157
|
-
@opts[:factories] = copts[:factories] if copts[:factories]
|
158
|
-
if copts[:add_default_factories] == false
|
159
|
-
@opts[:add_default_factories] = false
|
160
|
-
end
|
161
|
-
@gopts[:environment] ||= copts[:environment]
|
162
|
-
@omlopts.merge(copts[:oml] || {}) {|k, v1, v2| v1 } # merge in place as OML may hold @omlopts
|
163
|
-
end
|
164
|
-
|
165
|
-
if adv_config_file
|
166
|
-
aopts = OmfCommon.load_yaml(adv_config_file, symbolize_keys: true, erb_process: true)
|
167
|
-
aenv = aopts.delete(:environment)
|
168
|
-
@gopts[:environment] ||= @copts[:environment] || aenv || @def_opts[:environment]
|
169
|
-
@opts.merge!(aopts)
|
170
|
-
# need to do a merge! to update the hash passed into OML.init already
|
171
|
-
@omlopts.merge!(@opts.delete(:oml) || {}) {|k, v1, v2| v1 || v2 } # merge in place as OML may hold @omlopts
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
def oml_init
|
176
|
-
begin
|
177
|
-
@omlopts[:afterParse] = lambda {|o| parse_config_files() }
|
178
|
-
@oml_enabled = OML4R::init(ARGV, @omlopts) do |op|
|
179
|
-
op.banner = "OMF Resource Controller version '#{@gem_version}'\n"
|
180
|
-
op.banner += "Usage: #{@executable_name} [options]"
|
181
|
-
|
182
|
-
op.on("-c CONFIGFILE", "Configuration File") do |file|
|
183
|
-
@gopts[:config_file] = file
|
184
|
-
end
|
185
|
-
|
186
|
-
op.on("-a ADVANCED_CONFIGFILE", "Advanced Configuration File") do |file|
|
187
|
-
@gopts[:adv_config_file] = file
|
188
|
-
end
|
189
|
-
|
190
|
-
op.on("--log_config CONFIGFILE", "Logging Configuration File") do |file|
|
191
|
-
@gopts[:logging_configfile] = file
|
192
|
-
end
|
193
|
-
|
194
|
-
# op.on("-u URI", "Communication URI [#{@def_opts[:uri]}") do |uri|
|
195
|
-
# @copts[:uri] = uri
|
196
|
-
# end
|
197
|
-
|
198
|
-
op.on("-e ENVIRONMENT", "Environment (development, production ...) [#{@def_opts[:environment]}]") do |e|
|
199
|
-
@gopts[:environment] = e
|
200
|
-
end
|
201
|
-
|
202
|
-
# op.on("-i UID", "UID (and pubsub topic) of the resource, [#{@def_opts[:uid]}]") do |uid|
|
203
|
-
# @copts[:uid] = uid
|
204
|
-
# end
|
205
|
-
|
206
|
-
op.on("-v", "--version", "Show version") do
|
207
|
-
puts "OMF Resource Controller version '#{@gem_version}'"
|
208
|
-
exit
|
209
|
-
end
|
210
|
-
|
211
|
-
op.on("-h", "--help", "Show this message") do
|
212
|
-
puts op
|
213
|
-
exit
|
214
|
-
end
|
215
|
-
end
|
216
|
-
rescue OML4R::MissingArgumentException => e
|
217
|
-
puts "Warning: #{e.message} to instrument this RC, so it will run without instrumentation. (see --oml-help)"
|
218
|
-
rescue => e
|
219
|
-
puts e.message
|
220
|
-
exit(1)
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
OmfRcRunner.new().run()
|
19
|
+
OmfRc::Runner.new.run
|
data/init/angstrom
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#! /bin/sh
|
2
|
+
### BEGIN INIT INFO
|
3
|
+
# Provides: omf-rc
|
4
|
+
# Required-Start: $ALL
|
5
|
+
# Required-Stop: $remote_fs $syslog
|
6
|
+
# Default-Start: 2 3 4 5
|
7
|
+
# Default-Stop: 0 1 6
|
8
|
+
# Short-Description: Start daemon at boot time
|
9
|
+
# Description: Enable service provided by daemon.
|
10
|
+
### END INIT INFO
|
11
|
+
|
12
|
+
PATH=$PATH:/usr/bin:/usr/local/bin
|
13
|
+
DAEMON=/usr/local/bin/run_omf_rc.sh
|
14
|
+
[ -x "$DAEMON" ] || exit 0
|
15
|
+
NAME=omf_rc
|
16
|
+
PIDFILE=/var/run/$NAME.pid
|
17
|
+
|
18
|
+
start(){
|
19
|
+
echo -n "Starting OMF Resource Controller: $NAME"
|
20
|
+
start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --exec $DAEMON 2>&1 | logger -t omf_rc &
|
21
|
+
echo "."
|
22
|
+
}
|
23
|
+
|
24
|
+
stop(){
|
25
|
+
echo -n "Stopping OMF Resource Controller: $NAME"
|
26
|
+
start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE
|
27
|
+
echo "."
|
28
|
+
}
|
29
|
+
|
30
|
+
case "$1" in
|
31
|
+
start)
|
32
|
+
start
|
33
|
+
;;
|
34
|
+
stop)
|
35
|
+
stop
|
36
|
+
;;
|
37
|
+
restart)
|
38
|
+
stop
|
39
|
+
start
|
40
|
+
;;
|
41
|
+
*)
|
42
|
+
echo "Usage: $0 {start|stop|restart}" >&2
|
43
|
+
exit 3
|
44
|
+
;;
|
45
|
+
esac
|
46
|
+
|
47
|
+
:
|
@@ -123,11 +123,13 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
123
123
|
begin
|
124
124
|
# Setup authentication related properties
|
125
125
|
if (@certificate = @opts.delete(:certificate))
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
126
|
+
elsif (pcert = @opts.delete(:parent_certificate))
|
127
|
+
@certificate = pcert.dup
|
128
|
+
end
|
129
|
+
|
130
|
+
if @certificate
|
131
|
+
@certificate.resource_id = resource_address
|
132
|
+
OmfCommon::Auth::CertificateStore.instance.register(@certificate)
|
131
133
|
end
|
132
134
|
|
133
135
|
# Extend resource with Resource Module, can be obtained from Factory
|
@@ -386,9 +388,8 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
386
388
|
end
|
387
389
|
|
388
390
|
objects_by_topic(topic.id.to_s).each do |obj|
|
389
|
-
|
390
|
-
|
391
|
-
end
|
391
|
+
OmfRc::ResourceProxy::MPReceived.inject(Time.now.to_f, self.uid,
|
392
|
+
topic.id.to_s, message.mid) if OmfCommon::Measure.enabled?
|
392
393
|
execute_omf_operation(message, obj, topic)
|
393
394
|
end
|
394
395
|
end
|
@@ -492,7 +493,12 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
492
493
|
message.each_property do |key, value|
|
493
494
|
method_name = "#{message.operation.to_s}_#{key}"
|
494
495
|
p_value = message[key]
|
495
|
-
|
496
|
+
|
497
|
+
if namespaced_property?(key)
|
498
|
+
response[key, namespace] = obj.__send__(method_name, p_value)
|
499
|
+
else
|
500
|
+
response[key] = obj.__send__(method_name, p_value)
|
501
|
+
end
|
496
502
|
end
|
497
503
|
end
|
498
504
|
|
@@ -512,7 +518,13 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
512
518
|
request_props.each do |p_name|
|
513
519
|
method_name = "request_#{p_name.to_s}"
|
514
520
|
value = obj.__send__(method_name)
|
515
|
-
|
521
|
+
if value
|
522
|
+
if namespaced_property?(p_name)
|
523
|
+
response[p_name, namespace] = value
|
524
|
+
else
|
525
|
+
response[p_name] = value
|
526
|
+
end
|
527
|
+
end
|
516
528
|
end
|
517
529
|
end
|
518
530
|
|
@@ -567,10 +579,11 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
567
579
|
end
|
568
580
|
|
569
581
|
# Just send to all topics, including group membership
|
570
|
-
(membership_topics.map { |mt| mt[1] } + @topics).each
|
571
|
-
|
572
|
-
|
573
|
-
|
582
|
+
(membership_topics.map { |mt| mt[1] } + @topics).each do |t|
|
583
|
+
t.publish(message)
|
584
|
+
OmfRc::ResourceProxy::MPPublished.inject(Time.now.to_f,
|
585
|
+
self.uid, t.id, message.mid) if OmfCommon::Measure.enabled?
|
586
|
+
end
|
574
587
|
end
|
575
588
|
|
576
589
|
def inform_status(props)
|
@@ -676,4 +689,11 @@ class OmfRc::ResourceProxy::AbstractResource
|
|
676
689
|
end
|
677
690
|
end
|
678
691
|
end
|
692
|
+
|
693
|
+
# Check if a property has namespace associated
|
694
|
+
#
|
695
|
+
# @param [String] name of the property
|
696
|
+
def namespaced_property?(name)
|
697
|
+
respond_to?(:namespace) && name =~ /^(.+)__(.+)$/
|
698
|
+
end
|
679
699
|
end
|
@@ -88,6 +88,7 @@ module OmfRc::ResourceProxy::Application
|
|
88
88
|
property :app_id, :default => nil
|
89
89
|
property :description, :default => ''
|
90
90
|
property :binary_path, :default => nil
|
91
|
+
property :quiet, :default => false
|
91
92
|
property :platform, :default => nil
|
92
93
|
property :pkg_tarball, :default => nil
|
93
94
|
property :tarball_install_path, :default => '/'
|
@@ -169,7 +170,7 @@ module OmfRc::ResourceProxy::Application
|
|
169
170
|
msg: msg,
|
170
171
|
seq: res.property.event_sequence,
|
171
172
|
uid: res.uid
|
172
|
-
}, :ALL)
|
173
|
+
}, :ALL) unless res.property.quiet
|
173
174
|
end
|
174
175
|
end
|
175
176
|
|
@@ -549,7 +550,7 @@ module OmfRc::ResourceProxy::Application
|
|
549
550
|
o = res.property.oml
|
550
551
|
ofile = "/tmp/#{res.uid}-#{Time.now.to_i}.xml"
|
551
552
|
of = File.open(ofile,'w')
|
552
|
-
of << "<omlc experiment='#{o.experiment}' id='#{o.id}'>\n"
|
553
|
+
of << "<omlc experiment='#{o.experiment}' id='#{o.id}_#{res.uid}'>\n"
|
553
554
|
o.collection.each do |c|
|
554
555
|
of << " <collect url='#{c.url}'>\n"
|
555
556
|
c.streams.each do |m|
|
@@ -346,6 +346,14 @@ module OmfRc::ResourceProxyDSL
|
|
346
346
|
alias_method "orig_request_#{request_name}", "request_#{request_name}"
|
347
347
|
end
|
348
348
|
|
349
|
+
def namespace(ns_prefix, ns_href)
|
350
|
+
define_method("namespace") do
|
351
|
+
{ ns_prefix => ns_href }
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
alias_method :ns, :namespace
|
356
|
+
|
349
357
|
# Define internal property. Refer to options section to see supported options.
|
350
358
|
#
|
351
359
|
# @param [Symbol] name of the property
|
@@ -0,0 +1,180 @@
|
|
1
|
+
# Copyright (c) 2013 National ICT Australia Limited (NICTA).
|
2
|
+
# This software may be used and distributed solely under the terms of the MIT license (License).
|
3
|
+
# You should find a copy of the License in LICENSE.TXT or at http://opensource.org/licenses/MIT.
|
4
|
+
# By downloading or using this software you accept the terms and the liability disclaimer in the License.
|
5
|
+
|
6
|
+
module OmfRc
|
7
|
+
# Class to start an OMF RC. The configuration parameters can be set
|
8
|
+
# in decreasing priority through the command line, configuration
|
9
|
+
# file and default settings (see @def_opts).
|
10
|
+
#
|
11
|
+
# For historic reasons and to make this implementation more interesting
|
12
|
+
# there are two different config file formats. A 'normal' one inherited from
|
13
|
+
# earlier version of OMF, and an 'advanced' one which is identical to the
|
14
|
+
# format accepted by OmfCommon.init(). To maintain some level of sanity,
|
15
|
+
# only one configuration file is accepted.
|
16
|
+
#
|
17
|
+
# Having said that, there is one exception and that relates to the 'oml'
|
18
|
+
# configuration which is stripped out first and handed to the OML4R library
|
19
|
+
# during command line parsing.
|
20
|
+
#
|
21
|
+
class Runner
|
22
|
+
include Hashie
|
23
|
+
|
24
|
+
attr_accessor :gopts, :copts, :def_opts
|
25
|
+
attr_accessor :opts
|
26
|
+
|
27
|
+
def initialize()
|
28
|
+
@executable_name = File.basename($PROGRAM_NAME)
|
29
|
+
@oml_enabled = false
|
30
|
+
@gem_version = OmfCommon.version_of('omf_common')
|
31
|
+
|
32
|
+
@node_id = Socket.gethostname
|
33
|
+
|
34
|
+
@def_opts = Mash.new(
|
35
|
+
environment: 'production',
|
36
|
+
resources: [ { type: :node, uid: @node_id }],
|
37
|
+
factories: [],
|
38
|
+
communication: { url: "xmpp://#{@node_id}-#{Process.pid}:#{@node_id}-#{Process.pid}@localhost" },
|
39
|
+
add_default_factories: true,
|
40
|
+
)
|
41
|
+
|
42
|
+
@gopts = Mash.new(
|
43
|
+
config_file: nil,
|
44
|
+
adv_config_file: nil,
|
45
|
+
logging_configfile: nil,
|
46
|
+
environment: nil
|
47
|
+
)
|
48
|
+
|
49
|
+
@opts = Mash.new
|
50
|
+
|
51
|
+
@omlopts = {appName: @executable_name}
|
52
|
+
end
|
53
|
+
|
54
|
+
def run()
|
55
|
+
oml_init() # calls parse_config_files()
|
56
|
+
|
57
|
+
OmfCommon::Measure.enable if @oml_enabled
|
58
|
+
|
59
|
+
OmfCommon.init(@opts[:environment], @opts.to_hash) do |el|
|
60
|
+
# Load a customised logging set up if provided
|
61
|
+
OmfCommon.load_logging_config(@opts[:logging_configfile])
|
62
|
+
|
63
|
+
info "Starting OMF Resource Controller version '#{@gem_version}'"
|
64
|
+
|
65
|
+
Signal.trap("SIGINT") do
|
66
|
+
# TODO: Should release resources first
|
67
|
+
info "Stopping ..."
|
68
|
+
OmfCommon.comm.disconnect
|
69
|
+
end
|
70
|
+
|
71
|
+
# Load extensions
|
72
|
+
if @opts[:add_default_factories] != false
|
73
|
+
OmfRc::ResourceFactory.load_default_resource_proxies
|
74
|
+
end
|
75
|
+
|
76
|
+
@opts[:factories].each do |f|
|
77
|
+
if (req = f[:require])
|
78
|
+
begin
|
79
|
+
info "Try to load resource module '#{req}'"
|
80
|
+
require(req)
|
81
|
+
rescue LoadError => e
|
82
|
+
error e.message
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
OmfCommon.comm.on_connected do |comm|
|
88
|
+
info "Connected using #{comm.conn_info}"
|
89
|
+
|
90
|
+
rc_cert = OmfCommon.load_credentials(@opts[:credentials])
|
91
|
+
|
92
|
+
@opts[:resources].each do |res_opts|
|
93
|
+
rtype = res_opts.delete(:type)
|
94
|
+
res_creation_opts = res_opts.delete(:creation_opts)
|
95
|
+
res_creation_opts ||= res_opts.delete(:create_opts)
|
96
|
+
res_creation_opts ||= {}
|
97
|
+
res_opts[:certificate] = rc_cert
|
98
|
+
begin
|
99
|
+
OmfRc::ResourceFactory.create(rtype, res_opts, res_creation_opts)
|
100
|
+
rescue => e
|
101
|
+
error "#{e.message}\n#{e.backtrace.join("\n")}"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
107
|
+
info "Stopping OMF Resource Controller version '#{@gem_version}'"
|
108
|
+
end
|
109
|
+
|
110
|
+
def parse_config_files()
|
111
|
+
config_file = @gopts[:config_file]
|
112
|
+
|
113
|
+
if config_file.nil?
|
114
|
+
puts "You must specify a config file"
|
115
|
+
exit(1)
|
116
|
+
else
|
117
|
+
cfg_opts = Mash.new(OmfCommon.load_yaml(config_file, symbolize_keys: true, erb_process: true))
|
118
|
+
|
119
|
+
@opts.merge!(@def_opts.merge(cfg_opts))
|
120
|
+
|
121
|
+
# Legacy support uri & uid opt could also configure comm & resource
|
122
|
+
cfg_opts.each do |k, v|
|
123
|
+
case k.to_sym
|
124
|
+
when :uri
|
125
|
+
@opts[:communication][:url] = v
|
126
|
+
when :uid
|
127
|
+
@opts[:resources][0][:type] = :node
|
128
|
+
@opts[:resources][0][:uid] = v
|
129
|
+
else
|
130
|
+
@opts[k] = v
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
@omlopts.merge(@opts[:instrumentation] || {}) { |k, v1, v2| v1 } # merge in place as OML may hold @omlopts
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def oml_init
|
139
|
+
begin
|
140
|
+
@omlopts[:afterParse] = lambda {|o| parse_config_files() }
|
141
|
+
@oml_enabled = OML4R::init(ARGV, @omlopts) do |op|
|
142
|
+
op.banner = "OMF Resource Controller version '#{@gem_version}'\n"
|
143
|
+
op.banner += "Usage: #{@executable_name} [options]"
|
144
|
+
|
145
|
+
op.on("-c CONFIGFILE", "Configuration File") do |file|
|
146
|
+
@gopts[:config_file] = file
|
147
|
+
end
|
148
|
+
|
149
|
+
op.on("-a ADVANCED_CONFIGFILE", "Advanced Configuration File") do |file|
|
150
|
+
@gopts[:adv_config_file] = file
|
151
|
+
end
|
152
|
+
|
153
|
+
op.on("--log_config CONFIGFILE", "Logging Configuration File") do |file|
|
154
|
+
@gopts[:logging_configfile] = file
|
155
|
+
end
|
156
|
+
|
157
|
+
op.on("-e ENVIRONMENT", "Environment (development, production ...) [#{@def_opts[:environment]}]") do |e|
|
158
|
+
@gopts[:environment] = e
|
159
|
+
end
|
160
|
+
|
161
|
+
op.on("-v", "--version", "Show version") do
|
162
|
+
puts "OMF Resource Controller version '#{@gem_version}'"
|
163
|
+
exit
|
164
|
+
end
|
165
|
+
|
166
|
+
op.on("-h", "--help", "Show this message") do
|
167
|
+
puts op
|
168
|
+
exit
|
169
|
+
end
|
170
|
+
end
|
171
|
+
rescue OML4R::MissingArgumentException => e
|
172
|
+
puts "Warning: #{e.message} to instrument this RC, so it will run without instrumentation. (see --oml-help)"
|
173
|
+
rescue => e
|
174
|
+
puts e.message
|
175
|
+
#puts e.backtrace
|
176
|
+
exit(1)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
data/lib/omf_rc/version.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
# You should find a copy of the License in LICENSE.TXT or at http://opensource.org/licenses/MIT.
|
4
4
|
# By downloading or using this software you accept the terms and the liability disclaimer in the License.
|
5
5
|
|
6
|
+
require 'omf_common/version'
|
7
|
+
|
6
8
|
module OmfRc
|
7
|
-
VERSION =
|
9
|
+
VERSION = OmfCommon.version_of('omf_rc')
|
8
10
|
end
|
data/omf_rc.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_development_dependency "em-minitest-spec", "~> 1.1.1"
|
26
26
|
s.add_development_dependency "pry"
|
27
27
|
s.add_development_dependency "simplecov"
|
28
|
-
s.add_runtime_dependency "omf_common", "=
|
28
|
+
s.add_runtime_dependency "omf_common", "= #{OmfCommon::VERSION}"
|
29
29
|
s.add_runtime_dependency "cocaine", "~> 0.3.0"
|
30
30
|
s.add_runtime_dependency "mocha"
|
31
31
|
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
---
|
2
|
+
# default topic name is this machine's hostname
|
3
|
+
# default xmpp user name/password is "hostname-pid"
|
4
|
+
# this is to ensure that every RC has its own topic and XMPP account
|
5
|
+
:uid: <%= Socket.gethostname %>
|
6
|
+
:uri: xmpp://<%= "#{Socket.gethostname}-#{Process.pid}" %>:<%= "#{Socket.gethostname}-#{Process.pid}" %>@somewhere
|
7
|
+
:environment: production
|
8
|
+
:debug: false
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# EXISTING options
|
2
|
+
|
3
|
+
# By default it loads node proxy, and this is its id
|
4
|
+
uid: bob
|
5
|
+
|
6
|
+
# How to connect to pubsub server
|
7
|
+
uri: xmpp://remote
|
8
|
+
|
9
|
+
# Which environment to use, the value is the one of pre-defined ones in omf_common
|
10
|
+
environment: development
|
11
|
+
|
12
|
+
# Load an external file contains Logging configuration
|
13
|
+
logging_configfile: config/my_logging.rb
|
14
|
+
|
15
|
+
# If load default type factories
|
16
|
+
add_default_factories: true
|
17
|
+
|
18
|
+
# Additional resources which can be created by this RC
|
19
|
+
factories:
|
20
|
+
- require: omf_rc_openflow
|
21
|
+
|
22
|
+
# Customise what proxy to load
|
23
|
+
resources:
|
24
|
+
- type: my_resource
|
25
|
+
# Can initialise resource properties
|
26
|
+
uid: resource_1
|
27
|
+
my_prop: foo
|
28
|
+
membership:
|
29
|
+
- g1
|
30
|
+
|
31
|
+
# Can set resource creation options
|
32
|
+
creation_opts:
|
33
|
+
send_backtrace: true
|
34
|
+
|
35
|
+
# END of EXISTING options
|
36
|
+
|
37
|
+
|
38
|
+
# Option to be MODIFIED
|
39
|
+
|
40
|
+
# This used to be called 'auth', but it is really about loading
|
41
|
+
# credentials (certificates) during RC bootstrap. Name it 'credentials' makes more sense.
|
42
|
+
|
43
|
+
credentials:
|
44
|
+
root_cert_dir: ~/omf_keys/root/
|
45
|
+
entity_cert: ~/omf_keys/rc.pem
|
46
|
+
entity_key: ~/omf_keys/rc_key.pem
|
47
|
+
|
48
|
+
# END of Option to be MODIFIED
|
49
|
+
|
50
|
+
# NEW options (used to be defined in 'advanced configuration file')
|
51
|
+
|
52
|
+
# Basically everything that can be initialised using OmfCommon.init
|
53
|
+
|
54
|
+
communication:
|
55
|
+
type: :xmpp
|
56
|
+
url: xmpp://localhost
|
57
|
+
|
58
|
+
auth:
|
59
|
+
authenticate: true
|
60
|
+
pdp:
|
61
|
+
constructor: TestPDP
|
62
|
+
trust:
|
63
|
+
- adam
|
64
|
+
|
65
|
+
eventloop:
|
66
|
+
type: :em
|
67
|
+
|
68
|
+
logging:
|
69
|
+
|
70
|
+
level:
|
71
|
+
default: debug
|
72
|
+
|
73
|
+
appenders:
|
74
|
+
stdout:
|
75
|
+
date_pattern: "%H:%M:%S"
|
76
|
+
pattern: "%d %5l %c{2}: %m\n"
|
77
|
+
color_scheme: none
|
78
|
+
|
79
|
+
# END of NEW options
|
80
|
+
|
81
|
+
# OML options
|
82
|
+
|
83
|
+
instrumentation:
|
84
|
+
oml-id: id # Name to identify this app instance [undefined]
|
85
|
+
oml-domain: domain # Name of experimental domain [undefined] *EXPERIMENTAL*
|
86
|
+
oml-collect: uri # URI of server to send measurements to
|
87
|
+
oml-protocol: 4 # Protocol number [4]
|
88
|
+
oml-log-level: l # Log level used (info: 1 .. debug: 0)
|
89
|
+
oml-noop: # Do not collect measurements
|
90
|
+
oml-config: file # File holding OML configuration parameters
|
91
|
+
|
92
|
+
# END of OML options
|
@@ -9,7 +9,7 @@ require 'omf_rc/resource_proxy_dsl'
|
|
9
9
|
describe OmfRc::ResourceProxyDSL do
|
10
10
|
before do
|
11
11
|
mock_comm_in_res_proxy
|
12
|
-
mock_topics_in_res_proxy(resources: [:mp0, :mrp0, :up0])
|
12
|
+
mock_topics_in_res_proxy(resources: [:mp0, :mrp0, :up0, :f0])
|
13
13
|
|
14
14
|
module OmfRc::Util::MockUtility
|
15
15
|
include OmfRc::ResourceProxyDSL
|
@@ -69,6 +69,14 @@ describe OmfRc::ResourceProxyDSL do
|
|
69
69
|
|
70
70
|
register_proxy :useless_proxy
|
71
71
|
end
|
72
|
+
|
73
|
+
module OmfRc::ResourceProxy::Foo
|
74
|
+
include OmfRc::ResourceProxyDSL
|
75
|
+
|
76
|
+
register_proxy :foo
|
77
|
+
|
78
|
+
namespace :foo, "http://schema/foo"
|
79
|
+
end
|
72
80
|
end
|
73
81
|
|
74
82
|
after do
|
@@ -144,4 +152,11 @@ describe OmfRc::ResourceProxyDSL do
|
|
144
152
|
lambda { mock_proxy.configure_init_only_prop }.must_raise NoMethodError
|
145
153
|
end
|
146
154
|
end
|
155
|
+
|
156
|
+
describe "when namespace specified" do
|
157
|
+
it "must define namespace in the resource proxy" do
|
158
|
+
foo = OmfRc::ResourceFactory.create(:foo, uid: :f0)
|
159
|
+
foo.namespace.must_equal({foo: "http://schema/foo"})
|
160
|
+
end
|
161
|
+
end
|
147
162
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# Copyright (c) 2013 National ICT Australia Limited (NICTA).
|
2
|
+
# This software may be used and distributed solely under the terms of the MIT license (License).
|
3
|
+
# You should find a copy of the License in LICENSE.TXT or at http://opensource.org/licenses/MIT.
|
4
|
+
# By downloading or using this software you accept the terms and the liability disclaimer in the License.
|
5
|
+
|
6
|
+
require 'test_helper'
|
7
|
+
require 'omf_rc/runner'
|
8
|
+
|
9
|
+
describe OmfRc::Runner do
|
10
|
+
describe 'when loading a configuration yaml file' do
|
11
|
+
before do
|
12
|
+
@r = OmfRc::Runner.new
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'must initialise options properly' do
|
16
|
+
@r.gopts[:config_file] = "#{FIXTURE_DIR}/omf_rc.yml"
|
17
|
+
@r.parse_config_files
|
18
|
+
|
19
|
+
@r.opts[:add_default_factories].must_equal true
|
20
|
+
|
21
|
+
@r.opts[:factories][0][:require].must_equal 'omf_rc_openflow'
|
22
|
+
|
23
|
+
@r.opts[:resources][0][:membership].must_equal ['g1']
|
24
|
+
|
25
|
+
@r.opts[:credentials][:root_cert_dir].must_equal '~/omf_keys/root/'
|
26
|
+
@r.opts[:credentials][:entity_cert].must_equal '~/omf_keys/rc.pem'
|
27
|
+
@r.opts[:credentials][:entity_key].must_equal '~/omf_keys/rc_key.pem'
|
28
|
+
|
29
|
+
@r.opts[:communication][:url].must_equal "xmpp://localhost"
|
30
|
+
@r.opts[:communication][:auth][:pdp][:trust].must_equal ['adam']
|
31
|
+
|
32
|
+
@r.opts[:instrumentation]['oml-domain'].must_equal 'domain'
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'must support a very minimal configure file with proper defaults' do
|
36
|
+
@r.gopts[:config_file] = "#{FIXTURE_DIR}/omf_rc.simple.yml"
|
37
|
+
@r.parse_config_files
|
38
|
+
|
39
|
+
@r.opts[:add_default_factories].must_equal true
|
40
|
+
@r.opts[:resources][0][:type].must_equal :node
|
41
|
+
|
42
|
+
node_id = Socket.gethostname
|
43
|
+
user = "#{node_id}-#{Process.pid}"
|
44
|
+
|
45
|
+
@r.opts[:resources][0][:uid].must_equal node_id
|
46
|
+
@r.opts[:communication][:url].must_equal "xmpp://#{user}:#{user}@somewhere"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omf_rc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.
|
4
|
+
version: 6.0.8.pre.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NICTA
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2013-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -42,28 +42,28 @@ dependencies:
|
|
42
42
|
name: pry
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - '>='
|
45
|
+
- - ! '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - '>='
|
52
|
+
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: simplecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - '>='
|
59
|
+
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - '>='
|
66
|
+
- - ! '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - '='
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 6.0.
|
75
|
+
version: 6.0.8.pre.1
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - '='
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 6.0.
|
82
|
+
version: 6.0.8.pre.1
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: cocaine
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,14 +98,14 @@ dependencies:
|
|
98
98
|
name: mocha
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - '>='
|
101
|
+
- - ! '>='
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - '>='
|
108
|
+
- - ! '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
description: Resource controller of OMF, a generic framework for controlling and managing
|
@@ -128,6 +128,7 @@ files:
|
|
128
128
|
- config/config.yml
|
129
129
|
- config/config_with_authentication.yml.example
|
130
130
|
- config/config_with_extensions.yml.example
|
131
|
+
- init/angstrom
|
131
132
|
- init/debian
|
132
133
|
- init/fedora
|
133
134
|
- init/run_omf_rc.sh
|
@@ -144,6 +145,7 @@ files:
|
|
144
145
|
- lib/omf_rc/resource_proxy/virtual_machine_factory.rb
|
145
146
|
- lib/omf_rc/resource_proxy/wlan.rb
|
146
147
|
- lib/omf_rc/resource_proxy_dsl.rb
|
148
|
+
- lib/omf_rc/runner.rb
|
147
149
|
- lib/omf_rc/util/common_tools.rb
|
148
150
|
- lib/omf_rc/util/hostapd.rb
|
149
151
|
- lib/omf_rc/util/ip.rb
|
@@ -163,6 +165,8 @@ files:
|
|
163
165
|
- test/fixture/iw/info
|
164
166
|
- test/fixture/iw/link
|
165
167
|
- test/fixture/lsmod
|
168
|
+
- test/fixture/omf_rc.simple.yml
|
169
|
+
- test/fixture/omf_rc.yml
|
166
170
|
- test/fixture/oml.hash
|
167
171
|
- test/fixture/oml.spec
|
168
172
|
- test/fixture/oml.xml
|
@@ -179,6 +183,7 @@ files:
|
|
179
183
|
- test/omf_rc/resource_proxy/application_spec.rb
|
180
184
|
- test/omf_rc/resource_proxy/node_spec.rb
|
181
185
|
- test/omf_rc/resource_proxy_dsl_spec.rb
|
186
|
+
- test/omf_rc/runner_spec.rb
|
182
187
|
- test/omf_rc/util/common_tools_spec.rb
|
183
188
|
- test/omf_rc/util/ip_spec.rb
|
184
189
|
- test/omf_rc/util/iw_spec.rb
|
@@ -194,44 +199,18 @@ require_paths:
|
|
194
199
|
- lib
|
195
200
|
required_ruby_version: !ruby/object:Gem::Requirement
|
196
201
|
requirements:
|
197
|
-
- - '>='
|
202
|
+
- - ! '>='
|
198
203
|
- !ruby/object:Gem::Version
|
199
204
|
version: 1.9.3
|
200
205
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
201
206
|
requirements:
|
202
|
-
- - '
|
207
|
+
- - ! '>'
|
203
208
|
- !ruby/object:Gem::Version
|
204
|
-
version:
|
209
|
+
version: 1.3.1
|
205
210
|
requirements: []
|
206
211
|
rubyforge_project: omf_rc
|
207
|
-
rubygems_version: 2.0.
|
212
|
+
rubygems_version: 2.0.7
|
208
213
|
signing_key:
|
209
214
|
specification_version: 4
|
210
215
|
summary: OMF resource controller
|
211
|
-
test_files:
|
212
|
-
- test/fixture/ip/addr_show
|
213
|
-
- test/fixture/iw/help
|
214
|
-
- test/fixture/iw/info
|
215
|
-
- test/fixture/iw/link
|
216
|
-
- test/fixture/lsmod
|
217
|
-
- test/fixture/oml.hash
|
218
|
-
- test/fixture/oml.spec
|
219
|
-
- test/fixture/oml.xml
|
220
|
-
- test/fixture/sys/class/ieee80211/phy0/device/uevent
|
221
|
-
- test/fixture/sys/class/ieee80211/phy0/uevent
|
222
|
-
- test/fixture/sys/class/net/eth0/device/uevent
|
223
|
-
- test/fixture/sys/class/net/eth0/uevent
|
224
|
-
- test/fixture/sys/class/net/wlan0/device/uevent
|
225
|
-
- test/fixture/sys/class/net/wlan0/uevent
|
226
|
-
- test/omf_rc/deferred_process_spec.rb
|
227
|
-
- test/omf_rc/message_process_error_spec.rb
|
228
|
-
- test/omf_rc/resource_factory_spec.rb
|
229
|
-
- test/omf_rc/resource_proxy/abstract_resource_spec.rb
|
230
|
-
- test/omf_rc/resource_proxy/application_spec.rb
|
231
|
-
- test/omf_rc/resource_proxy/node_spec.rb
|
232
|
-
- test/omf_rc/resource_proxy_dsl_spec.rb
|
233
|
-
- test/omf_rc/util/common_tools_spec.rb
|
234
|
-
- test/omf_rc/util/ip_spec.rb
|
235
|
-
- test/omf_rc/util/iw_spec.rb
|
236
|
-
- test/omf_rc/util/mod_spec.rb
|
237
|
-
- test/test_helper.rb
|
216
|
+
test_files: []
|