furnish 0.1.0 → 0.1.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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4d4afd9cd6de61bdd854e6d2f7a1a6872752f6f4
4
+ data.tar.gz: 170882525003c0f981bd530c237eb6ff49833ce6
5
+ SHA512:
6
+ metadata.gz: 654feec56dab6dcdad88a5b5778188fa53930482000a88d0c67d98ed91b7cb6118ec30b6064ffb647e7a2a9a8b0e8c0ee6e91f7fc98d876188cf3fb8c8974445
7
+ data.tar.gz: 5e3047a0556417cb61853a560cd7efa9c4cb75def76c9aa2a6585063a25092b3b90e00c60be2a5e61d22019f59642645575cde00b251d8029897cec2c11bcc26
data/CHANGELOG.md CHANGED
@@ -1,4 +1,15 @@
1
- * 0.1.0 (04/09/2013)
1
+ # 0.1.1 (04/16/2013)
2
+ * #wait_for would spin forever if something got flagged as needing recovery
3
+ (threaded scheduler only). Now raises the first item's exception if
4
+ provided, or a generic one if it just flagged a failure.
5
+ * #wait_for would also throw rather cryptic exceptions if the scheduler was
6
+ threaded and was not running. Now raises something communicative.
7
+ * aliases for commonly used scheduler methods:
8
+ * #wait_for is aliased to #w
9
+ * #teardown_group is aliased to #d and #down
10
+ * New API: Furnish::Scheduler#groups can be used to more easily get at
11
+ provisioner groups the scheduler knows about.
12
+ # 0.1.0 (04/09/2013)
2
13
  * Furnish requires 1.9.3 or greater -- always has been the case, now rubygems enforces that for us.
3
14
  * Runtime performance increased significantly. No hard numbers, but test
4
15
  suite assertion count doubled and total test runtime actually dropped
@@ -34,16 +45,16 @@
34
45
  * `<<` is now an alias for `schedule_provisioner_group`
35
46
  * `s` and `sched` are now aliases for `schedule_provision`
36
47
  * Probably some other shit I don't remember now.
37
- * 0.0.4 (03/25/2013)
48
+ # 0.0.4 (03/25/2013)
38
49
  * Support for FURNISH_DEBUG environment variable for test suites.
39
50
  * Ruby 2.0.0-p0 Compatibility Fixes
40
51
  * Documentation is RDoc 4.0 compatible.
41
52
 
42
- * 0.0.3 (03/21/2013)
53
+ # 0.0.3 (03/21/2013)
43
54
  * Fix an issue where state wasn't tracked for provisioners themselves after the provisioning process had started.
44
55
 
45
- * 0.0.2 (03/20/2013)
56
+ # 0.0.2 (03/20/2013)
46
57
  * Extract Furnish::TestCase into gem for consumption by other gems that need to test against furnish.
47
58
 
48
- * 0.0.1 (02/23/2013)
59
+ # 0.0.1 (02/23/2013)
49
60
  * Initial release as extracted from chef-workflow.
@@ -140,7 +140,7 @@ module Furnish
140
140
 
141
141
  begin
142
142
  args = perform_deprovision(this_prov, shutdown_args)
143
- rescue Exception => e
143
+ rescue => e
144
144
  if_debug do
145
145
  puts "Deprovision of #{this_prov} had errors:"
146
146
  puts "#{e.message}"
@@ -97,6 +97,17 @@ module Furnish
97
97
  vm.need_recovery
98
98
  end
99
99
 
100
+ #
101
+ # Get the Furnish::ProvisionerGroup by name as it currently exists in the
102
+ # scheduler. Useful for querying properties of a given provisioner after
103
+ # they've been set.
104
+ #
105
+ def group(name)
106
+ vm.groups[name]
107
+ end
108
+
109
+ alias g group
110
+
100
111
  #
101
112
  # Schedule a group of VMs for provision. This takes a group name, which is a
