omf_ec 6.0.3 → 6.0.4.pre.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MjRmMzAxMmI4ZWZmOWI2NjY1NDhlN2ZkMmM1ZGM5MGM0Y2JmMjNkZA==
5
+ data.tar.gz: !binary |-
6
+ OTYyYTQ5NzYxOTBiNWVjZDE2NmNmMDAwMmE1YzM0NjQ4MjUzOWYyMg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ NGJhYTg5OTJiMmM0YjFmMmExZjNkNjA0YjNkNGQ0ZjVhZjM5NjMyNzNjOWMz
10
+ ZmM0OThiZDhiODgxN2VlYzAwY2Y3ZTRmZTAwOTllYzgwYWNlMDU4MDY5MDE4
11
+ NjkzZmE0YmM5MDBkZmUwYTg1NGZlOTZkMmI1Y2MwOTQ0NjU3YmQ=
12
+ data.tar.gz: !binary |-
13
+ MDE2ZDQ0MWFkZjE3YmE0ZjFhMGE5YmNmYzNmOTAwZGY3OGIzOTI5M2E4MjJm
14
+ MzAxNTFkYTljNTczNGJjZDFjYWUyMjlmOGVjZDkxMjAzZDUyYWUzNDQzYzFk
15
+ OWUwOTJlNDliNDdhZGE3NGQ2YzUwZTE1YzRiZWQyNTg1MjZlNGY=
data/bin/omf_ec CHANGED
@@ -40,6 +40,10 @@ arg_name "directory"
40
40
  default_value "/tmp"
41
41
  flag [:log_file_dir]
42
42
 
43
+ desc "Logging config file"
44
+ arg_name "file"
45
+ flag [:log_config]
46
+
43
47
  # the path given here is relative to the user's home directory
44
48
  config_file(".config/omf_ec.yml")
45
49
 
@@ -59,7 +63,7 @@ command :exec do |c|
59
63
 
60
64
  c.action do |global_options, options, args|
61
65
  help_now! "Missing experiment script" if args[0].nil?
62
- help_now! "Experiment script not found" unless File.exist?(args[0])
66
+ help_now! "Experiment script not found" unless File.exist?(File.expand_path(args[0]))
63
67
 
64
68
  # User-provided command line values for Experiment Properties cannot be
65
69
  # set here as the propertties have not been defined yet by the experiment.
@@ -79,7 +83,7 @@ command :exec do |c|
79
83
  end
80
84
 
81
85
  # FIXME this loading script is way too simple
82
- load_exp(args[0], global_options, options, properties)
86
+ load_exp(File.expand_path(args[0]), global_options, options, properties)
83
87
  end
84
88
  end
85
89
 
@@ -231,26 +235,28 @@ def setup_logging(global_options = {})
231
235
  end
232
236
 
233
237
  unless global_options[:debug]
234
- Logging.consolidate 'OmfCommon', 'OmfEc', 'OmfRc'
238
+ Logging.consolidate 'OmfCommon', 'OmfRc'
235
239
  end
236
240
 
237
241
  # FIXME this should go to common setup
238
- if global_options[:log_file_dir] && File.exist?(global_options[:log_file_dir])
242
+ if global_options[:log_file_dir] && File.exist?(File.expand_path(global_options[:log_file_dir]))
239
243
  Logging.logger.root.add_appenders(
240
244
  Logging.appenders.file(
241
- "#{global_options[:log_file_dir]}/#{OmfEc.experiment.id}.log",
245
+ "#{File.expand_path(global_options[:log_file_dir])}/#{OmfEc.experiment.id}.log",
242
246
  :layout => Logging.layouts.pattern(:date_pattern => '%F %T %z',
243
247
  :pattern => '[%d] %-5l %c: %m\n')))
244
248
  end
249
+
250
+ OmfCommon.load_logging_config(global_options[:log_config])
245
251
  end
246
252
 
