halite 1.8.1 → 1.8.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +48 -22
- data/CHANGELOG.md +4 -0
- data/gemfiles/chef-12.16.gemfile +19 -0
- data/gemfiles/chef-12.17.gemfile +19 -0
- data/gemfiles/chef-12.18.gemfile +19 -0
- data/gemfiles/chef-12.19.gemfile +19 -0
- data/gemfiles/chef-12.20.gemfile +19 -0
- data/gemfiles/chef-12.21.gemfile +19 -0
- data/gemfiles/chef-12.gemfile +2 -2
- data/gemfiles/chef-13.0.gemfile +19 -0
- data/gemfiles/chef-13.1.gemfile +19 -0
- data/gemfiles/chef-13.10.gemfile +19 -0
- data/gemfiles/chef-13.2.gemfile +19 -0
- data/gemfiles/chef-13.3.gemfile +19 -0
- data/gemfiles/chef-13.4.gemfile +19 -0
- data/gemfiles/{chef-12.0.gemfile → chef-13.5.gemfile} +2 -2
- data/gemfiles/{chef-12.1.gemfile → chef-13.6.gemfile} +2 -2
- data/gemfiles/chef-13.7.gemfile +19 -0
- data/gemfiles/{chef-12.2.gemfile → chef-13.8.gemfile} +2 -2
- data/gemfiles/{chef-12.3.gemfile → chef-13.9.gemfile} +2 -2
- data/gemfiles/chef-13.gemfile +2 -2
- data/gemfiles/chef-14.0.gemfile +19 -0
- data/gemfiles/chef-14.1.gemfile +19 -0
- data/gemfiles/chef-14.2.gemfile +19 -0
- data/gemfiles/chef-14.3.gemfile +19 -0
- data/gemfiles/chef-14.4.gemfile +19 -0
- data/gemfiles/{chef-12.4.0.gemfile → chef-14.gemfile} +2 -2
- data/lib/halite/spec_helper.rb +37 -37
- data/lib/halite/spec_helper/patcher.rb +6 -129
- data/lib/halite/spec_helper/runner.rb +30 -35
- data/lib/halite/version.rb +1 -1
- data/spec/example_resources/custom.rb +29 -0
- data/spec/example_resources/simple.rb +4 -10
- data/spec/runner_spec.rb +17 -55
- data/spec/spec_helper.rb +2 -0
- data/spec/spec_helper_spec.rb +34 -12
- metadata +28 -13
- data/gemfiles/chef-12.4.gemfile +0 -19
- data/gemfiles/chef-12.5.gemfile +0 -19
- data/gemfiles/chef-12.6.gemfile +0 -19
- data/gemfiles/chef-12.7.gemfile +0 -19
- data/gemfiles/chef-13.7.16.gemfile +0 -21
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2018, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
eval_gemfile File.expand_path('../../Gemfile', __FILE__)
|
18
|
+
|
19
|
+
gem 'chef', '~> 14.0.202'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2018, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
eval_gemfile File.expand_path('../../Gemfile', __FILE__)
|
18
|
+
|
19
|
+
gem 'chef', '~> 14.1.12'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2018, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
eval_gemfile File.expand_path('../../Gemfile', __FILE__)
|
18
|
+
|
19
|
+
gem 'chef', '~> 14.2.0'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2018, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
eval_gemfile File.expand_path('../../Gemfile', __FILE__)
|
18
|
+
|
19
|
+
gem 'chef', '~> 14.3.37'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2018, Noah Kantrowitz
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
|
17
|
+
eval_gemfile File.expand_path('../../Gemfile', __FILE__)
|
18
|
+
|
19
|
+
gem 'chef', '~> 14.4.56'
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright
|
2
|
+
# Copyright 2018, Noah Kantrowitz
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
# you may not use this file except in compliance with the License.
|
@@ -16,4 +16,4 @@
|
|
16
16
|
|
17
17
|
eval_gemfile File.expand_path('../../Gemfile', __FILE__)
|
18
18
|
|
19
|
-
gem 'chef', '
|
19
|
+
gem 'chef', '~> 14.4'
|
data/lib/halite/spec_helper.rb
CHANGED
@@ -55,6 +55,8 @@ module Halite
|
|
55
55
|
autoload :Patcher, 'halite/spec_helper/patcher'
|
56
56
|
autoload :Runner, 'halite/spec_helper/runner'
|
57
57
|
extend RSpec::SharedContext
|
58
|
+
def self.described_class; nil; end
|
59
|
+
include ChefSpec::API
|
58
60
|
|
59
61
|
# @!attribute [r] step_into
|
60
62
|
# Resource names to step in to when running this example.
|
@@ -91,29 +93,36 @@ module Halite
|
|
91
93
|
# @example Enable Fauxhai attributes
|
92
94
|
# let(:chefspec_options) { {platform: 'ubuntu', version: '12.04'} }
|
93
95
|
let(:chefspec_options) { Hash.new }
|
94
|
-
|
95
|
-
#
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
96
|
+
|
97
|
+
# Cross-link the Halite and ChefSpec data.
|
98
|
+
let(:chefspec_platform) do
|
99
|
+
chefspec_options[:platform] || 'ubuntu'
|
100
|
+
end
|
101
|
+
let(:chefspec_platform_version) do
|
102
|
+
chefspec_options[:version]
|
103
|
+
end
|
104
|
+
|
105
|
+
# Merge in extra options data.
|
106
|
+
def chef_runner_options
|
107
|
+
super.tap do |options|
|
108
|
+
options[:halite_gemspec] = halite_gemspec
|
109
|
+
# And some legacy data.
|
110
|
+
options[:default_attributes].update(default_attributes)
|
111
|
+
options[:normal_attributes].update(normal_attributes)
|
112
|
+
options[:override_attributes].update(override_attributes)
|
113
|
+
options.update(chefspec_options)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# Custom runner class.
|
118
|
+
def chef_runner_class
|
119
|
+
Halite::SpecHelper::Runner
|
120
|
+
end
|
121
|
+
|
122
|
+
# Don't try to converge any recipes, even by default.
|
123
|
+
let(:chef_run) do
|
124
|
+
chef_runner.converge
|
110
125
|
end
|
111
|
-
# @!attribute [r] chef_run
|
112
|
-
# Trigger a Chef converge. By default no resources are converged. This is
|
113
|
-
# normally overwritten by the {#recipe} helper.
|
114
|
-
# @return [ChefSpec::SoloRunner]
|
115
|
-
# @see #recipe
|
116
|
-
let(:chef_run) { chef_runner.converge() }
|
117
126
|
|
118
127
|
# An alias for slightly more semantic meaning, just forces the lazy #subject
|
119
128
|
# to run.
|
@@ -172,7 +181,7 @@ module Halite
|
|
172
181
|
# end
|
173
182
|
def recipe(*recipe_names, subject: true, &block)
|
174
183
|
# Keep the actual logic in a let in case I want to define the subject as something else
|
175
|
-
let(:chef_run) { chef_runner.converge(*recipe_names
|
184
|
+
let(:chef_run) { recipe_names.empty? ? chef_runner.converge_block(&block) : chef_runner.converge(*recipe_names) }
|
176
185
|
subject { chef_run } if subject
|
177
186
|
end
|
178
187
|
|
@@ -192,7 +201,8 @@ module Halite
|
|
192
201
|
# end
|
193
202
|
# it { is_expected.to run_ruby_block('test') }
|
194
203
|
# end
|
195
|
-
def step_into(name, resource_name=nil, unwrap_notifying_block: true)
|
204
|
+
def step_into(name=nil, resource_name=nil, unwrap_notifying_block: true)
|
205
|
+
return super() if name.nil?
|
196
206
|
resource_class = if name.is_a?(Class)
|
197
207
|
name
|
198
208
|
elsif resources[name.to_sym]
|
@@ -210,16 +220,6 @@ module Halite
|
|
210
220
|
Chef::Mixin::ConvertToClassName.convert_to_snake_case(resource_class.name.split('::').last)
|
211
221
|
end
|
212
222
|
|
213
|
-
# Add a resource-level matcher to ChefSpec.
|
214
|
-
ChefSpec.define_matcher(resource_name)
|
215
|
-
|
216
|
-
# Figure out the available actions and create ChefSpec matchers.
|
217
|
-
resource_class.new(nil, nil).allowed_actions.each do |action|
|
218
|
-
define_method("#{action}_#{resource_name}") do |instance_name|
|
219
|
-
ChefSpec::Matchers::ResourceMatcher.new(resource_name, action, instance_name)
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
223
|
# Patch notifying_block from Poise::Provider to just run directly.
|
224
224
|
# This is not a great solution but it is better than nothing for right
|
225
225
|
# now. In the future this should maybe do an internal converge but using
|
@@ -238,7 +238,7 @@ module Halite
|
|
238
238
|
end
|
239
239
|
|
240
240
|
# Add to the let variable passed in to ChefSpec.
|
241
|
-
|
241
|
+
super(resource_name)
|
242
242
|
end
|
243
243
|
|
244
244
|
# Define a resource class for use in an example group. By default the
|
@@ -333,7 +333,7 @@ module Halite
|
|
333
333
|
around do |ex|
|
334
334
|
if patch && resource(name) == resource_class
|
335
335
|
# We haven't been overridden from a nested scope.
|
336
|
-
Patcher.patch(name, resource_class
|
336
|
+
Patcher.patch(name, resource_class) { ex.run }
|
337
337
|
else
|
338
338
|
ex.run
|
339
339
|
end
|
@@ -424,7 +424,7 @@ module Halite
|
|
424
424
|
around do |ex|
|
425
425
|
if patch && provider(name) == provider_class
|
426
426
|
# We haven't been overridden from a nested scope.
|
427
|
-
Patcher.patch(name, provider_class
|
427
|
+
Patcher.patch(name, provider_class) { ex.run }
|
428
428
|
else
|
429
429
|
ex.run
|
430
430
|
end
|
@@ -26,30 +26,16 @@ module Halite
|
|
26
26
|
# @since 1.0.0
|
27
27
|
# @api private
|
28
28
|
module Patcher
|
29
|
-
# Flag to disable module-name patching.
|
30
|
-
DISABLE_PATCH_MODULE = ::Gem::Requirement.create('>= 13').satisfied_by?(::Gem::Version.create(Chef::VERSION))
|
31
|
-
|
32
29
|
# Patch a class in to Chef for the duration of a block.
|
33
30
|
#
|
34
31
|
# @param name [String, Symbol] Name to create in snake-case (eg. :my_name).
|
35
32
|
# @param klass [Class] Class to patch in.
|
36
|
-
# @param mod [Module] Optional module to create a constant in.
|
37
33
|
# @param block [Proc] Block to execute while the patch is available.
|
38
34
|
# @return [void]
|
39
|
-
def self.patch(name, klass,
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
patch_handler_map(name, klass) do
|
44
|
-
patch_recipe_dsl(name, klass) do
|
45
|
-
if mod
|
46
|
-
patch_module(mod, name, klass, &block)
|
47
|
-
else
|
48
|
-
block.call
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
35
|
+
def self.patch(name, klass, &block)
|
36
|
+
patch_handler_map(name, klass) do
|
37
|
+
patch_recipe_dsl(name, klass) do
|
38
|
+
block.call
|
53
39
|
end
|
54
40
|
end
|
55
41
|
end
|
@@ -65,10 +51,8 @@ module Halite
|
|
65
51
|
def self.post_create_cleanup(name, klass)
|
66
52
|
# Remove from DSL.
|
67
53
|
Chef::DSL::Resources.remove_resource_dsl(name) if defined?(Chef::DSL::Resources.remove_resource_dsl)
|
68
|
-
# Remove from
|
69
|
-
|
70
|
-
# Remove from the priority and handler maps.
|
71
|
-
{priority: priority_map_for(klass), handler: handler_map_for(klass)}.each do |type, map|
|
54
|
+
# Remove from the handler map.
|
55
|
+
{handler: handler_map_for(klass)}.each do |type, map|
|
72
56
|
if map
|
73
57
|
# Make sure we add name in there too because anonymous classes don't
|
74
58
|
# get a handler map registration by default.
|
@@ -78,78 +62,6 @@ module Halite
|
|
78
62
|
klass.instance_variable_set(:"@halite_original_#{type}_keys", removed_keys)
|
79
63
|
end
|
80
64
|
end
|
81
|
-
# Remove from the global node map.
|
82
|
-
if defined?(Chef::Resource.node_map)
|
83
|
-
removed_keys = remove_from_node_map(Chef::Resource.node_map, klass)
|
84
|
-
# Used down in patch_node_map.
|
85
|
-
klass.instance_variable_set(:@halite_original_nodemap_keys, removed_keys)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
# Patch an object in to a global namespace for the duration of a block.
|
90
|
-
#
|
91
|
-
# @param mod [Module] Namespace to patch in to.
|
92
|
-
# @param name [String, Symbol] Name to create in snake-case (eg. :my_name).
|
93
|
-
# @param obj Object to patch in.
|
94
|
-
# @param block [Proc] Block to execute while the name is available.
|
95
|
-
# @return [void]
|
96
|
-
def self.patch_module(mod, name, obj, &block)
|
97
|
-
return block.call if DISABLE_PATCH_MODULE
|
98
|
-
class_name = Chef::Mixin::ConvertToClassName.convert_to_class_name(name.to_s)
|
99
|
-
if mod.const_defined?(class_name, false)
|
100
|
-
old_class = mod.const_get(class_name, false)
|
101
|
-
# We are only allowed to patch over things installed by patch_module
|
102
|
-
raise "#{mod.name}::#{class_name} is already defined" if !old_class.instance_variable_get(:@poise_patch_module)
|
103
|
-
# Remove it before setting to avoid the redefinition warning
|
104
|
-
mod.send(:remove_const, class_name)
|
105
|
-
end
|
106
|
-
# Tag our objects so we know we are allowed to overwrite those, but not other stuff.
|
107
|
-
obj.instance_variable_set(:@poise_patch_module, true)
|
108
|
-
mod.const_set(class_name, obj)
|
109
|
-
begin
|
110
|
-
block.call
|
111
|
-
ensure
|
112
|
-
# Same as above, have to remove before set because warnings
|
113
|
-
mod.send(:remove_const, class_name)
|
114
|
-
mod.const_set(class_name, old_class) if old_class
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
# Patch an object in to Chef's DescendantsTracker system for the duration
|
119
|
-
# of a code block.
|
120
|
-
#
|
121
|
-
# @param klass [Class] Class to patch in.
|
122
|
-
# @param block [Proc] Block to execute while the patch is available.
|
123
|
-
# @return [void]
|
124
|
-
def self.patch_descendants_tracker(klass, &block)
|
125
|
-
begin
|
126
|
-
# Re-add to tracking.
|
127
|
-
Chef::Mixin::DescendantsTracker.store_inherited(klass.superclass, klass)
|
128
|
-
block.call
|
129
|
-
ensure
|
130
|
-
# Clean up after ourselves.
|
131
|
-
Chef::Mixin::DescendantsTracker.direct_descendants(klass.superclass).delete(klass)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
# Patch a class in to its node_map. This is not used in 12.4+.
|
136
|
-
#
|
137
|
-
# @param name [Symbol] Name to patch in.
|
138
|
-
# @param klass [Class] Resource class to patch in.
|
139
|
-
# @param block [Proc] Block to execute while the patch is available.
|
140
|
-
# @return [void]
|
141
|
-
def self.patch_node_map(name, klass, &block)
|
142
|
-
return block.call unless defined?(klass.node_map)
|
143
|
-
begin
|
144
|
-
# Technically this is set to true on >=12.4, but this should work.
|
145
|
-
keys = klass.instance_variable_get(:@halite_original_nodemap_keys) | [name.to_sym]
|
146
|
-
keys.each do |key|
|
147
|
-
klass.node_map.set(key, klass)
|
148
|
-
end
|
149
|
-
block.call
|
150
|
-
ensure
|
151
|
-
remove_from_node_map(klass.node_map, klass)
|
152
|
-
end
|
153
65
|
end
|
154
66
|
|
155
67
|
# Patch a resource in to Chef's recipe DSL for the duration of a code
|
@@ -169,28 +81,6 @@ module Halite
|
|
169
81
|
end
|
170
82
|
end
|
171
83
|
|
172
|
-
# Patch a class in to the correct priority map for the duration of a code
|
173
|
-
# block. This is a no-op before Chef 12.4.
|
174
|
-
#
|
175
|
-
# @since 1.0.4
|
176
|
-
# @param name [Symbol] Name to patch in.
|
177
|
-
# @param klass [Class] Resource or provider class to patch in.
|
178
|
-
# @param block [Proc] Block to execute while the patch is available.
|
179
|
-
# @return [void]
|
180
|
-
def self.patch_priority_map(name, klass, &block)
|
181
|
-
priority_map = priority_map_for(klass)
|
182
|
-
return block.call unless priority_map
|
183
|
-
begin
|
184
|
-
# Unlike patch_node_map, this has to be an array!
|
185
|
-
klass.instance_variable_get(:@halite_original_priority_keys).each do |key|
|
186
|
-
priority_map.set(key, [klass])
|
187
|
-
end
|
188
|
-
block.call
|
189
|
-
ensure
|
190
|
-
remove_from_node_map(priority_map, klass)
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
84
|
# Patch a class in to the correct handler map for the duration of a code
|
195
85
|
# block. This is a no-op before Chef 12.4.1.
|
196
86
|
#
|
@@ -214,19 +104,6 @@ module Halite
|
|
214
104
|
|
215
105
|
private
|
216
106
|
|
217
|
-
# Find the global priority map for a class.
|
218
|
-
#
|
219
|
-
# @since 1.0.4
|
220
|
-
# @param klass [Class] Resource or provider class to look up.
|
221
|
-
# @return [nil, Chef::Platform::ResourcePriorityMap, Chef::Platform::ProviderPriorityMap]
|
222
|
-
def self.priority_map_for(klass)
|
223
|
-
if defined?(Chef.resource_priority_map) && klass < Chef::Resource
|
224
|
-
Chef.resource_priority_map
|
225
|
-
elsif defined?(Chef.provider_priority_map) && klass < Chef::Provider
|
226
|
-
Chef.provider_priority_map
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
107
|
# Find the global handler map for a class.
|
231
108
|
#
|
232
109
|
# @since 1.0.7
|
@@ -30,45 +30,19 @@ module Halite
|
|
30
30
|
#
|
31
31
|
# @since 1.0.0
|
32
32
|
class Runner < ChefSpec::SoloRunner
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
else
|
38
|
-
{}
|
39
|
-
end
|
40
|
-
new(options).tap do |instance|
|
41
|
-
instance.converge(*recipe_names, &block)
|
42
|
-
end
|
33
|
+
def initialize(options={})
|
34
|
+
# Store the gemspec for later use
|
35
|
+
@halite_gemspec = options[:halite_gemspec]
|
36
|
+
super
|
43
37
|
end
|
44
38
|
|
45
|
-
def
|
46
|
-
# Repeating the detault platform.
|
47
|
-
options[:platform] ||= 'ubuntu'
|
48
|
-
options[:version] ||= '16.04'
|
49
|
-
super(options) do |node|
|
50
|
-
# Allow inserting arbitrary attribute data in to the node
|
51
|
-
node.attributes.default = Chef::Mixin::DeepMerge.merge(node.attributes.default, options[:default_attributes]) if options[:default_attributes]
|
52
|
-
node.attributes.normal = Chef::Mixin::DeepMerge.merge(node.attributes.normal, options[:normal_attributes]) if options[:normal_attributes]
|
53
|
-
node.attributes.override = Chef::Mixin::DeepMerge.merge(node.attributes.override, options[:override_attributes]) if options[:override_attributes]
|
54
|
-
# Store the gemspec for later use
|
55
|
-
@halite_gemspec = options[:halite_gemspec]
|
56
|
-
end
|
39
|
+
def preload!
|
57
40
|
end
|
58
41
|
|
59
|
-
def converge(*
|
60
|
-
|
61
|
-
super(*recipe_names) do
|
42
|
+
def converge(*args, &block)
|
43
|
+
super(*args) do |node|
|
62
44
|
add_halite_cookbooks(node, @halite_gemspec) if @halite_gemspec
|
63
|
-
if block
|
64
|
-
cookbook_name = if @halite_gemspec
|
65
|
-
Halite::Gem.new(Array(@halite_gemspec).first).cookbook_name + '_spec'
|
66
|
-
else
|
67
|
-
nil
|
68
|
-
end
|
69
|
-
recipe = Chef::Recipe.new(cookbook_name, nil, run_context)
|
70
|
-
recipe.instance_exec(&block)
|
71
|
-
end
|
45
|
+
block.call(node) if block
|
72
46
|
end
|
73
47
|
end
|
74
48
|
|
@@ -96,10 +70,31 @@ module Halite
|
|
96
70
|
end
|
97
71
|
end
|
98
72
|
|
73
|
+
# Override the normal cookbook loading behavior.
|
74
|
+
def cookbook
|
75
|
+
if @halite_gemspec
|
76
|
+
halite_gem = Halite::Gem.new(Array(@halite_gemspec).first)
|
77
|
+
Chef::Cookbook::Metadata.new.tap do |metadata|
|
78
|
+
metadata.name(halite_gem.cookbook_name)
|
79
|
+
end
|
80
|
+
else
|
81
|
+
super
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
99
85
|
# Don't try to autodetect the calling cookbook.
|
100
|
-
def calling_cookbook_path(
|
86
|
+
def calling_cookbook_path(*args)
|
101
87
|
File.expand_path('../empty', __FILE__)
|
102
88
|
end
|
89
|
+
|
90
|
+
# Inject a better chefspec_cookbook_root option.
|
91
|
+
def apply_chef_config!
|
92
|
+
super
|
93
|
+
if @halite_gemspec
|
94
|
+
Chef::Config[:chefspec_cookbook_root] = Array(@halite_gemspec).first.full_gem_path
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
103
98
|
end
|
104
99
|
end
|
105
100
|
end
|