kitchen-salt 0.6.0 → 0.6.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f711ec1a9e53499fabcbcfd43f13987d9b38bcb5
4
- data.tar.gz: 5ce22225b656097be617e2cafcca453b43463add
2
+ SHA256:
3
+ metadata.gz: e4475c3f3b756deffb4496c2fb8f7de2b883be4782351c6ddf96742aad3d756f
4
+ data.tar.gz: 277e089f45bb734662498288d6773d2e752e97585aa78dedaefebb6b4c6b1f06
5
5
  SHA512:
6
- metadata.gz: 410f0585fe62b1fd6be86be74af64f1d1635712b18aab725eff66c112eafb9b16870fbc851f69e372daa44579ff93854ce5c6d4d7390632c43add517d3ef8568
7
- data.tar.gz: 979dd2e1b87611a79c59c55d75b7eb6587ba2eed6e2617cac0c7c6d121649d0f09fbbffb4e6e4d164926e90c5505b6f94c35a595396f3db9a58e0c88d6cf63a3
6
+ metadata.gz: 9edcc1c724670fe20adb1e4aae236d28ec6e94033e7066b627f0b6492023cd4599ebee67b555936d9060206594421f4dc51d32d8d43128a27274d604022bc453
7
+ data.tar.gz: b1b2570d0309c96471773183f6be7c5ff296f207f4c61e69c101a947786a2ffe0005b11904a283405d2567f5219bc21c1d1ad361fb0262263a78b78c52ff1277
@@ -1,5 +1,5 @@
1
1
  module Kitchen
2
2
  module Salt
3
- VERSION = '0.6.0'.freeze
3
+ VERSION = '0.6.1'.freeze
4
4
  end
5
5
  end
@@ -64,6 +64,7 @@ module Kitchen
64
64
  salt_env: 'base',
65
65
  salt_file_root: '/srv/salt',
66
66
  salt_force_color: false,
67
+ salt_enable_color: true,
67
68
  salt_install: 'bootstrap',
68
69
  salt_minion_config_dropin_files: [],
69
70
  salt_minion_config_template: nil,
@@ -106,7 +107,7 @@ module Kitchen
106
107
  end
107
108
 
108
109
  def install_command
109
- unless config[:salt_install] == 'pip' || config[:install_after_init_environment]
110
+ unless not config[:salt_install] || config[:salt_install] == 'pip' || config[:install_after_init_environment]
110
111
  setup_salt
111
112
  end
112
113
  end
@@ -268,11 +269,16 @@ module Kitchen
268
269
  cmd << sudo("#{config[:root_path]}/gpgkey.sh;") if config[:gpg_key]
269
270
  salt_config_path = config[:salt_config]
270
271
  end
272
+
273
+ if config[:pre_salt_command]
274
+ cmd << "#{config[:pre_salt_command]} && "
275
+ end
271
276
  cmd << sudo("#{salt_call} --state-output=changes --config-dir=#{os_join(config[:root_path], salt_config_path)} state.highstate")
272
277
  cmd << " --log-level=#{config[:log_level]}" if config[:log_level]
273
278
  cmd << " --id=#{config[:salt_minion_id]}" if config[:salt_minion_id]
274
279
  cmd << " test=#{config[:dry_run]}" if config[:dry_run]
275
280
  cmd << ' --force-color' if config[:salt_force_color]
281
+ cmd << ' --no-color' if not config[:salt_enable_color]
276
282
  if "#{salt_version}" > RETCODE_VERSION || salt_version == 'latest'
277
283
  # hope for the best and hope it works eventually
278
284
  cmd << ' --retcode-passthrough'
@@ -1,5 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
+ require "date"
4
+ require "kitchen/errors"
3
5
  require "kitchen/verifier/base"
4
6
 
5
7
  module Kitchen
@@ -11,14 +13,11 @@ module Kitchen
11
13
 