102
113
  # string, an array of provisioner objects, and a list of string dependencies.
@@ -138,22 +149,43 @@ module Furnish
138
149
  alias << schedule_provisioner_group
139
150
 
140
151
  #
141
- # Sleep until this list of dependencies are resolved. In parallel mode, will
142
- # raise if an exception occurred while waiting for these resources. In
143
- # serial mode, wait_for just returns nil.
152
+ # Sleep until this list of dependencies are resolved. In parallel mode,
153
+ # will raise if an exception occurred while waiting for these groups, or
154
+ # the groups entered recovery state, or the scheduler is not currently
155
+ # running. In serial mode, wait_for just returns nil.
144
156
  #
145
157
  def wait_for(*dependencies)
146
158
  return nil if @serial
147
159
  return nil if dependencies.empty?
148
160
 
161
+ unless running?
162
+ raise "The scheduler doesn't appear to be running or started. Can't wait_for anything!"
163
+ end
164
+
149
165
  dep_set = Set[*dependencies]
150
166
 
151
167
  until dep_set & vm.solved == dep_set
152
168
  sleep 0.1
153
169
  @solver_thread.join unless @solver_thread.alive?
170
+
171
+ dependencies_in_recovery = needs_recovery.keys.to_set & dep_set
172
+
173
+ if needs_recovery? and !dependencies_in_recovery.empty?
174
+ # we really can't get them all, but we can at least raise the first one.
175
+ group_name = dependencies_in_recovery.first
176
+
177
+ group_exception = needs_recovery[group_name]
178
+ if group_exception
179
+ raise group_exception
180
+ else
181
+ raise "group #{group_name} is in recovery during wait_for"
182
+ end
183
+ end
154
184
  end
155
185
  end
156
186
 
187
+ alias w wait_for
188
+
157
189
  #
158
190
  # Start the scheduler. In serial mode this call will block until the whole
159
191
  # dependency graph is satisfied, or one of the provisions fails, at which
@@ -301,9 +333,11 @@ module Furnish
301
333
 
302
334
  deprovision_group(group_name)
303
335
  end
304
-
305
336
  end
306
337
 
338
+ alias down teardown_group
339
+ alias d teardown_group
340
+
307
341
  #
308
342
  # Instruct all provisioners except ones in the exception list to tear down.
309
343
  # Calls #stop as its first action.
@@ -1,4 +1,4 @@
1
1
  module Furnish
2
2
  # The current version of Furnish.
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
data/test/mt_cases.rb CHANGED
@@ -28,13 +28,16 @@ module Furnish
28
28
 
29
29
  sched.s(test1, Dummy.new)
30
30
  sched.s(test2, prov.new)
31
- sched.run rescue nil # FIXME oof. maybe move this to indepedent tests for serial mode?
31
+ sched.run rescue nil # start.
32
32
  assert(sched.serial || sched.running?)
33
33
  unless sched.serial
34
34
  sleep 0.1 while !sched.needs_recovery.has_key?(test2)
35
35
  end
36
36
  assert(sched.needs_recovery?)
37
37
  assert_includes(sched.needs_recovery.keys, test2)
38
+ unless sched.serial
39
+ assert_raises(RuntimeError) { sched.wait_for(test2) }
40
+ end
38
41
  refute_solved(test2)
39
42
  sched.s(test3, Dummy.new, [test2])
40
43
  refute_solved(test3)
@@ -72,6 +75,11 @@ module Furnish
72
75
  sleep 0.1 while !sched.needs_recovery.has_key?(test4)
73
76
  end
74
77
  assert(sched.needs_recovery?)
78
+ unless sched.serial
79
+ assert_raises(RuntimeError) { sched.wait_for(test2) }
80
+ assert_raises(RuntimeError) { sched.wait_for(test4) }
81
+ assert_raises(RuntimeError) { sched.wait_for(test1, test2, test3, test4, test5) }
82
+ end
75
83
  refute_solved(test2)
