furnish 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,6 @@
1
1
  require 'helper'
2
2
 
3
+ # NOTE the dummy classes in this file are defined in test/dummy_classes.rb
3
4
  class TestProvisionerGroup < Furnish::TestCase
4
5
  def test_constructor
5
6
  dummy = Dummy.new
@@ -8,22 +9,24 @@ class TestProvisionerGroup < Furnish::TestCase
8
9
  assert_equal('blarg', pg.name)
9
10
  assert_kind_of(Set, pg.dependencies)
10
11
  assert_empty(pg.dependencies)
11
- assert_equal('blarg', dummy.name)
12
+ assert_equal('blarg', dummy.furnish_group_name)
12
13
 
13
14
  dummy = Dummy.new
14
15
  pg = Furnish::ProvisionerGroup.new([dummy], 'blarg2', %w[blarg])
15
16
  assert_includes(pg, dummy)
16
17
  assert_equal('blarg2', pg.name)
17
18
  assert_equal(Set['blarg'], pg.dependencies)
18
- assert_equal('blarg2', dummy.name)
19
+ assert_equal('blarg2', dummy.furnish_group_name)
20
+
21
+ assert_raises(ArgumentError, "A non-empty list of provisioners must be provided") { Furnish::ProvisionerGroup.new([], 'blarg3') }
22
+ assert_raises(ArgumentError, "A non-empty list of provisioners must be provided") { Furnish::ProvisionerGroup.new(nil, 'blarg3') }
19
23
  end
20
24
 
21
25
  def test_up_down
22
- if ENV["FURNISH_DEBUG"]
23
- $stderr.puts "Testing logging, output muted"
24
- require 'stringio'
25
- Furnish.logger = Furnish::Logger.new(StringIO.new, 3)
26
- end
26
+ Furnish.logger.puts "Testing logging, output muted"
27
+
28
+ require 'stringio'
29
+ Furnish.logger = Furnish::Logger.new(StringIO.new, 3)
27
30
 
28
31
  store = Palsy::Object.new('dummy')
29
32
  dummy = Dummy.new
@@ -31,27 +34,176 @@ class TestProvisionerGroup < Furnish::TestCase
31
34
 
32
35
  assert(pg.startup, 'started')
33
36
  assert(store[ [pg.name, 'startup'].join("-") ], 'startup ran')
37
+ assert_nil(pg.group_state['index'])
38
+ assert_nil(pg.group_state['provisioner_args'])
39
+ assert_nil(pg.group_state['action'])
40
+ assert_nil(pg.group_state['provisioner'])
41
+
34
42
  assert(pg.shutdown, 'stopped')
35
43
  assert(store[ [pg.name, 'startup'].join("-") ], 'shutdown ran')
44
+ assert_nil(pg.group_state['index'])
45
+ assert_nil(pg.group_state['provisioner_args'])
46
+ assert_nil(pg.group_state['action'])
47
+ assert_nil(pg.group_state['provisioner'])
48
+
49
+ pg = Furnish::ProvisionerGroup.new([Dummy.new, StartFailDummy.new], 'track_test')
50
+ assert_raises(RuntimeError, "Could not provision #{pg.name} with provisioner #{dummy.class.name}") { pg.startup }
51
+ assert_equal(1, pg.group_state['index'])
52
+ assert_equal(:startup, pg.group_state['action'])
53
+ assert_equal(StartFailDummy, pg.group_state['provisioner'].class)
54
+ assert_equal({}, pg.group_state['provisioner_args'])
55
+
56
+ pg = Furnish::ProvisionerGroup.new([Dummy.new, StartExceptionDummy.new], 'track_test')
57
+ assert_raises(RuntimeError, "Could not provision #{pg.name} with provisioner #{dummy.class.name}") { pg.startup }
58
+ assert_equal(1, pg.group_state['index'])
59
+ assert_equal(:startup, pg.group_state['action'])
60
+ assert_equal(StartExceptionDummy, pg.group_state['provisioner'].class)
61
+ assert_equal({}, pg.group_state['provisioner_args'])
62
+
63
+ pg = Furnish::ProvisionerGroup.new([StopFailDummy.new, Dummy.new], 'track_test')
64
+ assert_raises(RuntimeError, "Could not deprovision #{pg.name}/#{dummy.class.name}") { pg.shutdown }
65
+ assert_equal(1, pg.group_state['index'])
66
+ assert_equal(:shutdown, pg.group_state['action'])
67
+ assert_equal(StopFailDummy, pg.group_state['provisioner'].class)
68
+
69
+ pg = Furnish::ProvisionerGroup.new([StopExceptionDummy.new, Dummy.new], 'track_test')
70
+ assert_raises(RuntimeError, "Could not deprovision #{pg.name}/#{dummy.class.name}") { pg.shutdown }
71
+ assert_equal(1, pg.group_state['index'])
72
+ assert_equal(:shutdown, pg.group_state['action'])
73
+ assert_equal(StopExceptionDummy, pg.group_state['provisioner'].class)
36
74
 
