kitchen-salt 0.6.0 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
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: f264baa2768e6d4a343d428d316da1fa467f365e012804d0184927bdf441efc3
4
+ data.tar.gz: 8a9608d00cdd30471567e3de85073515d8aab496610f6b7867bcb520f888bb85
5
5
  SHA512:
6
- metadata.gz: 410f0585fe62b1fd6be86be74af64f1d1635712b18aab725eff66c112eafb9b16870fbc851f69e372daa44579ff93854ce5c6d4d7390632c43add517d3ef8568
7
- data.tar.gz: 979dd2e1b87611a79c59c55d75b7eb6587ba2eed6e2617cac0c7c6d121649d0f09fbbffb4e6e4d164926e90c5505b6f94c35a595396f3db9a58e0c88d6cf63a3
6
+ metadata.gz: 8ca9f7b27528e62f990a791083606c657a070a856063eef2cc632dfc82ce0c00d0a2a87fd3d46b36b687b165b39f28daafe023e521c5920b4afa79972cac8448
7
+ data.tar.gz: 3c9ea1fbd395c1ee5dc4df1f6899ff980e29477e2ffab63f8395745350834eed1db09d83f566356f5e071df097f1e102884634c3b7df2619cd5ef547e210d136
@@ -42,15 +42,15 @@ function fetchGitFormula() {
42
42
  if ! [[ "${FETCHED[*]}" =~ $name ]]; then # dependency not yet fetched
43
43
  echo "Fetching: $name"
44
44
  if test -e "$GIT_FORMULAS_PATH/$name"; then
45
- pushd "$GIT_FORMULAS_PATH/$name" &>/dev/null
45
+ pushd "$GIT_FORMULAS_PATH/$name" &>/dev/null || exit
46
46
  test ! -e .git || git pull -r
47
- popd &>/dev/null
47
+ popd &>/dev/null || exit
48
48
  else
49
49
  echo "git clone $source $GIT_FORMULAS_PATH/$name -b $branch"
50
50
  git clone "$source" "$GIT_FORMULAS_PATH/$name" -b "$branch"
51
51
  fi
52
52
  # install dependencies
53
- FETCHED+=($name)
53
+ FETCHED+=("$name")
54
54
  if [ -e "$GIT_FORMULAS_PATH/$name/metadata.yml" ]; then
55
55
  fetchDependencies "$GIT_FORMULAS_PATH/$name/metadata.yml"
56
56
  fi
@@ -40,7 +40,12 @@ then
40
40
  elif [ -z "${SALT_VERSION}" -a "#{salt_install}" = "pip" ]
41
41
  then
42
42
  echo "Make sure setuptools and pip are new enough"
43
- #{sudo(salt_pip_bin)} install "setuptools>=30" "pip>=9"
43
+ export REQUIREMENTS_FILE=$(mktemp)
44
+ echo "setuptools >=30,<54.* ; python_version < '3.6'" > $REQUIREMENTS_FILE
45
+ echo "setuptools >=30,!=50.*,!=51.*,!=52.*; python_version >= '3.6'" > $REQUIREMENTS_FILE
46
+ echo "pip >=9,<21.0.0 ; python_version < '3.6'" >> $REQUIREMENTS_FILE
47
+ echo "pip >=9 ; python_version >= '3.6'" >> $REQUIREMENTS_FILE
48
+ #{sudo(salt_pip_bin)} install -r $REQUIREMENTS_FILE
44
49
  echo #{sudo(salt_pip_bin)} #{salt_pip_install_command} #{salt_pip_pkg}
45
50
  #{sudo(salt_pip_bin)} #{salt_pip_install_command} #{salt_pip_pkg}
46
51
  elif [ -z "${SALT_VERSION}" -a "#{salt_install}" = "apt" ]
@@ -5,7 +5,7 @@ salt_version = config[:salt_version]
5
5
  bootstrap_options = config[:salt_bootstrap_options] % [salt_version]
6
6
 
7
7
  <<-POWERSHELL
8
- if (Test-Path #{salt_call}) {
8
+ if (Get-Command #{salt_call}) {
9
9
  $installed_version = $(#{salt_call} --version).split(' ')[1]
10
10
  }
11
11
  if (-Not $(Test-Path c:\\temp)) {
@@ -15,6 +15,7 @@ if (-Not $installed_version -And "#{salt_install}" -eq "bootstrap") {
15
15
  [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
16
16
  (New-Object net.webclient).DownloadFile("#{salt_url}", "c:\\temp\\salt_bootstrap.ps1")
17
17
  #{sudo('powershell')} c:\\temp\\salt_bootstrap.ps1 #{bootstrap_options}
18
+ $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
18
19
  }
19
20
  $FULL_SALT_VERSION = $(#{salt_call} --version).split(' ')[1]
20
21
  if ($FULL_SALT_VERSION) {
@@ -9,7 +9,7 @@ file_roots:
9
9
  - <%= os_join(config[:root_path], config[:salt_spm_root], 'salt') %>
10
10
 
11
11
  pillar_roots:
12
- <%= config[:salt_env] %>:
12
+ <%= config[:pillar_env] || config[:salt_env] %>:
13
13
  - <%= os_join(config[:root_path], config[:salt_pillar_root]) %>
14
14
  - <%= os_join(config[:root_path], config[:salt_spm_root], 'pillar') %>
15
15
 
@@ -47,23 +47,25 @@ module Kitchen
47
47
  is_file_root: false,
48
48
  local_salt_root: nil,
49
49
  omnibus_cachier: false,
50
+ pillar_env: nil,
50
51
  pillars_from_directories: [],
51
52
  pip_bin: 'pip',
52
53
  pip_editable: false,
53
54
  pip_extra_index_url: [],
54
- pip_index_url: 'https://pypi.python.org/simple/',
55
+ pip_index_url: 'https://pypi.org/simple/',
55
56
  pip_pkg: 'salt==%s',
56
57
  remote_states: nil,
57
58
  require_chef: true,
58
- salt_apt_repo_key: 'https://repo.saltstack.com/apt/ubuntu/16.04/amd64/latest/SALTSTACK-GPG-KEY.pub',
59
- salt_apt_repo: 'https://repo.saltstack.com/apt/ubuntu/16.04/amd64/',
59
+ salt_apt_repo_key: 'https://repo.saltproject.io/apt/ubuntu/16.04/amd64/latest/SALTSTACK-GPG-KEY.pub',
60
+ salt_apt_repo: 'https://repo.saltproject.io/apt/ubuntu/16.04/amd64',
60
61
  salt_bootstrap_options: '',
61
- salt_bootstrap_url: 'https://bootstrap.saltstack.com',
62
+ salt_bootstrap_url: 'https://bootstrap.saltproject.io',
62
63
  salt_config: '/etc/salt',
63
64
  salt_copy_filter: [],
64
65
  salt_env: 'base',
65
66
  salt_file_root: '/srv/salt',
66
67
  salt_force_color: false,
68
+ salt_enable_color: true,
67
69
  salt_install: 'bootstrap',
68
70
  salt_minion_config_dropin_files: [],
69
71
  salt_minion_config_template: nil,
@@ -75,10 +77,10 @@ module Kitchen
75
77
  salt_spm_root: '/srv/spm',
76
78
  salt_state_top: '/srv/salt/top.sls',
77
79
  salt_version: 'latest',
78
- salt_yum_repo_key: 'https://repo.saltstack.com/yum/redhat/$releasever/$basearch/archive/%s/SALTSTACK-GPG-KEY.pub',
79
- salt_yum_repo_latest: 'https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm',
80
- salt_yum_repo: 'https://repo.saltstack.com/yum/redhat/$releasever/$basearch/archive/%s',
81
- salt_yum_rpm_key: 'https://repo.saltstack.com/yum/redhat/7/x86_64/archive/%s/SALTSTACK-GPG-KEY.pub',
80
+ salt_yum_repo_key: 'https://repo.saltproject.io/yum/redhat/$releasever/$basearch/archive/%s/SALTSTACK-GPG-KEY.pub',
81
+ salt_yum_repo_latest: 'https://repo.saltproject.io/yum/redhat/salt-repo-latest-2.el7.noarch.rpm',
82
+ salt_yum_repo: 'https://repo.saltproject.io/yum/redhat/$releasever/$basearch/archive/%s',
83
+ salt_yum_rpm_key: 'https://repo.saltproject.io/yum/redhat/7/x86_64/archive/%s/SALTSTACK-GPG-KEY.pub',
82
84
  state_collection: false,
83
85
  state_top_from_file: false,
84
86
  state_top: {},
@@ -89,7 +91,7 @@ module Kitchen
89
91
 
90
92
  WIN_DEFAULT_CONFIG = {
91
93
  chef_bootstrap_url: 'https://omnitruck.chef.io/install.ps1',
92
- salt_bootstrap_url: 'https://raw.githubusercontent.com/saltstack/salt-bootstrap/develop/bootstrap-salt.ps1'
94
+ salt_bootstrap_url: 'https://winbootstrap.saltproject.io/develop'
93
95
  }.freeze
94
96
 
95
97
  # salt-call version that supports the undocumented --retcode-passthrough command
@@ -106,6 +108,7 @@ module Kitchen
106
108
  end
107
109
 
108
110
  def install_command
111
+ return unless config[:salt_install]
109
112
  unless config[:salt_install] == 'pip' || config[:install_after_init_environment]
110
113
  setup_salt
111
114
  end
@@ -123,6 +126,7 @@ module Kitchen
123
126
  #{config[:prepare_salt_environment]}
124
127
  PREPARE
125
128
  end
129
+ return cmd unless config[:salt_install]
126
130
  if config[:salt_install] == 'pip' || config[:install_after_init_environment]
127
131
  cmd << setup_salt
128
132
  end
@@ -136,8 +140,13 @@ module Kitchen
136
140
  # if salt_verison is set, bootstrap is being used & bootstrap_options is empty,
137
141
  # set the bootstrap_options string to git install the requested version
138
142
  if (salt_version != 'latest') && (config[:salt_install] == 'bootstrap') && config[:salt_bootstrap_options].empty?
139
- debug("Using bootstrap git to install #{salt_version}")
140
- config[:salt_bootstrap_options] = "-P git v#{salt_version}"
143
+ if windows_os?
144
+ debug("Using bootstrap to install #{salt_version}")
145
+ config[:salt_bootstrap_options] = "-version #{salt_version}"
146
+ else
147
+ debug("Using bootstrap git to install #{salt_version}")
148
+ config[:salt_bootstrap_options] = "-P git v#{salt_version}"
149
+ end
141
150
  end
142
151
 
143
152
  install_template = if windows_os?
@@ -208,6 +217,7 @@ module Kitchen
208
217
  end
209
218
 
210
219
  def prepare_install
220
+ return unless config[:salt_install]
211
221
  salt_version = config[:salt_version]
212
222
  if config[:salt_install] == 'pip'
213
223
  debug('Using pip to install')
@@ -268,11 +278,24 @@ module Kitchen
268
278
  cmd << sudo("#{config[:root_path]}/gpgkey.sh;") if config[:gpg_key]
269
279
  salt_config_path = config[:salt_config]
270
280
  end
271
- cmd << sudo("#{salt_call} --state-output=changes --config-dir=#{os_join(config[:root_path], salt_config_path)} state.highstate")
281
+
282
+ if config[:pre_salt_command]
283
+ cmd << "#{config[:pre_salt_command]} && "
284
+ end
285
+ cmd << sudo("#{salt_call}")
286
+ state_output = config[:salt_minion_extra_config][:state_output]
287
+ if state_output
288
+ cmd << " --state-output=#{state_output}"
289
+ else
290
+ cmd << " --state-output=changes"
291
+ end
292
+ cmd << " --config-dir=#{os_join(config[:root_path], salt_config_path)}"
293
+ cmd << " state.highstate"
272
294
  cmd << " --log-level=#{config[:log_level]}" if config[:log_level]
273
295
  cmd << " --id=#{config[:salt_minion_id]}" if config[:salt_minion_id]
274
296
  cmd << " test=#{config[:dry_run]}" if config[:dry_run]
275
297
  cmd << ' --force-color' if config[:salt_force_color]
298
+ cmd << ' --no-color' if not config[:salt_enable_color]
276
299
  if "#{salt_version}" > RETCODE_VERSION || salt_version == 'latest'
277
300
  # hope for the best and hope it works eventually
278
301
  cmd << ' --retcode-passthrough'
@@ -404,6 +427,13 @@ module Kitchen
404
427
  end
405
428
 
406
429
  def prepare_dependencies
430
+ # Dependency scripts are bash scripts only
431
+ # Copying them clobbers the kitchen temp directory
432
+ # with a file named `kitchen`. If adding Windows
433
+ # support for dependencies, relocate into a
434
+ # sub-directory
435
+ return if windows_os?
436
+
407
437
  # upload scripts
408
438
  sandbox_scripts_path = File.join(sandbox_path, config[:salt_config], 'scripts')
409
439
  info("Preparing scripts into #{config[:salt_config]}/scripts")
@@ -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,68 +13,130 @@ 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
18
+ default_config :windows do |verifier|
19
+ verifier.windows_os? ? true : false
20
+ end
17
21
  default_config :verbose, false
18
22
  default_config :run_destructive, false
19
- default_config :ssh_tests, true
20
- default_config :proxy_tests, false
21
- default_config :pytest, false
23
+ default_config :runtests, false
22
24
  default_config :coverage, false
23
25
  default_config :junitxml, false
24
26
  default_config :from_filenames, []
27
+ default_config :from_filenames_basename, "changed-files-list.txt"
28
+ default_config :from_filenames_path, false
25
29
  default_config :enable_filenames, false
26
30
  default_config :passthrough_opts, []
27
31
  default_config :output_columns, 120
28
32
  default_config :sysinfo, true
33
+ default_config :sys_stats, false
34
+ default_config :environment_vars, {}
35
+ default_config :zip_windows_artifacts, false
29
36
 
30
37
  def call(state)
31
- info("[#{name}] Verify on instance #{instance.name} with state=#{state}")
38
+ create_sandbox
39
+ debug("Detected platform for instance #{instance.name}: #{instance.platform.os_type}. Config's windows setting value: #{config[:windows]}")
40
+ if (ENV['ONLY_DOWNLOAD_ARTEFACTS'] || '') == '1'
41
+ only_download_artefacts = true
42
+ else
43
+ only_download_artefacts = false
44
+ end
45
+ if (ENV['DONT_DOWNLOAD_ARTEFACTS'] || '') == '1'
46
+ dont_download_artefacts = true
47
+ else
48
+ dont_download_artefacts = false
49
+ end
50
+ if only_download_artefacts and dont_download_artefacts
51
+ error_msg = "The environment variables 'ONLY_DOWNLOAD_ARTEFACTS' or 'DONT_DOWNLOAD_ARTEFACTS' cannot be both set to '1'"
52
+ error(error_msg)
53
+ raise ActionFailed, error_msg
54
+ end
55
+ if only_download_artefacts
56
+ info("[#{name}] Only downloading artefacts from instance #{instance.name} with state=#{state}")
57
+ else
58
+ info("[#{name}] Verify on instance #{instance.name} with state=#{state}")
59
+ if ENV['NOX_ENABLE_FROM_FILENAMES']
60
+ config[:enable_filenames] = true
61
+ end
62
+
63
+ if config[:enable_filenames] and ENV['CHANGE_TARGET'] and ENV['BRANCH_NAME'] and ENV['FORCE_FULL'] != 'true'
64
+ require 'git'
65
+ repo = Git.open(Dir.pwd)
66
+ config[:from_filenames] = repo.diff("origin/#{ENV['CHANGE_TARGET']}",
67
+ "origin/#{ENV['BRANCH_NAME']}").name_status.keys.select{|file| file.end_with?('.py')}
68
+ debug("Populating `from_filenames` with: #{config[:from_filenames]}")
69
+ if config[:windows] && config[:from_filenames].any?
70
+ # On windows, if the changed files list is too big, it will error.
71
+ # Let's then pass an absolute path to a text file which contains the list of changed
72
+ # files, one per line.
73
+ config[:from_filenames_path] = File.join(sandbox_path, config[:from_filenames_basename])
74
+ from_filenames_contents = "#{config[:from_filenames].join('\n')}"
75
+ File.open(config[:from_filenames_path], "w") { |f| f.write from_filenames_contents }
76
+ info("Created #{config[:from_filenames_path]} with contents:\n#{from_filenames_contents}")
77
+ end
78
+ end
79
+ end
32
80
  root_path = (config[:windows] ? '%TEMP%\\kitchen' : '/tmp/kitchen')
33
81
  if ENV['KITCHEN_TESTS']
34
82
  ENV['KITCHEN_TESTS'].split(' ').each{|test| config[:tests].push(test)}
35
83
  end
36
- noxenv = instance.suite.name
37
- if config[:pytest]
38
- noxenv = "pytest"
39
- tests = config[:tests].join(' ')
84
+
85
+ if ENV['NOX_PASSTHROUGH_OPTS']
86
+ ENV['NOX_PASSTHROUGH_OPTS'].split(' ').each{|opt| config[:passthrough_opts].push(opt)}
87
+ end
88
+
89
+ if ENV['NOX_ENV_NAME']
90
+ noxenv = ENV['NOX_ENV_NAME']
91
+ elsif config[:runtests] == true
92
+ noxenv = "runtests-zeromq"
40
93
  else
41
- noxenv = "runtests"
42
- tests = config[:tests].collect{|test| "-n #{test}"}.join(' ')
94
+ # Default to pytest-zeromq
95
+ noxenv = "pytest-zeromq"
43
96
  end
44
- noxenv = "#{noxenv}-#{config[:transport] ? config[:transport] : 'zeromq'}"
45
- if ENV['NOX_SESSION']
46
- noxenv = "#{noxenv}-#{ENV['NOX_SESSION']}"
97
+
98
+ # Is the nox env already including the Python version?
99
+ if not noxenv.match(/^(.*)-([\d]{1})(\.([\d]{1}))?$/)
100
+ # Nox env's are not py<python-version> named, they just use the <python-version>
101
+ # Additionally, nox envs are parametrised to enable or disable test coverage
102
+ # So, the line below becomes something like:
103
+ # runtests-2(coverage=True)
104
+ # pytest-3(coverage=False)
105
+ suite = instance.suite.name.gsub('py', '').gsub('2', '2.7')
106
+ noxenv = "#{noxenv}-#{suite}"
47
107
  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'})"
108
+ noxenv = "#{noxenv}(coverage=#{config[:coverage] ? 'True' : 'False'})"
55
109
 
56
- if config[:enable_filenames] and ENV['CHANGE_TARGET'] and ENV['BRANCH_NAME']
57
- require 'git'
58
- repo = Git.open(Dir.pwd)
59
- config[:from_filenames] = repo.diff("origin/#{ENV['CHANGE_TARGET']}",
60
- "origin/#{ENV['BRANCH_NAME']}").name_status.keys.select{|file| file.end_with?('.py')}
110
+ if noxenv.include? "pytest"
111
+ tests = config[:tests].join(' ')
112
+ if config[:sys_stats]
113
+ sys_stats = '--sys-stats'
114
+ if not config[:verbose]
115
+ config[:verbose] = true
116
+ end
117
+ else
118
+ sys_stats = ''
119
+ end
120
+ elsif noxenv.include? "runtests"
121
+ tests = config[:tests].collect{|test| "-n #{test}"}.join(' ')
122
+ sys_stats = ''
61
123
  end
62
124
 
63
125
  if config[:junitxml]
64
126
  junitxml = File.join(root_path, config[:testingdir], 'artifacts', 'xml-unittests-output')
65
- if config[:pytest]
66
- junitxml = "--junitxml=#{File.join(junitxml, 'test-results.xml')}"
127
+ if noxenv.include? "pytest"
128
+ junitxml = "--junitxml=#{File.join(junitxml, "test-results-#{DateTime.now.strftime('%Y%m%d%H%M%S.%L')}.xml")}"
67
129
  else
68
130
  junitxml = "--xml=#{junitxml}"
69
131
  end
70
132
  end
71
133
 
72
134
  # 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
- }
135
+ if config[:windows]
136
+ save = {'$env:KitchenTestingDir/artifacts/' => "#{Dir.pwd}"}
137
+ else
138
+ save = {"#{File.join(root_path, config[:testingdir], 'artifacts')}/" => "#{Dir.pwd}"}
139
+ end
76
140
  # Hash insert order matters, that's why we define a new one and merge
77
141
  # the one from config
78
142
  save.merge!(config[:save])
@@ -80,60 +144,131 @@ module Kitchen
80
144
  command = [
81
145
  'nox',
82
146
  "-f #{File.join(root_path, config[:testingdir], 'noxfile.py')}",
147
+ (config[:windows] ? "--envdir=C:\\Windows\\Temp\\nox" : ""),
83
148
  (config[:windows] ? "-e #{noxenv}" : "-e '#{noxenv}'"),
84
149
  '--',
85
150
  "--output-columns=#{config[:output_columns]}",
151
+ sys_stats,
86
152
  (config[:sysinfo] ? '--sysinfo' : ''),
87
153
  (config[:junitxml] ? junitxml : ''),
88
- (config[:windows] ? "--names-file=#{root_path}\\testing\\tests\\whitelist.txt" : ''),
89
154
  (config[:verbose] ? '-vv' : '-v'),
90
- (config[:run_destructive] ? "--run-destructive" : ''),
91
- (config[:ssh_tests] ? "--ssh-tests" : ''),
92
- (config[:proxy_tests] ? "--proxy-tests" : ''),
155
+ (config[:run_destructive] ? '--run-destructive' : ''),
93
156
  config[:passthrough_opts].join(' '),
94
- (config[:from_filenames].any? ? "--from-filenames=#{config[:from_filenames].join(',')}" : ''),
95
- tests,
96
157
  ].join(' ')
158
+
159
+ if tests.nil? || tests.empty?
160
+ # If we're not targetting specific tests...
161
+ extra_command = []
162
+ if config[:windows]
163
+ extra_command.push("--names-file=#{root_path}\\testing\\tests\\whitelist.txt")
164
+ if config[:from_filenames_path]
165
+ # Add the required command flag for the tests runner
166
+ extra_command.push("--from-filenames=#{root_path}\\testing\\#{config[:from_filenames_basename]}")
167
+ end
168
+ else
169
+ if config[:from_filenames].any?
170
+ extra_command.push("--from-filenames=#{config[:from_filenames].join(',')}")
171
+ end
172
+ end
173
+ command = "#{command} #{extra_command.join(' ')}"
174
+ else
175
+ command = "#{command} #{tests}"
176
+ end
177
+
178
+ environment_vars = {}
179
+ if ENV['CI'] || ENV['DRONE'] || ENV['JENKINS_URL']
180
+ environment_vars['CI'] = 1
181
+ end
182
+ # Hash insert order matters, that's why we define a new one and merge
183
+ # the one from config
184
+ environment_vars.merge!(config[:environment_vars])
185
+
186
+ # Strip trailing whitespace
187
+ command = command.rstrip
188
+
97
189
  if config[:windows]
98
190
  command = "cmd.exe /c --% \"#{command}\" 2>&1"
99
191
  end
100
- info("Running Command: #{command}")
101
192
  instance.transport.connection(state) do |conn|
102
193
  begin
103
194
  if config[:windows]
104
195
  conn.execute('$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")')
105
- conn.execute("$env:PythonPath = [Environment]::ExpandEnvironmentVariables(\"#{root_path}\\testing\")")
196
+ conn.execute("$env:PythonPath = [Environment]::ExpandEnvironmentVariables(\"#{File.join(root_path, config[:testingdir])}\")")
197
+ conn.execute("[Environment]::SetEnvironmentVariable(\"KitchenTestingDir\", [Environment]::ExpandEnvironmentVariables(\"#{File.join(root_path, config[:testingdir])}\"), \"Machine\")")
198
+ environment_vars.each do |key, value|
199
+ conn.execute("[Environment]::SetEnvironmentVariable(\"#{key}\", \"#{value}\", \"Machine\")")
200
+ end
106
201
  else
202
+ command_env = []
203
+ environment_vars.each do |key, value|
204
+ command_env.push("#{key}=#{value}")
205
+ end
206
+ if not command_env.empty?
207
+ command = "env #{command_env.join(' ')} #{command}"
208
+ end
107
209
  begin
108
210
  conn.execute(sudo("chown -R $USER #{root_path}"))
109
211
  rescue => e
110
212
  error("Failed to chown #{root_path} :: #{e}")
111
213
  end
112
214
  end
113
- begin
215
+ if not only_download_artefacts
216
+ if config[:from_filenames_path]
217
+ upload_file_path = "$env:KitchenTestingDir\\#{config[:from_filenames_basename]}"
218
+ info("Uploading #{config[:from_filenames_path]} to #{upload_file_path} on #{instance.to_str}")
219
+ conn.upload(config[:from_filenames_path], "#{upload_file_path}")
220
+ end
221
+ info("Running Command: #{command}")
114
222
  conn.execute(sudo(command))
115
- rescue => e
116
- info("Verify command failed :: #{e}")
117
223
  end
118
224
  ensure
119
- save.each do |remote, local|
120
- unless config[:windows]
225
+ if not dont_download_artefacts
226
+ save.each do |remote, local|
227
+ if config[:windows]
228
+ if config[:zip_windows_artifacts]
229
+ begin
230
+ conn.execute("7z.exe a #{remote}artifacts.zip #{remote}")
231
+ rescue => e
232
+ begin
233
+ info("7z.exe failed, attempting zip with powershell Compress-Archive")
234
+ conn.execute("powershell Compress-Archive #{remote} #{remote}artifacts.zip -Force")
235
+ rescue => e2
236
+ error("Failed to create zip: #{e2}")
237
+ end
238
+ end
239
+ end
240
+ else
241
+ begin
242
+ conn.execute(sudo("chmod -R +r #{remote}"))
243
+ rescue => e
244
+ error("Failed to chown #{remote} :: #{e}")
245
+ end
246
+ end
121
247
  begin
122
- conn.execute(sudo("chmod -R +r #{remote}"))
248
+ info("Copying #{remote} to #{local}")
249
+ if config[:windows]
250
+ if config[:zip_windows_artifacts]
251
+ conn.download(remote + "artifacts.zip", local + "/artifacts.zip")
252
+ system('unzip -o artifacts.zip')
253
+ system('rm artifacts.zip')
254
+ end
255
+ else
256
+ conn.download(remote, local)
257
+ end
123
258
  rescue => e
124
- error("Failed to chown #{remote} :: #{e}")
259
+ error("Failed to copy #{remote} to #{local} :: #{e}")
125
260
  end
126
261
  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
262
  end
134
263
  end
135
264
  end
136
- debug("[#{name}] Verify completed.")
265
+ if only_download_artefacts
266
+ info("[#{name}] Download artefacts completed.")
267
+ else
268
+ debug("[#{name}] Verify completed.")
269
+ end
270
+ ensure
271
+ cleanup_sandbox
137
272
  end
138
273
  end
139
274
  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]
@@ -20,6 +20,9 @@ module Kitchen
20
20
  # load a top.sls from disk
21
21
  if config[:local_salt_root].nil?
22
22
  top_file = 'top.sls'
23
+ unless config[:state_collection].nil?
24
+ top_file = File.join(config[:state_collection], top_file)
25
+ end
23
26
  else
24
27
  top_file = File.join(config[:local_salt_root], 'salt/top.sls')
25
28
  end
@@ -77,7 +80,7 @@ module Kitchen
77
80
  cp_r_with_filter(File.join(path, formula), formula_dir, config[:salt_copy_filter])
78
81
 
79
82
  # copy across the _modules etc directories for python implementation
80
- %w(_modules _states _grains _renderers _returners).each do |extrapath|
83
+ %w(_modules _states _grains _renderers _returners _runners _utils).each do |extrapath|
81
84
  prepare_formula_dir(path, extrapath)
82
85
  end
83
86
  end
@@ -96,6 +99,9 @@ module Kitchen
96
99
 
97
100
  if config[:local_salt_root].nil?
98
101
  states_location = config[:kitchen_root]
102
+ unless config[:state_collection].nil?
103
+ states_location = File.join(states_location, config[:state_collection])
104
+ end
99
105
  else
100
106
  states_location = File.join(config[:local_salt_root], 'salt')
101
107
  end
@@ -57,7 +57,6 @@ module Kitchen
57
57
 
58
58
  def salt_call
59
59
  return config[:salt_call_command] if config[:salt_call_command]
60
- return 'c:\\salt\\salt-call.bat' if windows_os?
61
60
  'salt-call'
62
61
  end
63
62
 
@@ -1,5 +1,5 @@
1
1
  module Kitchen
2
2
  module Salt
3
- VERSION = '0.6.0'.freeze
3
+ VERSION = '0.6.4'.freeze
4
4
  end
5
5
  end
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.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - SaltStack Inc
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-25 00:00:00.000000000 Z
11
+ date: 2022-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -166,7 +166,7 @@ homepage: https://github.com/saltstack/kitchen-salt
166
166
  licenses:
167
167
  - Apache-2.0
168
168
  metadata: {}
169
- post_install_message:
169
+ post_install_message:
170
170
  rdoc_options: []
171
171
  require_paths:
172
172
  - lib
@@ -181,9 +181,8 @@ 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
186
- signing_key:
184
+ rubygems_version: 3.0.3
185
+ signing_key:
187
186
  specification_version: 4
188
187
  summary: salt provisioner for test-kitchen
189
188
  test_files: []