12
14
  default_config :testingdir, '/testing'
13
15
  default_config :tests, []
14
- default_config :transport, false
15
16
  default_config :save, {}
16
- default_config :windows, false
17
+ default_config :windows, nil
17
18
  default_config :verbose, false
18
19
  default_config :run_destructive, false
19
- default_config :ssh_tests, true
20
- default_config :proxy_tests, false
21
- default_config :pytest, false
20
+ default_config :runtests, false
22
21
  default_config :coverage, false
23
22
  default_config :junitxml, false
24
23
  default_config :from_filenames, []
@@ -26,34 +25,89 @@ module Kitchen
26
25
  default_config :passthrough_opts, []
27
26
  default_config :output_columns, 120
28
27
  default_config :sysinfo, true
28
+ default_config :sys_stats, false
29
+ default_config :environment_vars, {}
29
30
 
30
31
  def call(state)
31
- info("[#{name}] Verify on instance #{instance.name} with state=#{state}")
32
+ if config[:windows].nil?
33
+ # Since windows is not set, lets try and guess since kitchen actually knows this infomation
34
+ if instance.platform.os_type == 'windows'
35
+ config[:windows] = true
36
+ else
37
+ config[:windows] = false
38
+ end
39
+ end
40
+ debug("Detected platform for instance #{instance.name}: #{instance.platform.os_type}. Config's windows setting value: #{config[:windows]}")
41
+ if (ENV['ONLY_DOWNLOAD_ARTEFACTS'] || '') == '1'
42
+ only_download_artefacts = true
43
+ else
44
+ only_download_artefacts = false
45
+ end
46
+ if (ENV['DONT_DOWNLOAD_ARTEFACTS'] || '') == '1'
47
+ dont_download_artefacts = true
48
+ else
49
+ dont_download_artefacts = false
50
+ end
51
+ if only_download_artefacts and dont_download_artefacts
52
+ error_msg = "The environment variables 'ONLY_DOWNLOAD_ARTEFACTS' or 'DONT_DOWNLOAD_ARTEFACTS' cannot be both set to '1'"
53
+ error(error_msg)
54
+ raise ActionFailed, error_msg
55
+ end
56
+ if only_download_artefacts
57
+ info("[#{name}] Only downloading artefacts from instance #{instance.name} with state=#{state}")
58
+ else
59
+ info("[#{name}] Verify on instance #{instance.name} with state=#{state}")
60
+ end
32
61
  root_path = (config[:windows] ? '%TEMP%\\kitchen' : '/tmp/kitchen')
33
62
  if ENV['KITCHEN_TESTS']
34
63
  ENV['KITCHEN_TESTS'].split(' ').each{|test| config[:tests].push(test)}
35
64
  end
36
- noxenv = instance.suite.name
37
- if config[:pytest]
38
- noxenv = "pytest"
39
- tests = config[:tests].join(' ')
65
+
66
+ if ENV['NOX_ENABLE_FROM_FILENAMES']
67
+ config[:enable_filenames] = true
68
+ end
69
+
70
+ if ENV['NOX_PASSTHROUGH_OPTS']
71
+ ENV['NOX_PASSTHROUGH_OPTS'].split(' ').each{|opt| config[:passthrough_opts].push(opt)}
72
+ end
73
+
74
+ if ENV['NOX_ENV_NAME']
75
+ noxenv = ENV['NOX_ENV_NAME']
76
+ elsif config[:runtests] == true
77
+ noxenv = "runtests-zeromq"
40
78
  else
41
- noxenv = "runtests"
42
- tests = config[:tests].collect{|test| "-n #{test}"}.join(' ')
79
+ # Default to pytest-zeromq
80
+ noxenv = "pytest-zeromq"
43
81
  end