37
75
  dummy = StartFailDummy.new
38
- pg = Furnish::ProvisionerGroup.new(dummy, 'blarg2')
76
+ pg = Furnish::ProvisionerGroup.new([ReturnsDataDummy.new, dummy], 'blarg2')
39
77
  assert_raises(RuntimeError, "Could not provision #{pg.name} with provisioner #{dummy.class.name}") { pg.startup }
78
+ assert_equal(1, pg.group_state['index'])
79
+ assert_equal(:startup, pg.group_state['action'])
80
+ assert_equal(dummy.class, pg.group_state['provisioner'].class)
81
+ assert_equal({:started => 1}, pg.group_state['provisioner_args'])
40
82
 
41
83
  dummy = StopFailDummy.new
42
84
  pg = Furnish::ProvisionerGroup.new(dummy, 'blarg3')
43
85
  assert_raises(RuntimeError, "Could not deprovision #{pg.name}/#{dummy.class.name}") { pg.shutdown }
44
- pg.shutdown(true)
86
+ assert_equal(0, pg.group_state['index'])
87
+ assert_equal(:shutdown, pg.group_state['action'])
88
+ assert_equal(dummy.class, pg.group_state['provisioner'].class)
89
+ pg.shutdown({ }, true)
90
+ assert_nil(pg.group_state['index'])
91
+ assert_nil(pg.group_state['provisioner_args'])
92
+ assert_nil(pg.group_state['action'])
93
+ assert_nil(pg.group_state['provisioner'])
45
94
 
46
95
  dummy = StartExceptionDummy.new
47
96
  pg = Furnish::ProvisionerGroup.new(dummy, 'blarg4')
48
97
  assert_raises(RuntimeError, "Could not provision #{pg.name} with provisioner #{dummy.class.name}") { pg.startup }
98
+ assert_equal(:startup, pg.group_state['action'])
99
+ assert_equal(dummy.class, pg.group_state['provisioner'].class)
49
100
 
50
101
  dummy = StopExceptionDummy.new
51
102
  pg = Furnish::ProvisionerGroup.new(dummy, 'blarg4')
52
103
  assert_raises(RuntimeError, "Could not deprovision #{pg.name}/#{dummy.class.name}") { pg.shutdown }
53
- pg.shutdown(true)
104
+ assert_equal(0, pg.group_state['index'])
105
+ assert_equal(:shutdown, pg.group_state['action'])
106
+ assert_equal(dummy.class, pg.group_state['provisioner'].class)
107
+ pg.shutdown({ }, true)
108
+ assert_nil(pg.group_state['index'])
109
+ assert_nil(pg.group_state['provisioner_args'])
110
+ assert_nil(pg.group_state['action'])
111
+ assert_nil(pg.group_state['provisioner'])
54
112
  sleep 0.1 # wait for flush
