omf_ec 6.0.3 → 6.0.4.pre.1

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 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: []