76
84
  refute_solved(test3)
77
85
  refute_solved(test4)
@@ -131,6 +139,48 @@ module Furnish
131
139
  assert_equal("floop", sched.vm.groups['test2'].first.report.last, "provision failed but state is still stored for the provisions that succeeded")
132
140
  end
133
141
 
142
+ def test_scheduler_groups
143
+ group = Furnish::ProvisionerGroup.new([Dummy.new], 'test2')
144
+ sched.s('test1', Dummy.new)
145
+ sched << group
146
+ sched.run rescue nil
147
+ sched.w('test1', 'test2')
148
+
149
+ %w[test1 test2].each do |group_name|
150
+ assert_kind_of(Furnish::ProvisionerGroup, sched.group(group_name))
151
+ assert_kind_of(Dummy, sched.group(group_name).first)
152
+ end
153
+ end
154
+
155
+ def test_aliases
156
+ group = Furnish::ProvisionerGroup.new([Dummy.new], 'test2')
157
+ sched.s('test1', Dummy.new)
158
+ sched << group
159
+ sched.run rescue nil
160
+ sched.w('test1', 'test2')
161
+ assert_solved('test1')
162
+ assert_solved('test2')
163
+ assert_kind_of(Furnish::ProvisionerGroup, sched.g('test1'))
164
+ assert_kind_of(Furnish::ProvisionerGroup, sched.g('test2'))
165
+ sched.d('test1')
166
+ sched.d('test2')
167
+ refute_solved('test1')
168
+ refute_solved('test2')
169
+ end
170
+
171
+ def test_wait_for_no_run
172
+ unless sched.serial
173
+ sched.s('test1', Dummy.new)
174
+ assert_raises(RuntimeError) { sched.wait_for('test1') }
175
+ sched.run
176
+ sched.wait_for('test1')
177
+ assert_solved('test1')
178
+ sched.teardown
179
+ refute_solved('test1')
180
+ assert_raises(RuntimeError) { sched.wait_for('test1') }
181
+ end
182
+ end
183
+
134
184
  def test_provision_cycle
135
185
  machine_names = %w[blarg blarg2 blarg3]
136
186
 
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: furnish
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.1.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Erik Hollensbe
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-04-09 00:00:00.000000000 Z
11
+ date: 2013-04-16 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: palsy
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: :runtime
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,23 +27,20 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
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
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: minitest
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,23 +55,20 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: guard-minitest
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
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
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: guard-rake
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,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: rdoc
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ~>
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
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
@@ -110,33 +97,29 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: rb-fsevent
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :development
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
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: simplecov
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - '>='
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - '>='
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  description: A novel way to do virtual machine provisioning
@@ -179,30 +162,26 @@ files:
179
162
  - test/test_vm.rb
180
163
  homepage: ''
181
164
  licenses: []
165
+ metadata: {}
182
166
  post_install_message:
183
167
  rdoc_options: []
184
168
  require_paths:
185
169
  - lib
186
170
  required_ruby_version: !ruby/object:Gem::Requirement
187
- none: false
188
171
  requirements:
189
- - - ! '>='
172
+ - - '>='
190
173
  - !ruby/object:Gem::Version
191
174
  version: 1.9.3
192
175
  required_rubygems_version: !ruby/object:Gem::Requirement
193
- none: false
194
176
  requirements:
195
- - - ! '>='
177
+ - - '>='
196
178
  - !ruby/object:Gem::Version
197
179
  version: '0'
198
- segments:
199
- - 0
200
- hash: 4039116121410524587
201
180
  requirements: []
202
181
  rubyforge_project:
203
- rubygems_version: 1.8.25
182
+ rubygems_version: 2.0.0
204
183
  signing_key:
205
- specification_version: 3
184
+ specification_version: 4
206
185
  summary: A novel way to do virtual machine provisioning
207
186
  test_files:
208
187
  - test/dummy_classes.rb