55
- assert_match(%r!Deprovision #{dummy.class.name}/#{pg.name} had errors:!, Furnish.logger.string)
113
+ assert_includes(Furnish.logger.string.split(/\n/), "Deprovision of #{pg.name}[#{dummy.class.name}] had errors:")
114
+ end
115
+
116
+ def test_recover
117
+ [ RecoverableDummy, RaisingRecoverableDummy ].each do |prov|
118
+ pg = Furnish::ProvisionerGroup.new(prov.new, "#{prov.name}-recover1")
119
+ assert_raises(RuntimeError) { pg.startup }
120
+ assert_equal(0, pg.group_state['index'])
121
+ assert_equal(:startup, pg.group_state['action'])
122
+ assert_equal(prov, pg.group_state['provisioner'].class)
123
+ assert_equal({ }, pg.group_state['provisioner_args'])
124
+ assert(pg.recover)
125
+ assert_nil(pg.group_state['index'])
126
+ assert_nil(pg.group_state['provisioner_args'])
127
+ assert_nil(pg.group_state['action'])
128
+ assert_nil(pg.group_state['provisioner'])
129
+ assert(pg.first.run_state[:startup])
130
+
131
+ pg = Furnish::ProvisionerGroup.new(prov.new, "#{prov.name}-recover2")
132
+ assert_raises(RuntimeError) { pg.shutdown }
133
+ assert_equal(0, pg.group_state['index'])
134
+ assert_equal(:shutdown, pg.group_state['action'])
135
+ assert_equal(prov, pg.group_state['provisioner'].class)
136
+ assert_equal({ }, pg.group_state['provisioner_args'])
137
+ assert(pg.recover)
138
+ assert_nil(pg.group_state['index'])
139
+ assert_nil(pg.group_state['provisioner_args'])
140
+ assert_nil(pg.group_state['action'])
141
+ assert_nil(pg.group_state['provisioner'])
142
+ assert(pg.first.run_state[:shutdown])
143
+
144
+ pg = Furnish::ProvisionerGroup.new([Dummy.new, prov.new], "#{prov.name}-recover3")
145
+ assert_raises(RuntimeError) { pg.startup }
146
+ assert_equal(1, pg.group_state['index'])
147
+ assert_equal(:startup, pg.group_state['action'])
148
+ assert_equal(prov, pg.group_state['provisioner'].class)
149
+ assert(pg.group_state['provisioner_args'])
150
+ assert(pg.first.run_state[:startup])
151
+ refute(pg.last.run_state[:startup])
152
+ assert(pg.recover)
153
+ assert_nil(pg.group_state['index'])
154
+ assert_nil(pg.group_state['provisioner_args'])
155
+ assert_nil(pg.group_state['action'])
156
+ assert_nil(pg.group_state['provisioner'])
157
+ assert(pg.last.run_state[:startup])
158
+
159
+ pg = Furnish::ProvisionerGroup.new([Dummy.new, prov.new], "#{prov.name}-recover4")
160
+ assert_raises(RuntimeError) { pg.shutdown }
161
+ assert_equal(0, pg.group_state['index'])
162
+ assert_equal(:shutdown, pg.group_state['action'])
163
+ assert_equal(prov, pg.group_state['provisioner'].class)
164
+ assert_equal({ }, pg.group_state['provisioner_args'])
165
+ refute(pg.first.run_state[:shutdown])
166
+ refute(pg.last.run_state[:shutdown])
167
+ assert(pg.recover)
168
+ assert_nil(pg.group_state['index'])
169
+ assert_nil(pg.group_state['provisioner_args'])
170
+ assert_nil(pg.group_state['action'])
171
+ assert_nil(pg.group_state['provisioner'])
172
+
173
+ assert(pg.first.run_state[:shutdown])
174
+ assert(pg.last.run_state[:shutdown])
175
+
176
+ pg = Furnish::ProvisionerGroup.new([prov.new, Dummy.new], "#{prov.name}-recover5")
177
+ assert_raises(RuntimeError) { pg.startup }
178
+ assert_equal(0, pg.group_state['index'])
179
+ assert_equal(:startup, pg.group_state['action'])
180
+ assert_equal(prov, pg.group_state['provisioner'].class)
181
+ assert_equal({ }, pg.group_state['provisioner_args'])
182
+ refute(pg.first.run_state[:startup])
183
+ refute(pg.last.run_state[:startup])
184
+ assert(pg.recover)
185
+ assert_nil(pg.group_state['index'])
186
+ assert_nil(pg.group_state['provisioner_args'])
187
+ assert_nil(pg.group_state['action'])
188
+ assert_nil(pg.group_state['provisioner'])
189
+ assert_equal({ :startup => true }, pg.first.run_state[:startup])
190
+ assert(pg.last.run_state[:startup])
191
+
192
+ pg = Furnish::ProvisionerGroup.new([prov.new, Dummy.new], "#{prov.name}-recover6")
193
+ assert_raises(RuntimeError) { pg.shutdown }
194
+ assert_equal(1, pg.group_state['index'])
195
+ assert_equal(:shutdown, pg.group_state['action'])
196
+ assert_equal(prov, pg.group_state['provisioner'].class)
197
+ assert_equal({ }, pg.group_state['provisioner_args'])
198
+ refute(pg.first.run_state[:shutdown])
199
+ assert(pg.last.run_state[:shutdown])
200
+ assert(pg.recover)
201
+ assert_nil(pg.group_state['index'])
202
+ assert_nil(pg.group_state['provisioner_args'])
203
+ assert_nil(pg.group_state['action'])
204
+ assert_nil(pg.group_state['provisioner'])
205
+ assert_equal({ :shutdown => true }, pg.first.run_state[:shutdown])
206
+ assert(pg.last.run_state[:shutdown])
207
+ end
56
208
  end
57
209
  end
@@ -2,14 +2,12 @@ require 'helper'
2
2
 
3
3
  class TestSchedulerBasic < Furnish::SchedulerTestCase
4
4
  def test_schedule_provision
5
- sched = Furnish::Scheduler.new
6
-
7
5
  assert(sched.schedule_provision('blarg', [Dummy.new]), 'we can schedule')
8
6
  assert_includes(sched.vm.waiters.keys, 'blarg', 'exists in the waiters')
9
7
  assert_includes(sched.vm.groups.keys, 'blarg', 'exists in the vm group set')
10
8
  assert_equal(1, sched.vm.groups['blarg'].count, 'one item array')
11
9
  assert_kind_of(Furnish::Provisioner::Dummy, sched.vm.groups['blarg'].first, 'first object is our dummy object')
12
- assert_equal('blarg', sched.vm.groups['blarg'].first.name, 'name is set properly')
10
+ assert_equal('blarg', sched.vm.groups['blarg'].first.furnish_group_name, 'name is set properly')
13
11
  assert_nil(sched.schedule_provision('blarg', [Dummy.new]), 'does not schedule twice')
14
12
 
15
13
  assert(sched.schedule_provision('blarg2', Dummy.new), 'scheduling does not need an array')
@@ -17,7 +15,7 @@ class TestSchedulerBasic < Furnish::SchedulerTestCase
17
15
  assert_includes(sched.vm.groups.keys, 'blarg2', 'exists in the vm group set')
18
16
  assert_kind_of(Furnish::ProvisionerGroup, sched.vm.groups['blarg2'], 'boxes our single item')
19
17
  assert_kind_of(Furnish::Provisioner::Dummy, sched.vm.groups['blarg2'].first, 'first object is our dummy object')
20
- assert_equal('blarg2', sched.vm.groups['blarg2'].first.name, 'name is set properly')
18
+ assert_equal('blarg2', sched.vm.groups['blarg2'].first.furnish_group_name, 'name is set properly')
21
19
 
22
20
  assert_raises(
23
21
  RuntimeError,
@@ -30,4 +28,59 @@ class TestSchedulerBasic < Furnish::SchedulerTestCase
30
28
  assert_includes(sched.vm.waiters.keys, 'blarg4', 'included in waiters list')
31
29
  assert_includes(sched.vm.dependencies['blarg4'], 'blarg2', 'dependencies are tracked for provision')
32
30
  end
31
+
32
+ def test_protocol
33
+ # NOTE these classes are in test/dummy_classes.rb
34
+ assert(sched.schedule_provision('blarg', [YieldsIntegerBarDummy.new, AcceptsIntegerBarDummy.new]))
35
+ assert(sched.schedule_provision('blarg1', [YieldsIntegerBarDummy.new, RequiresBarDummy.new]))
36
+ assert(sched.schedule_provision('blarg2', [YieldsStringBarDummy.new, AcceptsStringBarDummy.new]))
37
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg3', [YieldsStringBarDummy.new, RequiresBarDummy.new]) }
38
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg4', [YieldsStringBarDummy.new, AcceptsIntegerBarDummy.new]) }
39
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg5', [YieldsFooDummy.new, AcceptsIntegerBarDummy.new]) }
40
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg6', [YieldsFooDummy.new, RequiresBarDummy.new]) }
41
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg7', [YieldsIntegerBarDummy.new, AcceptsFooDummy.new]) }
42
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg8', [YieldsStringBarDummy.new, AcceptsFooDummy.new]) }
43
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg9', [YieldsIntegerBarDummy.new, RequiresBarAcceptsFooDummy.new]) }
44
+ assert(sched.schedule_provision('blarg10', [YieldsFooBarDummy.new, RequiresBarAcceptsFooDummy.new]))
45
+ assert(sched.schedule_provision('blarg11', [YieldsFooBarDummy.new, AcceptsFooDummy.new]))
46
+ assert(sched.schedule_provision('blarg12', [YieldsFooBarDummy.new, AcceptsIntegerBarDummy.new]))
47
+ assert(sched.schedule_provision('blarg13', [YieldsFooDummy.new, AcceptsFooDummy.new]))
48
+ assert(sched.schedule_provision('blarg14', [YieldsFooBarDummy.new, RequiresBarDummy.new]))
49
+ assert(sched.schedule_provision('blarg15', [YieldsIntegerBarDummy.new, YieldsFooDummy.new, RequiresBarAcceptsFooDummy.new]))
50
+
51
+ assert(sched.schedule_provision('blarg-shutdown', [ShutdownAcceptsIntegerBarDummy.new, ShutdownYieldsIntegerBarDummy.new]))
52
+ assert(sched.schedule_provision('blarg1-shutdown', [ShutdownRequiresBarDummy.new, ShutdownYieldsIntegerBarDummy.new]))
53
+ assert(sched.schedule_provision('blarg2-shutdown', [ShutdownAcceptsStringBarDummy.new, ShutdownYieldsStringBarDummy.new]))
54
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg3-shutdown', [ShutdownRequiresBarDummy.new, ShutdownYieldsStringBarDummy.new] ) }
55
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg4-shutdown', [ShutdownAcceptsIntegerBarDummy.new, ShutdownYieldsStringBarDummy.new]) }
56
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg5-shutdown', [ShutdownAcceptsIntegerBarDummy.new, ShutdownYieldsFooDummy.new]) }
57
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg6-shutdown', [ShutdownRequiresBarDummy.new, ShutdownYieldsFooDummy.new]) }
58
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg7-shutdown', [ShutdownAcceptsFooDummy.new, ShutdownYieldsIntegerBarDummy.new]) }
59
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg8-shutdown', [ShutdownAcceptsFooDummy.new, ShutdownYieldsStringBarDummy.new]) }
60
+ assert_raises(ArgumentError) { sched.schedule_provision('blarg9-shutdown', [ShutdownRequiresBarAcceptsFooDummy.new, ShutdownYieldsIntegerBarDummy.new]) }
61
+ assert(sched.schedule_provision('blarg10-shutdown', [ShutdownRequiresBarAcceptsFooDummy.new, ShutdownYieldsFooBarDummy.new]))
62
+ assert(sched.schedule_provision('blarg11-shutdown', [ShutdownAcceptsFooDummy.new, ShutdownYieldsFooBarDummy.new]))
63
+ assert(sched.schedule_provision('blarg12-shutdown', [ShutdownAcceptsIntegerBarDummy.new, ShutdownYieldsFooBarDummy.new]))
64
+ assert(sched.schedule_provision('blarg13-shutdown', [ShutdownAcceptsFooDummy.new, ShutdownYieldsFooDummy.new]))
65
+ assert(sched.schedule_provision('blarg14-shutdown', [ShutdownRequiresBarDummy.new, ShutdownYieldsFooBarDummy.new]))
66
+ assert(sched.schedule_provision('blarg15-shutdown', [ShutdownRequiresBarAcceptsFooDummy.new, ShutdownYieldsFooDummy.new, ShutdownYieldsIntegerBarDummy.new]))
67
+ end
68
+
69
+ def test_cascade_protocol
70
+ assert(sched.schedule_provision('blarg-cascade1', [ReturnsInfoDummy.new, Dummy.new, Dummy.new]))
71
+ assert(sched.schedule_provision('blarg-cascade2', [Dummy.new, Dummy.new, ReturnsInfoDummy.new]))
72
+ sched.run
73
+ assert(sched.serial || sched.running?)
74
+ sched.wait_for('blarg-cascade1', 'blarg-cascade2')
75
+ assert_solved('blarg-cascade1')
76
+ assert_solved('blarg-cascade2')
77
+ cascade1 = sched.vm.groups['blarg-cascade1']
78
+ cascade2 = sched.vm.groups['blarg-cascade2']
79
+ assert_equal({ :startup_blah => [1] }, cascade1.last.run_state[:startup])
80
+ assert_equal({ :startup_blah => [1] }, cascade2.last.run_state[:startup])
81
+ sched.teardown
82
+
83
+ assert_equal({ :shutdown_blah => [1] }, cascade1.first.run_state[:shutdown])
84
+ assert_equal({ :shutdown_blah => [1] }, cascade2.first.run_state[:shutdown])
85
+ end
33
86
  end
@@ -1,19 +1,6 @@
1
1
  require 'helper'
2
2
 
3
- class SleepyDummy < Dummy
4
- def startup(*args)
5
- sleep 1
6
- super
7
- end
8
- end
9
-
10
- class SleepyFailingDummy < SleepyDummy
11
- def startup(*args)
12
- super
13
- return false
14
- end
15
- end
16
-
3
+ # NOTE the dummy classes in this file are defined in test/dummy_classes.rb
17
4
  class TestSchedulerThreaded < Furnish::RestartingSchedulerTestCase
18
5
  def setup
19
6
  super
@@ -32,12 +19,13 @@ class TestSchedulerThreaded < Furnish::RestartingSchedulerTestCase
32
19
  #
33
20
  # this actually tests that functionality, so kill the monitor prematurely.
34
21
  #
35
- @monitor.kill rescue nil
36
22
  assert(sched.schedule_provision('blarg', SleepyFailingDummy.new))
37
23
  sched.run
38
24
  assert(sched.running?, 'running after provision')
39
- sleep 3
40
- assert_raises(RuntimeError, "Could not provision blarg with provisioner SleepyFailingDummy") { sched.running? }
25
+ sleep 4
26
+ assert(sched.running?, 'still running after failure')
27
+ assert_kind_of(RuntimeError, sched.needs_recovery['blarg'])
28
+ assert_equal("Could not provision blarg[SleepyFailingDummy]", sched.needs_recovery['blarg'].message)
41
29
  sched.teardown
42
30
  refute(sched.running?, 'not running after teardown')
43
31
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: furnish
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-25 00:00:00.000000000 Z
12
+ date: 2013-04-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: palsy
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 0.0.2
21
+ version: 0.0.4
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: 0.0.2
29
+ version: 0.0.4
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: rake
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -80,17 +80,17 @@ dependencies:
80
80
  requirement: !ruby/object:Gem::Requirement
81
81
  none: false
82
82
  requirements:
83
- - - ! '>='
83
+ - - ~>
84
84
  - !ruby/object:Gem::Version
85
- version: '0'
85
+ version: 0.0.8
86
86
  type: :development
87
87
  prerelease: false
88
88
  version_requirements: !ruby/object:Gem::Requirement
89
89
  none: false
90
90
  requirements:
91
- - - ! '>='
91
+ - - ~>
92
92
  - !ruby/object:Gem::Version
93
- version: '0'
93
+ version: 0.0.8
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: rdoc
96
96
  requirement: !ruby/object:Gem::Requirement
@@ -156,17 +156,22 @@ files:
156
156
  - furnish.gemspec
157
157
  - lib/furnish.rb
158
158
  - lib/furnish/logger.rb
159
+ - lib/furnish/protocol.rb
159
160
  - lib/furnish/provisioner.rb
160
161
  - lib/furnish/provisioner_group.rb
162
+ - lib/furnish/provisioners/api.rb
161
163
  - lib/furnish/provisioners/dummy.rb
162
164
  - lib/furnish/scheduler.rb
163
165
  - lib/furnish/test.rb
164
166
  - lib/furnish/version.rb
165
167
  - lib/furnish/vm.rb
168
+ - test/dummy_classes.rb
166
169
  - test/helper.rb
167
170
  - test/mt_cases.rb
171
+ - test/test_api.rb
168
172
  - test/test_dummy.rb
169
173
  - test/test_logger.rb
174
+ - test/test_protocol.rb
170
175
  - test/test_provisioner_group.rb
171
176
  - test/test_scheduler_basic.rb
172
177
  - test/test_scheduler_serial.rb
@@ -183,10 +188,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
183
188
  requirements:
184
189
  - - ! '>='
185
190
  - !ruby/object:Gem::Version
186
- version: '0'
187
- segments:
188
- - 0
189
- hash: 2505276676287387659
191
+ version: 1.9.3
190
192
  required_rubygems_version: !ruby/object:Gem::Requirement
191
193
  none: false
192
194
  requirements:
@@ -195,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
197
  version: '0'
196
198
  segments:
197
199
  - 0
198
- hash: 2505276676287387659
200
+ hash: 4039116121410524587
199
201
  requirements: []
200
202
  rubyforge_project:
201
203
  rubygems_version: 1.8.25
@@ -203,10 +205,13 @@ signing_key:
203
205
  specification_version: 3
204
206
  summary: A novel way to do virtual machine provisioning
205
207
  test_files:
208
+ - test/dummy_classes.rb
206
209
  - test/helper.rb
207
210
  - test/mt_cases.rb
211
+ - test/test_api.rb
208
212
  - test/test_dummy.rb
209
213
  - test/test_logger.rb
214
+ - test/test_protocol.rb
210
215
  - test/test_provisioner_group.rb
211
216
  - test/test_scheduler_basic.rb
212
217
  - test/test_scheduler_serial.rb