kitchen-dsc 0.9.3 → 0.10.0
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/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
|