puppet 6.17.0-x86-mingw32 → 6.18.0-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile.lock +6 -5
- data/lib/puppet/application/apply.rb +18 -20
- data/lib/puppet/application/lookup.rb +16 -4
- data/lib/puppet/configurer/downloader.rb +31 -10
- data/lib/puppet/confine.rb +1 -1
- data/lib/puppet/confine/any.rb +1 -1
- data/lib/puppet/defaults.rb +21 -3
- data/lib/puppet/feature/base.rb +1 -1
- data/lib/puppet/file_serving/mount/locales.rb +1 -2
- data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
- data/lib/puppet/file_serving/mount/plugins.rb +1 -2
- data/lib/puppet/file_system/file_impl.rb +3 -3
- data/lib/puppet/functions/lstrip.rb +4 -4
- data/lib/puppet/functions/reverse_each.rb +1 -1
- data/lib/puppet/functions/rstrip.rb +4 -4
- data/lib/puppet/functions/step.rb +1 -1
- data/lib/puppet/functions/strip.rb +4 -4
- data/lib/puppet/gettext/config.rb +5 -5
- data/lib/puppet/gettext/module_translations.rb +4 -4
- data/lib/puppet/indirector/exec.rb +1 -1
- data/lib/puppet/indirector/facts/facter.rb +3 -3
- data/lib/puppet/indirector/file_metadata/http.rb +1 -0
- data/lib/puppet/indirector/hiera.rb +4 -0
- data/lib/puppet/indirector/indirection.rb +1 -1
- data/lib/puppet/indirector/report/processor.rb +2 -2
- data/lib/puppet/module.rb +1 -2
- data/lib/puppet/network/format_support.rb +2 -2
- data/lib/puppet/network/http/route.rb +2 -2
- data/lib/puppet/node/environment.rb +12 -5
- data/lib/puppet/pal/pal_impl.rb +27 -3
- data/lib/puppet/parameter.rb +1 -1
- data/lib/puppet/parser/functions.rb +21 -17
- data/lib/puppet/parser/functions/create_resources.rb +11 -7
- data/lib/puppet/parser/type_loader.rb +2 -2
- data/lib/puppet/pops/adaptable.rb +7 -13
- data/lib/puppet/pops/adapters.rb +8 -4
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
- data/lib/puppet/pops/loaders.rb +18 -11
- data/lib/puppet/pops/lookup/context.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
- data/lib/puppet/pops/types/iterable.rb +34 -8
- data/lib/puppet/pops/validation/checker4_0.rb +19 -15
- data/lib/puppet/provider/file/windows.rb +1 -1
- data/lib/puppet/provider/package/apt.rb +34 -0
- data/lib/puppet/provider/package/gem.rb +4 -2
- data/lib/puppet/provider/package/puppet_gem.rb +5 -0
- data/lib/puppet/provider/package/zypper.rb +3 -0
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/windows_adsi.rb +18 -1
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/test/test_helper.rb +10 -3
- data/lib/puppet/transaction.rb +2 -2
- data/lib/puppet/transaction/persistence.rb +1 -1
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/trusted_external.rb +2 -2
- data/lib/puppet/type.rb +4 -3
- data/lib/puppet/type/file.rb +2 -2
- data/lib/puppet/type/file/source.rb +27 -7
- data/lib/puppet/type/notify.rb +2 -2
- data/lib/puppet/type/service.rb +4 -0
- data/lib/puppet/type/user.rb +18 -3
- data/lib/puppet/util.rb +26 -12
- data/lib/puppet/util/autoload.rb +9 -7
- data/lib/puppet/util/character_encoding.rb +9 -5
- data/lib/puppet/util/execution.rb +2 -2
- data/lib/puppet/util/windows.rb +1 -0
- data/lib/puppet/util/windows/api_types.rb +15 -1
- data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
- data/lib/puppet/util/windows/security.rb +4 -4
- data/lib/puppet/util/windows/user.rb +219 -0
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +78 -69
- data/man/man5/puppet.conf.5 +22 -3
- data/man/man8/puppet-agent.8 +1 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +2 -2
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
- data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
- data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
- data/spec/integration/application/agent_spec.rb +29 -37
- data/spec/integration/application/apply_spec.rb +149 -149
- data/spec/integration/application/config_spec.rb +74 -0
- data/spec/integration/application/doc_spec.rb +16 -6
- data/spec/integration/application/filebucket_spec.rb +65 -16
- data/spec/integration/application/help_spec.rb +42 -0
- data/spec/integration/application/lookup_spec.rb +13 -0
- data/spec/integration/application/module_spec.rb +68 -0
- data/spec/integration/application/plugin_spec.rb +50 -0
- data/spec/integration/data_binding_spec.rb +82 -0
- data/spec/integration/directory_environments_spec.rb +17 -17
- data/spec/integration/indirector/facts/facter_spec.rb +8 -6
- data/spec/integration/node/environment_spec.rb +1 -1
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
- data/spec/integration/util/windows/process_spec.rb +26 -32
- data/spec/integration/util/windows/user_spec.rb +7 -0
- data/spec/integration/util_spec.rb +7 -33
- data/spec/lib/puppet_spec/matchers.rb +0 -80
- data/spec/lib/puppet_spec/puppetserver.rb +8 -0
- data/spec/unit/application/agent_spec.rb +3 -4
- data/spec/unit/application/face_base_spec.rb +6 -4
- data/spec/unit/application/facts_spec.rb +39 -10
- data/spec/unit/application/man_spec.rb +52 -0
- data/spec/unit/application/resource_spec.rb +3 -1
- data/spec/unit/application/ssl_spec.rb +15 -2
- data/spec/unit/configurer/downloader_spec.rb +10 -0
- data/spec/unit/configurer_spec.rb +47 -31
- data/spec/unit/confine_spec.rb +2 -1
- data/spec/unit/face/config_spec.rb +3 -1
- data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
- data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
- data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
- data/spec/unit/file_system/uniquefile_spec.rb +18 -0
- data/spec/unit/http/client_spec.rb +0 -1
- data/spec/unit/http/resolver_spec.rb +0 -1
- data/spec/unit/http/service/ca_spec.rb +0 -1
- data/spec/unit/http/service/compiler_spec.rb +0 -1
- data/spec/unit/http/service/file_server_spec.rb +0 -1
- data/spec/unit/http/service/report_spec.rb +0 -1
- data/spec/unit/http/service_spec.rb +0 -1
- data/spec/unit/http/session_spec.rb +0 -1
- data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
- data/spec/unit/network/format_support_spec.rb +3 -2
- data/spec/unit/node/environment_spec.rb +18 -1
- data/spec/unit/pops/loaders/loaders_spec.rb +70 -0
- data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
- data/spec/unit/provider/package/apt_spec.rb +77 -0
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
- data/spec/unit/provider/package/zypper_spec.rb +14 -0
- data/spec/unit/provider/service/init_spec.rb +41 -0
- data/spec/unit/provider/service/systemd_spec.rb +1 -6
- data/spec/unit/provider/service/windows_spec.rb +28 -0
- data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
- data/spec/unit/puppet_pal_2pec.rb +40 -0
- data/spec/unit/reports/store_spec.rb +17 -13
- data/spec/unit/transaction/persistence_spec.rb +15 -0
- data/spec/unit/type/service_spec.rb +35 -2
- data/spec/unit/type/user_spec.rb +31 -2
- data/spec/unit/util/character_encoding_spec.rb +4 -4
- data/spec/unit/util/command_line_spec.rb +11 -6
- metadata +21 -44
- data/spec/integration/faces/config_spec.rb +0 -91
- data/spec/integration/faces/documentation_spec.rb +0 -57
- data/spec/integration/file_bucket/file_spec.rb +0 -50
- data/spec/integration/file_serving/content_spec.rb +0 -7
- data/spec/integration/file_serving/fileset_spec.rb +0 -12
- data/spec/integration/file_serving/metadata_spec.rb +0 -8
- data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
- data/spec/integration/file_system/uniquefile_spec.rb +0 -26
- data/spec/integration/module_tool/forge_spec.rb +0 -51
- data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
- data/spec/integration/provider/service/init_spec.rb +0 -48
- data/spec/integration/provider/service/systemd_spec.rb +0 -25
- data/spec/integration/provider/service/windows_spec.rb +0 -50
- data/spec/integration/reference/providers_spec.rb +0 -21
- data/spec/integration/reports_spec.rb +0 -13
- data/spec/integration/ssl/certificate_request_spec.rb +0 -44
- data/spec/integration/ssl/host_spec.rb +0 -72
- data/spec/integration/ssl/key_spec.rb +0 -99
- data/spec/shared_behaviours/file_serving_model.rb +0 -51
- data/spec/unit/face/man_spec.rb +0 -25
- data/spec/unit/man_spec.rb +0 -31
@@ -0,0 +1,74 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'puppet/application/config'
|
4
|
+
|
5
|
+
#describe "puppet config" do
|
6
|
+
describe Puppet::Face[:config, '0.0.1'] do
|
7
|
+
include PuppetSpec::Files
|
8
|
+
|
9
|
+
# different UTF-8 widths
|
10
|
+
# 1-byte A
|
11
|
+
# 2-byte ۿ - http://www.fileformat.info/info/unicode/char/06ff/index.htm - 0xDB 0xBF / 219 191
|
12
|
+
# 3-byte ᚠ - http://www.fileformat.info/info/unicode/char/16A0/index.htm - 0xE1 0x9A 0xA0 / 225 154 160
|
13
|
+
# 4-byte 𠜎 - http://www.fileformat.info/info/unicode/char/2070E/index.htm - 0xF0 0xA0 0x9C 0x8E / 240 160 156 142
|
14
|
+
MIXED_UTF8 = "A\u06FF\u16A0\u{2070E}" # Aۿᚠ𠜎
|
15
|
+
|
16
|
+
let(:tmp_config) { tmpfile('puppet.conf') }
|
17
|
+
let(:config) { Puppet::Application[:config] }
|
18
|
+
|
19
|
+
def read_utf8(path)
|
20
|
+
File.read(tmp_config, :encoding => 'UTF-8')
|
21
|
+
end
|
22
|
+
|
23
|
+
def write_utf8(path, content)
|
24
|
+
File.write(tmp_config, content, 0, :encoding => 'UTF-8')
|
25
|
+
end
|
26
|
+
|
27
|
+
it "reads a UTF-8 value" do
|
28
|
+
write_utf8(tmp_config, <<~EOF)
|
29
|
+
[main]
|
30
|
+
tags=#{MIXED_UTF8}
|
31
|
+
EOF
|
32
|
+
|
33
|
+
Puppet.initialize_settings(['--config', tmp_config])
|
34
|
+
config.command_line.args = ['print', 'tags' ]
|
35
|
+
|
36
|
+
expect {
|
37
|
+
config.run
|
38
|
+
}.to exit_with(0)
|
39
|
+
.and output("#{MIXED_UTF8}\n").to_stdout
|
40
|
+
end
|
41
|
+
|
42
|
+
it "sets a UTF-8 value" do
|
43
|
+
Puppet.initialize_settings(['--config', tmp_config])
|
44
|
+
config.command_line.args = ['set', 'tags', MIXED_UTF8 ]
|
45
|
+
|
46
|
+
expect {
|
47
|
+
config.run
|
48
|
+
}.to exit_with(0)
|
49
|
+
|
50
|
+
expect(read_utf8(tmp_config)).to eq(<<~EOF)
|
51
|
+
[main]
|
52
|
+
tags = #{MIXED_UTF8}
|
53
|
+
EOF
|
54
|
+
end
|
55
|
+
|
56
|
+
it "deletes a key" do
|
57
|
+
write_utf8(tmp_config, <<~EOF)
|
58
|
+
[main]
|
59
|
+
tags=#{MIXED_UTF8}
|
60
|
+
EOF
|
61
|
+
|
62
|
+
Puppet.initialize_settings(['--config', tmp_config])
|
63
|
+
config.command_line.args = ['delete', 'tags']
|
64
|
+
|
65
|
+
expect {
|
66
|
+
config.run
|
67
|
+
}.to exit_with(0)
|
68
|
+
.and output(/Deleted setting from 'main': 'tags=#{MIXED_UTF8}'/).to_stdout
|
69
|
+
|
70
|
+
expect(read_utf8(tmp_config)).to eq(<<~EOF)
|
71
|
+
[main]
|
72
|
+
EOF
|
73
|
+
end
|
74
|
+
end
|
@@ -1,14 +1,24 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'puppet_spec/files'
|
3
2
|
require 'puppet/application/doc'
|
4
3
|
|
5
4
|
describe Puppet::Application::Doc do
|
6
5
|
include PuppetSpec::Files
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
expect
|
7
|
+
let(:app) { Puppet::Application[:doc] }
|
8
|
+
|
9
|
+
it 'lists references' do
|
10
|
+
app.command_line.args = ['-l']
|
11
|
+
expect {
|
12
|
+
app.run
|
13
|
+
}.to exit_with(0)
|
14
|
+
.and output(/configuration - A reference for all settings/).to_stdout
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'generates markdown' do
|
18
|
+
app.command_line.args = ['-r', 'report']
|
19
|
+
expect {
|
20
|
+
app.run
|
21
|
+
}.to exit_with(0)
|
22
|
+
.and output(/# Report Reference/).to_stdout
|
13
23
|
end
|
14
24
|
end
|
@@ -10,20 +10,34 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
|
|
10
10
|
let(:server) { PuppetSpec::Puppetserver.new }
|
11
11
|
let(:filebucket) { Puppet::Application[:filebucket] }
|
12
12
|
let(:backup_file) { tmpfile('backup_file') }
|
13
|
+
let(:text) { 'some random text' }
|
14
|
+
let(:md5) { Digest::MD5.file(backup_file).to_s }
|
13
15
|
|
14
16
|
before :each do
|
15
17
|
Puppet[:log_level] = 'debug'
|
18
|
+
File.binwrite(backup_file, text)
|
16
19
|
end
|
17
20
|
|
18
|
-
it "backs up
|
19
|
-
|
20
|
-
|
21
|
+
it "backs up to and restores from the local filebucket" do
|
22
|
+
filebucket.command_line.args = ['backup', backup_file, '--local']
|
23
|
+
expect {
|
24
|
+
filebucket.run
|
25
|
+
}.to output(/: #{md5}/).to_stdout
|
21
26
|
|
27
|
+
dest = tmpfile('file_bucket_restore')
|
28
|
+
filebucket.command_line.args = ['restore', dest, md5, '--local']
|
29
|
+
expect {
|
30
|
+
filebucket.run
|
31
|
+
}.to output(/FileBucket read #{md5}/).to_stdout
|
32
|
+
|
33
|
+
expect(FileUtils.compare_file(backup_file, dest)).to eq(true)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "backs up text files to the filebucket server" do
|
22
37
|
server.start_server do |port|
|
23
38
|
Puppet[:masterport] = port
|
24
39
|
expect {
|
25
|
-
filebucket.command_line.args
|
26
|
-
filebucket.command_line.args << backup_file
|
40
|
+
filebucket.command_line.args = ['backup', backup_file]
|
27
41
|
filebucket.run
|
28
42
|
}.to output(a_string_matching(
|
29
43
|
%r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/#{md5}\/#{File.realpath(backup_file)}\?environment\=production returned 404 Not Found}
|
@@ -32,22 +46,58 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
|
|
32
46
|
).and matching(
|
33
47
|
%r{#{backup_file}: #{md5}}
|
34
48
|
)).to_stdout
|
49
|
+
|
50
|
+
expect(File.binread(File.join(server.upload_directory, 'filebucket'))).to eq(text)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it "backs up binary files to the filebucket server" do
|
55
|
+
binary = "\xD1\xF2\r\n\x81NuSc\x00".force_encoding(Encoding::ASCII_8BIT)
|
56
|
+
File.binwrite(backup_file, binary)
|
57
|
+
|
58
|
+
server.start_server do |port|
|
59
|
+
Puppet[:masterport] = port
|
60
|
+
expect {
|
61
|
+
filebucket.command_line.args = ['backup', backup_file]
|
62
|
+
filebucket.run
|
63
|
+
}.to output(a_string_matching(
|
64
|
+
%r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file/md5/b10778ecd8b08dff525e367cf15b2622/}
|
65
|
+
).and matching(
|
66
|
+
%r{Debug: HTTP PUT https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file/md5/b10778ecd8b08dff525e367cf15b2622/}
|
67
|
+
)).to_stdout
|
68
|
+
|
69
|
+
expect(File.binread(File.join(server.upload_directory, 'filebucket'))).to eq(binary)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
it "backs up utf-8 encoded files to the filebucket server" do
|
74
|
+
utf8 = "\u2603".force_encoding(Encoding::UTF_8)
|
75
|
+
File.binwrite(backup_file, utf8)
|
76
|
+
|
77
|
+
server.start_server do |port|
|
78
|
+
Puppet[:masterport] = port
|
79
|
+
expect {
|
80
|
+
filebucket.command_line.args = ['backup', backup_file]
|
81
|
+
filebucket.run
|
82
|
+
}.to output(a_string_matching(
|
83
|
+
%r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file/md5/48856faf4534a876adeadc72aec53cb2/}
|
84
|
+
).and matching(
|
85
|
+
%r{Debug: HTTP PUT https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file/md5/48856faf4534a876adeadc72aec53cb2/}
|
86
|
+
)).to_stdout
|
87
|
+
|
88
|
+
expect(File.read(File.join(server.upload_directory, 'filebucket'), encoding: 'utf-8')).to eq(utf8)
|
35
89
|
end
|
36
90
|
end
|
37
91
|
|
38
92
|
it "doesn't attempt to back up file that already exists on the filebucket server" do
|
39
93
|
file_exists_handler = -> (req, res) {
|
40
|
-
|
94
|
+
res.status = 200
|
41
95
|
}
|
42
96
|
|
43
|
-
File.binwrite(backup_file, 'some random text')
|
44
|
-
md5 = Digest::MD5.file(backup_file).to_s
|
45
|
-
|
46
97
|
server.start_server(mounts: {filebucket: file_exists_handler}) do |port|
|
47
98
|
Puppet[:masterport] = port
|
48
99
|
expect {
|
49
|
-
filebucket.command_line.args
|
50
|
-
filebucket.command_line.args << backup_file
|
100
|
+
filebucket.command_line.args = ['backup', backup_file]
|
51
101
|
filebucket.run
|
52
102
|
}.to output(a_string_matching(
|
53
103
|
%r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/#{md5}\/#{File.realpath(backup_file)}\?environment\=production returned 200 OK}
|
@@ -66,8 +116,7 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
|
|
66
116
|
server.start_server(mounts: {filebucket: get_handler}) do |port|
|
67
117
|
Puppet[:masterport] = port
|
68
118
|
expect {
|
69
|
-
filebucket.command_line.args
|
70
|
-
filebucket.command_line.args << 'fac251367c9e083c6b1f0f3181'
|
119
|
+
filebucket.command_line.args = ['get', 'fac251367c9e083c6b1f0f3181']
|
71
120
|
filebucket.run
|
72
121
|
}.to output(a_string_matching(
|
73
122
|
%r{Debug: HTTP GET https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/fac251367c9e083c6b1f0f3181\?environment\=production returned 200 OK}
|
@@ -90,7 +139,7 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
|
|
90
139
|
server.start_server(mounts: {filebucket: get_handler}) do |port|
|
91
140
|
Puppet[:masterport] = port
|
92
141
|
expect {
|
93
|
-
filebucket.command_line.args
|
142
|
+
filebucket.command_line.args = ['diff', 'fac251367c9e083c6b1f0f3181', backup_file, '--remote']
|
94
143
|
filebucket.run
|
95
144
|
}.to output(a_string_matching(
|
96
145
|
/[-<] ?foo/
|
@@ -118,7 +167,7 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
|
|
118
167
|
server.start_server(mounts: {filebucket: get_handler}) do |port|
|
119
168
|
Puppet[:masterport] = port
|
120
169
|
expect {
|
121
|
-
filebucket.command_line.args
|
170
|
+
filebucket.command_line.args = ['diff', 'd3b07384d113edec49eaa6238ad5ff00', "99b999207e287afffc86c053e5693247", '--remote']
|
122
171
|
filebucket.run
|
123
172
|
}.to output(a_string_matching(
|
124
173
|
/[-<] ?foo/
|
@@ -187,4 +236,4 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
|
|
187
236
|
end
|
188
237
|
end
|
189
238
|
end
|
190
|
-
end
|
239
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'puppet/application/help'
|
3
|
+
|
4
|
+
describe "puppet help" do
|
5
|
+
let(:app) { Puppet::Application[:help] }
|
6
|
+
|
7
|
+
it "generates global help" do
|
8
|
+
expect {
|
9
|
+
app.run
|
10
|
+
}.to exit_with(0)
|
11
|
+
.and output(Regexp.new(Regexp.escape(<<~END), Regexp::MULTILINE)).to_stdout
|
12
|
+
|
13
|
+
Usage: puppet <subcommand> [options] <action> [options]
|
14
|
+
|
15
|
+
Available subcommands:
|
16
|
+
END
|
17
|
+
end
|
18
|
+
|
19
|
+
Puppet::Face.faces.sort.each do |face_name|
|
20
|
+
context "for #{face_name}" do
|
21
|
+
it "generates help" do
|
22
|
+
app.command_line.args = ['help', face_name]
|
23
|
+
|
24
|
+
expect {
|
25
|
+
app.run
|
26
|
+
}.to exit_with(0)
|
27
|
+
.and output(/USAGE: puppet #{face_name} <action>/).to_stdout
|
28
|
+
end
|
29
|
+
|
30
|
+
Puppet::Face[face_name, :current].actions.sort.each do |action_name|
|
31
|
+
it "for action #{action_name}" do
|
32
|
+
app.command_line.args = ['help', face_name, action_name]
|
33
|
+
|
34
|
+
expect {
|
35
|
+
app.run
|
36
|
+
}.to exit_with(0)
|
37
|
+
.and output(/USAGE: puppet #{face_name}/).to_stdout
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -90,6 +90,19 @@ describe 'lookup' do
|
|
90
90
|
expect(lookup('a')).to eql('value a')
|
91
91
|
end
|
92
92
|
|
93
|
+
it 'loads external facts when running without --node' do
|
94
|
+
expect(Puppet::Util).not_to receive(:skip_external_facts)
|
95
|
+
expect(Facter).not_to receive(:load_external)
|
96
|
+
lookup('a')
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'skip loading of external facts when run with --node' do
|
100
|
+
app.options[:node] = "random_node"
|
101
|
+
expect(Facter).to receive(:load_external).once.with(false)
|
102
|
+
expect(Facter).to receive(:load_external).once.with(true)
|
103
|
+
lookup('a')
|
104
|
+
end
|
105
|
+
|
93
106
|
context 'uses node_terminus' do
|
94
107
|
require 'puppet/indirector/node/exec'
|
95
108
|
require 'puppet/indirector/node/plain'
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'puppet/forge'
|
4
|
+
require 'puppet_spec/https'
|
5
|
+
|
6
|
+
describe 'puppet module', unless: Puppet::Util::Platform.jruby? do
|
7
|
+
include PuppetSpec::Files
|
8
|
+
include_context "https client"
|
9
|
+
|
10
|
+
let(:app) { Puppet::Application[:module] }
|
11
|
+
let(:wrong_hostname) { 'localhost' }
|
12
|
+
let(:server) { PuppetSpec::HTTPSServer.new }
|
13
|
+
let(:ssl_provider) { Puppet::SSL::SSLProvider.new }
|
14
|
+
|
15
|
+
let(:release_response) { File.read(fixtures('unit/forge/bacula-releases.json')) }
|
16
|
+
let(:release_tarball) { File.binread(fixtures('unit/forge/bacula.tar.gz')) }
|
17
|
+
let(:target_dir) { tmpdir('bacula') }
|
18
|
+
|
19
|
+
before :each do
|
20
|
+
SemanticPuppet::Dependency.clear_sources
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'installs a module' do
|
24
|
+
# create a temp cacert bundle
|
25
|
+
ssl_file = tmpfile('systemstore')
|
26
|
+
File.write(ssl_file, server.ca_cert)
|
27
|
+
|
28
|
+
response_proc = -> (req, res) {
|
29
|
+
if req.path == '/v3/releases'
|
30
|
+
res['Content-Type'] = 'application/json'
|
31
|
+
res.body = release_response
|
32
|
+
else
|
33
|
+
res['Content-Type'] = 'application/octet-stream'
|
34
|
+
res.body = release_tarball
|
35
|
+
end
|
36
|
+
res.status = 200
|
37
|
+
}
|
38
|
+
|
39
|
+
# override path to system cacert bundle, this must be done before
|
40
|
+
# the SSLContext is created and the call to X509::Store.set_default_paths
|
41
|
+
Puppet::Util.withenv("SSL_CERT_FILE" => ssl_file) do
|
42
|
+
server.start_server(response_proc: response_proc) do |port|
|
43
|
+
Puppet[:module_repository] = "https://127.0.0.1:#{port}"
|
44
|
+
|
45
|
+
# On Windows, CP437 encoded output can't be matched against UTF-8 regexp,
|
46
|
+
# so encode the regexp to the external encoding and match against that.
|
47
|
+
app.command_line.args = ['install', 'puppetlabs-bacula', '--target-dir', target_dir]
|
48
|
+
expect {
|
49
|
+
app.run
|
50
|
+
}.to exit_with(0)
|
51
|
+
.and output(Regexp.new("└── puppetlabs-bacula".encode(Encoding.default_external))).to_stdout
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'returns a valid exception when there is an SSL verification problem' do
|
57
|
+
server.start_server do |port|
|
58
|
+
Puppet[:module_repository] = "https://#{wrong_hostname}:#{port}"
|
59
|
+
|
60
|
+
expect {
|
61
|
+
app.command_line.args = ['install', 'puppetlabs-bacula', '--target-dir', target_dir]
|
62
|
+
app.run
|
63
|
+
}.to exit_with(1)
|
64
|
+
.and output(%r{Notice: Downloading from https://#{wrong_hostname}:#{port}}).to_stdout
|
65
|
+
.and output(%r{Unable to verify the SSL certificate}).to_stderr
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -70,4 +70,54 @@ describe "puppet plugin" do
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
+
context "pluginsync for external facts uses source permissions to preserve fact executable-ness" do
|
74
|
+
before :all do
|
75
|
+
WebMock.enable!
|
76
|
+
end
|
77
|
+
|
78
|
+
after :all do
|
79
|
+
WebMock.disable!
|
80
|
+
end
|
81
|
+
|
82
|
+
before :each do
|
83
|
+
metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":420,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
|
84
|
+
stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
|
85
|
+
|
86
|
+
# response retains owner/group/mode due to source_permissions => use
|
87
|
+
facts_metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":500,\"group\":500,\"mode\":493,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
|
88
|
+
stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(status: 200, body: facts_metadata, headers: {'Content-Type' => 'application/json'})
|
89
|
+
end
|
90
|
+
|
91
|
+
it "processes a download request resulting in no changes" do
|
92
|
+
# Create these so there are no changes
|
93
|
+
Puppet::FileSystem.mkpath(Puppet[:plugindest])
|
94
|
+
Puppet::FileSystem.mkpath(Puppet[:localedest])
|
95
|
+
|
96
|
+
# /opt/puppetlabs/puppet/cache/facts.d will be created based on our umask.
|
97
|
+
# If the mode on disk is not 0755, then the mode from the metadata response
|
98
|
+
# (493 => 0755) will be applied, resulting in "plugins were downloaded"
|
99
|
+
# message. Enforce a umask so the results are consistent.
|
100
|
+
Puppet::FileSystem.mkpath(Puppet[:pluginfactdest])
|
101
|
+
Puppet::FileSystem.chmod(0755, Puppet[:pluginfactdest])
|
102
|
+
|
103
|
+
app = Puppet::Application[:plugin]
|
104
|
+
app.command_line.args << 'download'
|
105
|
+
expect {
|
106
|
+
app.run
|
107
|
+
}.to exit_with(0)
|
108
|
+
.and output(/No plugins downloaded/).to_stdout
|
109
|
+
end
|
110
|
+
|
111
|
+
it "updates the facts.d mode", unless: Puppet::Util::Platform.windows? do
|
112
|
+
Puppet::FileSystem.mkpath(Puppet[:pluginfactdest])
|
113
|
+
Puppet::FileSystem.chmod(0775, Puppet[:pluginfactdest])
|
114
|
+
|
115
|
+
app = Puppet::Application[:plugin]
|
116
|
+
app.command_line.args << 'download'
|
117
|
+
expect {
|
118
|
+
app.run
|
119
|
+
}.to exit_with(0)
|
120
|
+
.and output(/Downloaded these plugins: .*facts\.d/).to_stdout
|
121
|
+
end
|
122
|
+
end
|
73
123
|
end
|
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'puppet/indirector/hiera'
|
3
3
|
|
4
4
|
require 'puppet_spec/compiler'
|
5
|
+
require 'puppet/indirector/data_binding/hiera'
|
5
6
|
|
6
7
|
describe "Data binding" do
|
7
8
|
include PuppetSpec::Files
|
@@ -140,6 +141,71 @@ describe "Data binding" do
|
|
140
141
|
end
|
141
142
|
end
|
142
143
|
|
144
|
+
context "with plan_hierarchy key" do
|
145
|
+
context "using Hiera 5" do
|
146
|
+
let(:hiera_config) { <<~CONF }
|
147
|
+
---
|
148
|
+
version: 5
|
149
|
+
plan_hierarchy:
|
150
|
+
- path: global
|
151
|
+
name: Common
|
152
|
+
CONF
|
153
|
+
|
154
|
+
it "ignores plan_hierarchy outside of a Bolt plan" do
|
155
|
+
configure_hiera_for_plan_hierarchy(data, hiera_config)
|
156
|
+
|
157
|
+
create_manifest_in_module("testing", "binding.pp",
|
158
|
+
<<-MANIFEST)
|
159
|
+
class testing::binding($value) {}
|
160
|
+
MANIFEST
|
161
|
+
|
162
|
+
expect { compile_to_catalog("include testing::binding") }
|
163
|
+
.to raise_error(/Class\[Testing::Binding\]: expects a value for parameter 'value'/)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context "with invalid data" do
|
168
|
+
let(:hiera_config) { <<~CONF }
|
169
|
+
---
|
170
|
+
version: 5
|
171
|
+
plan_hierarchy:
|
172
|
+
- pop: the question
|
173
|
+
CONF
|
174
|
+
|
175
|
+
it "raises a validation error" do
|
176
|
+
configure_hiera_for_plan_hierarchy(data, hiera_config)
|
177
|
+
|
178
|
+
create_manifest_in_module("testing", "binding.pp",
|
179
|
+
<<-MANIFEST)
|
180
|
+
class testing::binding($value) {}
|
181
|
+
MANIFEST
|
182
|
+
|
183
|
+
expect { compile_to_catalog("include testing::binding") }
|
184
|
+
.to raise_error(/entry 'plan_hierarchy' index 0 unrecognized key 'pop'/)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
context "with Hiera 3" do
|
189
|
+
let(:hiera_config) { <<~CONF }
|
190
|
+
---
|
191
|
+
plan_hierarchy: ['global']
|
192
|
+
CONF
|
193
|
+
|
194
|
+
it "errors with plan_hierarchy key" do
|
195
|
+
configure_hiera_for_plan_hierarchy(data, hiera_config)
|
196
|
+
|
197
|
+
create_manifest_in_module("testing", "binding.pp",
|
198
|
+
<<-MANIFEST)
|
199
|
+
class testing::binding($value) {}
|
200
|
+
MANIFEST
|
201
|
+
|
202
|
+
expect { compile_to_catalog("include testing::binding") }
|
203
|
+
.to raise_error(/unrecognized key 'plan_hierarchy'/)
|
204
|
+
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
143
209
|
|
144
210
|
def configure_hiera_for_one_tier(data)
|
145
211
|
hiera_config_file = tmpfile("hiera.yaml")
|
@@ -163,6 +229,22 @@ describe "Data binding" do
|
|
163
229
|
Puppet[:hiera_config] = hiera_config_file
|
164
230
|
end
|
165
231
|
|
232
|
+
def configure_hiera_for_plan_hierarchy(data, config)
|
233
|
+
hiera_config_file = tmpfile("hiera.yaml")
|
234
|
+
|
235
|
+
File.open(hiera_config_file, 'w:UTF-8') do |f|
|
236
|
+
f.write(config)
|
237
|
+
end
|
238
|
+
|
239
|
+
data.each do | file, contents |
|
240
|
+
File.open(File.join(dir, "#{file}.yaml"), 'w:UTF-8') do |f|
|
241
|
+
f.write(YAML.dump(contents))
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
Puppet[:hiera_config] = hiera_config_file
|
246
|
+
end
|
247
|
+
|
166
248
|
def configure_hiera_for_two_tier(data)
|
167
249
|
hiera_config_file = tmpfile("hiera.yaml")
|
168
250
|
|