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 CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MWEyOGNkMWYxODcyY2Q0MDUxN2QxYWNhMWMyZTYyNWNiMzdlZGYzOA==
5
- data.tar.gz: !binary |-
6
- NWQ4MzQ5NjY2MWYxNGVjZTMzZWFmNzliY2ViNjAzMmYwMzlkZWRkZA==
7
- !binary "U0hBNTEy":
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
- def_event :ALL_NODES_UP do |state|
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
- on_event :ALL_NODES_UP do
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 :ALL_UP do |state|
57
- all_groups? do |g|
58
- app_plan = g.app_contexts.size * g.members.values.uniq.size
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
- if_plan == if_actual && app_plan == app_actual
64
- end
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
- all_groups? do |g|
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
- all_groups? do |g|
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] ||= []
@@ -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).join(', '))
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
- info "Event triggered: '#{event[:name]}'"
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 = @opts[:unique] ? SecureRandom.uuid : self.name
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.string_to_address(t_id)
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
@@ -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', unique: false)
33
- @g_b = OmfEc::Group.new('g_b', unique: false)
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.2
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-25 00:00:00.000000000 Z
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.2
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.2
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: []