kitchen-dsc 0.9.3 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/kitchen-dsc.gemspec +26 -19
- data/lib/kitchen-dsc/version.rb +1 -1
- data/lib/kitchen/provisioner/dsc.rb +104 -177
- data/lib/kitchen/provisioner/dsc_lcm/lcm_base.rb +88 -0
- data/lib/kitchen/provisioner/dsc_lcm/lcm_v4.rb +53 -0
- data/lib/kitchen/provisioner/dsc_lcm/lcm_v5.rb +54 -0
- metadata +107 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2306c243f65cad6f2d2080a500d65fe71a875e53
|
4
|
+
data.tar.gz: b6d307e16a48a0c85d5500816d5c4c14e82077d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6d4e0db90b1476db78803a3641b2a650d52ae9baab67ef01356cc5cab114bc2af2f4f79e5ddc94a6f22b7d39b136b42b74c59a27ba79ecab062dc7fe79d2c2d
|
7
|
+
data.tar.gz: dcce1e8063ea43ecfea9ac0f50d2d82e40158dc2d12150d66b8c4c63e8d3cf9d9205a2e955d1d75377e2963050a43bc9afd393a54002c1d6b63dfcca327e93bc
|
data/kitchen-dsc.gemspec
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
$LOAD_PATH.unshift File.expand_path(
|
4
|
-
require
|
3
|
+
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
4
|
+
require "kitchen-dsc/version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
7
|
+
s.name = "kitchen-dsc"
|
8
8
|
s.version = Kitchen::Dsc::VERSION
|
9
|
-
s.authors = [
|
10
|
-
s.email = [
|
11
|
-
s.homepage =
|
12
|
-
s.summary =
|
13
|
-
candidates = Dir.glob(
|
9
|
+
s.authors = ["Steven Murawski"]
|
10
|
+
s.email = ["smurawski@chef.io"]
|
11
|
+
s.homepage = "https://github.com/test-kitchen/kitchen-dsc"
|
12
|
+
s.summary = "PowerShell DSC provisioner for test-kitchen"
|
13
|
+
candidates = Dir.glob("lib/**/*") + ["README.md", "kitchen-dsc.gemspec"]
|
14
14
|
s.files = candidates.sort
|
15
15
|
s.platform = Gem::Platform::RUBY
|
16
|
-
s.require_paths = [
|
17
|
-
s.rubyforge_project =
|
18
|
-
s.license =
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = "[none]"
|
18
|
+
s.license = "Apache 2"
|
19
19
|
s.description = <<-EOF
|
20
20
|
== DESCRIPTION:
|
21
21
|
|
@@ -26,16 +26,23 @@ DSC Provisioner for Test Kitchen
|
|
26
26
|
TBD
|
27
27
|
|
28
28
|
EOF
|
29
|
-
s.add_dependency
|
30
|
-
|
31
|
-
|
32
|
-
s.add_development_dependency
|
33
|
-
s.add_development_dependency
|
34
|
-
s.add_development_dependency
|
29
|
+
s.add_dependency "test-kitchen", ">= 1.9"
|
30
|
+
s.add_dependency "dsc_lcm_configuration"
|
31
|
+
|
32
|
+
s.add_development_dependency "countloc", "~> 0.4"
|
33
|
+
s.add_development_dependency "rake"
|
34
|
+
s.add_development_dependency "rspec", "~> 3.2"
|
35
|
+
s.add_development_dependency "simplecov", "~> 0.9"
|
36
|
+
s.add_development_dependency "minitest", "~> 5.3"
|
37
|
+
s.add_development_dependency "yard", "~> 0.8"
|
38
|
+
s.add_development_dependency "pry"
|
39
|
+
s.add_development_dependency "pry-stack_explorer"
|
40
|
+
s.add_development_dependency "pry-byebug"
|
41
|
+
s.add_development_dependency "rb-readline"
|
35
42
|
|
36
43
|
# style and complexity libraries are tightly version pinned as newer releases
|
37
44
|
# may introduce new and undesireable style choices which would be immediately
|
38
45
|
# enforced in CI
|
39
|
-
s.add_development_dependency
|
40
|
-
s.add_development_dependency
|
46
|
+
s.add_development_dependency "finstyle", "1.4.0"
|
47
|
+
s.add_development_dependency "cane", "2.6.2"
|
41
48
|
end
|
data/lib/kitchen-dsc/version.rb
CHANGED
@@ -4,13 +4,14 @@
|
|
4
4
|
#
|
5
5
|
# Copyright (C) 2014 Steven Murawski
|
6
6
|
#
|
7
|
-
# Licensed under the
|
7
|
+
# Licensed under the Apache 2 License.
|
8
8
|
# See LICENSE for more details
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
10
|
+
require "fileutils"
|
11
|
+
require "pathname"
|
12
|
+
require "kitchen/provisioner/base"
|
13
|
+
require "kitchen/util"
|
14
|
+
require "dsc_lcm_configuration"
|
14
15
|
|
15
16
|
module Kitchen
|
16
17
|
module Provisioner
|
@@ -19,15 +20,15 @@ module Kitchen
|
|
19
20
|
|
20
21
|
attr_accessor :tmp_dir
|
21
22
|
|
22
|
-
default_config :modules_path,
|
23
|
+
default_config :modules_path, "modules"
|
23
24
|
|
24
|
-
default_config :configuration_script_folder,
|
25
|
-
default_config :configuration_script,
|
25
|
+
default_config :configuration_script_folder, "examples"
|
26
|
+
default_config :configuration_script, "dsc_configuration.ps1"
|
26
27
|
default_config :configuration_name do |provisioner|
|
27
28
|
provisioner.instance.suite.name
|
28
29
|
end
|
29
30
|
|
30
|
-
default_config :configuration_data_variable,
|
31
|
+
default_config :configuration_data_variable, "ConfigurationData"
|
31
32
|
default_config :configuration_data
|
32
33
|
|
33
34
|
default_config :nuget_force_bootstrap, true
|
@@ -35,97 +36,17 @@ module Kitchen
|
|
35
36
|
default_config :gallery_name
|
36
37
|
default_config :modules_from_gallery
|
37
38
|
|
38
|
-
default_config :dsc_local_configuration_manager_version,
|
39
|
-
default_config :dsc_local_configuration_manager
|
39
|
+
default_config :dsc_local_configuration_manager_version, "wmf4"
|
40
|
+
default_config :dsc_local_configuration_manager, {}
|
40
41
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
-
false
|
45
|
-
else
|
46
|
-
true
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def resolve_lcm_setting(name, default_value)
|
51
|
-
if override_lcm_setting? name
|
52
|
-
config[:dsc_local_configuration_manager][name.to_sym]
|
53
|
-
else
|
54
|
-
default_value
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def lcm_settings
|
59
|
-
{
|
60
|
-
action_after_reboot: (resolve_lcm_setting 'action_after_reboot', 'StopConfiguration'),
|
61
|
-
allow_module_overwrite: (resolve_lcm_setting 'allow_module_overwrite', false),
|
62
|
-
certificate_id: (resolve_lcm_setting 'certificate_id', nil),
|
63
|
-
configuration_mode: (resolve_lcm_setting 'configuration_mode', 'ApplyAndAutoCorrect'),
|
64
|
-
debug_mode: (resolve_lcm_setting 'debug_mode', 'All'),
|
65
|
-
reboot_if_needed: (resolve_lcm_setting 'reboot_if_needed', false),
|
66
|
-
refresh_mode: (resolve_lcm_setting 'refresh_mode', 'PUSH')
|
67
|
-
}
|
42
|
+
def finalize_config!(instance)
|
43
|
+
config[:dsc_local_configuration_manager] = lcm.lcm_config
|
44
|
+
super(instance)
|
68
45
|
end
|
69
46
|
|
70
47
|
def install_command
|
71
|
-
lcm_config = lcm_settings
|
72
|
-
case config[:dsc_local_configuration_manager_version]
|
73
|
-
when 'wmf4_legacy', 'wmf4'
|
74
|
-
lcm_configuration_script = <<-LCMSETUP
|
75
|
-
configuration SetupLCM
|
76
|
-
{
|
77
|
-
LocalConfigurationManager
|
78
|
-
{
|
79
|
-
AllowModuleOverwrite = [bool]::Parse('#{lcm_config[:allow_module_overwrite]}')
|
80
|
-
CertificateID = '#{lcm_config[:certificate_id].nil? ? '$null' : lcm_config[:certificate_id]}'
|
81
|
-
ConfigurationMode = '#{lcm_config[:configuration_mode]}'
|
82
|
-
ConfigurationModeFrequencyMins = #{lcm_config[:configuration_mode_frequency_mins].nil? ? '30' : lcm_config[:configuration_mode_frequency_mins]}
|
83
|
-
RebootNodeIfNeeded = [bool]::Parse('#{lcm_config[:reboot_if_needed]}')
|
84
|
-
RefreshFrequencyMins = #{lcm_config[:refresh_frequency_mins].nil? ? '15' : lcm_config[:refresh_frequency_mins]}
|
85
|
-
RefreshMode = '#{lcm_config[:refresh_mode]}'
|
86
|
-
}
|
87
|
-
}
|
88
|
-
LCMSETUP
|
89
|
-
when 'wmf4_with_update'
|
90
|
-
lcm_configuration_script = <<-LCMSETUP
|
91
|
-
configuration SetupLCM
|
92
|
-
{
|
93
|
-
LocalConfigurationManager
|
94
|
-
{
|
95
|
-
ActionAfterReboot = '#{lcm_config[:action_after_reboot]}'
|
96
|
-
AllowModuleOverwrite = [bool]::Parse('#{lcm_config[:allow_module_overwrite]}')
|
97
|
-
CertificateID = '#{lcm_config[:certificate_id].nil? ? '$null' : lcm_config[:certificate_id]}'
|
98
|
-
ConfigurationMode = '#{lcm_config[:configuration_mode]}'
|
99
|
-
ConfigurationModeFrequencyMins = #{lcm_config[:configuration_mode_frequency_mins].nil? ? '30' : lcm_config[:configuration_mode_frequency_mins]}
|
100
|
-
DebugMode = '#{lcm_config[:debug_mode]}'
|
101
|
-
RebootNodeIfNeeded = [bool]::Parse('#{lcm_config[:reboot_if_needed]}')
|
102
|
-
RefreshFrequencyMins = #{lcm_config[:refresh_frequency_mins].nil? ? '15' : lcm_config[:refresh_frequency_mins]}
|
103
|
-
RefreshMode = '#{lcm_config[:refresh_mode]}'
|
104
|
-
}
|
105
|
-
}
|
106
|
-
LCMSETUP
|
107
|
-
when 'wmf5'
|
108
|
-
lcm_configuration_script = <<-LCMSETUP
|
109
|
-
[DSCLocalConfigurationManager()]
|
110
|
-
configuration SetupLCM
|
111
|
-
{
|
112
|
-
Settings
|
113
|
-
{
|
114
|
-
ActionAfterReboot = '#{lcm_config[:action_after_reboot]}'
|
115
|
-
AllowModuleOverwrite = [bool]::Parse('#{lcm_config[:allow_module_overwrite]}')
|
116
|
-
CertificateID = '#{lcm_config[:certificate_id].nil? ? '$null' : lcm_config[:certificate_id]}'
|
117
|
-
ConfigurationMode = '#{lcm_config[:configuration_mode]}'
|
118
|
-
ConfigurationModeFrequencyMins = #{lcm_config[:configuration_mode_frequency_mins].nil? ? '15' : lcm_config[:configuration_mode_frequency_mins]}
|
119
|
-
DebugMode = '#{lcm_config[:debug_mode]}'
|
120
|
-
RebootNodeIfNeeded = [bool]::Parse('#{lcm_config[:reboot_if_needed]}')
|
121
|
-
RefreshFrequencyMins = #{lcm_config[:refresh_frequency_mins].nil? ? '30' : lcm_config[:refresh_frequency_mins]}
|
122
|
-
RefreshMode = '#{lcm_config[:refresh_mode]}'
|
123
|
-
}
|
124
|
-
}
|
125
|
-
LCMSETUP
|
126
|
-
end
|
127
48
|
full_lcm_configuration_script = <<-EOH
|
128
|
-
#{lcm_configuration_script}
|
49
|
+
#{lcm.lcm_configuration_script}
|
129
50
|
|
130
51
|
$null = SetupLCM
|
131
52
|
Set-DscLocalConfigurationManager -Path ./SetupLCM | out-null
|
@@ -133,63 +54,6 @@ module Kitchen
|
|
133
54
|
|
134
55
|
wrap_powershell_code(full_lcm_configuration_script)
|
135
56
|
end
|
136
|
-
# rubocop:enable Metrics/LineLength
|
137
|
-
|
138
|
-
def setup_config_directory_script
|
139
|
-
"mkdir (split-path (join-path #{config[:root_path]} #{sandboxed_configuration_script})) -force | out-null"
|
140
|
-
end
|
141
|
-
|
142
|
-
def powershell_module_params(module_specification_hash)
|
143
|
-
keys = module_specification_hash.keys.reject { |k| k.to_s.casecmp('force') == 0 }
|
144
|
-
unless keys.any? { |k| k.to_s.downcase == 'repository' }
|
145
|
-
keys.push(:repository)
|
146
|
-
module_specification_hash[:repository] = psmodule_repository_name
|
147
|
-
end
|
148
|
-
keys.map { |key| "-#{key} #{module_specification_hash[key]}" }.join(' ')
|
149
|
-
end
|
150
|
-
|
151
|
-
def powershell_modules
|
152
|
-
Array(config[:modules_from_gallery]).map do |powershell_module|
|
153
|
-
params = if powershell_module.is_a? Hash
|
154
|
-
powershell_module_params(powershell_module)
|
155
|
-
else
|
156
|
-
"-name '#{powershell_module}' -Repository #{psmodule_repository_name}"
|
157
|
-
end
|
158
|
-
"install-module #{params} -force | out-null"
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
def nuget_force_bootstrap
|
163
|
-
return unless config[:nuget_force_bootstrap]
|
164
|
-
info('Bootstrapping the nuget package provider for PowerShell PackageManagement.')
|
165
|
-
'install-packageprovider nuget -force -forcebootstrap | out-null'
|
166
|
-
end
|
167
|
-
|
168
|
-
def psmodule_repository_name
|
169
|
-
return 'PSGallery' if config[:gallery_name].nil? && config[:gallery_uri].nil?
|
170
|
-
return 'testing' if config[:gallery_name].nil?
|
171
|
-
config[:gallery_name]
|
172
|
-
end
|
173
|
-
|
174
|
-
def register_psmodule_repository
|
175
|
-
return if config[:gallery_uri].nil?
|
176
|
-
info("Registering a new PowerShellGet Repository - #{psmodule_repository_name}")
|
177
|
-
"register-packagesource -providername PowerShellGet -name '#{psmodule_repository_name}' -location '#{config[:gallery_uri]}' -force -trusted"
|
178
|
-
end
|
179
|
-
|
180
|
-
def install_module_script
|
181
|
-
return if config[:modules_from_gallery].nil?
|
182
|
-
<<-EOH
|
183
|
-
#{nuget_force_bootstrap}
|
184
|
-
#{register_psmodule_repository}
|
185
|
-
#{powershell_modules.join("\n")}
|
186
|
-
EOH
|
187
|
-
end
|
188
|
-
|
189
|
-
def install_modules?
|
190
|
-
config[:dsc_local_configuration_manager_version] == 'wmf5' &&
|
191
|
-
!config[:modules_from_gallery].nil?
|
192
|
-
end
|
193
57
|
|
194
58
|
def init_command
|
195
59
|
script = <<-EOH
|
@@ -201,18 +65,18 @@ module Kitchen
|
|
201
65
|
|
202
66
|
def create_sandbox
|
203
67
|
super
|
204
|
-
info(
|
68
|
+
info("Staging DSC Resource Modules for copy to the SUT")
|
205
69
|
if powershell_module?
|
206
70
|
prepare_resource_style_directory
|
207
71
|
else
|
208
72
|
prepare_repo_style_directory
|
209
73
|
end
|
210
|
-
info(
|
74
|
+
info("Staging DSC configuration script for copy to the SUT")
|
211
75
|
prepare_configuration_script
|
212
76
|
end
|
213
77
|
|
214
78
|
def prepare_command
|
215
|
-
info(
|
79
|
+
info("Moving DSC Resources onto PSModulePath")
|
216
80
|
info("Generating the MOF script for the configuration #{config[:configuration_name]}")
|
217
81
|
stage_resources_and_generate_mof_script = <<-EOH
|
218
82
|
if (Test-Path (join-path #{config[:root_path]} 'modules'))
|
@@ -237,20 +101,11 @@ module Kitchen
|
|
237
101
|
|
238
102
|
#{configuration_data_assignment unless config[:configuration_data].nil?}
|
239
103
|
|
240
|
-
$null = #{config[:configuration_name]} -outputpath c:/configurations #{
|
104
|
+
$null = #{config[:configuration_name]} -outputpath c:/configurations #{"-configurationdata $" + configuration_data_variable}
|
241
105
|
EOH
|
242
106
|
debug("Shelling out: #{stage_resources_and_generate_mof_script}")
|
243
107
|
wrap_powershell_code(stage_resources_and_generate_mof_script)
|
244
108
|
end
|
245
|
-
# rubocop:enable Metrics/LineLength
|
246
|
-
|
247
|
-
def configuration_data_variable
|
248
|
-
config[:configuration_data_variable].nil? ? 'ConfigurationData' : config[:configuration_data_variable]
|
249
|
-
end
|
250
|
-
|
251
|
-
def configuration_data_assignment
|
252
|
-
'$' + configuration_data_variable + ' = ' + ps_hash(config[:configuration_data])
|
253
|
-
end
|
254
109
|
|
255
110
|
def run_command
|
256
111
|
config[:retry_on_exit_code] = [35] if config[:retry_on_exit_code].empty?
|
@@ -280,8 +135,80 @@ module Kitchen
|
|
280
135
|
|
281
136
|
private
|
282
137
|
|
138
|
+
def lcm
|
139
|
+
@lcm ||= begin
|
140
|
+
lcm_version = config[:dsc_local_configuration_manager_version]
|
141
|
+
lcm_config = config[:dsc_local_configuration_manager]
|
142
|
+
DscLcmConfiguration::Factory.create(lcm_version, lcm_config)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def setup_config_directory_script
|
147
|
+
"mkdir (split-path (join-path #{config[:root_path]} #{sandboxed_configuration_script})) -force | out-null"
|
148
|
+
end
|
149
|
+
|
150
|
+
def powershell_module_params(module_specification_hash)
|
151
|
+
keys = module_specification_hash.keys.reject { |k| k.to_s.casecmp('force') == 0 }
|
152
|
+
unless keys.any? { |k| k.to_s.downcase == 'repository' }
|
153
|
+
keys.push(:repository)
|
154
|
+
module_specification_hash[:repository] = psmodule_repository_name
|
155
|
+
end
|
156
|
+
keys.map { |key| "-#{key} #{module_specification_hash[key]}" }.join(' ')
|
157
|
+
end
|
158
|
+
|
159
|
+
def powershell_modules
|
160
|
+
Array(config[:modules_from_gallery]).map do |powershell_module|
|
161
|
+
params = if powershell_module.is_a? Hash
|
162
|
+
powershell_module_params(powershell_module)
|
163
|
+
else
|
164
|
+
"-name '#{powershell_module}' -Repository #{psmodule_repository_name}"
|
165
|
+
end
|
166
|
+
"install-module #{params} -force | out-null"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def nuget_force_bootstrap
|
171
|
+
return unless config[:nuget_force_bootstrap]
|
172
|
+
info("Bootstrapping the nuget package provider for PowerShell PackageManagement.")
|
173
|
+
"install-packageprovider nuget -force -forcebootstrap | out-null"
|
174
|
+
end
|
175
|
+
|
176
|
+
def psmodule_repository_name
|
177
|
+
return "PSGallery" if config[:gallery_name].nil? && config[:gallery_uri].nil?
|
178
|
+
return "testing" if config[:gallery_name].nil?
|
179
|
+
config[:gallery_name]
|
180
|
+
end
|
181
|
+
|
182
|
+
def register_psmodule_repository
|
183
|
+
return if config[:gallery_uri].nil?
|
184
|
+
info("Registering a new PowerShellGet Repository - #{psmodule_repository_name}")
|
185
|
+
"register-packagesource -providername PowerShellGet -name '#{psmodule_repository_name}' -location '#{config[:gallery_uri]}' -force -trusted"
|
186
|
+
end
|
187
|
+
|
188
|
+
def install_module_script
|
189
|
+
return if config[:modules_from_gallery].nil?
|
190
|
+
<<-EOH
|
191
|
+
#{nuget_force_bootstrap}
|
192
|
+
#{register_psmodule_repository}
|
193
|
+
#{powershell_modules.join("\n")}
|
194
|
+
EOH
|
195
|
+
end
|
196
|
+
|
197
|
+
def install_modules?
|
198
|
+
config[:dsc_local_configuration_manager_version] == "wmf5" &&
|
199
|
+
!config[:modules_from_gallery].nil?
|
200
|
+
end
|
201
|
+
|
202
|
+
def configuration_data_variable
|
203
|
+
config[:configuration_data_variable].nil? ? "ConfigurationData" : config[:configuration_data_variable]
|
204
|
+
end
|
205
|
+
|
206
|
+
def configuration_data_assignment
|
207
|
+
"$" + configuration_data_variable + " = " + ps_hash(config[:configuration_data])
|
208
|
+
end
|
209
|
+
|
283
210
|
def wrap_powershell_code(code)
|
284
|
-
wrap_shell_code(
|
211
|
+
wrap_shell_code(["$ProgressPreference = 'SilentlyContinue';", code].join("\n"))
|
285
212
|
end
|
286
213
|
|
287
214
|
def powershell_module?
|
@@ -290,11 +217,11 @@ module Kitchen
|
|
290
217
|
end
|
291
218
|
|
292
219
|
def list_files(path)
|
293
|
-
base_directory_content = Dir.glob(File.join(path,
|
294
|
-
nested_directory_content = Dir.glob(File.join(path,
|
220
|
+
base_directory_content = Dir.glob(File.join(path, "*"))
|
221
|
+
nested_directory_content = Dir.glob(File.join(path, "*/**/*"))
|
295
222
|
all_directory_content = [base_directory_content, nested_directory_content].flatten
|
296
223
|
|
297
|
-
ignore_files = [
|
224
|
+
ignore_files = ["Gemfile", "Gemfile.lock", "README.md", "LICENSE.txt"]
|
298
225
|
all_directory_content.reject do |f|
|
299
226
|
debug("Enumerating #{f}")
|
300
227
|
ignore_files.include?(File.basename(f)) || File.directory?(f)
|
@@ -310,17 +237,17 @@ module Kitchen
|
|
310
237
|
|
311
238
|
base = config[:kitchen_root]
|
312
239
|
list_files(base).each do |src|
|
313
|
-
dest = File.join(sandbox_base_module_path, src.sub("#{base}/",
|
240
|
+
dest = File.join(sandbox_base_module_path, src.sub("#{base}/", ""))
|
314
241
|
FileUtils.mkdir_p(File.dirname(dest))
|
315
242
|
debug("Staging #{src} ")
|
316
243
|
debug(" at #{dest}")
|
317
|
-
FileUtils.cp(src, dest, preserve
|
244
|
+
FileUtils.cp(src, dest, :preserve => true)
|
318
245
|
end
|
319
246
|
end
|
320
247
|
|
321
248
|
def prepare_repo_style_directory
|
322
249
|
module_path = File.join(config[:kitchen_root], config[:modules_path])
|
323
|
-
sandbox_module_path = File.join(sandbox_path,
|
250
|
+
sandbox_module_path = File.join(sandbox_path, "modules")
|
324
251
|
|
325
252
|
if Dir.exist?(module_path)
|
326
253
|
debug("Moving #{module_path} to #{sandbox_module_path}")
|
@@ -331,23 +258,23 @@ module Kitchen
|
|
331
258
|
end
|
332
259
|
|
333
260
|
def sandboxed_configuration_script
|
334
|
-
File.join(
|
261
|
+
File.join("configuration", config[:configuration_script])
|
335
262
|
end
|
336
263
|
|
337
264
|
def pad(depth = 0)
|
338
|
-
|
265
|
+
" " * depth
|
339
266
|
end
|
340
267
|
|
341
268
|
def ps_hash(obj, depth = 0)
|
342
269
|
if obj.is_a?(Hash)
|
343
270
|
obj.map do |k, v|
|
344
|
-
%
|
271
|
+
%{#{pad(depth + 2)}#{ps_hash(k)} = #{ps_hash(v, depth + 2)}}
|
345
272
|
end.join(";\n").insert(0, "@{\n").insert(-1, "\n#{pad(depth)}}")
|
346
273
|
elsif obj.is_a?(Array)
|
347
|
-
array_string = obj.map { |v| ps_hash(v, depth + 4) }.join(
|
274
|
+
array_string = obj.map { |v| ps_hash(v, depth + 4) }.join(",")
|
348
275
|
"#{pad(depth)}@(\n#{array_string}\n)"
|
349
276
|
else
|
350
|
-
%
|
277
|
+
%{"#{obj}"}
|
351
278
|
end
|
352
279
|
end
|
353
280
|
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Author:: Steven Murawski (<steven.murawski@gmail.com>)
|
4
|
+
#
|
5
|
+
# Copyright (C) 2014 Steven Murawski
|
6
|
+
#
|
7
|
+
# Licensed under the Apache 2 License.
|
8
|
+
# See LICENSE for more details
|
9
|
+
|
10
|
+
require "kitchen/provisioner/dsc_lcm/lcm_v4"
|
11
|
+
require "kitchen/provisioner/dsc_lcm/lcm_v5"
|
12
|
+
|
13
|
+
module Kitchen
|
14
|
+
module Provisioner
|
15
|
+
module DscLcm
|
16
|
+
class LcmBase
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
def lcm_properties
|
21
|
+
{
|
22
|
+
:allow_module_overwrite => false,
|
23
|
+
:certificate_id => nil,
|
24
|
+
:configuration_mode => "ApplyAndAutoCorrect",
|
25
|
+
:configuration_mode_frequency_mins => 30,
|
26
|
+
:reboot_if_needed => false,
|
27
|
+
:refresh_mode => "PUSH",
|
28
|
+
:refresh_frequency_mins => 15
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize(config = {})
|
33
|
+
@certificate_id = nil
|
34
|
+
lcm_properties.each do |setting, value|
|
35
|
+
send(setting, value)
|
36
|
+
end
|
37
|
+
|
38
|
+
config.each do |setting, value|
|
39
|
+
send(setting, value)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def method_missing(name, *args)
|
44
|
+
return super unless lcm_properties.keys.include?(name)
|
45
|
+
if args.length == 1
|
46
|
+
instance_variable_set("@#{name}", args.first)
|
47
|
+
else
|
48
|
+
instance_variable_get("@#{name}")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def certificate_id(value = nil)
|
53
|
+
if value.nil?
|
54
|
+
@certificate_id.nil? ? "$null" : "'#{@certificate_id}'"
|
55
|
+
else
|
56
|
+
@certificate_id = value
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def lcm_config
|
61
|
+
hash = {}
|
62
|
+
lcm_properties.keys.each do |key|
|
63
|
+
hash[key] = send(key)
|
64
|
+
end
|
65
|
+
hash
|
66
|
+
end
|
67
|
+
|
68
|
+
def lcm_configuration_script
|
69
|
+
<<-LCMSETUP
|
70
|
+
configuration SetupLCM
|
71
|
+
{
|
72
|
+
LocalConfigurationManager
|
73
|
+
{
|
74
|
+
AllowModuleOverwrite = [bool]::Parse('#{allow_module_overwrite}')
|
75
|
+
CertificateID = #{certificate_id}
|
76
|
+
ConfigurationMode = '#{configuration_mode}'
|
77
|
+
ConfigurationModeFrequencyMins = #{configuration_mode_frequency_mins}
|
78
|
+
RebootNodeIfNeeded = [bool]::Parse('#{reboot_if_needed}')
|
79
|
+
RefreshFrequencyMins = #{refresh_frequency_mins}
|
80
|
+
RefreshMode = '#{refresh_mode}'
|
81
|
+
}
|
82
|
+
}
|
83
|
+
LCMSETUP
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Author:: Steven Murawski (<steven.murawski@gmail.com>)
|
4
|
+
#
|
5
|
+
# Copyright (C) 2014 Steven Murawski
|
6
|
+
#
|
7
|
+
# Licensed under the Apache 2 License.
|
8
|
+
# See LICENSE for more details
|
9
|
+
|
10
|
+
require "kitchen/provisioner/dsc_lcm/lcm_base"
|
11
|
+
|
12
|
+
module Kitchen
|
13
|
+
module Provisioner
|
14
|
+
module DscLcm
|
15
|
+
class LcmV4 < LcmBase
|
16
|
+
|
17
|
+
def lcm_properties
|
18
|
+
{
|
19
|
+
:action_after_reboot => "StopConfiguration",
|
20
|
+
:allow_module_overwrite => false,
|
21
|
+
:certificate_id => nil,
|
22
|
+
:configuration_mode => "ApplyAndAutoCorrect",
|
23
|
+
:configuration_mode_frequency_mins => 30,
|
24
|
+
:debug_mode => "All",
|
25
|
+
:reboot_if_needed => false,
|
26
|
+
:refresh_mode => "PUSH",
|
27
|
+
:refresh_frequency_mins => 15
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def lcm_configuration_script
|
32
|
+
<<-LCMSETUP
|
33
|
+
configuration SetupLCM
|
34
|
+
{
|
35
|
+
LocalConfigurationManager
|
36
|
+
{
|
37
|
+
ActionAfterReboot = '#{action_after_reboot}'
|
38
|
+
AllowModuleOverwrite = [bool]::Parse('#{allow_module_overwrite}')
|
39
|
+
CertificateID = #{certificate_id}
|
40
|
+
ConfigurationMode = '#{configuration_mode}'
|
41
|
+
ConfigurationModeFrequencyMins = #{configuration_mode_frequency_mins}
|
42
|
+
DebugMode = '#{debug_mode}'
|
43
|
+
RebootNodeIfNeeded = [bool]::Parse('#{reboot_if_needed}')
|
44
|
+
RefreshFrequencyMins = #{refresh_frequency_mins}
|
45
|
+
RefreshMode = '#{refresh_mode}'
|
46
|
+
}
|
47
|
+
}
|
48
|
+
LCMSETUP
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Author:: Steven Murawski (<steven.murawski@gmail.com>)
|
4
|
+
#
|
5
|
+
# Copyright (C) 2014 Steven Murawski
|
6
|
+
#
|
7
|
+
# Licensed under the Apache 2 License.
|
8
|
+
# See LICENSE for more details
|
9
|
+
|
10
|
+
require "kitchen/provisioner/dsc_lcm/lcm_base"
|
11
|
+
|
12
|
+
module Kitchen
|
13
|
+
module Provisioner
|
14
|
+
module DscLcm
|
15
|
+
class LcmV5 < LcmBase
|
16
|
+
|
17
|
+
def lcm_properties
|
18
|
+
{
|
19
|
+
:action_after_reboot => "StopConfiguration",
|
20
|
+
:allow_module_overwrite => false,
|
21
|
+
:certificate_id => nil,
|
22
|
+
:configuration_mode => "ApplyAndAutoCorrect",
|
23
|
+
:configuration_mode_frequency_mins => 15,
|
24
|
+
:debug_mode => "All",
|
25
|
+
:reboot_if_needed => false,
|
26
|
+
:refresh_mode => "PUSH",
|
27
|
+
:refresh_frequency_mins => 30
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def lcm_configuration_script
|
32
|
+
<<-LCMSETUP
|
33
|
+
[DSCLocalConfigurationManager()]
|
34
|
+
configuration SetupLCM
|
35
|
+
{
|
36
|
+
Settings
|
37
|
+
{
|
38
|
+
ActionAfterReboot = '#{action_after_reboot}'
|
39
|
+
AllowModuleOverwrite = [bool]::Parse('#{allow_module_overwrite}')
|
40
|
+
CertificateID = #{certificate_id}
|
41
|
+
ConfigurationMode = '#{configuration_mode}'
|
42
|
+
ConfigurationModeFrequencyMins = #{configuration_mode_frequency_mins}
|
43
|
+
DebugMode = '#{debug_mode}'
|
44
|
+
RebootNodeIfNeeded = [bool]::Parse('#{reboot_if_needed}')
|
45
|
+
RefreshFrequencyMins = #{refresh_frequency_mins}
|
46
|
+
RefreshMode = '#{refresh_mode}'
|
47
|
+
}
|
48
|
+
}
|
49
|
+
LCMSETUP
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kitchen-dsc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Murawski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-kitchen
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.9'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: dsc_lcm_configuration
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: countloc
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +94,90 @@ dependencies:
|
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0.9'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: minitest
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '5.3'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '5.3'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: yard
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.8'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.8'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: pry
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: pry-stack_explorer
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: pry-byebug
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: rb-readline
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
83
181
|
- !ruby/object:Gem::Dependency
|
84
182
|
name: finstyle
|
85
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -127,6 +225,9 @@ files:
|
|
127
225
|
- kitchen-dsc.gemspec
|
128
226
|
- lib/kitchen-dsc/version.rb
|
129
227
|
- lib/kitchen/provisioner/dsc.rb
|
228
|
+
- lib/kitchen/provisioner/dsc_lcm/lcm_base.rb
|
229
|
+
- lib/kitchen/provisioner/dsc_lcm/lcm_v4.rb
|
230
|
+
- lib/kitchen/provisioner/dsc_lcm/lcm_v5.rb
|
130
231
|
homepage: https://github.com/test-kitchen/kitchen-dsc
|
131
232
|
licenses:
|
132
233
|
- Apache 2
|