chef-apply 0.2.1 → 0.2.2
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/Gemfile.lock +13 -10
- data/lib/chef_apply/action/base.rb +6 -11
- data/lib/chef_apply/action/converge_target.rb +5 -7
- data/lib/chef_apply/action/install_chef/linux.rb +1 -2
- data/lib/chef_apply/target_host.rb +53 -6
- data/lib/chef_apply/version.rb +1 -1
- data/spec/unit/action/base_spec.rb +1 -1
- data/spec/unit/action/converge_target_spec.rb +3 -3
- data/spec/unit/target_host_spec.rb +79 -9
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47763f0152ecf082b519b5e8f19aee5616d37bbf96693b0751e74f51632be7f8
|
4
|
+
data.tar.gz: 55feba8903fa01cab32672129689d34ead1e005750db15505cd5fbae9ab54366
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16ce92eeadd92a96cf00a56d4c2faaa551fef3b442eee4ba54cda7f81671f8af876090611e59f2ece3b7ded1ec04f29bb56baa1f6e183c5db2bfc919915703c5
|
7
|
+
data.tar.gz: de6f1bd15e8e62c54332089364cfe1a3c9989e903403913667fa77ebd15af96479654ed279c6c4ce04d345864a50a2ad9c844481f8f7771b4a59d3b26d266f6a
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
chef-apply (0.2.
|
4
|
+
chef-apply (0.2.2)
|
5
5
|
chef (>= 14.0)
|
6
6
|
chef-dk (>= 3.0)
|
7
7
|
chef-telemetry
|
@@ -21,16 +21,18 @@ GEM
|
|
21
21
|
addressable (2.5.2)
|
22
22
|
public_suffix (>= 2.0.2, < 4.0)
|
23
23
|
ast (2.4.0)
|
24
|
-
aws-sdk (2.11.
|
25
|
-
aws-sdk-resources (= 2.11.
|
26
|
-
aws-sdk-core (2.11.
|
24
|
+
aws-sdk (2.11.153)
|
25
|
+
aws-sdk-resources (= 2.11.153)
|
26
|
+
aws-sdk-core (2.11.153)
|
27
27
|
aws-sigv4 (~> 1.0)
|
28
28
|
jmespath (~> 1.0)
|
29
|
-
aws-sdk-resources (2.11.
|
30
|
-
aws-sdk-core (= 2.11.
|
29
|
+
aws-sdk-resources (2.11.153)
|
30
|
+
aws-sdk-core (= 2.11.153)
|
31
31
|
aws-sigv4 (1.0.3)
|
32
32
|
azure_graph_rbac (0.17.0)
|
33
33
|
ms_rest_azure (~> 0.11.0)
|
34
|
+
azure_mgmt_key_vault (0.17.2)
|
35
|
+
ms_rest_azure (~> 0.11.0)
|
34
36
|
azure_mgmt_resources (0.17.2)
|
35
37
|
ms_rest_azure (~> 0.11.0)
|
36
38
|
binding_of_caller (0.8.0)
|
@@ -147,10 +149,10 @@ GEM
|
|
147
149
|
representable (~> 3.0)
|
148
150
|
retriable (>= 2.0, < 4.0)
|
149
151
|
signet (~> 0.9)
|
150
|
-
googleauth (0.6.
|
152
|
+
googleauth (0.6.7)
|
151
153
|
faraday (~> 0.12)
|
152
154
|
jwt (>= 1.4, < 3.0)
|
153
|
-
memoist (~> 0.
|
155
|
+
memoist (~> 0.16)
|
154
156
|
multi_json (~> 1.11)
|
155
157
|
os (>= 0.9, < 2.0)
|
156
158
|
signet (~> 0.7)
|
@@ -330,9 +332,10 @@ GEM
|
|
330
332
|
toml-rb (1.1.2)
|
331
333
|
citrus (~> 3.0, > 3.0)
|
332
334
|
tomlrb (1.2.7)
|
333
|
-
train (1.5.
|
335
|
+
train (1.5.4)
|
334
336
|
aws-sdk (~> 2)
|
335
337
|
azure_graph_rbac (~> 0.16)
|
338
|
+
azure_mgmt_key_vault (~> 0.17)
|
336
339
|
azure_mgmt_resources (~> 0.15)
|
337
340
|
docker-api (~> 1.26)
|
338
341
|
google-api-client (~> 0.23.9)
|
@@ -389,4 +392,4 @@ DEPENDENCIES
|
|
389
392
|
simplecov
|
390
393
|
|
391
394
|
BUNDLED WITH
|
392
|
-
1.16.
|
395
|
+
1.16.6
|
@@ -60,23 +60,18 @@ module ChefApply
|
|
60
60
|
windows: "%TEMP%",
|
61
61
|
other: "$TMPDIR",
|
62
62
|
},
|
63
|
-
mkdir: {
|
64
|
-
windows: "New-Item -ItemType Directory -Force -Path ",
|
65
|
-
other: "mkdir -p ",
|
66
|
-
},
|
67
|
-
# TODO this is duplicating some stuff in the install_chef folder
|
68
|
-
# TODO maybe we start to break these out into actual functions, so
|
69
|
-
# we don't have to try and make really long one-liners
|
70
|
-
mktemp: {
|
71
|
-
windows: "$parent = [System.IO.Path]::GetTempPath(); [string] $name = [System.Guid]::NewGuid(); $tmp = New-Item -ItemType Directory -Path (Join-Path $parent $name); $tmp.FullName",
|
72
|
-
other: "bash -c 'd=$(mktemp -d -p${TMPDIR:-/tmp} chef_XXXXXX); chmod 777 $d; echo $d'"
|
73
|
-
},
|
74
63
|
delete_folder: {
|
75
64
|
windows: "Remove-Item -Recurse -Force –Path",
|
76
65
|
other: "rm -rf",
|
77
66
|
}
|
78
67
|
}
|
79
68
|
|
69
|
+
# TODO - I'd like to consider PATH_MAPPING in action::base
|
70
|
+
# to platform subclasses/mixins for target_host. This way our 'target host'
|
71
|
+
# which reprsents a node, the data and actions we can perform on it
|
72
|
+
# knows how to `read_chef_report`, `mkdir`, etc.
|
73
|
+
# -mp 2018-10-17
|
74
|
+
|
80
75
|
PATH_MAPPING.keys.each do |m|
|
81
76
|
define_method(m) { PATH_MAPPING[m][family] }
|
82
77
|
end
|
@@ -26,8 +26,10 @@ module ChefApply::Action
|
|
26
26
|
|
27
27
|
def perform_action
|
28
28
|
local_policy_path = config.delete :local_policy_path
|
29
|
-
remote_tmp = target_host.
|
30
|
-
remote_dir_path = escape_windows_path(remote_tmp
|
29
|
+
remote_tmp = target_host.mktemp()
|
30
|
+
remote_dir_path = escape_windows_path(remote_tmp)
|
31
|
+
# Ensure the directory is owned by the connecting user,
|
32
|
+
# otherwise we won't be able to put things into it over scp as that user.
|
31
33
|
remote_policy_path = create_remote_policy(local_policy_path, remote_dir_path)
|
32
34
|
remote_config_path = create_remote_config(remote_dir_path)
|
33
35
|
create_remote_handler(remote_dir_path)
|
@@ -134,11 +136,7 @@ module ChefApply::Action
|
|
134
136
|
return if certs.empty?
|
135
137
|
notify(:uploading_trusted_certs)
|
136
138
|
remote_tcd = "#{dir}/trusted_certs"
|
137
|
-
|
138
|
-
# user it would get as default since we run in sudo mode) because the `upload_file`
|
139
|
-
# uploads as the connection user. Without this upload_file would fail because
|
140
|
-
# it tries to write to a root-owned folder.
|
141
|
-
target_host.run_command("#{mkdir} #{remote_tcd}", true)
|
139
|
+
target_host.mkdir(remote_tcd)
|
142
140
|
certs.each do |cert_file|
|
143
141
|
target_host.upload_file(cert_file, "#{remote_tcd}/#{File.basename(cert_file)}")
|
144
142
|
end
|
@@ -30,8 +30,7 @@ module ChefApply::Action::InstallChef
|
|
30
30
|
|
31
31
|
def setup_remote_temp_path
|
32
32
|
installer_dir = "/tmp/chef-installer"
|
33
|
-
target_host.
|
34
|
-
target_host.run_command!("chmod 777 #{installer_dir}")
|
33
|
+
target_host.mkdir(installer_dir)
|
35
34
|
installer_dir
|
36
35
|
end
|
37
36
|
end
|
@@ -127,18 +127,15 @@ module ChefApply
|
|
127
127
|
backend.platform
|
128
128
|
end
|
129
129
|
|
130
|
-
def run_command!(command
|
131
|
-
result = run_command(command
|
130
|
+
def run_command!(command)
|
131
|
+
result = run_command(command)
|
132
132
|
if result.exit_status != 0
|
133
133
|
raise RemoteExecutionFailed.new(@config[:host], command, result)
|
134
134
|
end
|
135
135
|
result
|
136
136
|
end
|
137
137
|
|
138
|
-
def run_command(command
|
139
|
-
if config[:sudo] && sudo_as_user && base_os == :linux
|
140
|
-
command = "-u #{config[:user]} #{command}"
|
141
|
-
end
|
138
|
+
def run_command(command)
|
142
139
|
backend.run_command command
|
143
140
|
end
|
144
141
|
|
@@ -179,6 +176,56 @@ module ChefApply
|
|
179
176
|
JSON.parse(manifest.content)
|
180
177
|
end
|
181
178
|
|
179
|
+
# create a dir. set owner to the connecting user if host isn't windows
|
180
|
+
# so that scp -- which uses the connecting user -- can upload into it.
|
181
|
+
def mkdir(path)
|
182
|
+
if base_os == :windows
|
183
|
+
run_command!("New-Item -ItemType Directory -Force -Path #{path}")
|
184
|
+
else
|
185
|
+
# This will also set ownership to the connecting user instead of default of
|
186
|
+
# root when sudo'd, so that the dir can be used to upload files using scp -
|
187
|
+
# which is done as the connecting user.
|
188
|
+
run_command!("mkdir -p #{path}")
|
189
|
+
chown(path, user)
|
190
|
+
end
|
191
|
+
nil
|
192
|
+
end
|
193
|
+
|
194
|
+
# TODO make these platform-specific classes instead of conditionals
|
195
|
+
|
196
|
+
# Simplified chown - just sets user , defaults to connection user. Does not touch
|
197
|
+
# group. Only has effect on non-windows targets
|
198
|
+
def chown(path, owner = nil)
|
199
|
+
return if base_os == :windows
|
200
|
+
owner ||= user
|
201
|
+
run_command!("chown #{owner} '#{path}'")
|
202
|
+
end
|
203
|
+
|
204
|
+
MKTMP_WIN_CMD = "$parent = [System.IO.Path]::GetTempPath();" +
|
205
|
+
"[string] $name = [System.Guid]::NewGuid();" +
|
206
|
+
"$tmp = New-Item -ItemType Directory -Path " +
|
207
|
+
"(Join-Path $parent $name);" +
|
208
|
+
"$tmp.FullName"
|
209
|
+
|
210
|
+
MKTMP_LINUX_CMD = "d=$(mktemp -d -p${TMPDIR:-/tmp} chef_XXXXXX); echo $d"
|
211
|
+
|
212
|
+
# Create temporary dir and return the path.
|
213
|
+
# This will also set ownership to the connecting user instead of default of
|
214
|
+
# root when sudo'd, so that the dir can be used to upload files using scp -
|
215
|
+
# which is done as the connecting user.
|
216
|
+
def mktemp
|
217
|
+
if base_os == :windows
|
218
|
+
res = run_command!(MKTMP_WIN_CMD)
|
219
|
+
res.stdout.chomp.strip
|
220
|
+
else
|
221
|
+
# # TODO should we keep chmod 777?
|
222
|
+
res = run_command!("bash -c '#{MKTMP_LINUX_CMD}'")
|
223
|
+
path = res.stdout.chomp.strip
|
224
|
+
chown(path)
|
225
|
+
path
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
182
229
|
private
|
183
230
|
|
184
231
|
def train_connection
|
data/lib/chef_apply/version.rb
CHANGED
@@ -57,7 +57,7 @@ RSpec.describe ChefApply::Action::Base do
|
|
57
57
|
end
|
58
58
|
|
59
59
|
shared_examples "check path fetching" do
|
60
|
-
[:chef_client, :cache_path, :read_chef_report, :delete_chef_report, :tempdir, :
|
60
|
+
[:chef_client, :cache_path, :read_chef_report, :delete_chef_report, :tempdir, :delete_folder].each do |path|
|
61
61
|
it "correctly returns path #{path}" do
|
62
62
|
expect(action.send(path)).to be_a(String)
|
63
63
|
end
|
@@ -232,7 +232,7 @@ RSpec.describe ChefApply::Action::ConvergeTarget do
|
|
232
232
|
let!(:cert2) { FileUtils.touch(File.join(certs_dir, "2.pem"))[0] }
|
233
233
|
|
234
234
|
it "uploads the local certs" do
|
235
|
-
expect(target_host).to receive(:
|
235
|
+
expect(target_host).to receive(:mkdir).with(remote_tcd)
|
236
236
|
expect(target_host).to receive(:upload_file).with(cert1, File.join(remote_tcd, File.basename(cert1)))
|
237
237
|
expect(target_host).to receive(:upload_file).with(cert2, File.join(remote_tcd, File.basename(cert2)))
|
238
238
|
subject.upload_trusted_certs(remote_folder)
|
@@ -254,9 +254,9 @@ RSpec.describe ChefApply::Action::ConvergeTarget do
|
|
254
254
|
let(:remote_archive) { File.join(remote_folder, File.basename(archive)) }
|
255
255
|
let(:remote_config) { "#{remote_folder}/workstation.rb" }
|
256
256
|
let(:remote_handler) { "#{remote_folder}/reporter.rb" }
|
257
|
-
let(:tmpdir) {
|
257
|
+
let(:tmpdir) { remote_folder }
|
258
258
|
before do
|
259
|
-
expect(target_host).to receive(:
|
259
|
+
expect(target_host).to receive(:mktemp).and_return(tmpdir)
|
260
260
|
end
|
261
261
|
let(:result) { double("command result", exit_status: 0, stdout: "") }
|
262
262
|
|
@@ -129,15 +129,6 @@ RSpec.describe ChefApply::TargetHost do
|
|
129
129
|
it "returns the result" do
|
130
130
|
expect(subject.run_command!(command)).to eq result
|
131
131
|
end
|
132
|
-
|
133
|
-
context "when sudo_as_user is true" do
|
134
|
-
let(:family) { "debian" }
|
135
|
-
let(:is_linux) { true }
|
136
|
-
it "returns the result" do
|
137
|
-
expect(backend).to receive(:run_command).with("-u user #{command}").and_return(result)
|
138
|
-
expect(subject.run_command!(command, true)).to eq result
|
139
|
-
end
|
140
|
-
end
|
141
132
|
end
|
142
133
|
|
143
134
|
context "when an error occurs" do
|
@@ -228,4 +219,83 @@ RSpec.describe ChefApply::TargetHost do
|
|
228
219
|
end
|
229
220
|
end
|
230
221
|
|
222
|
+
context "target host operations" do
|
223
|
+
let(:base_os) { :unknown }
|
224
|
+
let(:user) { "testuser" }
|
225
|
+
before do
|
226
|
+
allow(subject).to receive(:base_os).and_return base_os
|
227
|
+
allow(subject).to receive(:user).and_return user
|
228
|
+
end
|
229
|
+
context "#mkdir" do
|
230
|
+
context "when the target is Windows" do
|
231
|
+
let(:base_os) { :windows }
|
232
|
+
it "creates the directory using the correct command PowerShell command" do
|
233
|
+
# TODO - testing command strings always feels a bit like an antipattern. Do we have alternatives?
|
234
|
+
expect(subject).to receive(:run_command!).with("New-Item -ItemType Directory -Force -Path C:\\temp\\dir")
|
235
|
+
subject.mkdir("C:\\temp\\dir")
|
236
|
+
end
|
237
|
+
|
238
|
+
end
|
239
|
+
context "when the target is Linux" do
|
240
|
+
let(:base_os) { :linux }
|
241
|
+
it "uses a properly formed mkdir to create the directory and changes ownership to connected user" do
|
242
|
+
expect(subject).to receive(:run_command!).with("mkdir -p /tmp/dir")
|
243
|
+
expect(subject).to receive(:run_command!).with("chown testuser '/tmp/dir'")
|
244
|
+
subject.mkdir("/tmp/dir")
|
245
|
+
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
context "#chown" do
|
251
|
+
context "when the target is Windows" do
|
252
|
+
let(:base_os) { :windows }
|
253
|
+
xit "does nothing - this is not implemented until we need it"
|
254
|
+
end
|
255
|
+
|
256
|
+
context "when the target is Linux" do
|
257
|
+
let(:base_os) { :linux }
|
258
|
+
let(:path) { "/tmp/blah" }
|
259
|
+
|
260
|
+
context "and an owner is provided" do
|
261
|
+
it "uses a properly formed chown to change owning user to the connected user" do
|
262
|
+
expect(subject).to receive(:run_command!).with("chown newowner '/tmp/dir'")
|
263
|
+
subject.chown("/tmp/dir", "newowner")
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
context "and an owner is not provided" do
|
268
|
+
it "uses a properly formed chown to change owning user to the connected user" do
|
269
|
+
expect(subject).to receive(:run_command!).with("chown #{user} '/tmp/dir'")
|
270
|
+
subject.chown("/tmp/dir")
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
context "#mktemp" do
|
277
|
+
context "when the target is Windows" do
|
278
|
+
let(:base_os) { :windows }
|
279
|
+
let(:path) { "C:\\temp\\blah" }
|
280
|
+
it "creates the temporary directory using the correct PowerShell command and returns the path" do
|
281
|
+
expect(subject).to receive(:run_command!).
|
282
|
+
with(ChefApply::TargetHost::MKTMP_WIN_CMD).
|
283
|
+
and_return(instance_double("result", stdout: path))
|
284
|
+
expect(subject.mktemp()).to eq(path)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
context "when the target is Linux" do
|
289
|
+
let(:base_os) { :linux }
|
290
|
+
let(:path) { "/tmp/blah" }
|
291
|
+
it "creates the directory using a properly formed mktemp, changes ownership to connecting user, and returns the path" do
|
292
|
+
expect(subject).to receive(:run_command!).
|
293
|
+
with("bash -c '#{ChefApply::TargetHost::MKTMP_LINUX_CMD}'").
|
294
|
+
and_return(instance_double("result", stdout: "/tmp/blah"))
|
295
|
+
expect(subject).to receive(:chown).with(path)
|
296
|
+
expect(subject.mktemp()).to eq path
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
231
301
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-apply
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chef Software, Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mixlib-cli
|