omf_ec 6.0.2.pre.2 → 6.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/omf_ec +10 -15
- data/example/engine_oedl.rb +21 -18
- data/example/engine_test.rb +15 -11
- data/example/test_exp/test00.rb +5 -0
- data/example/test_exp/test01.rb +5 -0
- data/example/test_exp/test02.rb +5 -0
- data/example/test_exp/test03.rb +5 -0
- data/example/test_exp/test06.rb +6 -1
- data/example/test_exp/test07.rb +5 -0
- data/lib/omf_ec/app_definition.rb +5 -0
- data/lib/omf_ec/backward/app_definition.rb +25 -3
- data/lib/omf_ec/backward/core_ext/array.rb +5 -0
- data/lib/omf_ec/backward/default_events.rb +16 -10
- data/lib/omf_ec/backward/dsl.rb +5 -0
- data/lib/omf_ec/backward/exp/testbed.rb +7 -2
- data/lib/omf_ec/backward/group.rb +8 -1
- data/lib/omf_ec/context/app_context.rb +13 -7
- data/lib/omf_ec/context/def_app_context.rb +5 -0
- data/lib/omf_ec/context/group_context.rb +31 -0
- data/lib/omf_ec/context/net_context.rb +12 -0
- data/lib/omf_ec/context.rb +5 -0
- data/lib/omf_ec/core_ext/hash.rb +11 -0
- data/lib/omf_ec/dsl.rb +6 -1
- data/lib/omf_ec/experiment.rb +7 -2
- data/lib/omf_ec/experiment_property.rb +16 -11
- data/lib/omf_ec/group.rb +8 -2
- data/lib/omf_ec/version.rb +6 -1
- data/lib/omf_ec.rb +6 -0
- data/omf_ec.gemspec +3 -1
- data/test/omf_ec/context_spec.rb +5 -0
- data/test/omf_ec/dsl_spec.rb +87 -24
- data/test/omf_ec/experiment_property_spec.rb +18 -6
- data/test/omf_ec/experiment_spec.rb +6 -0
- data/test/omf_ec/group_spec.rb +32 -23
- data/test/test_helper.rb +33 -0
- metadata +27 -8
- data/config/ec.yml +0 -164
data/bin/omf_ec
CHANGED
@@ -23,9 +23,9 @@ flag [:u, :uri]
|
|
23
23
|
desc "Debug XMPP traffic mode (include XMPP debug logging messages under debug mode)."
|
24
24
|
switch [:x, :xmpp]
|
25
25
|
|
26
|
-
desc "
|
27
|
-
arg_name "
|
28
|
-
flag [:
|
26
|
+
desc "Directory containing root certificates"
|
27
|
+
arg_name "directory", :optional
|
28
|
+
flag [:root_cert_dir]
|
29
29
|
|
30
30
|
desc "Your certificate"
|
31
31
|
arg_name "cert", :optional
|
@@ -40,6 +40,7 @@ arg_name "directory"
|
|
40
40
|
default_value "/tmp"
|
41
41
|
flag [:log_file_dir]
|
42
42
|
|
43
|
+
# the path given here is relative to the user's home directory
|
43
44
|
config_file(".config/omf_ec.yml")
|
44
45
|
|
45
46
|
desc "Execute an experiment script"
|
@@ -196,16 +197,14 @@ on_error do |exception|
|
|
196
197
|
end
|
197
198
|
|
198
199
|
pre do |global_options, command, options, args|
|
200
|
+
#opts = OmfCommon.load_yaml(config_file_name) if File.exist?(config_file_name)
|
201
|
+
#opts.delete("commands")
|
202
|
+
#global_options.merge!(opts)
|
203
|
+
|
199
204
|
unless global_options[:uri]
|
200
205
|
help_now! "Incomplete options. Need communication URI"
|
201
206
|
end
|
202
207
|
|
203
|
-
|
204
|
-
# Import private key
|
205
|
-
if global_options[:private_key]
|
206
|
-
OmfCommon::Key.instance.import(global_options[:private_key])
|
207
|
-
end
|
208
|
-
|
209
208
|
# Check version
|
210
209
|
if options[:check]
|
211
210
|
File.open(args[0], 'r') do |f|
|
@@ -247,10 +246,6 @@ end
|
|
247
246
|
|
248
247
|
def load_exp(exp_path, global_options = {} , options = {}, properties = {})
|
249
248
|
begin
|
250
|
-
if global_options[:root_cert] && File.exist?(global_options[:root_cert])
|
251
|
-
root = OmfCommon::Auth::Certificate.create_from_x509(File.read(global_options[:root_cert]))
|
252
|
-
end
|
253
|
-
|
254
249
|
if global_options[:cert] && File.exist?(global_options[:cert]) &&
|
255
250
|
global_options[:key] && File.exist?(global_options[:key])
|
256
251
|
|
@@ -273,7 +268,7 @@ def load_exp(exp_path, global_options = {} , options = {}, properties = {})
|
|
273
268
|
}
|
274
269
|
}
|
275
270
|
|
276
|
-
opts[:communication][:auth] = {
|
271
|
+
opts[:communication][:auth] = {} if entity
|
277
272
|
|
278
273
|
OmfCommon.init(:development, opts) do |el|
|
279
274
|
setup_logging(global_options)
|
@@ -282,7 +277,7 @@ def load_exp(exp_path, global_options = {} , options = {}, properties = {})
|
|
282
277
|
info "Connected using #{comm.conn_info}"
|
283
278
|
info "Start experiment: #{OmfEc.experiment.id}"
|
284
279
|
|
285
|
-
OmfCommon::Auth::CertificateStore.instance.
|
280
|
+
OmfCommon::Auth::CertificateStore.instance.register_default_certs(global_options[:root_cert_dir]) if global_options[:root_cert_dir]
|
286
281
|
OmfCommon::Auth::CertificateStore.instance.register(entity, OmfCommon.comm.local_address) if entity
|
287
282
|
|
288
283
|
begin
|
data/example/engine_oedl.rb
CHANGED
@@ -1,15 +1,18 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
# OMF_VERSIONS = 6.0
|
2
7
|
#
|
3
8
|
|
4
|
-
def_property('
|
5
|
-
|
6
|
-
garage = prop.name
|
9
|
+
def_property('garage', 'garage', 'Name of garage')
|
7
10
|
|
8
11
|
defEvent :engine_created do |state|
|
9
|
-
# state holds list of resources, and automatically updated once OMF inform messages received.
|
12
|
+
# state is an array holds list of resources, and automatically updated once OMF inform messages received.
|
10
13
|
state.find_all do |v|
|
11
|
-
v[:type] == 'engine'
|
12
|
-
end.size
|
14
|
+
v[:type] == 'engine' && !v[:membership].empty?
|
15
|
+
end.size > 0
|
13
16
|
end
|
14
17
|
|
15
18
|
defEvent :rpm_reached_4000 do |state|
|
@@ -19,34 +22,34 @@ defEvent :rpm_reached_4000 do |state|
|
|
19
22
|
end
|
20
23
|
|
21
24
|
# Define a group and add garages to it.
|
22
|
-
defGroup('garages', garage)
|
25
|
+
defGroup('garages', prop.garage)
|
23
26
|
|
24
27
|
# :ALL_UP is a pre-defined event,
|
25
28
|
# triggered when all resources set to be part of groups are available and configured as members of the associated groups.
|
26
29
|
onEvent :ALL_UP do
|
27
30
|
group('garages') do |g|
|
28
|
-
g.create_resource('
|
31
|
+
g.create_resource('my_engine', type: 'engine')
|
29
32
|
|
30
33
|
onEvent :engine_created do
|
31
34
|
info ">>> Accelerating all engines"
|
32
|
-
g.resources[type: 'engine']
|
35
|
+
g.resources[type: 'engine'].throttle = 50
|
33
36
|
|
34
|
-
|
35
|
-
|
37
|
+
# We periodically check engine RPM
|
38
|
+
every 2.second do
|
39
|
+
g.resources[type: 'engine'].rpm
|
40
|
+
end
|
36
41
|
end
|
37
42
|
|
38
43
|
onEvent :rpm_reached_4000 do
|
39
44
|
info ">>> Engine RPM reached 4000"
|
40
|
-
|
41
45
|
info ">>> Reduce engine throttle"
|
42
46
|
g.resources[type: 'engine'].throttle = 0
|
47
|
+
end
|
43
48
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
done!
|
49
|
-
end
|
49
|
+
after 20.seconds do
|
50
|
+
info ">>> Release engines"
|
51
|
+
g.resources[type: 'engine'].release
|
52
|
+
done!
|
50
53
|
end
|
51
54
|
end
|
52
55
|
end
|
data/example/engine_test.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
# OMF_VERSIONS = 6.0
|
2
7
|
|
3
8
|
def create_engine(garage)
|
@@ -42,19 +47,18 @@ def on_engine_created(engine)
|
|
42
47
|
end
|
43
48
|
|
44
49
|
# Monitor all status information from the engine
|
45
|
-
engine.
|
46
|
-
msg.
|
47
|
-
|
50
|
+
engine.on_inform do |msg|
|
51
|
+
case msg.itype
|
52
|
+
when 'STATUS'
|
53
|
+
msg.each_property do |name, value|
|
54
|
+
info "#{name}: #{value}"
|
55
|
+
end
|
56
|
+
when 'ERROR'
|
57
|
+
error msg[:reason]
|
58
|
+
when 'WARN'
|
59
|
+
warn msg[:reason]
|
48
60
|
end
|
49
61
|
end
|
50
|
-
|
51
|
-
engine.on_error do |msg|
|
52
|
-
error msg[:reason]
|
53
|
-
end
|
54
|
-
|
55
|
-
engine.on_warn do |msg|
|
56
|
-
warn msg[:reason]
|
57
|
-
end
|
58
62
|
end
|
59
63
|
|
60
64
|
OmfCommon.comm.subscribe('garage') do |garage|
|
data/example/test_exp/test00.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
# We can use communicator to interact with XMPP server
|
2
7
|
#
|
3
8
|
# Find all top level pubsub nodes
|
data/example/test_exp/test01.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
#
|
2
7
|
# Test 1
|
3
8
|
#
|
data/example/test_exp/test02.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
#
|
2
7
|
# Test 2
|
3
8
|
#
|
data/example/test_exp/test03.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
#
|
2
7
|
# Test 3
|
3
8
|
#
|
data/example/test_exp/test06.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
#
|
2
7
|
# Test 6
|
3
8
|
#
|
@@ -62,7 +67,7 @@ def check_outcome
|
|
62
67
|
match2 = match1.grep(/AgentCommands/)
|
63
68
|
result1 = (match2.length == 1) ? true : false
|
64
69
|
# 2)
|
65
|
-
match1 = lines.grep(/
|
70
|
+
match1 = lines.grep(/EXIT/)
|
66
71
|
match2 = match1.grep(/AgentCommands/)
|
67
72
|
result2 = (match2.length >= 2) ? true : false
|
68
73
|
|
data/example/test_exp/test07.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
#
|
2
7
|
# Test 7
|
3
8
|
#
|
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
require 'securerandom'
|
2
7
|
|
3
8
|
module OmfEc
|
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
module OmfEc
|
2
7
|
module Backward
|
3
8
|
module AppDefinition
|
@@ -39,8 +44,25 @@ module OmfEc
|
|
39
44
|
define_parameter(Hash[name,opts])
|
40
45
|
end
|
41
46
|
|
42
|
-
|
43
|
-
|
47
|
+
# Define metrics to measure
|
48
|
+
#
|
49
|
+
# @param [String] name of the metric
|
50
|
+
# @param [Symbol] type of the metric data. For all supporting metric data types, refers to http://oml.mytestbed.net/doc/oml/latest/oml2-scaffold.1.html#_mp_defmetric_name_type
|
51
|
+
# @param [Hash] opts additional options
|
52
|
+
#
|
53
|
+
# @option opts [String] :unit unit of measure of the metric
|
54
|
+
# @option opts [String] :description of the metric
|
55
|
+
# @option opts [Float] :precision precision of the metric value
|
56
|
+
# @option opts [Range] :range value range of the metric
|
57
|
+
#
|
58
|
+
# @example OEDL
|
59
|
+
# app.defMeasurement("power") do |mp|
|
60
|
+
# mp.defMetric('power', :double, unit: "W", precision: 0.1, description: 'Power')
|
61
|
+
# end
|
62
|
+
def defMetric(name,type, opts = {})
|
63
|
+
# the third parameter used to be a description string
|
64
|
+
opts = {:description => opts} if opts.class!=Hash
|
65
|
+
@fields << {:field => name, :type => type}.merge(opts)
|
44
66
|
end
|
45
67
|
|
46
68
|
# XXX: This should be provided by the omf-oml glue.
|
@@ -48,7 +70,7 @@ module OmfEc
|
|
48
70
|
mp = {:mp => name, :fields => []}
|
49
71
|
@fields = []
|
50
72
|
# call the block with ourserlves to process its 'defMetric' statements
|
51
|
-
block.call(self) if block
|
73
|
+
block.call(self) if block
|
52
74
|
@fields.each { |f| mp[:fields] << f }
|
53
75
|
define_measurement_point(mp)
|
54
76
|
end
|
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
class Array
|
2
7
|
def startApplications
|
3
8
|
if !self.empty? && self.all? { |v| v.class == OmfEc::Group }
|
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
module OmfEc
|
2
7
|
module Backward
|
3
8
|
module DefaultEvents
|
@@ -9,9 +14,7 @@ module OmfEc
|
|
9
14
|
def_event :ALL_UP do |state|
|
10
15
|
all_groups? do |g|
|
11
16
|
plan = g.members.uniq.sort
|
12
|
-
actual = state.find_all
|
13
|
-
v[:membership] && v[:membership].include?(g.id)
|
14
|
-
end.map { |v| v[:address] }.sort
|
17
|
+
actual = state.find_all { |v| v.joined?(g.id) }.map { |v| v[:address] }.sort
|
15
18
|
|
16
19
|
debug "Planned: #{g.name}(#{g.id}): #{plan}"
|
17
20
|
debug "Actual: #{g.name}(#{g.id}): #{actual}"
|
@@ -49,10 +52,7 @@ module OmfEc
|
|
49
52
|
def_event :ALL_INTERFACE_UP do |state|
|
50
53
|
all_groups? do |g|
|
51
54
|
plan = g.net_ifs.map { |v| v.conf[:if_name] }.uniq.size * g.members.uniq.size
|
52
|
-
actual = state.
|
53
|
-
v[:membership] &&
|
54
|
-
(v[:membership].include?("#{g.id}_wlan") || v[:membership].include?("#{g.id}_net"))
|
55
|
-
end.size
|
55
|
+
actual = state.count { |v| v.joined?("#{g.id}_wlan", "#{g.id}_net") }
|
56
56
|
plan == actual
|
57
57
|
end
|
58
58
|
end
|
@@ -60,13 +60,19 @@ module OmfEc
|
|
60
60
|
def_event :ALL_UP_AND_INSTALLED do |state|
|
61
61
|
all_groups? do |g|
|
62
62
|
plan = g.app_contexts.size * g.members.uniq.size
|
63
|
-
actual = state.
|
64
|
-
v[:membership] && v[:membership].include?("#{g.id}_application")
|
65
|
-
end.size
|
63
|
+
actual = state.count { |v| v.joined?("#{g.id}_application") }
|
66
64
|
plan == actual
|
67
65
|
end
|
68
66
|
end
|
69
67
|
|
68
|
+
def_event :ALL_APPS_DONE do |state|
|
69
|
+
all_groups? do |g|
|
70
|
+
plan = (g.execs.size + g.app_contexts.size) * g.members.uniq.size
|
71
|
+
actual = state.count { |v| v.joined?("#{g.id}_application") && v[:event] == 'EXIT' }
|
72
|
+
plan == 0 ? false : plan == actual
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
70
76
|
end
|
71
77
|
end
|
72
78
|
end
|
data/lib/omf_ec/backward/dsl.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
module OmfEc
|
2
7
|
module Backward
|
3
8
|
module DSL
|
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
def create_app(testbed)
|
2
7
|
testbed.create(:application, binary_path: @cmd) do |reply|
|
3
8
|
if reply.success?
|
@@ -6,11 +11,11 @@ def create_app(testbed)
|
|
6
11
|
app.on_subscribed do
|
7
12
|
app.configure(state: :running)
|
8
13
|
|
9
|
-
app.
|
14
|
+
app.on_inform do |m|
|
10
15
|
case m.itype
|
11
16
|
when 'STATUS'
|
12
17
|
if m[:status_type] == 'APP_EVENT'
|
13
|
-
after(2) { OmfCommon.comm.disconnect } if m[:event] =~ /
|
18
|
+
after(2) { OmfCommon.comm.disconnect } if m[:event] =~ /EXIT/
|
14
19
|
info m[:msg] if m[:msg]
|
15
20
|
else
|
16
21
|
m.each_property do |k, v|
|
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
require 'securerandom'
|
2
7
|
|
3
8
|
module OmfEc
|
@@ -12,10 +17,12 @@ module OmfEc
|
|
12
17
|
# Create an application for the group and start it
|
13
18
|
#
|
14
19
|
def exec(name)
|
20
|
+
self.synchronize do
|
21
|
+
self.execs << name
|
22
|
+
end
|
15
23
|
create_resource(name, type: 'application', binary_path: name)
|
16
24
|
|
17
25
|
e_uid = SecureRandom.uuid
|
18
|
-
|
19
26
|
e_name = "#{self.name}_application_#{name}_created_#{e_uid}"
|
20
27
|
|
21
28
|
resource_group_name = "#{self.id}_application"
|
@@ -1,10 +1,16 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
module OmfEc::Context
|
7
|
+
# Holds application configuration
|
2
8
|
class AppContext
|
3
9
|
attr_accessor :name, :app_def, :param_values, :oml_collections
|
4
10
|
|
5
11
|
# Keep track of contexts for each app, i.e. multiple contexts can share
|
6
|
-
# the same app def. This happens for example when a group can have the
|
7
|
-
# same applications added to it many times, but with different parameter
|
12
|
+
# the same app def. This happens for example when a group can have the
|
13
|
+
# same applications added to it many times, but with different parameter
|
8
14
|
# values for each. Thus we need to distinguish these different context
|
9
15
|
@@context_count = Hash.new
|
10
16
|
|
@@ -61,11 +67,11 @@ module OmfEc::Context
|
|
61
67
|
|
62
68
|
def properties
|
63
69
|
# deep copy the properties from the app definition
|
64
|
-
original = Marshal.load(Marshal.dump(app_def.properties))
|
70
|
+
original = Marshal.load(Marshal.dump(app_def.properties))
|
65
71
|
# now build the properties for this context
|
66
72
|
# - use the properties from app definition as the base
|
67
|
-
# - if this context's param_values has a property which also exists in
|
68
|
-
# the app def and if that property has an assigned value, then
|
73
|
+
# - if this context's param_values has a property which also exists in
|
74
|
+
# the app def and if that property has an assigned value, then
|
69
75
|
# use that value for the properties of this context
|
70
76
|
p = original.merge({:type => 'application'})
|
71
77
|
@param_values.each do |k,v|
|
@@ -77,9 +83,9 @@ module OmfEc::Context
|
|
77
83
|
p[:use_oml] = true
|
78
84
|
p[:oml][:id] = @name
|
79
85
|
p[:oml][:experiment] = OmfEc.experiment.id
|
80
|
-
p[:oml][:collection] = @oml_collections
|
86
|
+
p[:oml][:collection] = @oml_collections
|
81
87
|
end
|
82
88
|
p
|
83
|
-
end
|
89
|
+
end
|
84
90
|
end
|
85
91
|
end
|
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
module OmfEc::Context
|
2
7
|
class DefAppContext
|
3
8
|
attr_accessor :conf
|
@@ -1,4 +1,10 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
module OmfEc::Context
|
7
|
+
# Holds group configuration
|
2
8
|
class GroupContext
|
3
9
|
attr_accessor :group
|
4
10
|
attr_accessor :guard
|
@@ -10,11 +16,32 @@ module OmfEc::Context
|
|
10
16
|
self
|
11
17
|
end
|
12
18
|
|
19
|
+
# Supports OEDL 6 syntax [] for setting FRCP guard
|
20
|
+
#
|
21
|
+
# @param [Hash] opts option hash which sets constraints
|
22
|
+
#
|
23
|
+
# @example Reduce throttle to zero for all resources of type 'engine' from group 'A'
|
24
|
+
#
|
25
|
+
# group('A') do |g|
|
26
|
+
# g.resources[type: 'engine'].throttle = 0
|
27
|
+
# end
|
28
|
+
#
|
13
29
|
def [](opts = {})
|
14
30
|
self.guard.merge!(opts)
|
15
31
|
self
|
16
32
|
end
|
17
33
|
|
34
|
+
# Calling standard methods or assignments will simply trigger sending a FRCP message
|
35
|
+
#
|
36
|
+
# @example OEDL
|
37
|
+
# # Will send FRCP CONFIGURE message
|
38
|
+
# g.resources[type: 'engine'].throttle = 0
|
39
|
+
#
|
40
|
+
# # Will send FRCP REQUEST message
|
41
|
+
# g.resources[type: 'engine'].rpm
|
42
|
+
#
|
43
|
+
# # Will send FRCP RELEASE message
|
44
|
+
# g.resources[type: 'engine'].release
|
18
45
|
def method_missing(name, *args, &block)
|
19
46
|
if name =~ /(.+)=/
|
20
47
|
self.operation = :configure
|
@@ -27,6 +54,10 @@ module OmfEc::Context
|
|
27
54
|
send_message(name, *args, &block)
|
28
55
|
end
|
29
56
|
|
57
|
+
# Send FRCP message
|
58
|
+
#
|
59
|
+
# @param [String] name of the property
|
60
|
+
# @param [Object] value of the property, for configuring
|
30
61
|
def send_message(name, value = nil, &block)
|
31
62
|
if self.guard[:type]
|
32
63
|
topic = self.group.resource_topic(self.guard[:type])
|
@@ -1,4 +1,10 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
module OmfEc::Context
|
7
|
+
# Holds network related configuration
|
2
8
|
class NetContext
|
3
9
|
# Wifi frequency channel matching
|
4
10
|
FREQUENCY= {
|
@@ -18,6 +24,11 @@ module OmfEc::Context
|
|
18
24
|
self
|
19
25
|
end
|
20
26
|
|
27
|
+
# Property assignment will simply update configuration
|
28
|
+
#
|
29
|
+
# @example OEDL
|
30
|
+
# node.net.w0.mode = "adhoc"
|
31
|
+
# node.net.w0.essid = "helloworld"
|
21
32
|
def method_missing(name, *args, &block)
|
22
33
|
if name =~ /(.+)=/
|
23
34
|
net_prop = $1.to_sym
|
@@ -33,6 +44,7 @@ module OmfEc::Context
|
|
33
44
|
end
|
34
45
|
end
|
35
46
|
|
47
|
+
# Interchange channel and frequency value
|
36
48
|
def map_channel_freq
|
37
49
|
if self.conf[:channel] && self.conf[:frequency].nil?
|
38
50
|
self.conf[:frequency] = FREQUENCY[self.conf[:channel].to_s.to_i]
|
data/lib/omf_ec/context.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
require 'omf_ec/context/group_context'
|
2
7
|
require 'omf_ec/context/net_context'
|
3
8
|
require 'omf_ec/context/app_context'
|
@@ -0,0 +1,11 @@
|
|
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
|
+
class Hash
|
7
|
+
def joined?(*group_ids)
|
8
|
+
self[:membership] && group_ids.any? { |g_id| self[:membership].include?(g_id) }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
data/lib/omf_ec/dsl.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
require 'active_support/core_ext'
|
2
7
|
require 'eventmachine'
|
3
8
|
|
@@ -148,7 +153,7 @@ module OmfEc
|
|
148
153
|
# Check if any elements in array equals the value provided
|
149
154
|
#
|
150
155
|
def one_equal(array, value)
|
151
|
-
array.any? ? false : array.
|
156
|
+
!array.any? ? false : array.any? { |v| v.to_s == value.to_s }
|
152
157
|
end
|
153
158
|
|
154
159
|
# Define an event
|
data/lib/omf_ec/experiment.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# Copyright (c) 2012 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
|
+
|
1
6
|
require 'hashie'
|
2
7
|
require 'singleton'
|
3
8
|
require 'monitor'
|
@@ -14,6 +19,7 @@ module OmfEc
|
|
14
19
|
attr_reader :groups, :sub_groups, :state
|
15
20
|
|
16
21
|
def initialize
|
22
|
+
super
|
17
23
|
@id = Time.now.utc.iso8601
|
18
24
|
@state ||= [] #TODO: we need to keep history of all the events and not ovewrite them
|
19
25
|
@groups ||= []
|
@@ -21,7 +27,6 @@ module OmfEc
|
|
21
27
|
@app_definitions ||= Hash.new
|
22
28
|
@sub_groups ||= []
|
23
29
|
@cmdline_properties ||= Hash.new
|
24
|
-
super
|
25
30
|
end
|
26
31
|
|
27
32
|
def property
|
@@ -143,8 +148,8 @@ module OmfEc
|
|
143
148
|
self.synchronize do
|
144
149
|
@events.find_all { |v| v[:callbacks] && !v[:callbacks].empty? }.each do |event|
|
145
150
|
if event[:trigger].call(@state)
|
146
|
-
info "Event triggered: '#{event[:name]}'"
|
147
151
|
@events.delete(event) if event[:consume_event]
|
152
|
+
info "Event triggered: '#{event[:name]}'"
|
148
153
|
|
149
154
|
# Last in first serve callbacks
|
150
155
|
event[:callbacks].reverse.each do |callback|
|