247
253
  def load_exp(exp_path, global_options = {} , options = {}, properties = {})
248
254
  begin
249
- if global_options[:cert] && File.exist?(global_options[:cert]) &&
250
- global_options[:key] && File.exist?(global_options[:key])
255
+ if global_options[:cert] && File.exist?(File.expand_path(global_options[:cert])) &&
256
+ global_options[:key] && File.exist?(File.expand_path(global_options[:key]))
251
257
 
252
- entity = OmfCommon::Auth::Certificate.create_from_x509(File.read(global_options[:cert]),
253
- File.read(global_options[:key]))
258
+ entity = OmfCommon::Auth::Certificate.create_from_x509(File.read(File.expand_path(global_options[:cert])),
259
+ File.read(File.expand_path(global_options[:key])))
254
260
  end
255
261
 
256
262
  opts = {
@@ -271,18 +277,22 @@ def load_exp(exp_path, global_options = {} , options = {}, properties = {})
271
277
  opts[:communication][:auth] = {} if entity
272
278
 
273
279
  OmfCommon.init(:development, opts) do |el|
280
+
274
281
  setup_logging(global_options)
275
282
 
276
283
  OmfCommon.comm.on_connected do |comm|
284
+ info "OMF Experiment Controller #{OmfEc::VERSION}"
277
285
  info "Connected using #{comm.conn_info}"
278
- info "Start experiment: #{OmfEc.experiment.id}"
286
+ info "Execute: #{exp_path}"
287
+ info "Properties: #{OmfEc.experiment.cmdline_properties}"
279
288
 
280
- OmfCommon::Auth::CertificateStore.instance.register_default_certs(global_options[:root_cert_dir]) if global_options[:root_cert_dir]
289
+ OmfCommon::Auth::CertificateStore.instance.register_default_certs(File.expand_path(global_options[:root_cert_dir])) if global_options[:root_cert_dir]
281
290
  OmfCommon::Auth::CertificateStore.instance.register(entity, OmfCommon.comm.local_address) if entity
282
291
 
283
292
  begin
284
293
  include OmfEc::Backward::DefaultEvents
285
294
  load exp_path
295
+ OmfEc::Experiment.start
286
296
  rescue => e
287
297
  error e.message
288
298
  error e.backtrace.join("\n")
@@ -11,19 +11,22 @@ module OmfEc
11
11
  def included(base)
12
12
  base.instance_eval do
13
13
 
14
- def_event :ALL_UP do |state|
14
+ def_event :ALL_NODES_UP do |state|
15
15
  all_groups? do |g|
16
- plan = g.members.uniq.sort
17
- actual = state.find_all { |v| v.joined?(g.id) }.map { |v| v[:address] }.sort
16
+ plan = g.members.values.uniq.sort
17
+ actual = state.find_all { |v| v.joined?(g.address) }.map { |v| v[:address] }.sort
18
18
 
19
- debug "Planned: #{g.name}(#{g.id}): #{plan}"
20
- debug "Actual: #{g.name}(#{g.id}): #{actual}"
19
+ debug "Planned: #{g.name}(#{g.address}): #{plan}"
20
+ debug "Actual: #{g.name}(#{g.address}): #{actual}"
21
21
 
22
- plan == actual
22
+ if plan.empty? && actual.empty?
23
+ warn "Group '#{g.name}' is empty"
24
+ end
25
+ plan.empty? ? true : plan == actual
23
26
  end
24
27
  end
25
28
 
26
- on_event :ALL_UP do
29
+ on_event :ALL_NODES_UP do
27
30
  all_groups do |group|
28
31
  # Deal with brilliant net.w0.ip syntax...
29
32
  group.net_ifs && group.net_ifs.each do |nif|
@@ -49,26 +52,37 @@ module OmfEc
49
52
  end
50
53
  end
51
54
 
55
+ def_event :ALL_UP do |state|
56
+ all_groups? do |g|
57
+ app_plan = g.app_contexts.size * g.members.values.uniq.size
58
+ app_actual = state.count { |v| v.joined?(g.address("application")) }
59
+ if_plan = g.net_ifs.map { |v| v.conf[:if_name] }.uniq.size * g.members.values.uniq.size
60
+ if_actual = state.count { |v| v.joined?(g.address("wlan"), g.address("net")) }
61
+
62
+ if_plan == if_actual && app_plan == app_actual
63
+ end
64
+ end
65
+
52
66
  def_event :ALL_INTERFACE_UP do |state|
53
67
  all_groups? do |g|
54
- plan = g.net_ifs.map { |v| v.conf[:if_name] }.uniq.size * g.members.uniq.size
55
- actual = state.count { |v| v.joined?("#{g.id}_wlan", "#{g.id}_net") }
68
+ plan = g.net_ifs.map { |v| v.conf[:if_name] }.uniq.size * g.members.values.uniq.size
69
+ actual = state.count { |v| v.joined?(g.address("wlan"), g.address("net")) }
56
70
  plan == actual
57
71
  end
58
72
  end
59
73
 
60
74
  def_event :ALL_UP_AND_INSTALLED do |state|
61
75
  all_groups? do |g|
62
- plan = g.app_contexts.size * g.members.uniq.size
63
- actual = state.count { |v| v.joined?("#{g.id}_application") }
76
+ plan = g.app_contexts.size * g.members.values.uniq.size
77
+ actual = state.count { |v| v.joined?(g.address("application")) }
64
78
  plan == actual
65
79
  end
66
80
  end
67
81
 
68
82
  def_event :ALL_APPS_DONE do |state|
69
83
  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' }
84
+ plan = (g.execs.size + g.app_contexts.size) * g.members.values.uniq.size
85
+ actual = state.count { |v| v.joined?(g.address("application")) && v[:event] == 'EXIT' }
72
86
  plan == 0 ? false : plan == actual
73
87
  end
74
88
  end
@@ -76,7 +90,6 @@ module OmfEc
76
90
  end
77
91
  end
78
92
  end
79
-
80
93
  end
81
94
  end
82
95
  end
@@ -23,9 +23,9 @@ def create_app(testbed)
23
23
  end
24
24
  end
25
25
  when 'WARN'
26
- warn m[:reason]
26
+ warn m[:reason], m.src
27
27
  when 'ERROR'
28
- error m[:reason]
28
+ error m[:reason], m.src
29
29
  end
30
30
  end
31
31
  end
@@ -25,10 +25,10 @@ module OmfEc
25
25
  e_uid = SecureRandom.uuid
26
26
  e_name = "#{self.name}_application_#{name}_created_#{e_uid}"
27
27
 
28
- resource_group_name = "#{self.id}_application"
28
+ resource_group_name = self.address("application")
29
29
 
30
30
  def_event e_name do |state|
31
- state.find_all { |v| v[:hrn] == name && v[:membership] && v[:membership].include?(resource_group_name)}.size >= self.members.uniq.size
31
+ state.find_all { |v| v[:hrn] == name && v[:membership] && v[:membership].include?(resource_group_name)}.size >= self.members.values.sort.uniq.size
32
32
  end
33
33
 
34
34
  on_event e_name do
@@ -65,6 +65,16 @@ module OmfEc::Context
65
65
  topic = self.group.topic
66
66
  end
67
67
 
68
+ if topic.nil?
69
+ if self.guard[:type]
70
+ warn "Group '#{self.group.name}' has NO resources of type '#{self.guard[:type]}' ready. Could not send message."
71
+ else
72
+ warn "Group topic '#{self.group.name}' NOT subscribed. Could not send message."
73
+ end
74
+ return
75
+ end
76
+
77
+
68
78
  case self.operation
69
79
  when :configure
70
80
  topic.configure({ name => value }, { guard: self.guard })
@@ -79,7 +79,7 @@ module OmfEc
79
79
  unless planned_groups.empty?
80
80
  OmfEc.subscribe_and_monitor(name) do |res|
81
81
  info "Config #{name} to join #{planned_groups.map(&:name).join(', ')}"
82
- res.configure(membership: planned_groups.map(&:id).join(', '))
82
+ res.configure(membership: planned_groups.map(&:address).join(', '))
83
83
  end
84
84
  end
85
85
  end
@@ -91,7 +91,7 @@ module OmfEc
91
91
  # Find all groups a given resource belongs to
92
92
  #
93
93
  def groups_by_res(res_addr)
94
- groups.find_all { |g| g.members.include?(res_addr) }
94
+ groups.find_all { |g| g.members.values.include?(res_addr) }
95
95
  end
96
96
 
97
97
  def sub_group(name)
@@ -164,22 +164,38 @@ module OmfEc
164
164
  class << self
165
165
  # Disconnect communicator, try to delete any XMPP affiliations
166
166
  def done
167
- info "Exit in up to 15 seconds..."
168
-
169
- OmfCommon.eventloop.after(10) do
170
- info "Release applications and network interfaces"
167
+ info "Experiment: #{OmfEc.experiment.id} finished"
168
+ info "Release applications and network interfaces"
169
+ info "Exit in 15 seconds..."
171
170
 
171
+ OmfCommon.el.after(10) do
172
172
  allGroups do |g|
173
- g.resources[type: 'application'].release
173
+ g.resources[type: 'application'].release unless g.app_contexts.empty?
174
174
  g.resources[type: 'net'].release unless g.net_ifs.find_all { |v| v.conf[:type] == 'net' }.empty?
175
175
  g.resources[type: 'wlan'].release unless g.net_ifs.find_all { |v| v.conf[:type] == 'wlan' }.empty?
176
176
  end
177
177
 
178
- OmfCommon.eventloop.after(5) do
178
+ OmfCommon.el.after(5) do
179
179
  OmfCommon.comm.disconnect
180
180
  end
181
181
  end
182
182
  end
183
+
184
+ def start
185
+ info "Experiment: #{OmfEc.experiment.id} starts"
186
+
187
+ allGroups do |g|
188
+ g.members.each do |key, value|
189
+ OmfEc.subscribe_and_monitor(key) do |res|
190
+ info "Configure '#{key}' to join '#{g.name}'"
191
+ g.synchronize do
192
+ g.members[key] = res.address
193
+ end
194
+ res.configure(membership: g.address)
195
+ end
196
+ end
197
+ end
198
+ end
183
199
  end
184
200
  end
185
201
  end
data/lib/omf_ec/group.rb CHANGED
@@ -30,7 +30,7 @@ module OmfEc
30
30
  self.id = @opts[:unique] ? SecureRandom.uuid : self.name
31
31
  # Add empty holders for members, network interfaces, and apps
32
32
  self.net_ifs = []
33
- self.members = []
33
+ self.members = {}
34
34
  self.app_contexts = []
35
35
  self.execs = []
36
36
 
@@ -39,6 +39,11 @@ module OmfEc
39
39
  OmfEc.subscribe_and_monitor(id, self, &block)
40
40
  end
41
41
 
42
+ def address(suffix = nil)
43
+ t_id = suffix ? "#{self.id}_#{suffix.to_s}" : self.id
44
+ "#{OmfCommon.comm.conn_info[:proto]}://#{t_id}@#{OmfCommon.comm.conn_info[:domain]}"
45
+ end
46
+
42
47
  def associate_topic(topic)
43
48
  self.synchronize do
44
49
  @topic = topic
@@ -59,24 +64,19 @@ module OmfEc
59
64
  #
60
65
  # Resources to be added could be a list of resources, groups, or the mixture of both.
61
66
  def add_resource(*names)
62
- self.synchronize do
67
+ synchronize do
63
68
  # Recording membership first, used for ALL_UP event
64
69
  names.each do |name|
65
- g = OmfEc.experiment.group(name)
66
- if g # resource to add is a group
67
- @members += g.members
68
- self.add_resource(*g.members.uniq)
70
+ if (g = OmfEc.experiment.group(name))# resource to add is a group
71
+ @members.merge!(g.members)
69
72
  else
70
- OmfEc.subscribe_and_monitor(name) do |res|
71
- @members << res.address
72
- info "Config #{name} to join #{self.name}"
73
- res.configure(membership: self.id)
74
- end
73
+ @members[name] = nil
75
74
  end
76
75
  end
77
76
  end
78
77
  end
79
78
 
79
+
80
80
  # Create a set of new resources and add them to the group
81
81
  #
82
82
  # @param [String] name
@@ -93,7 +93,8 @@ module OmfEc
93
93
  end
94
94
 
95
95
  # Naming convention of child resource group
96
- resource_group_name = "#{self.id}_#{opts[:type].to_s}"
96
+ #resource_group_name = "#{self.id}_#{opts[:type].to_s}"
97
+ resource_group_name = self.address(opts[:type])
97
98
 
98
99
  OmfEc.subscribe_and_monitor(resource_group_name) do |res_group|
99
100
  associate_resource_topic(opts[:type].to_s, res_group)
@@ -4,5 +4,5 @@
4
4
  # By downloading or using this software you accept the terms and the liability disclaimer in the License.
5
5
 
6
6
  module OmfEc
7
- VERSION = "6.0.3"
7
+ VERSION = "6.0.4.pre.1"
8
8
  end
data/lib/omf_ec.rb CHANGED
@@ -38,25 +38,25 @@ module OmfEc
38
38
  topic.on_inform do |msg|
39
39
  case msg.itype
40
40
  when 'CREATION.FAILED'
41
- warn "RC reports creation.failed: '#{msg[:reason]}'"
42
- debug msg
41
+ warn "RC reports creation.failed: '#{msg[:reason]}'", msg.src
42
+ debug msg, msg.src
43
43
  when 'ERROR'
44
- warn "RC reports error: '#{msg[:reason]}'"
45
- debug msg
44
+ warn "RC reports error: '#{msg[:reason]}'", msg.src
45
+ debug msg, msg.src
46
46
  when 'WARN'
47
- warn "RC reports warning: '#{msg[:reason]}'"
48
- debug msg
47
+ warn "RC reports warning: '#{msg[:reason]}'", msg.src
48
+ debug msg, msg.src
49
49
  when 'CREATION.OK'
50
+ debug "Resource #{msg[:res_id]} #{msg.resource.address} created"
50
51
  debug "Received CREATION.OK via #{topic.id}"
51
- info "Resource #{msg[:res_id]} #{msg.resource.address} created"
52
+ debug msg, msg.src
52
53
 
53
54
  OmfEc.experiment.add_or_update_resource_state(msg.resource.address, msg.properties)
54
-
55
55
  OmfEc.experiment.process_events
56
56
  when 'STATUS'
57
57
  props = []
58
58
  msg.each_property { |k, v| props << "#{k}: #{v}" }
59
- debug "#{topic.id} >> inform: #{props.join(", ")}"
59
+ debug "Received INFORM via #{topic.id} >> #{props.join(", ")}", msg.src
60
60
 
61
61
  if msg[:status_type] == 'APP_EVENT'
62
62
  info "APP_EVENT #{msg[:event]} from app #{msg[:app]} - msg: #{msg[:msg]}"
@@ -76,7 +76,7 @@ module OmfEc
76
76
  if topic.error?
77
77
  error "Failed to subscribe #{topic_id}"
78
78
  else
79
- info "Subscribed to #{topic_id}"
79
+ debug "Subscribed to #{topic_id}"
80
80
  context_obj.associate_topic(topic) if context_obj
81
81
  block.call(context_obj || topic) if block
82
82
  register_default_callback(topic)
data/omf_ec.gemspec CHANGED
@@ -27,6 +27,6 @@ Gem::Specification.new do |s|
27
27
  s.add_development_dependency "pry"
28
28
  s.add_development_dependency "mocha"
29
29
 
30
- s.add_runtime_dependency "omf_common", "~> 6.0.2"
30
+ s.add_runtime_dependency "omf_common", "~> 6.0.4.pre.1"
31
31
  s.add_runtime_dependency "gli", "~> 2.5.3"
32
32
  end
@@ -9,10 +9,12 @@ require 'omf_ec/group'
9
9
  describe OmfEc::Group do
10
10
  before do
11
11
  OmfEc.stubs(:subscribe_and_monitor)
12
+ OmfEc::Group.any_instance.stubs(:address).returns("xmpp://g@bob.com")
12
13
  end
13
14
 
14
15
  after do
15
16
  OmfEc.unstub(:subscribe_and_monitor)
17
+ OmfEc::Group.any_instance.unstub(:address)
16
18
  end
17
19
 
18
20
  describe "when initialised" do
@@ -31,10 +33,10 @@ describe OmfEc::Group do
31
33
  @g_b = OmfEc::Group.new('g_b', unique: false)
32
34
  end
33
35
 
34
- it "must init default context related arrasy" do
35
- @group.net_ifs.must_equal []
36
- @group.members.must_equal []
37
- @group.app_contexts.must_equal []
36
+ it "must init default context related variables" do
37
+ @group.net_ifs.must_equal([])
38
+ @group.members.must_equal({})
39
+ @group.app_contexts.must_equal([])
38
40
  end
39
41
 
40
42
  it "must be capable of adding existing resources to group" do
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omf_ec
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.3
5
- prerelease:
4
+ version: 6.0.4.pre.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - NICTA
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-06-26 00:00:00.000000000 Z
11
+ date: 2013-08-29 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: minitest
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: em-minitest-spec
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: simplecov
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ! '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ! '>='
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: pry
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ! '>='
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ! '>='
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: mocha
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ! '>='
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ! '>='
92
81
  - !ruby/object:Gem::Version
@@ -94,23 +83,20 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: omf_common
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ~>
100
88
  - !ruby/object:Gem::Version
101
- version: 6.0.2
89
+ version: 6.0.4.pre.1
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ~>
108
95
  - !ruby/object:Gem::Version
109
- version: 6.0.2
96
+ version: 6.0.4.pre.1
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: gli
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - ~>
116
102
  - !ruby/object:Gem::Version
@@ -118,7 +104,6 @@ dependencies:
118
104
  type: :runtime
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - ~>
124
109
  - !ruby/object:Gem::Version
@@ -173,29 +158,25 @@ files:
173
158
  homepage: http://omf.mytestbed.net
174
159
  licenses:
175
160
  - MIT
161
+ metadata: {}
176
162
  post_install_message:
177
163
  rdoc_options: []
178
164
  require_paths:
179
165
  - lib
180
166
  required_ruby_version: !ruby/object:Gem::Requirement
181
- none: false
182
167
  requirements:
183
168
  - - ! '>='
184
169
  - !ruby/object:Gem::Version
185
170
  version: 1.9.3
186
171
  required_rubygems_version: !ruby/object:Gem::Requirement
187
- none: false
188
172
  requirements:
189
- - - ! '>='
173
+ - - ! '>'
190
174
  - !ruby/object:Gem::Version
191
- version: '0'
192
- segments:
193
- - 0
194
- hash: -4558190109347079441
175
+ version: 1.3.1
195
176
  requirements: []
196
177
  rubyforge_project: omf_ec
197
- rubygems_version: 1.8.25
178
+ rubygems_version: 2.0.7
198
179
  signing_key:
199
- specification_version: 3
180
+ specification_version: 4
200
181
  summary: OMF experiment controller
201
182
  test_files: []