44
- noxenv = "#{noxenv}-#{config[:transport] ? config[:transport] : 'zeromq'}"
45
- if ENV['NOX_SESSION']
46
- noxenv = "#{noxenv}-#{ENV['NOX_SESSION']}"
82
+
83
+ # Is the nox env already including the Python version?
84
+ if not noxenv.match(/^(.*)-([\d]{1})(\.([\d]{1}))?$/)
85
+ # Nox env's are not py<python-version> named, they just use the <python-version>
86
+ # Additionally, nox envs are parametrised to enable or disable test coverage
87
+ # So, the line below becomes something like:
88
+ # runtests-2(coverage=True)
89
+ # pytest-3(coverage=False)
90
+ suite = instance.suite.name.gsub('py', '').gsub('2', '2.7')
91
+ noxenv = "#{noxenv}-#{suite}"
47
92
  end
48
- # Nox env's are not py<python-version> named, they just use the <python-version>
49
- # Additionally, nox envs are parametrised to enable or disable test coverage
50
- # So, the line below becomes something like:
51
- # runtests-2(coverage=True)
52
- # pytest-3(coverage=False)
53
- suite = instance.suite.name.gsub('py', '').gsub('2', '2.7')
54
- noxenv = "#{noxenv}-#{suite}(coverage=#{config[:coverage] ? 'True' : 'False'})"
93
+ noxenv = "#{noxenv}(coverage=#{config[:coverage] ? 'True' : 'False'})"
55
94
 
56
- if config[:enable_filenames] and ENV['CHANGE_TARGET'] and ENV['BRANCH_NAME']
95
+ if noxenv.include? "pytest"
96
+ tests = config[:tests].join(' ')
97
+ if config[:sys_stats]
98
+ sys_stats = '--sys-stats'
99
+ if not config[:verbose]
100
+ config[:verbose] = true
101
+ end
102
+ else
103
+ sys_stats = ''
104
+ end
105
+ elsif noxenv.include? "runtests"
106
+ tests = config[:tests].collect{|test| "-n #{test}"}.join(' ')
107
+ sys_stats = ''
108
+ end
109
+
110
+ if config[:enable_filenames] and ENV['CHANGE_TARGET'] and ENV['BRANCH_NAME'] and ENV['FORCE_FULL'] != 'true'
57
111
  require 'git'
58
112
  repo = Git.open(Dir.pwd)
59
113
  config[:from_filenames] = repo.diff("origin/#{ENV['CHANGE_TARGET']}",
@@ -62,17 +116,19 @@ module Kitchen
62
116
 
63
117
  if config[:junitxml]
64
118
  junitxml = File.join(root_path, config[:testingdir], 'artifacts', 'xml-unittests-output')
65
- if config[:pytest]
66
- junitxml = "--junitxml=#{File.join(junitxml, 'test-results.xml')}"
119
+ if noxenv.include? "pytest"
120
+ junitxml = "--junitxml=#{File.join(junitxml, "test-results-#{DateTime.now.strftime('%Y%m%d%H%M%S.%L')}.xml")}"
67
121
  else
68
122
  junitxml = "--xml=#{junitxml}"
69
123
  end
70
124
  end
71
125
 
72
126
  # Be sure to copy the remote artifacts directory to the local machine
73
- save = {
74
- "#{File.join(root_path, config[:testingdir], 'artifacts')}" => "#{Dir.pwd}/"
75
- }
127
+ if config[:windows]
128
+ save = {'$env:KitchenTestingDir/artifacts/' => "#{Dir.pwd}"}
129
+ else
130
+ save = {"#{File.join(root_path, config[:testingdir], 'artifacts')}/" => "#{Dir.pwd}"}
131
+ end
76
132
  # Hash insert order matters, that's why we define a new one and merge
77
133
  # the one from config
78
134
  save.merge!(config[:save])
@@ -83,57 +139,88 @@ module Kitchen
83
139
  (config[:windows] ? "-e #{noxenv}" : "-e '#{noxenv}'"),
84
140
  '--',
85
141
  "--output-columns=#{config[:output_columns]}",
142
+ sys_stats,
86
143
  (config[:sysinfo] ? '--sysinfo' : ''),
87
144
  (config[:junitxml] ? junitxml : ''),
88
- (config[:windows] ? "--names-file=#{root_path}\\testing\\tests\\whitelist.txt" : ''),
89
145
  (config[:verbose] ? '-vv' : '-v'),
90
- (config[:run_destructive] ? "--run-destructive" : ''),
91
- (config[:ssh_tests] ? "--ssh-tests" : ''),
92
- (config[:proxy_tests] ? "--proxy-tests" : ''),
146
+ (config[:run_destructive] ? '--run-destructive' : ''),
93
147
  config[:passthrough_opts].join(' '),
94
- (config[:from_filenames].any? ? "--from-filenames=#{config[:from_filenames].join(',')}" : ''),
95
- tests,
96
148
  ].join(' ')
