chef 11.16.4 → 11.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +2 -2
- data/lib/chef/api_client.rb +1 -1
- data/lib/chef/chef_fs/chef_fs_data_store.rb +3 -2
- data/lib/chef/chef_fs/command_line.rb +3 -2
- data/lib/chef/chef_fs/data_handler/group_data_handler.rb +5 -1
- data/lib/chef/chef_fs/file_system/acl_entry.rb +2 -1
- data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +2 -1
- data/lib/chef/chef_fs/file_system/rest_list_dir.rb +3 -2
- data/lib/chef/chef_fs/file_system/rest_list_entry.rb +5 -4
- data/lib/chef/config_fetcher.rb +1 -1
- data/lib/chef/cookbook/cookbook_version_loader.rb +4 -4
- data/lib/chef/cookbook/metadata.rb +1 -1
- data/lib/chef/cookbook_version.rb +2 -2
- data/lib/chef/data_bag.rb +1 -1
- data/lib/chef/data_bag_item.rb +1 -1
- data/lib/chef/encrypted_data_bag_item/decryptor.rb +3 -3
- data/lib/chef/environment.rb +1 -1
- data/lib/chef/exceptions.rb +19 -2
- data/lib/chef/json_compat.rb +64 -45
- data/lib/chef/knife/bootstrap.rb +2 -2
- data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/chef-aix.erb +2 -2
- data/lib/chef/knife/bootstrap/chef-full.erb +2 -2
- data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +2 -2
- data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +2 -2
- data/lib/chef/knife/cookbook_site_download.rb +1 -1
- data/lib/chef/knife/cookbook_site_install.rb +34 -10
- data/lib/chef/knife/cookbook_site_list.rb +1 -1
- data/lib/chef/knife/cookbook_site_search.rb +1 -1
- data/lib/chef/knife/cookbook_site_share.rb +2 -2
- data/lib/chef/knife/cookbook_site_show.rb +3 -3
- data/lib/chef/knife/cookbook_site_unshare.rb +1 -1
- data/lib/chef/knife/core/subcommand_loader.rb +24 -0
- data/lib/chef/knife/deps.rb +3 -2
- data/lib/chef/node.rb +1 -1
- data/lib/chef/provider/deploy/revision.rb +1 -1
- data/lib/chef/provider/dsc_script.rb +32 -5
- data/lib/chef/provider/env.rb +25 -10
- data/lib/chef/provider/remote_file/cache_control_data.rb +1 -1
- data/lib/chef/resource.rb +1 -1
- data/lib/chef/resource/dsc_script.rb +2 -16
- data/lib/chef/resource_collection.rb +1 -1
- data/lib/chef/resource_reporter.rb +3 -3
- data/lib/chef/role.rb +1 -1
- data/lib/chef/run_list.rb +1 -1
- data/lib/chef/user.rb +1 -1
- data/lib/chef/util/dsc/local_configuration_manager.rb +15 -11
- data/lib/chef/util/powershell/cmdlet_result.rb +2 -2
- data/lib/chef/version.rb +1 -2
- data/spec/data/bootstrap/test-hints.erb +1 -1
- data/spec/data/bootstrap/test.erb +1 -1
- data/spec/functional/knife/cookbook_delete_spec.rb +3 -3
- data/spec/functional/knife/exec_spec.rb +1 -1
- data/spec/functional/resource/dsc_script_spec.rb +92 -47
- data/spec/functional/resource/env_spec.rb +3 -4
- data/spec/functional/util/powershell/cmdlet_spec.rb +1 -2
- data/spec/integration/knife/chef_fs_data_store_spec.rb +1 -1
- data/spec/integration/knife/chef_repo_path_spec.rb +6 -1
- data/spec/integration/knife/chef_repository_file_system_spec.rb +1 -1
- data/spec/integration/knife/chefignore_spec.rb +1 -1
- data/spec/integration/knife/common_options_spec.rb +1 -1
- data/spec/integration/knife/cookbook_api_ipv6_spec.rb +1 -1
- data/spec/integration/knife/delete_spec.rb +1 -1
- data/spec/integration/knife/deps_spec.rb +1 -1
- data/spec/integration/knife/diff_spec.rb +3 -3
- data/spec/integration/knife/download_spec.rb +3 -3
- data/spec/integration/knife/list_spec.rb +1 -1
- data/spec/integration/knife/raw_spec.rb +11 -1
- data/spec/integration/knife/redirection_spec.rb +1 -1
- data/spec/integration/knife/serve_spec.rb +1 -1
- data/spec/integration/knife/show_spec.rb +1 -1
- data/spec/integration/knife/upload_spec.rb +9 -9
- data/spec/spec_helper.rb +6 -0
- data/spec/support/shared/integration/integration_helper.rb +1 -2
- data/spec/support/shared/shared_examples.rb +10 -0
- data/spec/tiny_server.rb +2 -1
- data/spec/unit/api_client_spec.rb +3 -3
- data/spec/unit/chef_fs/data_handler/group_handler_spec.rb +63 -0
- data/spec/unit/config_fetcher_spec.rb +1 -1
- data/spec/unit/cookbook/metadata_spec.rb +7 -3
- data/spec/unit/cookbook_loader_spec.rb +1 -1
- data/spec/unit/cookbook_version_spec.rb +4 -0
- data/spec/unit/data_bag_item_spec.rb +5 -1
- data/spec/unit/data_bag_spec.rb +5 -1
- data/spec/unit/deprecation_spec.rb +1 -1
- data/spec/unit/encrypted_data_bag_item_spec.rb +14 -7
- data/spec/unit/environment_spec.rb +7 -3
- data/spec/unit/exceptions_spec.rb +6 -0
- data/spec/unit/json_compat_spec.rb +58 -17
- data/spec/unit/knife/cookbook_metadata_from_file_spec.rb +0 -1
- data/spec/unit/knife/cookbook_site_download_spec.rb +2 -1
- data/spec/unit/knife/cookbook_site_install_spec.rb +161 -116
- data/spec/unit/knife/cookbook_site_share_spec.rb +6 -6
- data/spec/unit/knife/core/bootstrap_context_spec.rb +2 -2
- data/spec/unit/knife/core/subcommand_loader_spec.rb +66 -1
- data/spec/unit/knife/data_bag_from_file_spec.rb +1 -2
- data/spec/unit/node_spec.rb +4 -0
- data/spec/unit/provider/dsc_script_spec.rb +134 -105
- data/spec/unit/provider/env/windows_spec.rb +2 -2
- data/spec/unit/provider/env_spec.rb +76 -11
- data/spec/unit/provider/remote_file/cache_control_data_spec.rb +1 -1
- data/spec/unit/resource/dsc_script_spec.rb +0 -29
- data/spec/unit/resource_collection_spec.rb +5 -1
- data/spec/unit/resource_reporter_spec.rb +3 -3
- data/spec/unit/resource_spec.rb +5 -1
- data/spec/unit/role_spec.rb +4 -0
- data/spec/unit/run_list_spec.rb +5 -1
- data/spec/unit/user_spec.rb +5 -1
- data/spec/unit/util/dsc/local_configuration_manager_spec.rb +15 -10
- metadata +11 -9
data/lib/chef/provider/env.rb
CHANGED
@@ -58,20 +58,22 @@ class Chef
|
|
58
58
|
# ==== Returns
|
59
59
|
# <true>:: If a change is required
|
60
60
|
# <false>:: If a change is not required
|
61
|
-
def
|
61
|
+
def requires_modify_or_create?
|
62
62
|
if @new_resource.delim
|
63
63
|
#e.g. check for existing value within PATH
|
64
|
-
not
|
65
|
-
val
|
64
|
+
not new_values.all? do |val|
|
65
|
+
current_values.include? val
|
66
66
|
end
|
67
67
|
else
|
68
68
|
@new_resource.value != @current_resource.value
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
+
alias_method :compare_value, :requires_modify_or_create?
|
73
|
+
|
72
74
|
def action_create
|
73
75
|
if @key_exists
|
74
|
-
if
|
76
|
+
if requires_modify_or_create?
|
75
77
|
modify_env
|
76
78
|
Chef::Log.info("#{@new_resource} altered")
|
77
79
|
@new_resource.updated_by_last_action(true)
|
@@ -91,13 +93,14 @@ class Chef
|
|
91
93
|
# after we removed the element.
|
92
94
|
def delete_element
|
93
95
|
return false unless @new_resource.delim #no delim: delete the key
|
94
|
-
|
96
|
+
needs_delete = new_values.any? { |v| current_values.include?(v) }
|
97
|
+
if !needs_delete
|
95
98
|
Chef::Log.debug("#{@new_resource} element '#{@new_resource.value}' does not exist")
|
96
99
|
return true #do not delete the key
|
97
100
|
else
|
98
101
|
new_value =
|
99
|
-
|
100
|
-
|
102
|
+
current_values.select { |item|
|
103
|
+
not new_values.include?(item)
|
101
104
|
}.join(@new_resource.delim)
|
102
105
|
|
103
106
|
if new_value.empty?
|
@@ -122,7 +125,7 @@ class Chef
|
|
122
125
|
|
123
126
|
def action_modify
|
124
127
|
if @key_exists
|
125
|
-
if
|
128
|
+
if requires_modify_or_create?
|
126
129
|
modify_env
|
127
130
|
Chef::Log.info("#{@new_resource} modified")
|
128
131
|
@new_resource.updated_by_last_action(true)
|
@@ -142,11 +145,23 @@ class Chef
|
|
142
145
|
|
143
146
|
def modify_env
|
144
147
|
if @new_resource.delim
|
145
|
-
|
146
|
-
|
148
|
+
values = new_values.reject do |v|
|
149
|
+
current_values.include?(v)
|
150
|
+
end
|
151
|
+
@new_resource.value((values + [@current_resource.value]).join(@new_resource.delim))
|
147
152
|
end
|
148
153
|
create_env
|
149
154
|
end
|
155
|
+
|
156
|
+
# Returns the current values to split by delimiter
|
157
|
+
def current_values
|
158
|
+
@current_values ||= @current_resource.value.split(@new_resource.delim)
|
159
|
+
end
|
160
|
+
|
161
|
+
# Returns the new values to split by delimiter
|
162
|
+
def new_values
|
163
|
+
@new_values ||= @new_resource.value.split(@new_resource.delim)
|
164
|
+
end
|
150
165
|
end
|
151
166
|
end
|
152
167
|
end
|
@@ -140,7 +140,7 @@ class Chef
|
|
140
140
|
|
141
141
|
def load_data
|
142
142
|
Chef::JSONCompat.from_json(load_json_data)
|
143
|
-
rescue Chef::Exceptions::FileNotFound, FFI_Yajl::ParseError, JSON::
|
143
|
+
rescue Chef::Exceptions::FileNotFound, FFI_Yajl::ParseError, Chef::Exceptions::JSON::ParseError
|
144
144
|
false
|
145
145
|
end
|
146
146
|
|
data/lib/chef/resource.rb
CHANGED
@@ -28,12 +28,8 @@ class Chef
|
|
28
28
|
super
|
29
29
|
@allowed_actions.push(:run)
|
30
30
|
@action = :run
|
31
|
-
|
32
|
-
|
33
|
-
else
|
34
|
-
raise Chef::Exceptions::NoProviderAvailable,
|
35
|
-
"#{powershell_info_str(run_context)}\nPowershell 4.0 or higher was not detected on your system and is required to use the dsc_script resource."
|
36
|
-
end
|
31
|
+
@provider = Chef::Provider::DscScript
|
32
|
+
@resource_name = :dsc_script
|
37
33
|
end
|
38
34
|
|
39
35
|
def code(arg=nil)
|
@@ -125,16 +121,6 @@ class Chef
|
|
125
121
|
:kind_of => [ Integer ]
|
126
122
|
)
|
127
123
|
end
|
128
|
-
|
129
|
-
private
|
130
|
-
|
131
|
-
def powershell_info_str(run_context)
|
132
|
-
if run_context && run_context.node[:languages] && run_context.node[:languages][:powershell]
|
133
|
-
install_info = "Powershell #{run_context.node[:languages][:powershell][:version]} was found on the system."
|
134
|
-
else
|
135
|
-
install_info = 'Powershell was not found.'
|
136
|
-
end
|
137
|
-
end
|
138
124
|
end
|
139
125
|
end
|
140
126
|
end
|
@@ -230,7 +230,7 @@ class Chef
|
|
230
230
|
resource_history_url = "reports/nodes/#{node_name}/runs/#{run_id}"
|
231
231
|
Chef::Log.info("Sending resource update report (run-id: #{run_id})")
|
232
232
|
Chef::Log.debug run_data.inspect
|
233
|
-
compressed_data = encode_gzip(
|
233
|
+
compressed_data = encode_gzip(Chef::JSONCompat.to_json(run_data))
|
234
234
|
Chef::Log.debug("Sending compressed run data...")
|
235
235
|
# Since we're posting compressed data we can not directly call post_rest which expects JSON
|
236
236
|
reporting_url = @rest_client.create_url(resource_history_url)
|
@@ -273,7 +273,7 @@ class Chef
|
|
273
273
|
resource_record.for_json
|
274
274
|
end
|
275
275
|
run_data["status"] = @status
|
276
|
-
run_data["run_list"] = @run_status.node.run_list
|
276
|
+
run_data["run_list"] = Chef::JSONCompat.to_json(@run_status.node.run_list)
|
277
277
|
run_data["total_res_count"] = @total_res_count.to_s
|
278
278
|
run_data["data"] = {}
|
279
279
|
run_data["start_time"] = start_time.to_s
|
@@ -283,7 +283,7 @@ class Chef
|
|
283
283
|
exception_data = {}
|
284
284
|
exception_data["class"] = exception.inspect
|
285
285
|
exception_data["message"] = exception.message
|
286
|
-
exception_data["backtrace"] = exception.backtrace
|
286
|
+
exception_data["backtrace"] = Chef::JSONCompat.to_json(exception.backtrace)
|
287
287
|
exception_data["description"] = @error_descriptions
|
288
288
|
run_data["data"]["exception"] = exception_data
|
289
289
|
end
|
data/lib/chef/role.rb
CHANGED
data/lib/chef/run_list.rb
CHANGED
data/lib/chef/user.rb
CHANGED
@@ -29,7 +29,7 @@ class Chef::Util::DSC
|
|
29
29
|
|
30
30
|
def test_configuration(configuration_document)
|
31
31
|
status = run_configuration_cmdlet(configuration_document)
|
32
|
-
|
32
|
+
log_what_if_exception(status.stderr) unless status.succeeded?
|
33
33
|
configuration_update_required?(status.return_value)
|
34
34
|
end
|
35
35
|
|
@@ -78,18 +78,22 @@ $ProgressPreference = 'SilentlyContinue';start-dscconfiguration -path #{@configu
|
|
78
78
|
EOH
|
79
79
|
end
|
80
80
|
|
81
|
-
def
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
81
|
+
def log_what_if_exception(what_if_exception_output)
|
82
|
+
if whatif_not_supported?(what_if_exception_output)
|
83
|
+
# LCM returns an error if any of the resources do not support the opptional What-If
|
84
|
+
Chef::Log::warn("Received error while testing configuration due to resource not supporting 'WhatIf'")
|
85
|
+
elsif dsc_module_import_failure?(what_if_exception_output)
|
86
|
+
Chef::Log::warn("Received error while testing configuration due to a module for an imported resource possibly not being fully installed:\n#{what_if_exception_output.gsub(/\s+/, ' ')}")
|
87
|
+
else
|
88
|
+
Chef::Log::warn("Received error while testing configuration:\n#{what_if_exception_output.gsub(/\s+/, ' ')}")
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def whatif_not_supported?(what_if_exception_output)
|
93
|
+
!! (what_if_exception_output.gsub(/[\r\n]+/, '').gsub(/\s+/, ' ') =~ /A parameter cannot be found that matches parameter name 'Whatif'/i)
|
90
94
|
end
|
91
95
|
|
92
|
-
def
|
96
|
+
def dsc_module_import_failure?(what_if_output)
|
93
97
|
!! (what_if_output =~ /\sCimException/ &&
|
94
98
|
what_if_output =~ /ProviderOperationExecutionFailure/ &&
|
95
99
|
what_if_output =~ /\smodule\s+is\s+installed/)
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require '
|
19
|
+
require 'chef/json_compat'
|
20
20
|
|
21
21
|
class Chef::Util::Powershell
|
22
22
|
class CmdletResult
|
@@ -33,7 +33,7 @@ class Chef::Util::Powershell
|
|
33
33
|
|
34
34
|
def return_value
|
35
35
|
if output_format == :object
|
36
|
-
|
36
|
+
Chef::JSONCompat.parse(@status.stdout)
|
37
37
|
else
|
38
38
|
@status.stdout
|
39
39
|
end
|
data/lib/chef/version.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
# Author:: Daniel DeLeo (<dan@opscode.com>)
|
3
2
|
# Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
|
4
3
|
# License:: Apache License, Version 2.0
|
@@ -17,7 +16,7 @@
|
|
17
16
|
|
18
17
|
class Chef
|
19
18
|
CHEF_ROOT = File.dirname(File.expand_path(File.dirname(__FILE__)))
|
20
|
-
VERSION = '11.
|
19
|
+
VERSION = '11.18.0'
|
21
20
|
end
|
22
21
|
|
23
22
|
# NOTE: the Chef::Version class is defined in version_class.rb
|
@@ -1 +1 @@
|
|
1
|
-
<%=
|
1
|
+
<%= Chef::JSONCompat.to_json(first_boot) %>
|
@@ -47,7 +47,7 @@ describe Chef::Knife::CookbookDelete do
|
|
47
47
|
Chef::Log.level = :debug
|
48
48
|
|
49
49
|
@knife.name_args = %w{no-such-cookbook}
|
50
|
-
@api.get("/cookbooks/no-such-cookbook", 404, {'error'=>'dear Tim, no. -Sent from my iPad'}
|
50
|
+
@api.get("/cookbooks/no-such-cookbook", 404, Chef::JSONCompat.to_json({'error'=>'dear Tim, no. -Sent from my iPad'}))
|
51
51
|
end
|
52
52
|
|
53
53
|
it "logs an error and exits" do
|
@@ -62,7 +62,7 @@ describe Chef::Knife::CookbookDelete do
|
|
62
62
|
before do
|
63
63
|
@knife.name_args = %w{obsolete-cookbook}
|
64
64
|
@cookbook_list = {'obsolete-cookbook' => { 'versions' => ['version' => '1.0.0']} }
|
65
|
-
@api.get("/cookbooks/obsolete-cookbook", 200, @cookbook_list
|
65
|
+
@api.get("/cookbooks/obsolete-cookbook", 200, Chef::JSONCompat.to_json(@cookbook_list))
|
66
66
|
end
|
67
67
|
|
68
68
|
it "asks for confirmation, then deletes the cookbook" do
|
@@ -105,7 +105,7 @@ describe Chef::Knife::CookbookDelete do
|
|
105
105
|
versions = ['1.0.0', '1.1.0', '1.2.0']
|
106
106
|
with_version = lambda { |version| { 'version' => version } }
|
107
107
|
@cookbook_list = {'obsolete-cookbook' => { 'versions' => versions.map(&with_version) } }
|
108
|
-
@api.get("/cookbooks/obsolete-cookbook", 200, @cookbook_list
|
108
|
+
@api.get("/cookbooks/obsolete-cookbook", 200, Chef::JSONCompat.to_json(@cookbook_list))
|
109
109
|
end
|
110
110
|
|
111
111
|
it "deletes all versions of a cookbook when given the '-a' flag" do
|
@@ -47,7 +47,7 @@ describe Chef::Knife::Exec do
|
|
47
47
|
@node = Chef::Node.new
|
48
48
|
@node.name("ohai-world")
|
49
49
|
response = {"rows" => [@node],"start" => 0,"total" => 1}
|
50
|
-
@api.get(%r{^/search/node}, 200,
|
50
|
+
@api.get(%r{^/search/node}, 200, Chef::JSONCompat.to_json(response))
|
51
51
|
code = "$output.puts nodes.all"
|
52
52
|
@knife.config[:exec] = code
|
53
53
|
@knife.run
|
@@ -81,17 +81,28 @@ describe Chef::Resource::DscScript, :windows_powershell_dsc_only do
|
|
81
81
|
let(:test_registry_value) { 'Registration' }
|
82
82
|
let(:test_registry_data1) { 'LL927' }
|
83
83
|
let(:test_registry_data2) { 'LL928' }
|
84
|
-
let(:
|
84
|
+
let(:reg_key_name_param_name) { 'testregkeyname' }
|
85
|
+
let(:reg_key_value_param_name) { 'testregvaluename' }
|
86
|
+
let(:registry_embedded_parameters) { "$#{reg_key_name_param_name} = '#{test_registry_key}';$#{reg_key_value_param_name} = '#{test_registry_value}'"}
|
87
|
+
let(:dsc_reg_code) { <<-EOH
|
88
|
+
#{registry_embedded_parameters}
|
85
89
|
Registry "ChefRegKey"
|
86
90
|
{
|
87
|
-
Key =
|
88
|
-
ValueName =
|
91
|
+
Key = $#{reg_key_name_param_name}
|
92
|
+
ValueName = $#{reg_key_value_param_name}
|
89
93
|
ValueData = '#{test_registry_data}'
|
90
94
|
Ensure = 'Present'
|
91
95
|
}
|
92
96
|
EOH
|
93
97
|
}
|
94
98
|
|
99
|
+
let(:dsc_code) { dsc_reg_code }
|
100
|
+
let(:dsc_reg_script) { <<-EOH
|
101
|
+
param($testregkeyname, $testregvaluename)
|
102
|
+
#{dsc_reg_code}
|
103
|
+
EOH
|
104
|
+
}
|
105
|
+
|
95
106
|
let(:dsc_user_prefix) { 'dsc' }
|
96
107
|
let(:dsc_user_suffix) { 'chefx' }
|
97
108
|
let(:dsc_user) {"#{dsc_user_prefix}_usr_#{dsc_user_suffix}" }
|
@@ -175,7 +186,7 @@ environment "whatsmydir"
|
|
175
186
|
Ensure = 'Present'
|
176
187
|
}
|
177
188
|
EOH
|
178
|
-
|
189
|
+
}
|
179
190
|
|
180
191
|
let(:dsc_config_name) {
|
181
192
|
dsc_test_resource_base.name
|
@@ -227,41 +238,79 @@ environment 'removethis'
|
|
227
238
|
EOH
|
228
239
|
removal_resource.run_action(:run)
|
229
240
|
end
|
230
|
-
let(:dsc_code) { dsc_environment_config }
|
231
|
-
it 'should not raise an exception if the cwd is not etc' do
|
232
|
-
dsc_test_resource.cwd(dsc_environment_no_fail_not_etc_directory)
|
233
|
-
expect {dsc_test_resource.run_action(:run)}.not_to raise_error
|
234
|
-
end
|
235
241
|
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
dsc_test_resource.run_action(:run)
|
241
|
-
|
242
|
-
|
242
|
+
describe 'when the DSC configuration contains code that raises an exception if cwd has a specific value' do
|
243
|
+
let(:dsc_code) { dsc_environment_config }
|
244
|
+
it 'should not raise an exception if the cwd is not etc' do
|
245
|
+
dsc_test_resource.cwd(dsc_environment_no_fail_not_etc_directory)
|
246
|
+
expect {dsc_test_resource.run_action(:run)}.not_to raise_error
|
247
|
+
end
|
248
|
+
|
249
|
+
it 'should raise an exception if the cwd is etc' do
|
250
|
+
dsc_test_resource.cwd(dsc_environment_fail_etc_directory)
|
251
|
+
expect {dsc_test_resource.run_action(:run)}.to raise_error(Chef::Exceptions::PowershellCmdletException)
|
252
|
+
begin
|
253
|
+
dsc_test_resource.run_action(:run)
|
254
|
+
rescue Chef::Exceptions::PowershellCmdletException => e
|
255
|
+
expect(e.message).to match(exception_message_signature)
|
256
|
+
end
|
243
257
|
end
|
244
258
|
end
|
245
259
|
end
|
246
260
|
|
247
261
|
shared_examples_for 'a parameterized DSC configuration script' do
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
262
|
+
let(:dsc_user_prefix_code) { dsc_user_prefix_env_code }
|
263
|
+
let(:dsc_user_suffix_code) { dsc_user_suffix_env_code }
|
264
|
+
it_behaves_like 'a dsc_script with configuration that uses environment variables'
|
265
|
+
end
|
266
|
+
|
267
|
+
shared_examples_for 'a dsc_script without configuration data that takes parameters' do
|
268
|
+
context 'when configuration data is not specified' do
|
269
|
+
|
270
|
+
before(:each) do
|
271
|
+
test_key_resource = Chef::Resource::RegistryKey.new(test_registry_key, dsc_test_run_context)
|
272
|
+
test_key_resource.recursive(true)
|
273
|
+
test_key_resource.run_action(:delete_key)
|
274
|
+
end
|
275
|
+
|
276
|
+
after(:each) do
|
277
|
+
test_key_resource = Chef::Resource::RegistryKey.new(test_registry_key, dsc_test_run_context)
|
278
|
+
test_key_resource.recursive(true)
|
279
|
+
test_key_resource.run_action(:delete_key)
|
280
|
+
end
|
281
|
+
|
282
|
+
let(:test_registry_data) { test_registry_data1 }
|
283
|
+
let(:dsc_parameterized_env_param_value) { "val" + Random::rand.to_s }
|
284
|
+
|
285
|
+
it 'should have a default value of nil for the configuration_data attribute' do
|
286
|
+
expect(dsc_test_resource.configuration_data).to eql(nil)
|
287
|
+
end
|
288
|
+
|
289
|
+
it 'should have a default value of nil for the configuration_data_path attribute' do
|
290
|
+
expect(dsc_test_resource.configuration_data_script).to eql(nil)
|
291
|
+
end
|
292
|
+
|
293
|
+
let(:dsc_test_resource) { dsc_resource_from_path }
|
294
|
+
let(:registry_embedded_parameters) { '' }
|
295
|
+
let(:dsc_code) { dsc_reg_script }
|
296
|
+
|
297
|
+
it 'should set a registry key according to parameters passed to the configuration' do
|
298
|
+
dsc_test_resource.configuration_name(config_name_value)
|
299
|
+
dsc_test_resource.flags({:"#{reg_key_name_param_name}" => test_registry_key, :"#{reg_key_value_param_name}" => test_registry_value})
|
300
|
+
expect(dsc_test_resource.registry_key_exists?(test_registry_key)).to eq(false)
|
301
|
+
dsc_test_resource.run_action(:run)
|
302
|
+
expect(dsc_test_resource.registry_key_exists?(test_registry_key)).to eq(true)
|
303
|
+
expect(dsc_test_resource.registry_value_exists?(test_registry_key, {:name => test_registry_value, :type => :string, :data => test_registry_data})).to eq(true)
|
304
|
+
end
|
252
305
|
end
|
253
306
|
end
|
254
307
|
|
255
308
|
shared_examples_for 'a dsc_script with configuration data' do
|
256
|
-
|
257
|
-
|
258
|
-
it_behaves_like 'a dsc_script with configuration data set via an attribute'
|
259
|
-
end
|
309
|
+
let(:configuration_data_attribute) { 'configuration_data' }
|
310
|
+
it_behaves_like 'a dsc_script with configuration data set via an attribute'
|
260
311
|
|
261
|
-
|
262
|
-
|
263
|
-
it_behaves_like 'a dsc_script with configuration data set via an attribute'
|
264
|
-
end
|
312
|
+
let(:configuration_data_attribute) { 'configuration_data_script' }
|
313
|
+
it_behaves_like 'a dsc_script with configuration data set via an attribute'
|
265
314
|
end
|
266
315
|
|
267
316
|
shared_examples_for 'a dsc_script with configuration data set via an attribute' do
|
@@ -282,33 +331,28 @@ EOH
|
|
282
331
|
end
|
283
332
|
|
284
333
|
shared_examples_for 'a dsc_script with configuration data that takes parameters' do
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
file.read
|
292
|
-
end
|
293
|
-
expect(configuration_script_content.include?(dsc_user)).to be(false)
|
334
|
+
let(:dsc_user_code) { dsc_user_param_code }
|
335
|
+
let(:config_param_section) { config_params }
|
336
|
+
let(:config_flags) {{:"#{dsc_user_prefix_param_name}" => "#{dsc_user_prefix}", :"#{dsc_user_suffix_param_name}" => "#{dsc_user_suffix}"}}
|
337
|
+
it 'does not directly contain the user name' do
|
338
|
+
configuration_script_content = ::File.open(dsc_test_resource.command) do | file |
|
339
|
+
file.read
|
294
340
|
end
|
295
|
-
|
341
|
+
expect(configuration_script_content.include?(dsc_user)).to be(false)
|
296
342
|
end
|
297
|
-
|
343
|
+
it_behaves_like 'a dsc_script with configuration data'
|
298
344
|
end
|
299
345
|
|
300
346
|
shared_examples_for 'a dsc_script with configuration data that uses environment variables' do
|
301
|
-
|
302
|
-
let(:dsc_user_code) { dsc_user_env_code }
|
347
|
+
let(:dsc_user_code) { dsc_user_env_code }
|
303
348
|
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
end
|
308
|
-
expect(configuration_script_content.include?(dsc_user)).to be(false)
|
349
|
+
it 'does not directly contain the user name' do
|
350
|
+
configuration_script_content = ::File.open(dsc_test_resource.command) do | file |
|
351
|
+
file.read
|
309
352
|
end
|
310
|
-
|
353
|
+
expect(configuration_script_content.include?(dsc_user)).to be(false)
|
311
354
|
end
|
355
|
+
it_behaves_like 'a dsc_script with configuration data'
|
312
356
|
end
|
313
357
|
|
314
358
|
context 'when supplying configuration through the configuration attribute' do
|
@@ -333,5 +377,6 @@ EOH
|
|
333
377
|
it_behaves_like 'a dsc_script with configuration data'
|
334
378
|
it_behaves_like 'a dsc_script with configuration data that uses environment variables'
|
335
379
|
it_behaves_like 'a dsc_script with configuration data that takes parameters'
|
380
|
+
it_behaves_like 'a dsc_script without configuration data that takes parameters'
|
336
381
|
end
|
337
382
|
end
|