omf_ec 6.0.8.pre.2 → 6.0.8.pre.3

Sign up to get free protection for your applications and to get access to all the features.
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: []