omf_ec 6.0.8.pre.2 → 6.0.8.pre.3
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.
- checksums.yaml +6 -14
- data/bin/omf_ec +6 -0
- data/lib/omf_ec/backward/default_events.rb +32 -20
- data/lib/omf_ec/backward/exp/testbed.rb +1 -1
- data/lib/omf_ec/dsl.rb +10 -2
- data/lib/omf_ec/experiment.rb +27 -7
- data/lib/omf_ec/group.rb +3 -4
- data/test/omf_ec/group_spec.rb +2 -12
- metadata +16 -16
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
Y2MzYmFjMmM3MDZmNWQ4OTk4Y2JlYTYwYWFiOGQ3ODk5YzUzNzhiZGIxMjIx
|
10
|
-
ZWNhODM0MmFjMmU3ZTNhMmM3ZTY3YzNhYTVjZjdkMWQ5MGYzYzdlN2NhMGM4
|
11
|
-
NWNkOGZlZWM3ZWZmM2ZlYTk5MTEzNmRhOWIwYmZmODMwMjk0YzU=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ZmE5N2VkOWJmM2Y5NzExOGVmN2M0YzFlY2FkN2E5ZTVmMTUzNjMyMzJkNmYx
|
14
|
-
YWIxM2JhOTZhNDAzZjhlOTc0MGYzNzBlMGQ0ZjE5ZTZlM2MzOWMxYzNhYzdj
|
15
|
-
N2MyOWEzMGVhMmRhNGFjMzRlY2Q5ZWYxZDk4NWI3OGY1ZTg4MDE=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 27b8a5ddbab771c9bcb2e4caee6b85d5465859e0
|
4
|
+
data.tar.gz: e137a54683156ee2a6954f59fb5d960d8787de65
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ed8149aa66a20c06cdebdacc26357c887a72421cf2eeae36940cf33c978a676e672c8d09129897c23c53f720221bb21ac57cd43279c00d0a1c497cf421bf725d
|
7
|
+
data.tar.gz: b2008ae56fc0195b315d575a946725ec41a444c9f788d6e23e50750d0fd7bb303763c0c89af1e4f3489f22ecebe6a47f113c239199cf6f6ac2537d590e02c7f1
|
data/bin/omf_ec
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
# Copyright (c) 2012 National ICT Australia Limited (NICTA).
|
4
|
+
# This software may be used and distributed solely under the terms of the MIT license (License).
|
5
|
+
# You should find a copy of the License in LICENSE.TXT or at http://opensource.org/licenses/MIT.
|
6
|
+
# By downloading or using this software you accept the terms and the liability disclaimer in the License.
|
7
|
+
|
8
|
+
puts "OMF Experiment Controller - Copyright (c) 2012-13 National ICT Australia Limited (NICTA)"
|
3
9
|
abort "Please use Ruby 1.9.3 or higher" if RUBY_VERSION < "1.9.3"
|
4
10
|
|
5
11
|
require 'gli'
|
@@ -11,7 +11,7 @@ module OmfEc
|
|
11
11
|
def included(base)
|
12
12
|
base.instance_eval do
|
13
13
|
|
14
|
-
|
14
|
+
def all_nodes_up?(state)
|
15
15
|
all_groups? do |g|
|
16
16
|
plan = g.members.values.uniq.sort
|
17
17
|
actual = state.find_all { |v| v.joined?(g.address) }.map { |v| v[:address].to_s }.sort
|
@@ -27,7 +27,23 @@ module OmfEc
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
def all_interfaces_ready?(state)
|
31
|
+
all_groups? do |g|
|
32
|
+
plan = g.net_ifs.map { |v| v.conf[:if_name] }.uniq.size * g.members.values.uniq.size
|
33
|
+
actual = state.count { |v| v.joined?(g.address("wlan"), g.address("net")) }
|
34
|
+
plan == 0 ? false : plan == actual
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def all_apps_ready?(state)
|
39
|
+
all_groups? do |g|
|
40
|
+
plan = g.app_contexts.size * g.members.values.uniq.size
|
41
|
+
actual = state.count { |v| v.joined?(g.address("application")) }
|
42
|
+
plan == 0 ? false : plan == actual
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def all_nodes_up_cbk
|
31
47
|
all_groups do |group|
|
32
48
|
# Deal with brilliant net.w0.ip syntax...
|
33
49
|
group.net_ifs && group.net_ifs.each do |nif|
|
@@ -53,34 +69,30 @@ module OmfEc
|
|
53
69
|
end
|
54
70
|
end
|
55
71
|
|
56
|
-
def_event :
|
57
|
-
|
58
|
-
|
59
|
-
app_actual = state.count { |v| v.joined?(g.address("application")) }
|
60
|
-
if_plan = g.net_ifs.map { |v| v.conf[:if_name] }.uniq.size * g.members.values.uniq.size
|
61
|
-
if_actual = state.count { |v| v.joined?(g.address("wlan"), g.address("net")) }
|
72
|
+
def_event :ALL_NODES_UP do |state|
|
73
|
+
all_nodes_up?(state)
|
74
|
+
end
|
62
75
|
|
63
|
-
|
64
|
-
|
76
|
+
alias_event :ALL_UP, :ALL_NODES_UP
|
77
|
+
|
78
|
+
on_event :ALL_NODES_UP do
|
79
|
+
all_nodes_up_cbk
|
80
|
+
end
|
81
|
+
|
82
|
+
def_event :ALL_RESOURCE_UP do |state|
|
83
|
+
all_nodes_up?(state) && all_interfaces_ready?(state) && all_apps_ready?(state)
|
65
84
|
end
|
66
85
|
|
67
86
|
def_event :ALL_INTERFACE_UP do |state|
|
68
|
-
|
69
|
-
plan = g.net_ifs.map { |v| v.conf[:if_name] }.uniq.size * g.members.values.uniq.size
|
70
|
-
actual = state.count { |v| v.joined?(g.address("wlan"), g.address("net")) }
|
71
|
-
plan == actual
|
72
|
-
end
|
87
|
+
all_nodes_up?(state) && all_interfaces_ready?(state)
|
73
88
|
end
|
74
89
|
|
75
90
|
def_event :ALL_UP_AND_INSTALLED do |state|
|
76
|
-
|
77
|
-
plan = g.app_contexts.size * g.members.values.uniq.size
|
78
|
-
actual = state.count { |v| v.joined?(g.address("application")) }
|
79
|
-
plan == actual
|
80
|
-
end
|
91
|
+
all_nodes_up?(state) && all_apps_ready?(state)
|
81
92
|
end
|
82
93
|
|
83
94
|
def_event :ALL_APPS_DONE do |state|
|
95
|
+
all_nodes_up?(state) &&
|
84
96
|
all_groups? do |g|
|
85
97
|
plan = (g.execs.size + g.app_contexts.size) * g.members.values.uniq.size
|
86
98
|
actual = state.count { |v| v.joined?(g.address("application")) && v[:event] == 'EXIT' }
|
@@ -15,7 +15,7 @@ def create_app(testbed)
|
|
15
15
|
case m.itype
|
16
16
|
when 'STATUS'
|
17
17
|
if m[:status_type] == 'APP_EVENT'
|
18
|
-
after(2) { OmfCommon.comm.disconnect } if m[:event] =~ /EXIT/
|
18
|
+
after(2) { OmfCommon.comm.disconnect ; OmfCommon.eventloop.stop } if m[:event] =~ /EXIT/
|
19
19
|
info m[:msg] if m[:msg]
|
20
20
|
else
|
21
21
|
m.each_property do |k, v|
|
data/lib/omf_ec/dsl.rb
CHANGED
@@ -162,10 +162,18 @@ module OmfEc
|
|
162
162
|
OmfEc.experiment.add_event(name, trigger)
|
163
163
|
end
|
164
164
|
|
165
|
+
# Create an alias name of an event
|
166
|
+
def alias_event(new_name, name)
|
167
|
+
unless (event = OmfEc.experiment.event(name))
|
168
|
+
raise RuntimeError, "Can not create alias for Event '#{name}' which is not defined"
|
169
|
+
else
|
170
|
+
event[:aliases] << new_name
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
165
174
|
# Define an event callback
|
166
175
|
def on_event(name, consume_event = true, &callback)
|
167
|
-
event = OmfEc.experiment.event(name)
|
168
|
-
if event.nil?
|
176
|
+
unless (event = OmfEc.experiment.event(name))
|
169
177
|
raise RuntimeError, "Event '#{name}' not defined"
|
170
178
|
else
|
171
179
|
event[:callbacks] ||= []
|
data/lib/omf_ec/experiment.rb
CHANGED
@@ -15,14 +15,15 @@ module OmfEc
|
|
15
15
|
|
16
16
|
include MonitorMixin
|
17
17
|
|
18
|
-
attr_accessor :name, :oml_uri, :app_definitions, :property, :cmdline_properties, :show_graph
|
18
|
+
attr_accessor :name, :oml_uri, :app_definitions, :property, :cmdline_properties, :show_graph, :nodes
|
19
19
|
attr_reader :groups, :sub_groups, :state
|
20
20
|
|
21
21
|
def initialize
|
22
22
|
super
|
23
|
-
@id = Time.now.utc.iso8601
|
23
|
+
@id = Time.now.utc.iso8601(3)
|
24
24
|
@state ||= [] #TODO: we need to keep history of all the events and not ovewrite them
|
25
25
|
@groups ||= []
|
26
|
+
@nodes ||= []
|
26
27
|
@events ||= []
|
27
28
|
@app_definitions ||= Hash.new
|
28
29
|
@sub_groups ||= []
|
@@ -80,7 +81,7 @@ module OmfEc
|
|
80
81
|
unless planned_groups.empty?
|
81
82
|
OmfEc.subscribe_and_monitor(name) do |res|
|
82
83
|
info "Config #{name} to join #{planned_groups.map(&:name).join(', ')}"
|
83
|
-
res.configure(membership: planned_groups.map(&:address)
|
84
|
+
res.configure(membership: planned_groups.map(&:address))
|
84
85
|
end
|
85
86
|
end
|
86
87
|
end
|
@@ -129,13 +130,13 @@ module OmfEc
|
|
129
130
|
end
|
130
131
|
|
131
132
|
def event(name)
|
132
|
-
@events.find { |v| v[:name] == name }
|
133
|
+
@events.find { |v| v[:name] == name || v[:aliases].include?(name) }
|
133
134
|
end
|
134
135
|
|
135
136
|
def add_event(name, trigger)
|
136
137
|
self.synchronize do
|
137
138
|
raise RuntimeError, "Event '#{name}' has already been defined" if event(name)
|
138
|
-
@events << { name: name, trigger: trigger }
|
139
|
+
@events << { name: name, trigger: trigger, aliases: [] }
|
139
140
|
end
|
140
141
|
end
|
141
142
|
|
@@ -150,7 +151,8 @@ module OmfEc
|
|
150
151
|
@events.find_all { |v| v[:callbacks] && !v[:callbacks].empty? }.each do |event|
|
151
152
|
if event[:trigger].call(@state)
|
152
153
|
@events.delete(event) if event[:consume_event]
|
153
|
-
|
154
|
+
event_names = ([event[:name]] + event[:aliases]).join(', ')
|
155
|
+
info "Event triggered: '#{event_names}'"
|
154
156
|
|
155
157
|
# Last in first serve callbacks
|
156
158
|
event[:callbacks].reverse.each do |callback|
|
@@ -186,10 +188,20 @@ module OmfEc
|
|
186
188
|
|
187
189
|
OmfCommon.el.after(5) do
|
188
190
|
OmfCommon.comm.disconnect
|
191
|
+
OmfCommon.eventloop.stop
|
189
192
|
end
|
190
193
|
end
|
191
194
|
end
|
192
195
|
|
196
|
+
def disconnect
|
197
|
+
info "Disconnecting in 5 sec from experiment: #{OmfEc.experiment.id}"
|
198
|
+
info "Run the EC again to reattach"
|
199
|
+
OmfCommon.el.after(5) do
|
200
|
+
OmfCommon.comm.disconnect
|
201
|
+
OmfCommon.eventloop.stop
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
193
205
|
def start
|
194
206
|
info "Experiment: #{OmfEc.experiment.id} starts"
|
195
207
|
|
@@ -200,11 +212,19 @@ module OmfEc
|
|
200
212
|
g.synchronize do
|
201
213
|
g.members[key] = res.address
|
202
214
|
end
|
203
|
-
res.configure(membership: g.address)
|
215
|
+
res.configure(membership: g.address, :node_index => OmfEc.experiment.nodes.index(key))
|
204
216
|
end
|
205
217
|
end
|
206
218
|
end
|
207
219
|
end
|
220
|
+
|
221
|
+
# Ask the resources which joined the groups I created to leave
|
222
|
+
#
|
223
|
+
def leave_memberships
|
224
|
+
all_groups do |g|
|
225
|
+
g.resources.membership = { leave: g.address }
|
226
|
+
end
|
227
|
+
end
|
208
228
|
end
|
209
229
|
end
|
210
230
|
end
|
data/lib/omf_ec/group.rb
CHANGED
@@ -22,12 +22,10 @@ module OmfEc
|
|
22
22
|
|
23
23
|
# @param [String] name name of the group
|
24
24
|
# @param [Hash] opts
|
25
|
-
# @option opts [Boolean] :unique Should the group be unique or not, default is true
|
26
25
|
def initialize(name, opts = {}, &block)
|
27
26
|
super()
|
28
|
-
@opts = {unique: true}.merge!(opts)
|
29
27
|
self.name = name
|
30
|
-
self.id =
|
28
|
+
self.id = "#{OmfEc.experiment.id}.#{self.name}"
|
31
29
|
# Add empty holders for members, network interfaces, and apps
|
32
30
|
self.net_ifs = []
|
33
31
|
self.members = {}
|
@@ -41,7 +39,7 @@ module OmfEc
|
|
41
39
|
|
42
40
|
def address(suffix = nil)
|
43
41
|
t_id = suffix ? "#{self.id}_#{suffix.to_s}" : self.id
|
44
|
-
OmfCommon.comm.
|
42
|
+
OmfCommon.comm.string_to_topic_address(t_id)
|
45
43
|
end
|
46
44
|
|
47
45
|
def associate_topic(topic)
|
@@ -70,6 +68,7 @@ module OmfEc
|
|
70
68
|
if (g = OmfEc.experiment.group(name))# resource to add is a group
|
71
69
|
@members.merge!(g.members)
|
72
70
|
else
|
71
|
+
OmfEc.experiment.nodes << name unless OmfEc.experiment.nodes.include?(name)
|
73
72
|
@members[name] = nil
|
74
73
|
end
|
75
74
|
end
|
data/test/omf_ec/group_spec.rb
CHANGED
@@ -17,20 +17,10 @@ describe OmfEc::Group do
|
|
17
17
|
OmfEc::Group.any_instance.unstub(:address)
|
18
18
|
end
|
19
19
|
|
20
|
-
describe "when initialised" do
|
21
|
-
it "must be generate unique id if :unique option is on" do
|
22
|
-
OmfEc::Group.new('bob').id.wont_equal 'bob'
|
23
|
-
end
|
24
|
-
|
25
|
-
it "must use name as id if :unique option is off" do
|
26
|
-
OmfEc::Group.new('bob', unique: false).id.must_equal 'bob'
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
20
|
describe "when used to represent group resource" do
|
31
21
|
before do
|
32
|
-
@group = OmfEc::Group.new('bob'
|
33
|
-
@g_b = OmfEc::Group.new('g_b'
|
22
|
+
@group = OmfEc::Group.new('bob')
|
23
|
+
@g_b = OmfEc::Group.new('g_b')
|
34
24
|
end
|
35
25
|
|
36
26
|
it "must init default context related variables" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: omf_ec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.8.pre.
|
4
|
+
version: 6.0.8.pre.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NICTA
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -42,42 +42,42 @@ dependencies:
|
|
42
42
|
name: simplecov
|
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: pry
|
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
|
70
70
|
name: mocha
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - '>='
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
@@ -86,40 +86,40 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - '='
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 6.0.8.pre.
|
89
|
+
version: 6.0.8.pre.3
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - '='
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 6.0.8.pre.
|
96
|
+
version: 6.0.8.pre.3
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: gli
|
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
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: sequel
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - '>='
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - '>='
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
description: Experiment controller of OMF, a generic framework for controlling and
|
@@ -181,12 +181,12 @@ require_paths:
|
|
181
181
|
- lib
|
182
182
|
required_ruby_version: !ruby/object:Gem::Requirement
|
183
183
|
requirements:
|
184
|
-
- -
|
184
|
+
- - '>='
|
185
185
|
- !ruby/object:Gem::Version
|
186
186
|
version: 1.9.3
|
187
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
188
188
|
requirements:
|
189
|
-
- -
|
189
|
+
- - '>'
|
190
190
|
- !ruby/object:Gem::Version
|
191
191
|
version: 1.3.1
|
192
192
|
requirements: []
|