chef 12.4.0.rc.2-universal-mingw32 → 12.4.0-universal-mingw32
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 +4 -4
- data/distro/powershell/chef/chef.psm1 +327 -0
- data/lib/chef/chef_class.rb +4 -4
- data/lib/chef/client.rb +12 -6
- data/lib/chef/node_map.rb +63 -38
- data/lib/chef/platform/priority_map.rb +54 -0
- data/lib/chef/platform/provider_mapping.rb +2 -2
- data/lib/chef/platform/provider_priority_map.rb +3 -21
- data/lib/chef/platform/resource_priority_map.rb +5 -22
- data/lib/chef/provider.rb +1 -1
- data/lib/chef/provider/package/rpm.rb +2 -2
- data/lib/chef/provider/service/debian.rb +0 -2
- data/lib/chef/provider/service/insserv.rb +0 -2
- data/lib/chef/provider/service/invokercd.rb +0 -2
- data/lib/chef/provider/service/redhat.rb +0 -2
- data/lib/chef/provider/service/upstart.rb +0 -2
- data/lib/chef/provider/user.rb +0 -2
- data/lib/chef/resource.rb +23 -24
- data/lib/chef/resource/lwrp_base.rb +2 -1
- data/lib/chef/resource/macports_package.rb +2 -1
- data/lib/chef/resource/package.rb +0 -5
- data/lib/chef/resource_resolver.rb +1 -0
- data/lib/chef/version.rb +1 -1
- data/spec/integration/recipes/lwrp_spec.rb +2 -6
- data/spec/integration/recipes/recipe_dsl_spec.rb +254 -39
- data/spec/support/shared/shared_examples.rb +1 -1
- data/spec/unit/api_client_spec.rb +1 -1
- data/spec/unit/client_spec.rb +35 -19
- data/spec/unit/cookbook_version_spec.rb +1 -1
- data/spec/unit/data_bag_item_spec.rb +1 -1
- data/spec/unit/data_bag_spec.rb +1 -1
- data/spec/unit/environment_spec.rb +1 -1
- data/spec/unit/exceptions_spec.rb +1 -1
- data/spec/unit/json_compat_spec.rb +1 -1
- data/spec/unit/lwrp_spec.rb +43 -4
- data/spec/unit/node_spec.rb +1 -1
- data/spec/unit/osc_user_spec.rb +1 -1
- data/spec/unit/provider/package/rpm_spec.rb +335 -124
- data/spec/unit/provider_resolver_spec.rb +0 -1
- data/spec/unit/recipe_spec.rb +12 -8
- data/spec/unit/resource_collection_spec.rb +1 -1
- data/spec/unit/resource_resolver_spec.rb +49 -0
- data/spec/unit/resource_spec.rb +19 -4
- data/spec/unit/role_spec.rb +1 -1
- data/spec/unit/run_list_spec.rb +1 -1
- data/spec/unit/runner_spec.rb +2 -2
- data/spec/unit/user_spec.rb +1 -1
- metadata +10 -8
- data/spec/support/pedant/Gemfile.lock +0 -67
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'chef/node_map'
|
2
|
+
|
3
|
+
class Chef
|
4
|
+
class Platform
|
5
|
+
class PriorityMap < Chef::NodeMap
|
6
|
+
def priority(resource_name, priority_array, *filter)
|
7
|
+
set_priority_array(resource_name.to_sym, priority_array, *filter)
|
8
|
+
end
|
9
|
+
|
10
|
+
# @api private
|
11
|
+
def get_priority_array(node, key)
|
12
|
+
get(node, key)
|
13
|
+
end
|
14
|
+
|
15
|
+
# @api private
|
16
|
+
def set_priority_array(key, priority_array, *filter, &block)
|
17
|
+
priority_array = Array(priority_array)
|
18
|
+
set(key, priority_array, *filter, &block)
|
19
|
+
priority_array
|
20
|
+
end
|
21
|
+
|
22
|
+
# @api private
|
23
|
+
def list_handlers(node, key, **filters)
|
24
|
+
list(node, key, **filters).flatten(1).uniq
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# Priority maps have one extra precedence: priority arrays override "provides,"
|
29
|
+
# and "provides" lines with identical filters sort by class name (ascending).
|
30
|
+
#
|
31
|
+
def compare_matchers(key, new_matcher, matcher)
|
32
|
+
# Priority arrays come before "provides"
|
33
|
+
if new_matcher[:value].is_a?(Array) != matcher[:value].is_a?(Array)
|
34
|
+
return new_matcher[:value].is_a?(Array) ? -1 : 1
|
35
|
+
end
|
36
|
+
|
37
|
+
cmp = super
|
38
|
+
if cmp == 0
|
39
|
+
# Sort by class name (ascending) as well, if all other properties
|
40
|
+
# are exactly equal
|
41
|
+
if new_matcher[:value].is_a?(Class) && !new_matcher[:override]
|
42
|
+
cmp = compare_matcher_properties(new_matcher, matcher) { |m| m[:value].name }
|
43
|
+
if cmp < 0
|
44
|
+
Chef::Log.warn "You are overriding #{key} on #{new_matcher[:filters].inspect} with #{new_matcher[:value].inspect}: used to be #{matcher[:value].inspect}. Use override: true if this is what you intended."
|
45
|
+
elsif cmp > 0
|
46
|
+
Chef::Log.warn "You declared a new resource #{new_matcher[:value].inspect} for resource #{key}, but it comes alphabetically after #{matcher[:value].inspect} and has the same filters (#{new_matcher[:filters].inspect}), so it will not be used. Use override: true if you want to use it for #{key}."
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
cmp
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -201,8 +201,8 @@ class Chef
|
|
201
201
|
|
202
202
|
begin
|
203
203
|
result = Chef::Provider.const_get(class_name)
|
204
|
-
Chef::Log.warn("Class Chef::Provider::#{class_name} does not declare '
|
205
|
-
Chef::Log.warn("This will no longer work in Chef 13: you must use '
|
204
|
+
Chef::Log.warn("Class Chef::Provider::#{class_name} does not declare 'resource_name #{convert_to_snake_case(class_name).to_sym.inspect}'.")
|
205
|
+
Chef::Log.warn("This will no longer work in Chef 13: you must use 'resource_name' to provide DSL.")
|
206
206
|
rescue NameError
|
207
207
|
end
|
208
208
|
end
|
@@ -1,29 +1,11 @@
|
|
1
1
|
require 'singleton'
|
2
|
+
require 'chef/platform/priority_map'
|
2
3
|
|
3
4
|
class Chef
|
4
5
|
class Platform
|
5
|
-
|
6
|
+
# @api private
|
7
|
+
class ProviderPriorityMap < Chef::Platform::PriorityMap
|
6
8
|
include Singleton
|
7
|
-
|
8
|
-
def get_priority_array(node, resource_name)
|
9
|
-
priority_map.get(node, resource_name.to_sym)
|
10
|
-
end
|
11
|
-
|
12
|
-
def set_priority_array(resource_name, priority_array, *filter, &block)
|
13
|
-
priority_map.set(resource_name.to_sym, Array(priority_array), *filter, &block)
|
14
|
-
end
|
15
|
-
|
16
|
-
# @api private
|
17
|
-
def list_handlers(node, resource_name)
|
18
|
-
priority_map.list(node, resource_name.to_sym).flatten(1).uniq
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def priority_map
|
24
|
-
require 'chef/node_map'
|
25
|
-
@priority_map ||= Chef::NodeMap.new
|
26
|
-
end
|
27
9
|
end
|
28
10
|
end
|
29
11
|
end
|
@@ -1,34 +1,17 @@
|
|
1
1
|
require 'singleton'
|
2
|
+
require 'chef/platform/priority_map'
|
2
3
|
|
3
4
|
class Chef
|
4
5
|
class Platform
|
5
|
-
|
6
|
+
# @api private
|
7
|
+
class ResourcePriorityMap < Chef::Platform::PriorityMap
|
6
8
|
include Singleton
|
7
9
|
|
8
|
-
def get_priority_array(node, resource_name, canonical: nil)
|
9
|
-
priority_map.get(node, resource_name.to_sym, canonical: canonical)
|
10
|
-
end
|
11
|
-
|
12
|
-
def set_priority_array(resource_name, priority_array, *filter, &block)
|
13
|
-
priority_map.set(resource_name.to_sym, Array(priority_array), *filter, &block)
|
14
|
-
end
|
15
|
-
|
16
10
|
# @api private
|
17
|
-
def
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
# @api private
|
22
|
-
def list_handlers(*args)
|
23
|
-
priority_map.list(*args).flatten(1).uniq
|
11
|
+
def get_priority_array(node, resource_name, canonical: nil)
|
12
|
+
super(node, resource_name.to_sym, canonical: canonical)
|
24
13
|
end
|
25
14
|
|
26
|
-
private
|
27
|
-
|
28
|
-
def priority_map
|
29
|
-
require 'chef/node_map'
|
30
|
-
@priority_map ||= Chef::NodeMap.new
|
31
|
-
end
|
32
15
|
end
|
33
16
|
end
|
34
17
|
end
|
data/lib/chef/provider.rb
CHANGED
@@ -176,7 +176,7 @@ class Chef
|
|
176
176
|
end
|
177
177
|
|
178
178
|
def self.provides(short_name, opts={}, &block)
|
179
|
-
Chef.
|
179
|
+
Chef.provider_priority_map.set(short_name, self, opts, &block)
|
180
180
|
end
|
181
181
|
|
182
182
|
def self.provides?(node, resource)
|
@@ -61,7 +61,7 @@ class Chef
|
|
61
61
|
Chef::Log.debug("#{@new_resource} checking rpm status")
|
62
62
|
shell_out_with_timeout!("rpm -qp --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' #{@new_resource.source}").stdout.each_line do |line|
|
63
63
|
case line
|
64
|
-
when /^([\w\d+_.-]+)\s([\w\
|
64
|
+
when /^([\w\d+_.-]+)\s([\w\d~_.-]+)$/
|
65
65
|
@current_resource.package_name($1)
|
66
66
|
@new_resource.version($2)
|
67
67
|
@candidate_version = $2
|
@@ -78,7 +78,7 @@ class Chef
|
|
78
78
|
@rpm_status = shell_out_with_timeout("rpm -q --queryformat '%{NAME} %{VERSION}-%{RELEASE}\n' #{@current_resource.package_name}")
|
79
79
|
@rpm_status.stdout.each_line do |line|
|
80
80
|
case line
|
81
|
-
when /^([\w\d+_.-]+)\s([\w\
|
81
|
+
when /^([\w\d+_.-]+)\s([\w\d~_.-]+)$/
|
82
82
|
Chef::Log.debug("#{@new_resource} current version is #{$2}")
|
83
83
|
@current_resource.version($2)
|
84
84
|
end
|
@@ -25,8 +25,6 @@ class Chef
|
|
25
25
|
UPDATE_RC_D_ENABLED_MATCHES = /\/rc[\dS].d\/S|not installed/i
|
26
26
|
UPDATE_RC_D_PRIORITIES = /\/rc([\dS]).d\/([SK])(\d\d)/i
|
27
27
|
|
28
|
-
provides :service, platform_family: "debian"
|
29
|
-
|
30
28
|
def self.provides?(node, resource)
|
31
29
|
super && Chef::Platform::ServiceHelpers.service_resource_providers.include?(:debian)
|
32
30
|
end
|
@@ -23,8 +23,6 @@ class Chef
|
|
23
23
|
class Service
|
24
24
|
class Invokercd < Chef::Provider::Service::Init
|
25
25
|
|
26
|
-
provides :service, platform_family: "debian"
|
27
|
-
|
28
26
|
def self.provides?(node, resource)
|
29
27
|
super && Chef::Platform::ServiceHelpers.service_resource_providers.include?(:invokercd)
|
30
28
|
end
|
@@ -26,8 +26,6 @@ class Chef
|
|
26
26
|
CHKCONFIG_ON = /\d:on/
|
27
27
|
CHKCONFIG_MISSING = /No such/
|
28
28
|
|
29
|
-
provides :service, platform_family: [ "rhel", "fedora", "suse" ]
|
30
|
-
|
31
29
|
def self.provides?(node, resource)
|
32
30
|
super && Chef::Platform::ServiceHelpers.service_resource_providers.include?(:redhat)
|
33
31
|
end
|
@@ -27,8 +27,6 @@ class Chef
|
|
27
27
|
class Upstart < Chef::Provider::Service::Simple
|
28
28
|
UPSTART_STATE_FORMAT = /\w+ \(?(\w+)\)?[\/ ](\w+)/
|
29
29
|
|
30
|
-
provides :service, os: "linux"
|
31
|
-
|
32
30
|
def self.provides?(node, resource)
|
33
31
|
super && Chef::Platform::ServiceHelpers.service_resource_providers.include?(:upstart)
|
34
32
|
end
|
data/lib/chef/provider/user.rb
CHANGED
data/lib/chef/resource.rb
CHANGED
@@ -924,11 +924,6 @@ class Chef
|
|
924
924
|
else
|
925
925
|
@resource_name = nil
|
926
926
|
end
|
927
|
-
else
|
928
|
-
# set resource_name automatically if it's not set
|
929
|
-
if !instance_variable_defined?(:@resource_name) && self.name
|
930
|
-
resource_name convert_to_snake_case(self.name.split('::')[-1])
|
931
|
-
end
|
932
927
|
end
|
933
928
|
|
934
929
|
@resource_name
|
@@ -965,7 +960,7 @@ class Chef
|
|
965
960
|
#
|
966
961
|
# @param actions [Array<Symbol>] The list of actions to add to allowed_actions.
|
967
962
|
#
|
968
|
-
# @return [
|
963
|
+
# @return [Array<Symbol>] The list of actions, as symbols.
|
969
964
|
#
|
970
965
|
def self.allowed_actions(*actions)
|
971
966
|
@allowed_actions ||=
|
@@ -974,10 +969,10 @@ class Chef
|
|
974
969
|
else
|
975
970
|
[ :nothing ]
|
976
971
|
end
|
977
|
-
@allowed_actions |= actions
|
972
|
+
@allowed_actions |= actions.flatten
|
978
973
|
end
|
979
974
|
def self.allowed_actions=(value)
|
980
|
-
@allowed_actions = value
|
975
|
+
@allowed_actions = value.uniq
|
981
976
|
end
|
982
977
|
|
983
978
|
#
|
@@ -1111,7 +1106,12 @@ class Chef
|
|
1111
1106
|
def self.inherited(child)
|
1112
1107
|
super
|
1113
1108
|
@sorted_descendants = nil
|
1114
|
-
|
1109
|
+
# set resource_name automatically if it's not set
|
1110
|
+
if child.name && !child.resource_name
|
1111
|
+
if child.name =~ /^Chef::Resource::(\w+)$/
|
1112
|
+
child.resource_name(convert_to_snake_case($1))
|
1113
|
+
end
|
1114
|
+
end
|
1115
1115
|
end
|
1116
1116
|
|
1117
1117
|
|
@@ -1143,7 +1143,7 @@ class Chef
|
|
1143
1143
|
remove_canonical_dsl
|
1144
1144
|
end
|
1145
1145
|
|
1146
|
-
result = Chef.
|
1146
|
+
result = Chef.resource_priority_map.set(name, self, options, &block)
|
1147
1147
|
Chef::DSL::Resources.add_resource_dsl(name)
|
1148
1148
|
result
|
1149
1149
|
end
|
@@ -1318,23 +1318,22 @@ class Chef
|
|
1318
1318
|
# when Chef::Resource::MyLwrp
|
1319
1319
|
# end
|
1320
1320
|
#
|
1321
|
-
resource_subclass =
|
1322
|
-
|
1323
|
-
|
1324
|
-
|
1325
|
-
|
1321
|
+
resource_subclass = Class.new(resource_class) do
|
1322
|
+
resource_name nil # we do not actually provide anything
|
1323
|
+
def initialize(*args, &block)
|
1324
|
+
Chef::Log.deprecation("Using an LWRP by its name (#{self.class.name}) directly is no longer supported in Chef 13 and will be removed. Use Chef::Resource.resource_for_node(node, name) instead.")
|
1325
|
+
super
|
1326
|
+
end
|
1327
|
+
def self.resource_name(*args)
|
1328
|
+
if args.empty?
|
1329
|
+
@resource_name ||= superclass.resource_name
|
1330
|
+
else
|
1326
1331
|
super
|
1327
1332
|
end
|
1328
|
-
def self.resource_name(*args)
|
1329
|
-
if args.empty?
|
1330
|
-
@resource_name ||= superclass.resource_name
|
1331
|
-
else
|
1332
|
-
super
|
1333
|
-
end
|
1334
|
-
end
|
1335
|
-
self
|
1336
1333
|
end
|
1337
|
-
|
1334
|
+
self
|
1335
|
+
end
|
1336
|
+
eval("Chef::Resource::#{class_name} = resource_subclass")
|
1338
1337
|
# Make case, is_a and kind_of work with the new subclass, for backcompat.
|
1339
1338
|
# Any subclass of Chef::Resource::ResourceClass is already a subclass of resource_class
|
1340
1339
|
# Any subclass of resource_class is considered a subclass of Chef::Resource::ResourceClass
|
@@ -85,8 +85,9 @@ class Chef
|
|
85
85
|
# Adds +action_names+ to the list of valid actions for this resource.
|
86
86
|
# Does not include superclass's action list when appending.
|
87
87
|
def actions(*action_names)
|
88
|
+
action_names = action_names.flatten
|
88
89
|
if !action_names.empty? && !@allowed_actions
|
89
|
-
self.allowed_actions = action_names
|
90
|
+
self.allowed_actions = ([ :nothing ] + action_names).uniq
|
90
91
|
else
|
91
92
|
allowed_actions(*action_names)
|
92
93
|
end
|
data/lib/chef/version.rb
CHANGED
@@ -45,12 +45,8 @@ log_level :warn
|
|
45
45
|
EOM
|
46
46
|
|
47
47
|
result = shell_out("#{chef_client} -c \"#{path_to('config/client.rb')}\" --no-color -F doc -o 'l-w-r-p::default'", :cwd => chef_dir)
|
48
|
-
|
49
|
-
|
50
|
-
* l_w_r_p_foo[me] action create (up to date)
|
51
|
-
EOM
|
52
|
-
expected = expected.lines.map { |l| l.chomp }.join("\n")
|
53
|
-
expect(actual).to include(expected)
|
48
|
+
expect(result.stdout).to match(/\* l_w_r_p_foo\[me\] action create \(up to date\)/)
|
49
|
+
expect(result.stdout).not_to match(/WARN: You are overriding l_w_r_p_foo/)
|
54
50
|
result.error!
|
55
51
|
end
|
56
52
|
end
|
@@ -15,13 +15,8 @@ describe "Recipe DSL methods" do
|
|
15
15
|
before(:context) {
|
16
16
|
|
17
17
|
class BaseThingy < Chef::Resource
|
18
|
-
def initialize(*args, &block)
|
19
|
-
super
|
20
|
-
@allowed_actions = [ :create ]
|
21
|
-
@action = :create
|
22
|
-
end
|
23
|
-
|
24
18
|
resource_name 'base_thingy'
|
19
|
+
default_action :create
|
25
20
|
|
26
21
|
class<<self
|
27
22
|
attr_accessor :created_resource
|
@@ -61,11 +56,7 @@ describe "Recipe DSL methods" do
|
|
61
56
|
before(:context) {
|
62
57
|
|
63
58
|
class Chef::Resource::BackcompatThingy < Chef::Resource
|
64
|
-
|
65
|
-
super
|
66
|
-
@allowed_actions = [ :create ]
|
67
|
-
@action = :create
|
68
|
-
end
|
59
|
+
default_action :create
|
69
60
|
end
|
70
61
|
class Chef::Provider::BackcompatThingy < Chef::Provider
|
71
62
|
def load_current_resource
|
@@ -100,7 +91,7 @@ describe "Recipe DSL methods" do
|
|
100
91
|
recipe = converge {
|
101
92
|
backcompat_thingy 'blah' do; end
|
102
93
|
}
|
103
|
-
expect(recipe.logged_warnings).to
|
94
|
+
expect(recipe.logged_warnings).to match(/Class Chef::Provider::BackcompatThingy does not declare 'resource_name :backcompat_thingy'./)
|
104
95
|
expect(BaseThingy.created_resource).not_to be_nil
|
105
96
|
end
|
106
97
|
end
|
@@ -114,19 +105,17 @@ describe "Recipe DSL methods" do
|
|
114
105
|
|
115
106
|
}
|
116
107
|
|
117
|
-
it "bar_thingy
|
118
|
-
|
108
|
+
it "bar_thingy does not work" do
|
109
|
+
expect_converge {
|
119
110
|
bar_thingy 'blah' do; end
|
120
|
-
}
|
121
|
-
expect(recipe.logged_warnings).to eq ''
|
122
|
-
expect(BaseThingy.created_resource).to eq(RecipeDSLSpecNamespace::Bar::BarThingy)
|
111
|
+
}.to raise_error(NoMethodError)
|
123
112
|
end
|
124
113
|
end
|
125
114
|
|
126
|
-
context "With a resource named NoNameThingy with resource_name nil" do
|
115
|
+
context "With a resource named Chef::Resource::NoNameThingy with resource_name nil" do
|
127
116
|
before(:context) {
|
128
117
|
|
129
|
-
class NoNameThingy < BaseThingy
|
118
|
+
class Chef::Resource::NoNameThingy < BaseThingy
|
130
119
|
resource_name nil
|
131
120
|
end
|
132
121
|
|
@@ -134,7 +123,7 @@ describe "Recipe DSL methods" do
|
|
134
123
|
|
135
124
|
it "no_name_thingy does not work" do
|
136
125
|
expect_converge {
|
137
|
-
|
126
|
+
no_name_thingy 'blah' do; end
|
138
127
|
}.to raise_error(NoMethodError)
|
139
128
|
end
|
140
129
|
end
|
@@ -199,6 +188,7 @@ describe "Recipe DSL methods" do
|
|
199
188
|
before(:context) {
|
200
189
|
|
201
190
|
class AnotherNoNameThingy3 < BaseThingy
|
191
|
+
resource_name :another_no_name_thingy_3
|
202
192
|
provides :another_no_name_thingy3, os: 'blarghle'
|
203
193
|
end
|
204
194
|
|
@@ -227,6 +217,7 @@ describe "Recipe DSL methods" do
|
|
227
217
|
before(:context) {
|
228
218
|
|
229
219
|
class AnotherNoNameThingy4 < BaseThingy
|
220
|
+
resource_name :another_no_name_thingy_4
|
230
221
|
provides :another_no_name_thingy4, os: 'blarghle'
|
231
222
|
provides :another_no_name_thingy4, platform_family: 'foo'
|
232
223
|
end
|
@@ -418,6 +409,7 @@ describe "Recipe DSL methods" do
|
|
418
409
|
before {
|
419
410
|
eval <<-EOM, nil, __FILE__, __LINE__+1
|
420
411
|
class #{class_name} < BaseThingy
|
412
|
+
resource_name #{dsl_method.inspect}
|
421
413
|
end
|
422
414
|
EOM
|
423
415
|
}
|
@@ -426,11 +418,12 @@ describe "Recipe DSL methods" do
|
|
426
418
|
eval <<-EOM, nil, __FILE__, __LINE__+1
|
427
419
|
module BlahModule
|
428
420
|
class #{class_name} < BaseThingy
|
421
|
+
resource_name #{dsl_method.inspect}
|
429
422
|
end
|
430
423
|
end
|
431
424
|
EOM
|
432
425
|
}
|
433
|
-
it "two_classes_one_dsl resolves to BlahModule::TwoClassesOneDsl (
|
426
|
+
it "two_classes_one_dsl resolves to BlahModule::TwoClassesOneDsl (alphabetical)" do
|
434
427
|
dsl_method = self.dsl_method
|
435
428
|
recipe = converge {
|
436
429
|
instance_eval("#{dsl_method} 'blah' do; end")
|
@@ -491,6 +484,7 @@ describe "Recipe DSL methods" do
|
|
491
484
|
eval <<-EOM, nil, __FILE__, __LINE__+1
|
492
485
|
module BlahModule
|
493
486
|
class BlahModule::#{class_name} < BaseThingy
|
487
|
+
resource_name #{dsl_method.inspect}
|
494
488
|
provides #{dsl_method.inspect}, os: 'blarghle'
|
495
489
|
end
|
496
490
|
end
|
@@ -572,11 +566,11 @@ describe "Recipe DSL methods" do
|
|
572
566
|
|
573
567
|
}
|
574
568
|
|
575
|
-
it "thingy3 works in a recipe and yields
|
569
|
+
it "thingy3 works in a recipe and yields Thingy3 (the alphabetical one)" do
|
576
570
|
recipe = converge {
|
577
571
|
thingy3 'blah' do; end
|
578
572
|
}
|
579
|
-
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::
|
573
|
+
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::Thingy3
|
580
574
|
end
|
581
575
|
|
582
576
|
it "thingy4 does not work in a recipe" do
|
@@ -586,16 +580,19 @@ describe "Recipe DSL methods" do
|
|
586
580
|
end
|
587
581
|
|
588
582
|
it "resource_matching_short_name returns Thingy4" do
|
589
|
-
expect(Chef::Resource.resource_matching_short_name(:thingy3)).to eq RecipeDSLSpecNamespace::
|
583
|
+
expect(Chef::Resource.resource_matching_short_name(:thingy3)).to eq RecipeDSLSpecNamespace::Thingy3
|
590
584
|
end
|
591
585
|
end
|
592
586
|
end
|
593
587
|
|
594
|
-
context "when Thingy5 has resource_name :thingy5" do
|
588
|
+
context "when Thingy5 has resource_name :thingy5 and provides :thingy5reverse, :thingy5_2 and :thingy5_2reverse" do
|
595
589
|
before(:context) {
|
596
590
|
|
597
591
|
class RecipeDSLSpecNamespace::Thingy5 < BaseThingy
|
598
592
|
resource_name :thingy5
|
593
|
+
provides :thingy5reverse
|
594
|
+
provides :thingy5_2
|
595
|
+
provides :thingy5_2reverse
|
599
596
|
end
|
600
597
|
|
601
598
|
}
|
@@ -611,6 +608,7 @@ describe "Recipe DSL methods" do
|
|
611
608
|
before(:context) {
|
612
609
|
|
613
610
|
class RecipeDSLSpecNamespace::Thingy6 < BaseThingy
|
611
|
+
resource_name :thingy6
|
614
612
|
provides :thingy5
|
615
613
|
end
|
616
614
|
|
@@ -623,23 +621,151 @@ describe "Recipe DSL methods" do
|
|
623
621
|
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::Thingy6
|
624
622
|
end
|
625
623
|
|
626
|
-
it "thingy5 works in a recipe and yields Foo::
|
624
|
+
it "thingy5 works in a recipe and yields Foo::Thingy5 (the alphabetical one)" do
|
627
625
|
recipe = converge {
|
628
626
|
thingy5 'blah' do; end
|
629
627
|
}
|
630
|
-
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::
|
628
|
+
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::Thingy5
|
631
629
|
end
|
632
630
|
|
633
631
|
it "resource_matching_short_name returns Thingy5" do
|
634
632
|
expect(Chef::Resource.resource_matching_short_name(:thingy5)).to eq RecipeDSLSpecNamespace::Thingy5
|
635
633
|
end
|
634
|
+
|
635
|
+
context "and AThingy5 provides :thingy5reverse" do
|
636
|
+
before(:context) {
|
637
|
+
|
638
|
+
class RecipeDSLSpecNamespace::AThingy5 < BaseThingy
|
639
|
+
resource_name :thingy5reverse
|
640
|
+
end
|
641
|
+
|
642
|
+
}
|
643
|
+
|
644
|
+
it "thingy5reverse works in a recipe and yields AThingy5 (the alphabetical one)" do
|
645
|
+
recipe = converge {
|
646
|
+
thingy5reverse 'blah' do; end
|
647
|
+
}
|
648
|
+
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::AThingy5
|
649
|
+
end
|
650
|
+
end
|
651
|
+
|
652
|
+
context "and ZRecipeDSLSpecNamespace::Thingy5 provides :thingy5_2" do
|
653
|
+
before(:context) {
|
654
|
+
|
655
|
+
module ZRecipeDSLSpecNamespace
|
656
|
+
class Thingy5 < BaseThingy
|
657
|
+
resource_name :thingy5_2
|
658
|
+
end
|
659
|
+
end
|
660
|
+
|
661
|
+
}
|
662
|
+
|
663
|
+
it "thingy5_2 works in a recipe and yields the RecipeDSLSpaceNamespace one (the alphabetical one)" do
|
664
|
+
recipe = converge {
|
665
|
+
thingy5_2 'blah' do; end
|
666
|
+
}
|
667
|
+
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::Thingy5
|
668
|
+
end
|
669
|
+
end
|
670
|
+
|
671
|
+
context "and ARecipeDSLSpecNamespace::Thingy5 provides :thingy5_2" do
|
672
|
+
before(:context) {
|
673
|
+
|
674
|
+
module ARecipeDSLSpecNamespace
|
675
|
+
class Thingy5 < BaseThingy
|
676
|
+
resource_name :thingy5_2reverse
|
677
|
+
end
|
678
|
+
end
|
679
|
+
|
680
|
+
}
|
681
|
+
|
682
|
+
it "thingy5_2reverse works in a recipe and yields the ARecipeDSLSpaceNamespace one (the alphabetical one)" do
|
683
|
+
recipe = converge {
|
684
|
+
thingy5_2reverse 'blah' do; end
|
685
|
+
}
|
686
|
+
expect(BaseThingy.created_resource).to eq ARecipeDSLSpecNamespace::Thingy5
|
687
|
+
end
|
688
|
+
end
|
636
689
|
end
|
690
|
+
|
691
|
+
context "when Thingy3 has resource_name :thingy3" do
|
692
|
+
before(:context) {
|
693
|
+
|
694
|
+
class RecipeDSLSpecNamespace::Thingy3 < BaseThingy
|
695
|
+
resource_name :thingy3
|
696
|
+
end
|
697
|
+
|
698
|
+
}
|
699
|
+
|
700
|
+
it "thingy3 works in a recipe" do
|
701
|
+
expect_recipe {
|
702
|
+
thingy3 'blah' do; end
|
703
|
+
}.to emit_no_warnings_or_errors
|
704
|
+
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::Thingy3
|
705
|
+
end
|
706
|
+
|
707
|
+
context "and Thingy4 has resource_name :thingy3" do
|
708
|
+
before(:context) {
|
709
|
+
|
710
|
+
class RecipeDSLSpecNamespace::Thingy4 < BaseThingy
|
711
|
+
resource_name :thingy3
|
712
|
+
end
|
713
|
+
|
714
|
+
}
|
715
|
+
|
716
|
+
it "thingy3 works in a recipe and yields Thingy3 (the alphabetical one)" do
|
717
|
+
recipe = converge {
|
718
|
+
thingy3 'blah' do; end
|
719
|
+
}
|
720
|
+
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::Thingy3
|
721
|
+
end
|
722
|
+
|
723
|
+
it "thingy4 does not work in a recipe" do
|
724
|
+
expect_converge {
|
725
|
+
thingy4 'blah' do; end
|
726
|
+
}.to raise_error(NoMethodError)
|
727
|
+
end
|
728
|
+
|
729
|
+
it "resource_matching_short_name returns Thingy4" do
|
730
|
+
expect(Chef::Resource.resource_matching_short_name(:thingy3)).to eq RecipeDSLSpecNamespace::Thingy3
|
731
|
+
end
|
732
|
+
end
|
733
|
+
|
734
|
+
context "and Thingy4 has resource_name :thingy3" do
|
735
|
+
before(:context) {
|
736
|
+
|
737
|
+
class RecipeDSLSpecNamespace::Thingy4 < BaseThingy
|
738
|
+
resource_name :thingy3
|
739
|
+
end
|
740
|
+
|
741
|
+
}
|
742
|
+
|
743
|
+
it "thingy3 works in a recipe and yields Thingy3 (the alphabetical one)" do
|
744
|
+
recipe = converge {
|
745
|
+
thingy3 'blah' do; end
|
746
|
+
}
|
747
|
+
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::Thingy3
|
748
|
+
end
|
749
|
+
|
750
|
+
it "thingy4 does not work in a recipe" do
|
751
|
+
expect_converge {
|
752
|
+
thingy4 'blah' do; end
|
753
|
+
}.to raise_error(NoMethodError)
|
754
|
+
end
|
755
|
+
|
756
|
+
it "resource_matching_short_name returns Thingy4" do
|
757
|
+
expect(Chef::Resource.resource_matching_short_name(:thingy3)).to eq RecipeDSLSpecNamespace::Thingy3
|
758
|
+
end
|
759
|
+
end
|
760
|
+
end
|
761
|
+
|
637
762
|
end
|
638
763
|
|
639
764
|
context "when Thingy7 provides :thingy8" do
|
640
765
|
before(:context) {
|
641
766
|
|
642
767
|
class RecipeDSLSpecNamespace::Thingy7 < BaseThingy
|
768
|
+
resource_name :thingy7
|
643
769
|
provides :thingy8
|
644
770
|
end
|
645
771
|
|
@@ -661,11 +787,11 @@ describe "Recipe DSL methods" do
|
|
661
787
|
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::Thingy7
|
662
788
|
end
|
663
789
|
|
664
|
-
it "thingy8 works in a recipe and yields
|
790
|
+
it "thingy8 works in a recipe and yields Thingy7 (alphabetical)" do
|
665
791
|
recipe = converge {
|
666
792
|
thingy8 'blah' do; end
|
667
793
|
}
|
668
|
-
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::
|
794
|
+
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::Thingy7
|
669
795
|
end
|
670
796
|
|
671
797
|
it "resource_matching_short_name returns Thingy8" do
|
@@ -674,36 +800,36 @@ describe "Recipe DSL methods" do
|
|
674
800
|
end
|
675
801
|
end
|
676
802
|
|
677
|
-
context "when
|
803
|
+
context "when Thingy12 provides :thingy12, :twizzle and :twizzle2" do
|
678
804
|
before(:context) {
|
679
805
|
|
680
|
-
class RecipeDSLSpecNamespace::
|
681
|
-
resource_name :
|
806
|
+
class RecipeDSLSpecNamespace::Thingy12 < BaseThingy
|
807
|
+
resource_name :thingy12
|
682
808
|
provides :twizzle
|
683
809
|
provides :twizzle2
|
684
810
|
end
|
685
811
|
|
686
812
|
}
|
687
813
|
|
688
|
-
it "
|
814
|
+
it "thingy12 works in a recipe and yields Thingy12" do
|
689
815
|
expect_recipe {
|
690
|
-
|
816
|
+
thingy12 'blah' do; end
|
691
817
|
}.to emit_no_warnings_or_errors
|
692
|
-
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::
|
818
|
+
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::Thingy12
|
693
819
|
end
|
694
820
|
|
695
|
-
it "twizzle works in a recipe and yields
|
821
|
+
it "twizzle works in a recipe and yields Thingy12" do
|
696
822
|
expect_recipe {
|
697
823
|
twizzle 'blah' do; end
|
698
824
|
}.to emit_no_warnings_or_errors
|
699
|
-
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::
|
825
|
+
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::Thingy12
|
700
826
|
end
|
701
827
|
|
702
|
-
it "twizzle2 works in a recipe and yields
|
828
|
+
it "twizzle2 works in a recipe and yields Thingy12" do
|
703
829
|
expect_recipe {
|
704
830
|
twizzle2 'blah' do; end
|
705
831
|
}.to emit_no_warnings_or_errors
|
706
|
-
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::
|
832
|
+
expect(BaseThingy.created_resource).to eq RecipeDSLSpecNamespace::Thingy12
|
707
833
|
end
|
708
834
|
end
|
709
835
|
|
@@ -752,6 +878,95 @@ describe "Recipe DSL methods" do
|
|
752
878
|
}.to raise_error(Chef::Exceptions::NoSuchResourceType)
|
753
879
|
end
|
754
880
|
end
|
881
|
+
|
882
|
+
context "when Thingy9 provides :thingy9" do
|
883
|
+
before(:context) {
|
884
|
+
class RecipeDSLSpecNamespace::Thingy9 < BaseThingy
|
885
|
+
resource_name :thingy9
|
886
|
+
end
|
887
|
+
}
|
888
|
+
|
889
|
+
it "declaring a resource providing the same :thingy9 produces a warning" do
|
890
|
+
expect(Chef::Log).to receive(:warn).with("You declared a new resource RecipeDSLSpecNamespace::Thingy9AlternateProvider for resource thingy9, but it comes alphabetically after RecipeDSLSpecNamespace::Thingy9 and has the same filters ({}), so it will not be used. Use override: true if you want to use it for thingy9.")
|
891
|
+
class RecipeDSLSpecNamespace::Thingy9AlternateProvider < BaseThingy
|
892
|
+
resource_name :thingy9
|
893
|
+
end
|
894
|
+
end
|
895
|
+
end
|
896
|
+
|
897
|
+
context "when Thingy10 provides :thingy10" do
|
898
|
+
before(:context) {
|
899
|
+
class RecipeDSLSpecNamespace::Thingy10 < BaseThingy
|
900
|
+
resource_name :thingy10
|
901
|
+
end
|
902
|
+
}
|
903
|
+
|
904
|
+
it "declaring a resource providing the same :thingy10 with override: true does not produce a warning" do
|
905
|
+
expect(Chef::Log).not_to receive(:warn)
|
906
|
+
class RecipeDSLSpecNamespace::Thingy10AlternateProvider < BaseThingy
|
907
|
+
provides :thingy10, override: true
|
908
|
+
end
|
909
|
+
end
|
910
|
+
end
|
911
|
+
|
912
|
+
context "when Thingy11 provides :thingy11" do
|
913
|
+
before(:context) {
|
914
|
+
class RecipeDSLSpecNamespace::Thingy11 < BaseThingy
|
915
|
+
resource_name :thingy10
|
916
|
+
end
|
917
|
+
}
|
918
|
+
|
919
|
+
it "declaring a resource providing the same :thingy11 with os: 'linux' does not produce a warning" do
|
920
|
+
expect(Chef::Log).not_to receive(:warn)
|
921
|
+
class RecipeDSLSpecNamespace::Thingy11AlternateProvider < BaseThingy
|
922
|
+
provides :thingy11, os: 'linux'
|
923
|
+
end
|
924
|
+
end
|
925
|
+
end
|
926
|
+
end
|
927
|
+
end
|
928
|
+
|
929
|
+
before(:all) { Namer.current_index = 0 }
|
930
|
+
before { Namer.current_index += 1 }
|
931
|
+
|
932
|
+
context "with an LWRP that declares actions" do
|
933
|
+
let(:resource_class) {
|
934
|
+
Class.new(Chef::Resource::LWRPBase) do
|
935
|
+
provides :"recipe_dsl_spec#{Namer.current_index}"
|
936
|
+
actions :create
|
937
|
+
end
|
938
|
+
}
|
939
|
+
let(:resource) {
|
940
|
+
resource_class.new("blah", run_context)
|
941
|
+
}
|
942
|
+
it "The actions are part of actions along with :nothing" do
|
943
|
+
expect(resource_class.actions).to eq [ :nothing, :create ]
|
944
|
+
end
|
945
|
+
it "The actions are part of allowed_actions along with :nothing" do
|
946
|
+
expect(resource.allowed_actions).to eq [ :nothing, :create ]
|
947
|
+
end
|
948
|
+
|
949
|
+
context "and a subclass that declares more actions" do
|
950
|
+
let(:subresource_class) {
|
951
|
+
Class.new(Chef::Resource::LWRPBase) do
|
952
|
+
provides :"recipe_dsl_spec_sub#{Namer.current_index}"
|
953
|
+
actions :delete
|
954
|
+
end
|
955
|
+
}
|
956
|
+
let(:subresource) {
|
957
|
+
subresource_class.new("subblah", run_context)
|
958
|
+
}
|
959
|
+
|
960
|
+
it "The parent class actions are not part of actions" do
|
961
|
+
expect(subresource_class.actions).to eq [ :nothing, :delete ]
|
962
|
+
end
|
963
|
+
it "The parent class actions are not part of allowed_actions" do
|
964
|
+
expect(subresource.allowed_actions).to eq [ :nothing, :delete ]
|
965
|
+
end
|
966
|
+
it "The parent class actions do not change" do
|
967
|
+
expect(resource_class.actions).to eq [ :nothing, :create ]
|
968
|
+
expect(resource.allowed_actions).to eq [ :nothing, :create ]
|
969
|
+
end
|
755
970
|
end
|
756
971
|
end
|
757
972
|
end
|