149
+
150
+ if tests.nil? || tests.empty?
151
+ # If we're not targetting specific tests...
152
+ extra_command = [
153
+ (config[:from_filenames].any? ? "--from-filenames=#{config[:from_filenames].join(',')}" : ''),
154
+ (config[:windows] ? "--names-file=#{root_path}\\testing\\tests\\whitelist.txt" : ''),
155
+ ].join(' ')
156
+ command = "#{command} #{extra_command}"
157
+ else
158
+ command = "#{command} #{tests}"
159
+ end
160
+
161
+ environment_vars = {}
162
+ if ENV['CI'] || ENV['DRONE'] || ENV['JENKINS_URL']
163
+ environment_vars['CI'] = 1
164
+ end
165
+ # Hash insert order matters, that's why we define a new one and merge
166
+ # the one from config
167
+ environment_vars.merge!(config[:environment_vars])
168
+
97
169
  if config[:windows]
98
170
  command = "cmd.exe /c --% \"#{command}\" 2>&1"
99
171
  end
100
- info("Running Command: #{command}")
101
172
  instance.transport.connection(state) do |conn|
102
173
  begin
103
174
  if config[:windows]
104
175
  conn.execute('$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")')
105
- conn.execute("$env:PythonPath = [Environment]::ExpandEnvironmentVariables(\"#{root_path}\\testing\")")
176
+ conn.execute("$env:PythonPath = [Environment]::ExpandEnvironmentVariables(\"#{File.join(root_path, config[:testingdir])}\")")
177
+ conn.execute("[Environment]::SetEnvironmentVariable(\"KitchenTestingDir\", [Environment]::ExpandEnvironmentVariables(\"#{File.join(root_path, config[:testingdir])}\"), \"Machine\")")
178
+ environment_vars.each do |key, value|
179
+ conn.execute("[Environment]::SetEnvironmentVariable(\"#{key}\", \"#{value}\", \"Machine\")")
180
+ end
106
181
  else
182
+ command_env = []
183
+ environment_vars.each do |key, value|
184
+ command_env.push("#{key}=#{value}")
185
+ end
186
+ if not command_env.empty?
187
+ command = "env #{command_env.join(' ')} #{command}"
188
+ end
107
189
  begin
108
190
  conn.execute(sudo("chown -R $USER #{root_path}"))
109
191
  rescue => e
110
192
  error("Failed to chown #{root_path} :: #{e}")
111
193
  end
112
194
  end
113
- begin
195
+ if not only_download_artefacts
196
+ info("Running Command: #{command}")
114
197
  conn.execute(sudo(command))
115
- rescue => e
116
- info("Verify command failed :: #{e}")
117
198
  end
118
199
  ensure
119
- save.each do |remote, local|
120
- unless config[:windows]
200
+ if not dont_download_artefacts
201
+ save.each do |remote, local|
202
+ unless config[:windows]
203
+ begin
204
+ conn.execute(sudo("chmod -R +r #{remote}"))
205
+ rescue => e
206
+ error("Failed to chown #{remote} :: #{e}")
207
+ end
208
+ end
121
209
  begin
122
- conn.execute(sudo("chmod -R +r #{remote}"))
210
+ info("Copying #{remote} to #{local}")
211
+ conn.download(remote, local)
123
212
  rescue => e
124
- error("Failed to chown #{remote} :: #{e}")
213
+ error("Failed to copy #{remote} to #{local} :: #{e}")
125
214
  end
126
215
  end
127
- begin
128
- info("Copying #{remote} to #{local}")
129
- conn.download(remote, local)
130
- rescue => e
131
- error("Failed to copy #{remote} to #{local} :: #{e}")
132
- end
133
216
  end
134
217
  end
135
218
  end
136
- debug("[#{name}] Verify completed.")
219
+ if only_download_artefacts
220
+ info("[#{name}] Download artefacts completed.")
221
+ else
222
+ debug("[#{name}] Verify completed.")
223
+ end
137
224
  end
138
225
  end
139
226
  end
@@ -22,6 +22,7 @@ module Kitchen
22
22
  default_config :windows, false
23
23
  default_config :enable_filenames, false
24
24
  default_config :from_filenames, []
25
+ default_config :prepend, false
25
26
 
26
27
  def call(state)
27
28
  info("[#{name}] Verify on instance #{instance.name} with state=#{state}")
@@ -29,12 +30,13 @@ module Kitchen
29
30
  if ENV['KITCHEN_TESTS']
30
31
  ENV['KITCHEN_TESTS'].split(' ').each{|test| config[:tests].push(test)}
31
32
  end
32
- if config[:enable_filenames] and ENV['CHANGE_TARGET'] and ENV['BRANCH_NAME']
33
+ if config[:enable_filenames] and ENV['CHANGE_TARGET'] and ENV['BRANCH_NAME'] and ENV['FORCE_FULL'] != 'true'
33
34
  require 'git'
34
35
  repo = Git.open('.')
35
- config[:from_filenames] = repo.diff("origin/#{ENV['CHANGE_TARGET']}", "origin/#{ENV['BRANCH_NAME']}").name_status.keys.select{|file| file.end_with?('.py')}
36
+ config[:from_filenames] = repo.diff("origin/#{ENV['CHANGE_TARGET']}", "origin/#{ENV['BRANCH_NAME']}").name_status.keys.select{|file| file.end_with?('.py')}
36
37
  end
37
38
  command = [
39
+ (config[:prepend] ? "#{config[:prepend]}" : ''),
38
40
  (config[:windows] ? 'python.exe' : config[:python_bin]),
39
41
  File.join(root_path, config[:testingdir], '/tests/runtests.py'),
40
42
  '--sysinfo',
@@ -47,7 +49,7 @@ module Kitchen
47
49
  (config[:xml] ? "--xml=#{config[:xml]}" : ''),
48
50
  config[:types].collect{|type| "--#{type}"}.join(' '),
49
51
  config[:tests].collect{|test| "-n #{test}"}.join(' '),
50
- (config[:from_filenames].any? ? "--from-filenames=#{config[:from_filenames].join(',')}" : ''),
52
+ (config[:from_filenames].any? ? "--from-filenames=#{config[:from_filenames].join(',')}" : ''),
51
53
  '2>&1',
52
54
  ].join(' ')
53
55
  if config[:windows]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-salt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - SaltStack Inc
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-25 00:00:00.000000000 Z
11
+ date: 2020-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -181,8 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
181
181
  - !ruby/object:Gem::Version
182
182
  version: '0'
183
183
  requirements: []
184
- rubyforge_project: "[none]"
185
- rubygems_version: 2.5.2.3
184
+ rubygems_version: 3.0.3
186
185
  signing_key:
187
186
  specification_version: 4
188
187
  summary: salt provisioner for test-kitchen