puppet 6.19.1 → 6.20.0
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/CODEOWNERS +2 -16
- data/Gemfile +2 -0
- data/Gemfile.lock +30 -25
- data/lib/puppet/application.rb +10 -6
- data/lib/puppet/application/agent.rb +1 -0
- data/lib/puppet/application/apply.rb +3 -2
- data/lib/puppet/application/device.rb +1 -0
- data/lib/puppet/application/filebucket.rb +2 -2
- data/lib/puppet/application/script.rb +1 -0
- data/lib/puppet/application_support.rb +7 -0
- data/lib/puppet/configurer.rb +28 -18
- data/lib/puppet/defaults.rb +24 -18
- data/lib/puppet/environments.rb +38 -54
- data/lib/puppet/face/config.rb +10 -0
- data/lib/puppet/face/epp.rb +12 -2
- data/lib/puppet/face/facts.rb +60 -0
- data/lib/puppet/ffi/posix.rb +10 -0
- data/lib/puppet/ffi/posix/constants.rb +14 -0
- data/lib/puppet/ffi/posix/functions.rb +24 -0
- data/lib/puppet/functions/epp.rb +1 -0
- data/lib/puppet/functions/inline_epp.rb +1 -0
- data/lib/puppet/indirector/fact_search.rb +60 -0
- data/lib/puppet/indirector/facts/json.rb +27 -0
- data/lib/puppet/indirector/facts/yaml.rb +3 -58
- data/lib/puppet/indirector/json.rb +5 -1
- data/lib/puppet/indirector/node/json.rb +8 -0
- data/lib/puppet/indirector/report/json.rb +34 -0
- data/lib/puppet/module_tool/applications/installer.rb +48 -2
- data/lib/puppet/module_tool/errors/shared.rb +17 -2
- data/lib/puppet/network/formats.rb +2 -1
- data/lib/puppet/pal/pal_impl.rb +70 -17
- data/lib/puppet/parser/ast/leaf.rb +3 -2
- data/lib/puppet/parser/templatewrapper.rb +1 -1
- data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
- data/lib/puppet/pops/model/ast_transformer.rb +1 -1
- data/lib/puppet/provider/package/apt.rb +4 -0
- data/lib/puppet/provider/user/aix.rb +2 -2
- data/lib/puppet/reference/configuration.rb +6 -5
- data/lib/puppet/settings.rb +33 -28
- data/lib/puppet/settings/alias_setting.rb +37 -0
- data/lib/puppet/settings/base_setting.rb +26 -2
- data/lib/puppet/util/autoload.rb +1 -8
- data/lib/puppet/util/fact_dif.rb +62 -0
- data/lib/puppet/util/posix.rb +54 -5
- data/lib/puppet/util/rubygems.rb +5 -1
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +188 -164
- data/man/man5/puppet.conf.5 +6 -6
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +2 -2
- 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 +2 -2
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +32 -1
- data/man/man8/puppet-filebucket.8 +3 -3
- 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 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +4 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +4 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +2 -2
- 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/agent/cached_deferred_catalog.json +91 -0
- data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
- data/spec/integration/application/agent_spec.rb +127 -3
- data/spec/integration/application/apply_spec.rb +19 -0
- data/spec/integration/defaults_spec.rb +0 -7
- data/spec/integration/environments/setting_hooks_spec.rb +1 -1
- data/spec/integration/resource/type_collection_spec.rb +2 -6
- data/spec/integration/transaction_spec.rb +4 -9
- data/spec/integration/util/windows/adsi_spec.rb +3 -1
- data/spec/integration/util/windows/registry_spec.rb +0 -10
- data/spec/lib/puppet_spec/settings.rb +6 -1
- data/spec/spec_helper.rb +1 -4
- data/spec/unit/agent_spec.rb +8 -6
- data/spec/unit/application/agent_spec.rb +0 -1
- data/spec/unit/application/config_spec.rb +224 -4
- data/spec/unit/application/filebucket_spec.rb +0 -2
- data/spec/unit/application_spec.rb +51 -9
- data/spec/unit/confine/feature_spec.rb +1 -1
- data/spec/unit/confine_spec.rb +8 -2
- data/spec/unit/defaults_spec.rb +20 -1
- data/spec/unit/environments_spec.rb +96 -19
- data/spec/unit/face/config_spec.rb +27 -32
- data/spec/unit/face/node_spec.rb +0 -11
- data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
- data/spec/unit/file_serving/metadata_spec.rb +3 -3
- data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
- data/spec/unit/forge/module_release_spec.rb +2 -7
- data/spec/unit/functions/inline_epp_spec.rb +26 -1
- data/spec/unit/http/service/compiler_spec.rb +49 -0
- data/spec/unit/http/service_spec.rb +1 -1
- data/spec/unit/indirector/face_spec.rb +0 -1
- data/spec/unit/indirector/facts/facter_spec.rb +0 -1
- data/spec/unit/indirector/facts/json_spec.rb +255 -0
- data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
- data/spec/unit/indirector/indirection_spec.rb +8 -12
- data/spec/unit/indirector/key/file_spec.rb +0 -1
- data/spec/unit/indirector/node/json_spec.rb +33 -0
- data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
- data/spec/unit/indirector/report/yaml_spec.rb +72 -8
- data/spec/unit/indirector_spec.rb +2 -2
- data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
- data/spec/unit/network/authconfig_spec.rb +0 -3
- data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
- data/spec/unit/network/http/handler_spec.rb +0 -5
- data/spec/unit/parser/compiler_spec.rb +3 -19
- data/spec/unit/parser/resource_spec.rb +14 -8
- data/spec/unit/parser/templatewrapper_spec.rb +4 -3
- data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
- data/spec/unit/property_spec.rb +1 -0
- data/spec/unit/provider/nameservice_spec.rb +66 -65
- data/spec/unit/provider/package/apt_spec.rb +4 -8
- data/spec/unit/provider/package/base_spec.rb +6 -5
- data/spec/unit/provider/package/pacman_spec.rb +18 -12
- data/spec/unit/provider/package/pip_spec.rb +6 -11
- data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
- data/spec/unit/provider/user/aix_spec.rb +5 -0
- data/spec/unit/provider/user/hpux_spec.rb +1 -1
- data/spec/unit/provider/user/pw_spec.rb +2 -0
- data/spec/unit/provider/user/useradd_spec.rb +1 -0
- data/spec/unit/provider_spec.rb +8 -10
- data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
- data/spec/unit/resource/capability_finder_spec.rb +6 -1
- data/spec/unit/resource/type_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +11 -10
- data/spec/unit/settings_spec.rb +419 -242
- data/spec/unit/ssl/base_spec.rb +0 -1
- data/spec/unit/ssl/host_spec.rb +0 -5
- data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
- data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
- data/spec/unit/transaction/event_manager_spec.rb +14 -11
- data/spec/unit/transaction_spec.rb +13 -4
- data/spec/unit/type/file/content_spec.rb +0 -1
- data/spec/unit/type/file/selinux_spec.rb +0 -2
- data/spec/unit/type/file_spec.rb +0 -6
- data/spec/unit/type/group_spec.rb +13 -6
- data/spec/unit/type/resources_spec.rb +7 -7
- data/spec/unit/type/service_spec.rb +1 -1
- data/spec/unit/type/tidy_spec.rb +0 -1
- data/spec/unit/type_spec.rb +2 -2
- data/spec/unit/util/at_fork_spec.rb +2 -2
- data/spec/unit/util/autoload_spec.rb +5 -1
- data/spec/unit/util/backups_spec.rb +1 -2
- data/spec/unit/util/execution_spec.rb +15 -11
- data/spec/unit/util/inifile_spec.rb +6 -14
- data/spec/unit/util/log_spec.rb +8 -7
- data/spec/unit/util/logging_spec.rb +3 -3
- data/spec/unit/util/posix_spec.rb +363 -15
- data/spec/unit/util/rubygems_spec.rb +2 -2
- data/spec/unit/util/selinux_spec.rb +76 -52
- data/spec/unit/util/storage_spec.rb +3 -1
- data/spec/unit/util/suidmanager_spec.rb +44 -41
- data/spec/unit/util_spec.rb +13 -6
- metadata +21 -10
- data/spec/integration/application/config_spec.rb +0 -74
- data/spec/unit/face/catalog_spec.rb +0 -6
- data/spec/unit/face/module_spec.rb +0 -3
@@ -11,9 +11,7 @@ describe Puppet::Type.type(:package).provider(:apt) do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
let(:provider) do
|
14
|
-
provider
|
15
|
-
provider.resource = resource
|
16
|
-
provider
|
14
|
+
resource.provider
|
17
15
|
end
|
18
16
|
|
19
17
|
it "should be the default provider on :osfamily => Debian" do
|
@@ -88,7 +86,7 @@ Version table:
|
|
88
86
|
|
89
87
|
describe ".instances" do
|
90
88
|
before do
|
91
|
-
allow(Puppet::Type::Package::ProviderDpkg).to receive(:instances).and_return([
|
89
|
+
allow(Puppet::Type::Package::ProviderDpkg).to receive(:instances).and_return([provider])
|
92
90
|
end
|
93
91
|
|
94
92
|
context "when package is manual marked" do
|
@@ -97,8 +95,7 @@ Version table:
|
|
97
95
|
end
|
98
96
|
|
99
97
|
it 'sets mark to manual' do
|
100
|
-
expect(
|
101
|
-
described_class.instances
|
98
|
+
expect(described_class.instances.map(&:mark)).to eq([:manual])
|
102
99
|
end
|
103
100
|
end
|
104
101
|
|
@@ -108,8 +105,7 @@ Version table:
|
|
108
105
|
end
|
109
106
|
|
110
107
|
it 'does not set mark to manual' do
|
111
|
-
expect(
|
112
|
-
described_class.instances
|
108
|
+
expect(described_class.instances.map(&:mark)).to eq([nil])
|
113
109
|
end
|
114
110
|
end
|
115
111
|
end
|
@@ -1,17 +1,18 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'puppet/provider/package'
|
3
3
|
|
4
|
+
Puppet::Type.type(:package).provide(:test_base_provider, parent: Puppet::Provider::Package) do
|
5
|
+
def query; end
|
6
|
+
end
|
7
|
+
|
4
8
|
describe Puppet::Provider::Package do
|
9
|
+
let(:provider) { Puppet::Type.type(:package).provider(:test_base_provider).new }
|
10
|
+
|
5
11
|
it 'returns absent for uninstalled packages when not purgeable' do
|
6
|
-
provider = Puppet::Provider::Package.new
|
7
|
-
expect(provider).to receive(:query).and_return(nil)
|
8
|
-
expect(provider.class).to receive(:feature?).with(:purgeable).and_return(false)
|
9
12
|
expect(provider.properties[:ensure]).to eq(:absent)
|
10
13
|
end
|
11
14
|
|
12
15
|
it 'returns purged for uninstalled packages when purgeable' do
|
13
|
-
provider = Puppet::Provider::Package.new
|
14
|
-
expect(provider).to receive(:query).and_return(nil)
|
15
16
|
expect(provider.class).to receive(:feature?).with(:purgeable).and_return(true)
|
16
17
|
expect(provider.properties[:ensure]).to eq(:purged)
|
17
18
|
end
|
@@ -32,10 +32,12 @@ describe Puppet::Type.type(:package).provider(:pacman) do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it "should call yaourt to install the right package quietly when yaourt is installed" do
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
without_partial_double_verification do
|
36
|
+
allow(described_class).to receive(:yaourt?).and_return(true)
|
37
|
+
args = ['--noconfirm', '--needed', '--noprogressbar', '-S', resource[:name]]
|
38
|
+
expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
|
39
|
+
provider.install
|
40
|
+
end
|
39
41
|
end
|
40
42
|
|
41
43
|
it "should raise an Puppet::Error if the installation failed" do
|
@@ -74,10 +76,12 @@ describe Puppet::Type.type(:package).provider(:pacman) do
|
|
74
76
|
end
|
75
77
|
|
76
78
|
it "should call yaourt to install the right package quietly when yaourt is installed" do
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
79
|
+
without_partial_double_verification do
|
80
|
+
expect(described_class).to receive(:yaourt?).and_return(true)
|
81
|
+
args = ['--noconfirm', '--needed', '--noprogressbar', '-x', '--arg=value', '-S', resource[:name]]
|
82
|
+
expect(provider).to receive(:yaourt).at_least(:once).with(*args).and_return('')
|
83
|
+
provider.install
|
84
|
+
end
|
81
85
|
end
|
82
86
|
end
|
83
87
|
|
@@ -172,10 +176,12 @@ describe Puppet::Type.type(:package).provider(:pacman) do
|
|
172
176
|
end
|
173
177
|
|
174
178
|
it "should call yaourt to remove the right package quietly" do
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
+
without_partial_double_verification do
|
180
|
+
allow(described_class).to receive(:yaourt?).and_return(true)
|
181
|
+
args = ["--noconfirm", "--noprogressbar", "-R", resource[:name]]
|
182
|
+
expect(provider).to receive(:yaourt).with(*args)
|
183
|
+
provider.uninstall
|
184
|
+
end
|
179
185
|
end
|
180
186
|
|
181
187
|
it "adds any uninstall_options" do
|
@@ -14,9 +14,8 @@ describe Puppet::Type.type(:package).provider(:pip) do
|
|
14
14
|
it { is_expected.to be_version_ranges }
|
15
15
|
|
16
16
|
before do
|
17
|
-
@resource = Puppet::
|
18
|
-
|
19
|
-
@provider = described_class.new(@resource)
|
17
|
+
@resource = Puppet::Type.type(:package).new(name: "fake_package", provider: :pip)
|
18
|
+
@provider = @resource.provider
|
20
19
|
@client = double('client')
|
21
20
|
allow(@client).to receive(:call).with('package_releases', 'real_package').and_return(["1.3", "1.2.5", "1.2.4"])
|
22
21
|
allow(@client).to receive(:call).with('package_releases', 'fake_package').and_return([])
|
@@ -335,7 +334,6 @@ describe Puppet::Type.type(:package).provider(:pip) do
|
|
335
334
|
|
336
335
|
it "should install" do
|
337
336
|
@resource[:ensure] = :installed
|
338
|
-
@resource[:source] = nil
|
339
337
|
expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "fake_package"]])
|
340
338
|
@provider.install
|
341
339
|
end
|
@@ -368,7 +366,6 @@ describe Puppet::Type.type(:package).provider(:pip) do
|
|
368
366
|
|
369
367
|
it "should install a particular version" do
|
370
368
|
@resource[:ensure] = "0.0.0"
|
371
|
-
@resource[:source] = nil
|
372
369
|
# TJK
|
373
370
|
expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "fake_package==0.0.0"]])
|
374
371
|
@provider.install
|
@@ -376,7 +373,6 @@ describe Puppet::Type.type(:package).provider(:pip) do
|
|
376
373
|
|
377
374
|
it "should upgrade" do
|
378
375
|
@resource[:ensure] = :latest
|
379
|
-
@resource[:source] = nil
|
380
376
|
# TJK
|
381
377
|
expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "--upgrade", "fake_package"]])
|
382
378
|
@provider.install
|
@@ -384,7 +380,6 @@ describe Puppet::Type.type(:package).provider(:pip) do
|
|
384
380
|
|
385
381
|
it "should handle install options" do
|
386
382
|
@resource[:ensure] = :installed
|
387
|
-
@resource[:source] = nil
|
388
383
|
@resource[:install_options] = [{"--timeout" => "10"}, "--no-index"]
|
389
384
|
expect(@provider).to receive(:execute).with(["/fake/bin/pip", ["install", "-q", "--timeout=10", "--no-index", "fake_package"]])
|
390
385
|
@provider.install
|
@@ -415,7 +410,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
|
|
415
410
|
let(:pip) { '/fake/bin/pip' }
|
416
411
|
|
417
412
|
it "should look up version if pip is present" do
|
418
|
-
allow(described_class).to receive(:
|
413
|
+
allow(described_class).to receive(:cmd).and_return(pip)
|
419
414
|
process = ['pip 8.0.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)']
|
420
415
|
allow(described_class).to receive(:execpipe).with([pip, '--version']).and_yield(process)
|
421
416
|
|
@@ -423,7 +418,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
|
|
423
418
|
end
|
424
419
|
|
425
420
|
it "parses multiple lines of output" do
|
426
|
-
allow(described_class).to receive(:
|
421
|
+
allow(described_class).to receive(:cmd).and_return(pip)
|
427
422
|
process = [
|
428
423
|
"/usr/local/lib/python2.7/dist-packages/urllib3/contrib/socks.py:37: DependencyWarning: SOCKS support in urllib3 requires the installation of optional dependencies: specifically, PySocks. For more information, see https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies",
|
429
424
|
" DependencyWarning",
|
@@ -435,7 +430,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
|
|
435
430
|
end
|
436
431
|
|
437
432
|
it "raises if there isn't a version string" do
|
438
|
-
allow(described_class).to receive(:
|
433
|
+
allow(described_class).to receive(:cmd).and_return(pip)
|
439
434
|
allow(described_class).to receive(:execpipe).with([pip, '--version']).and_yield([""])
|
440
435
|
expect {
|
441
436
|
described_class.pip_version(pip)
|
@@ -444,7 +439,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
|
|
444
439
|
|
445
440
|
it "quotes commands with spaces" do
|
446
441
|
pip = 'C:\Program Files\Python27\Scripts\pip.exe'
|
447
|
-
allow(described_class).to receive(:
|
442
|
+
allow(described_class).to receive(:cmd).and_return(pip)
|
448
443
|
process = ["pip 18.1 from c:\program files\python27\lib\site-packages\pip (python 2.7)\r\n"]
|
449
444
|
allow(described_class).to receive(:execpipe).with(["\"#{pip}\"", '--version']).and_yield(process)
|
450
445
|
|
@@ -8,10 +8,6 @@ describe Puppet::Type.type(:package).provider(:pkgdmg) do
|
|
8
8
|
it { is_expected.not_to be_uninstallable }
|
9
9
|
|
10
10
|
describe "when installing it should fail when" do
|
11
|
-
before :each do
|
12
|
-
expect(Puppet::Util).not_to receive(:execute)
|
13
|
-
end
|
14
|
-
|
15
11
|
it "no source is specified" do
|
16
12
|
expect { provider.install }.to raise_error(Puppet::Error, /must specify a package source/)
|
17
13
|
end
|
@@ -143,6 +143,11 @@ describe 'Puppet::Type::User::Provider::Aix' do
|
|
143
143
|
it "returns the user's password" do
|
144
144
|
expect(call_parse_password).to eql('some_password')
|
145
145
|
end
|
146
|
+
|
147
|
+
it "returns the user's password with tabs" do
|
148
|
+
resource[:name] = 'tab_password_user'
|
149
|
+
expect(call_parse_password).to eql('some_password')
|
150
|
+
end
|
146
151
|
end
|
147
152
|
|
148
153
|
# TODO: If we move from using Mocha to rspec's mocks,
|
@@ -33,7 +33,7 @@ describe Puppet::Type.type(:user).provider(:hpuxuseradd),
|
|
33
33
|
before :each do
|
34
34
|
allow(Etc).to receive(:getpwent).and_return(pwent)
|
35
35
|
allow(Etc).to receive(:getpwnam).and_return(pwent)
|
36
|
-
allow(
|
36
|
+
allow(provider).to receive(:command).with(:modify).and_return('/usr/sam/lbin/usermod.sam')
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should have feature manages_passwords" do
|
@@ -53,12 +53,14 @@ describe Puppet::Type.type(:user).provider(:pw) do
|
|
53
53
|
|
54
54
|
it "should use -G with the correct argument when the groups property is set" do
|
55
55
|
resource[:groups] = "group1"
|
56
|
+
allow(Puppet::Util::POSIX).to receive(:groups_of).with('testuser').and_return([])
|
56
57
|
expect(provider).to receive(:execute).with(include("-G").and(include("group1")), kind_of(Hash))
|
57
58
|
provider.create
|
58
59
|
end
|
59
60
|
|
60
61
|
it "should use -G with all the given groups when the groups property is set to an array" do
|
61
62
|
resource[:groups] = ["group1", "group2"]
|
63
|
+
allow(Puppet::Util::POSIX).to receive(:groups_of).with('testuser').and_return([])
|
62
64
|
expect(provider).to receive(:execute).with(include("-G").and(include("group1,group2")), kind_of(Hash))
|
63
65
|
provider.create
|
64
66
|
end
|
@@ -4,6 +4,7 @@ RSpec::Matchers.define_negated_matcher :excluding, :include
|
|
4
4
|
|
5
5
|
describe Puppet::Type.type(:user).provider(:useradd) do
|
6
6
|
before :each do
|
7
|
+
allow(Puppet::Util::POSIX).to receive(:groups_of).and_return([])
|
7
8
|
allow(described_class).to receive(:command).with(:password).and_return('/usr/bin/chage')
|
8
9
|
allow(described_class).to receive(:command).with(:localpassword).and_return('/usr/sbin/lchage')
|
9
10
|
allow(described_class).to receive(:command).with(:add).and_return('/usr/sbin/useradd')
|
data/spec/unit/provider_spec.rb
CHANGED
@@ -648,39 +648,37 @@ describe Puppet::Provider do
|
|
648
648
|
it "delegates instance execute to Puppet::Util::Execution" do
|
649
649
|
expect(Puppet::Util::Execution).to receive(:execute).with("a_command", { :option => "value" })
|
650
650
|
|
651
|
-
provider.new.
|
651
|
+
provider.new.execute("a_command", { :option => "value" })
|
652
652
|
end
|
653
653
|
|
654
654
|
it "delegates class execute to Puppet::Util::Execution" do
|
655
655
|
expect(Puppet::Util::Execution).to receive(:execute).with("a_command", { :option => "value" })
|
656
656
|
|
657
|
-
provider.
|
657
|
+
provider.execute("a_command", { :option => "value" })
|
658
658
|
end
|
659
659
|
|
660
660
|
it "delegates instance execpipe to Puppet::Util::Execution" do
|
661
|
-
|
662
|
-
expect(Puppet::Util::Execution).to receive(:execpipe).with("a_command", true, block)
|
661
|
+
allow(Puppet::Util::Execution).to receive(:execpipe).with("a_command", true).and_yield('some output')
|
663
662
|
|
664
|
-
provider.new.
|
663
|
+
expect { |b| provider.new.execpipe("a_command", true, &b) }.to yield_with_args('some output')
|
665
664
|
end
|
666
665
|
|
667
666
|
it "delegates class execpipe to Puppet::Util::Execution" do
|
668
|
-
|
669
|
-
expect(Puppet::Util::Execution).to receive(:execpipe).with("a_command", true, block)
|
667
|
+
allow(Puppet::Util::Execution).to receive(:execpipe).with("a_command", true).and_yield('some output')
|
670
668
|
|
671
|
-
provider.
|
669
|
+
expect { |b| provider.execpipe("a_command", true, &b) }.to yield_with_args('some output')
|
672
670
|
end
|
673
671
|
|
674
672
|
it "delegates instance execfail to Puppet::Util::Execution" do
|
675
673
|
expect(Puppet::Util::Execution).to receive(:execfail).with("a_command", "an exception to raise")
|
676
674
|
|
677
|
-
provider.new.
|
675
|
+
provider.new.execfail("a_command", "an exception to raise")
|
678
676
|
end
|
679
677
|
|
680
678
|
it "delegates class execfail to Puppet::Util::Execution" do
|
681
679
|
expect(Puppet::Util::Execution).to receive(:execfail).with("a_command", "an exception to raise")
|
682
680
|
|
683
|
-
provider.
|
681
|
+
provider.execfail("a_command", "an exception to raise")
|
684
682
|
end
|
685
683
|
end
|
686
684
|
|
@@ -69,6 +69,51 @@ describe 'Puppet Pal' do
|
|
69
69
|
}.to raise_error(/manifest_file or code_string cannot be given when configured_by_env is true/)
|
70
70
|
end
|
71
71
|
|
72
|
+
it 'shadows target variables that collide with plan variables' do
|
73
|
+
facts = { 'var' => 'fact' }
|
74
|
+
target_vars = { 'var' => 'target' }
|
75
|
+
|
76
|
+
expect(Puppet).to receive(:warning).with(/Target variable \$var will be overridden by fact of the same name/)
|
77
|
+
|
78
|
+
result = Puppet::Pal.in_tmp_environment('pal_env', facts: {}) do |ctx|
|
79
|
+
ctx.with_catalog_compiler(facts: facts, target_variables: target_vars ) do |c|
|
80
|
+
c.evaluate_string('$var')
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
expect(result).to eq('fact')
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'shadows target variables that collide with facts' do
|
88
|
+
plan_vars = { 'var' => 'plan' }
|
89
|
+
target_vars = { 'var' => 'target' }
|
90
|
+
|
91
|
+
expect(Puppet).to receive(:warning).with(/Target variable \$var will be overridden by plan variable of the same name/)
|
92
|
+
|
93
|
+
result = Puppet::Pal.in_tmp_environment('pal_env', facts: {}) do |ctx|
|
94
|
+
ctx.with_catalog_compiler(variables: plan_vars, target_variables: target_vars ) do |c|
|
95
|
+
c.evaluate_string('$var')
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
expect(result).to eq('plan')
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'shadows plan variables that collide with facts' do
|
103
|
+
facts = { 'var' => 'fact' }
|
104
|
+
plan_vars = { 'var' => 'plan' }
|
105
|
+
|
106
|
+
expect(Puppet).to receive(:warning).with(/Plan variable \$var will be overridden by fact of the same name/)
|
107
|
+
|
108
|
+
result = Puppet::Pal.in_tmp_environment('pal_env', facts: {}) do |ctx|
|
109
|
+
ctx.with_catalog_compiler(facts: facts, variables: plan_vars ) do |c|
|
110
|
+
c.evaluate_string('$var')
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
expect(result).to eq('fact')
|
115
|
+
end
|
116
|
+
|
72
117
|
context "evaluate_string method" do
|
73
118
|
it 'evaluates code string in a given tmp environment' do
|
74
119
|
result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: modulepath, facts: node_facts) do |ctx|
|
@@ -16,7 +16,12 @@ describe Puppet::Resource::CapabilityFinder do
|
|
16
16
|
Puppet.push_context({:loaders => loaders, :current_environment => env})
|
17
17
|
if mock_pdb
|
18
18
|
module Puppet::Util::Puppetdb
|
19
|
-
|
19
|
+
def query_puppetdb(query); end
|
20
|
+
module_function :query_puppetdb
|
21
|
+
|
22
|
+
class Http
|
23
|
+
def self.action(url); end
|
24
|
+
end
|
20
25
|
end
|
21
26
|
end
|
22
27
|
make_cap_type
|
@@ -554,7 +554,7 @@ describe Puppet::Resource::Type do
|
|
554
554
|
|
555
555
|
it "should not create a subscope for the :main class" do
|
556
556
|
allow(@resource).to receive(:title).and_return(:main)
|
557
|
-
expect(@
|
557
|
+
expect(@scope).not_to receive(:newscope)
|
558
558
|
expect(@type).to receive(:set_resource_parameters).with(@resource, @scope)
|
559
559
|
|
560
560
|
@type.evaluate_code(@resource)
|
data/spec/unit/resource_spec.rb
CHANGED
@@ -321,7 +321,7 @@ describe Puppet::Resource do
|
|
321
321
|
|
322
322
|
describe "when the resource type is :hostclass" do
|
323
323
|
let(:environment_name) { "testing env" }
|
324
|
-
let(:fact_values) { {
|
324
|
+
let(:fact_values) { { 'a' => 1 } }
|
325
325
|
let(:port) { Puppet::Parser::AST::Leaf.new(:value => '80') }
|
326
326
|
|
327
327
|
def inject_and_set_defaults(resource, scope)
|
@@ -330,10 +330,7 @@ describe Puppet::Resource do
|
|
330
330
|
|
331
331
|
before do
|
332
332
|
environment.known_resource_types.add(apache)
|
333
|
-
|
334
|
-
allow(scope).to receive(:host).and_return('host')
|
335
|
-
allow(scope).to receive(:environment).and_return(environment)
|
336
|
-
allow(scope).to receive(:facts).and_return(Puppet::Node::Facts.new("facts", fact_values))
|
333
|
+
scope.set_facts(fact_values)
|
337
334
|
end
|
338
335
|
|
339
336
|
context 'with a default value expression' do
|
@@ -627,11 +624,15 @@ describe Puppet::Resource do
|
|
627
624
|
expect(resource.to_hash[:myvar]).to eq("bob")
|
628
625
|
end
|
629
626
|
|
630
|
-
it "should set :name to the title if :name is not present for non-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
627
|
+
it "should set :name to the title if :name is not present for non-existent types" do
|
628
|
+
resource = Puppet::Resource.new :doesnotexist, "bar"
|
629
|
+
expect(resource.to_hash[:name]).to eq("bar")
|
630
|
+
end
|
631
|
+
|
632
|
+
it "should set :name to the title if :name is not present for a definition" do
|
633
|
+
type = Puppet::Resource::Type.new(:definition, :foo)
|
634
|
+
environment.known_resource_types.add(type)
|
635
|
+
resource = Puppet::Resource.new :foo, "bar", :environment => environment
|
635
636
|
expect(resource.to_hash[:name]).to eq("bar")
|
636
637
|
end
|
637
638
|
end
|
data/spec/unit/settings_spec.rb
CHANGED
@@ -87,16 +87,7 @@ describe Puppet::Settings do
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
-
|
91
90
|
describe "when initializing application defaults do" do
|
92
|
-
let(:default_values) do
|
93
|
-
values = {}
|
94
|
-
PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS.keys.each do |key|
|
95
|
-
values[key] = 'default value'
|
96
|
-
end
|
97
|
-
values
|
98
|
-
end
|
99
|
-
|
100
91
|
before do
|
101
92
|
@settings = Puppet::Settings.new
|
102
93
|
@settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
|
@@ -104,7 +95,7 @@ describe Puppet::Settings do
|
|
104
95
|
|
105
96
|
it "should fail if the app defaults hash is missing any required values" do
|
106
97
|
expect {
|
107
|
-
@settings.initialize_app_defaults(
|
98
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.reject { |key, _| key == :confdir })
|
108
99
|
}.to raise_error(Puppet::Settings::SettingsError)
|
109
100
|
end
|
110
101
|
|
@@ -112,7 +103,7 @@ describe Puppet::Settings do
|
|
112
103
|
# case behaviors / uses. However, until that time... we need to make sure that our private run_mode=
|
113
104
|
# setter method gets properly called during app initialization.
|
114
105
|
it "sets the preferred run mode when initializing the app defaults" do
|
115
|
-
@settings.initialize_app_defaults(
|
106
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :server))
|
116
107
|
|
117
108
|
expect(@settings.preferred_run_mode).to eq(:server)
|
118
109
|
end
|
@@ -121,7 +112,7 @@ describe Puppet::Settings do
|
|
121
112
|
# initialize_app_defaults is called in spec_helper, before we even
|
122
113
|
# get here, but call it here to make it explicit what we're trying
|
123
114
|
# to do.
|
124
|
-
@settings.initialize_app_defaults(
|
115
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
|
125
116
|
|
126
117
|
Puppet::Settings::REQUIRED_APP_SETTINGS.each do |key|
|
127
118
|
expect(File).to exist(File.dirname(Puppet[key]))
|
@@ -148,6 +139,7 @@ describe Puppet::Settings do
|
|
148
139
|
end.to_not raise_error
|
149
140
|
end
|
150
141
|
end
|
142
|
+
|
151
143
|
describe "if no interpolation error" do
|
152
144
|
it "should not raise an error" do
|
153
145
|
hook_values = []
|
@@ -177,6 +169,7 @@ describe Puppet::Settings do
|
|
177
169
|
@settings.send(:call_hooks_deferred_to_application_initialization, options)
|
178
170
|
end.to raise_error(Puppet::Settings::InterpolationError)
|
179
171
|
end
|
172
|
+
|
180
173
|
it "should contain the setting name in error message" do
|
181
174
|
hook_values = []
|
182
175
|
@settings.define_settings(
|
@@ -193,6 +186,7 @@ describe Puppet::Settings do
|
|
193
186
|
end.to raise_error(Puppet::Settings::InterpolationError, /badhook/)
|
194
187
|
end
|
195
188
|
end
|
189
|
+
|
196
190
|
describe "if no interpolation error" do
|
197
191
|
it "should not raise an error" do
|
198
192
|
hook_values = []
|
@@ -397,122 +391,320 @@ describe Puppet::Settings do
|
|
397
391
|
end
|
398
392
|
|
399
393
|
describe "call_hook" do
|
394
|
+
let(:config_file) { tmpfile('config') }
|
395
|
+
|
396
|
+
before :each do
|
397
|
+
# We can't specify the config file to read from using `Puppet[:config] =`
|
398
|
+
# or pass it as an arg to Puppet.initialize_global_settings, because
|
399
|
+
# both of those will set the value on the `Puppet.settings` instance
|
400
|
+
# which is different from the `@settings` instance created in the test.
|
401
|
+
# Instead, we define a `:config` setting and set its default value to
|
402
|
+
# the `config_file` temp file, and then access the `config_file` within
|
403
|
+
# each test.
|
404
|
+
@settings.define_settings(:main, :config => { :type => :file, :desc => "config file", :default => config_file })
|
405
|
+
end
|
406
|
+
|
400
407
|
Puppet::Settings::StringSetting.available_call_hook_values.each do |val|
|
401
408
|
describe "when :#{val}" do
|
402
409
|
describe "and definition invalid" do
|
403
410
|
it "should raise error if no hook defined" do
|
404
411
|
expect do
|
405
|
-
@settings.define_settings(:section, :
|
412
|
+
@settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => val})
|
406
413
|
end.to raise_error(ArgumentError, /no :hook/)
|
407
414
|
end
|
415
|
+
|
408
416
|
it "should include the setting name in the error message" do
|
409
417
|
expect do
|
410
|
-
@settings.define_settings(:section, :
|
411
|
-
end.to raise_error(ArgumentError, /for :
|
418
|
+
@settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => val})
|
419
|
+
end.to raise_error(ArgumentError, /for :setting/)
|
412
420
|
end
|
413
421
|
end
|
422
|
+
|
414
423
|
describe "and definition valid" do
|
415
424
|
before(:each) do
|
416
425
|
hook_values = []
|
417
|
-
@settings.define_settings(:section, :
|
426
|
+
@settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => val, :hook => lambda { |v| hook_values << v }})
|
418
427
|
end
|
419
428
|
|
420
429
|
it "should call the hook when value written" do
|
421
|
-
expect(@settings.setting(:
|
422
|
-
@settings[:
|
430
|
+
expect(@settings.setting(:setting)).to receive(:handle).with("something").once
|
431
|
+
@settings[:setting] = "something"
|
423
432
|
end
|
424
433
|
end
|
425
434
|
end
|
426
435
|
end
|
427
436
|
|
428
437
|
it "should have a default value of :on_write_only" do
|
429
|
-
@settings.define_settings(:section, :
|
430
|
-
expect(@settings.setting(:
|
438
|
+
@settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| hook_values << v }})
|
439
|
+
expect(@settings.setting(:setting).call_hook).to eq(:on_write_only)
|
431
440
|
end
|
432
441
|
|
433
442
|
describe "when nil" do
|
434
443
|
it "should generate a warning" do
|
435
444
|
expect(Puppet).to receive(:warning)
|
436
|
-
@settings.define_settings(:section, :
|
445
|
+
@settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => nil, :hook => lambda { |v| hook_values << v }})
|
437
446
|
end
|
447
|
+
|
438
448
|
it "should use default" do
|
439
|
-
@settings.define_settings(:section, :
|
440
|
-
expect(@settings.setting(:
|
449
|
+
@settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => nil, :hook => lambda { |v| hook_values << v }})
|
450
|
+
expect(@settings.setting(:setting).call_hook).to eq(:on_write_only)
|
441
451
|
end
|
442
452
|
end
|
443
453
|
|
444
454
|
describe "when invalid" do
|
445
455
|
it "should raise an error" do
|
446
456
|
expect do
|
447
|
-
@settings.define_settings(:section, :
|
457
|
+
@settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => :foo, :hook => lambda { |v| hook_values << v }})
|
448
458
|
end.to raise_error(ArgumentError, /invalid.*call_hook/i)
|
449
459
|
end
|
450
460
|
end
|
451
461
|
|
462
|
+
describe "when :on_write_only" do
|
463
|
+
it "returns its hook type" do
|
464
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |_| }})
|
465
|
+
|
466
|
+
expect(@settings.setting(:setting).call_hook).to eq(:on_write_only)
|
467
|
+
end
|
468
|
+
|
469
|
+
it "should not call the hook at definition" do
|
470
|
+
hook_values = []
|
471
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| hook_values << v }})
|
472
|
+
|
473
|
+
expect(hook_values).to eq(%w[])
|
474
|
+
end
|
475
|
+
|
476
|
+
it "calls the hook when initializing global defaults with the value from the `main` section" do
|
477
|
+
hook_values = []
|
478
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| hook_values << v }})
|
479
|
+
|
480
|
+
File.write(config_file, <<~END)
|
481
|
+
[main]
|
482
|
+
setting=in_main
|
483
|
+
END
|
484
|
+
@settings.initialize_global_settings
|
485
|
+
|
486
|
+
expect(@settings[:setting]).to eq('in_main')
|
487
|
+
expect(hook_values).to eq(%w[in_main])
|
488
|
+
end
|
489
|
+
|
490
|
+
it "doesn't call the hook when initializing app defaults" do
|
491
|
+
hook_values = []
|
492
|
+
@settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
|
493
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| hook_values << v }})
|
494
|
+
|
495
|
+
File.write(config_file, <<~END)
|
496
|
+
[main]
|
497
|
+
setting=in_main
|
498
|
+
[agent]
|
499
|
+
setting=in_agent
|
500
|
+
END
|
501
|
+
@settings.initialize_global_settings
|
502
|
+
|
503
|
+
hook_values.clear
|
504
|
+
|
505
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
|
506
|
+
|
507
|
+
expect(@settings[:setting]).to eq('in_main')
|
508
|
+
expect(hook_values).to eq(%w[])
|
509
|
+
end
|
510
|
+
|
511
|
+
it "doesn't call the hook with value from a section that matches the run_mode" do
|
512
|
+
hook_values = []
|
513
|
+
@settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
|
514
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| hook_values << v }})
|
515
|
+
|
516
|
+
File.write(config_file, <<~END)
|
517
|
+
[main]
|
518
|
+
setting=in_main
|
519
|
+
[agent]
|
520
|
+
setting=in_agent
|
521
|
+
END
|
522
|
+
@settings.initialize_global_settings
|
523
|
+
|
524
|
+
hook_values.clear
|
525
|
+
|
526
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :agent))
|
527
|
+
|
528
|
+
expect(@settings[:setting]).to eq('in_agent')
|
529
|
+
expect(hook_values).to eq(%w[])
|
530
|
+
end
|
531
|
+
end
|
532
|
+
|
452
533
|
describe "when :on_define_and_write" do
|
453
|
-
it "
|
534
|
+
it "returns its hook type" do
|
535
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |_| }})
|
536
|
+
|
537
|
+
expect(@settings.setting(:setting).call_hook).to eq(:on_define_and_write)
|
538
|
+
end
|
539
|
+
|
540
|
+
it "should call the hook at definition with the default value" do
|
454
541
|
hook_values = []
|
455
|
-
@settings.define_settings(:
|
456
|
-
|
457
|
-
expect(hook_values).to eq(%w
|
542
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| hook_values << v }})
|
543
|
+
|
544
|
+
expect(hook_values).to eq(%w[yay])
|
545
|
+
end
|
546
|
+
|
547
|
+
it "calls the hook when initializing global defaults with the value from the `main` section" do
|
548
|
+
hook_values = []
|
549
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| hook_values << v }})
|
550
|
+
|
551
|
+
File.write(config_file, <<~END)
|
552
|
+
[main]
|
553
|
+
setting=in_main
|
554
|
+
END
|
555
|
+
@settings.initialize_global_settings
|
556
|
+
|
557
|
+
expect(@settings[:setting]).to eq('in_main')
|
558
|
+
expect(hook_values).to eq(%w[yay in_main])
|
559
|
+
end
|
560
|
+
|
561
|
+
it "doesn't call the hook when initializing app defaults" do
|
562
|
+
hook_values = []
|
563
|
+
@settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
|
564
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| hook_values << v }})
|
565
|
+
|
566
|
+
File.write(config_file, <<~END)
|
567
|
+
[main]
|
568
|
+
setting=in_main
|
569
|
+
[agent]
|
570
|
+
setting=in_agent
|
571
|
+
END
|
572
|
+
@settings.initialize_global_settings
|
573
|
+
|
574
|
+
hook_values.clear
|
575
|
+
|
576
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
|
577
|
+
|
578
|
+
expect(@settings[:setting]).to eq('in_main')
|
579
|
+
expect(hook_values).to eq([])
|
580
|
+
end
|
581
|
+
|
582
|
+
it "doesn't call the hook with value from a section that matches the run_mode" do
|
583
|
+
hook_values = []
|
584
|
+
@settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
|
585
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| hook_values << v }})
|
586
|
+
|
587
|
+
File.write(config_file, <<~END)
|
588
|
+
[main]
|
589
|
+
setting=in_main
|
590
|
+
[agent]
|
591
|
+
setting=in_agent
|
592
|
+
END
|
593
|
+
|
594
|
+
@settings.initialize_global_settings
|
595
|
+
|
596
|
+
hook_values.clear
|
597
|
+
|
598
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :agent))
|
599
|
+
|
600
|
+
# The correct value is returned
|
601
|
+
expect(@settings[:setting]).to eq('in_agent')
|
602
|
+
|
603
|
+
# but the hook is never called, seems like a bug!
|
604
|
+
expect(hook_values).to eq([])
|
458
605
|
end
|
459
606
|
end
|
460
607
|
|
461
608
|
describe "when :on_initialize_and_write" do
|
462
|
-
|
463
|
-
@
|
464
|
-
|
609
|
+
it "returns its hook type" do
|
610
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_initialize_and_write, :hook => lambda { |_| }})
|
611
|
+
|
612
|
+
expect(@settings.setting(:setting).call_hook).to eq(:on_initialize_and_write)
|
465
613
|
end
|
466
614
|
|
467
615
|
it "should not call the hook at definition" do
|
468
|
-
|
469
|
-
|
616
|
+
hook_values = []
|
617
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_initialize_and_write, :hook => lambda { |v| hook_values << v }})
|
618
|
+
expect(hook_values).to eq([])
|
470
619
|
end
|
471
620
|
|
472
|
-
it "
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
621
|
+
it "calls the hook when initializing global defaults with the value from the `main` section" do
|
622
|
+
hook_values = []
|
623
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_initialize_and_write, :hook => lambda { |v| hook_values << v }})
|
624
|
+
|
625
|
+
File.write(config_file, <<~END)
|
626
|
+
[main]
|
627
|
+
setting=in_main
|
628
|
+
END
|
629
|
+
@settings.initialize_global_settings
|
630
|
+
|
631
|
+
expect(@settings[:setting]).to eq('in_main')
|
632
|
+
expect(hook_values).to eq(%w[in_main])
|
633
|
+
end
|
634
|
+
|
635
|
+
it "calls the hook when initializing app defaults" do
|
636
|
+
hook_values = []
|
478
637
|
@settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
|
638
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_initialize_and_write, :hook => lambda { |v| hook_values << v }})
|
479
639
|
|
480
|
-
|
640
|
+
File.write(config_file, <<~END)
|
641
|
+
[main]
|
642
|
+
setting=in_main
|
643
|
+
[agent]
|
644
|
+
setting=in_agent
|
645
|
+
END
|
646
|
+
@settings.initialize_global_settings
|
481
647
|
|
482
|
-
|
648
|
+
hook_values.clear
|
649
|
+
|
650
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
|
651
|
+
|
652
|
+
expect(@settings[:setting]).to eq('in_main')
|
653
|
+
expect(hook_values).to eq(%w[in_main])
|
654
|
+
end
|
655
|
+
|
656
|
+
it "calls the hook with the overridden value from a section that matches the run_mode" do
|
657
|
+
hook_values = []
|
658
|
+
@settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
|
659
|
+
@settings.define_settings(:main, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_initialize_and_write, :hook => lambda { |v| hook_values << v }})
|
660
|
+
|
661
|
+
File.write(config_file, <<~END)
|
662
|
+
[main]
|
663
|
+
setting=in_main
|
664
|
+
[agent]
|
665
|
+
setting=in_agent
|
666
|
+
END
|
667
|
+
@settings.initialize_global_settings
|
668
|
+
|
669
|
+
hook_values.clear
|
670
|
+
|
671
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :agent))
|
672
|
+
|
673
|
+
expect(@settings[:setting]).to eq('in_agent')
|
674
|
+
expect(hook_values).to eq(%w[in_agent])
|
483
675
|
end
|
484
676
|
end
|
485
677
|
end
|
486
678
|
|
487
679
|
it "should call passed blocks when values are set" do
|
488
680
|
values = []
|
489
|
-
@settings.define_settings(:section, :
|
681
|
+
@settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| values << v }})
|
490
682
|
expect(values).to eq([])
|
491
683
|
|
492
|
-
@settings[:
|
684
|
+
@settings[:setting] = "something"
|
493
685
|
expect(values).to eq(%w{something})
|
494
686
|
end
|
495
687
|
|
496
688
|
it "should call passed blocks when values are set via the command line" do
|
497
689
|
values = []
|
498
|
-
@settings.define_settings(:section, :
|
690
|
+
@settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :hook => lambda { |v| values << v }})
|
499
691
|
expect(values).to eq([])
|
500
692
|
|
501
|
-
@settings.handlearg("--
|
693
|
+
@settings.handlearg("--setting", "yay")
|
502
694
|
|
503
695
|
expect(values).to eq(%w{yay})
|
504
696
|
end
|
505
697
|
|
506
698
|
it "should provide an option to call passed blocks during definition" do
|
507
699
|
values = []
|
508
|
-
@settings.define_settings(:section, :
|
700
|
+
@settings.define_settings(:section, :setting => {:default => "yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| values << v }})
|
509
701
|
expect(values).to eq(%w{yay})
|
510
702
|
end
|
511
703
|
|
512
704
|
it "should pass the fully interpolated value to the hook when called on definition" do
|
513
705
|
values = []
|
514
706
|
@settings.define_settings(:section, :one => { :default => "test", :desc => "a" })
|
515
|
-
@settings.define_settings(:section, :
|
707
|
+
@settings.define_settings(:section, :setting => {:default => "$one/yay", :desc => "boo", :call_hook => :on_define_and_write, :hook => lambda { |v| values << v }})
|
516
708
|
expect(values).to eq(%w{test/yay})
|
517
709
|
end
|
518
710
|
|
@@ -561,12 +753,8 @@ describe Puppet::Settings do
|
|
561
753
|
end
|
562
754
|
|
563
755
|
it "setting a value to nil causes it to return to its default" do
|
564
|
-
default_values = { :one => "skipped value" }
|
565
|
-
[:logdir, :confdir, :codedir, :vardir].each do |key|
|
566
|
-
default_values[key] = 'default value'
|
567
|
-
end
|
568
756
|
@settings.define_settings :main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS
|
569
|
-
@settings.initialize_app_defaults(
|
757
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:one => "skipped value"))
|
570
758
|
@settings[:one] = "value will disappear"
|
571
759
|
|
572
760
|
@settings[:one] = nil
|
@@ -627,13 +815,14 @@ describe Puppet::Settings do
|
|
627
815
|
end
|
628
816
|
|
629
817
|
describe "when choosing which value to return" do
|
818
|
+
let(:config_file) { tmpfile('settings') }
|
819
|
+
|
630
820
|
before do
|
631
821
|
@settings = Puppet::Settings.new
|
632
822
|
@settings.define_settings :section,
|
633
|
-
:config => { :type => :file, :default =>
|
823
|
+
:config => { :type => :file, :default => config_file, :desc => "a" },
|
634
824
|
:one => { :default => "ONE", :desc => "a" },
|
635
825
|
:two => { :default => "TWO", :desc => "b" }
|
636
|
-
allow(Puppet::FileSystem).to receive(:exist?).and_return(true)
|
637
826
|
@settings.preferred_run_mode = :agent
|
638
827
|
end
|
639
828
|
|
@@ -642,18 +831,16 @@ describe Puppet::Settings do
|
|
642
831
|
end
|
643
832
|
|
644
833
|
it "should return values set on the cli before values set in the configuration file" do
|
645
|
-
|
646
|
-
allow(@settings).to receive(:read_file).and_return(text)
|
834
|
+
File.write(config_file, "[main]\none = fileval\n")
|
647
835
|
@settings.handlearg("--one", "clival")
|
648
|
-
@settings.
|
836
|
+
@settings.initialize_global_settings
|
649
837
|
|
650
838
|
expect(@settings[:one]).to eq("clival")
|
651
839
|
end
|
652
840
|
|
653
841
|
it "should return values set in the mode-specific section before values set in the main section" do
|
654
|
-
|
655
|
-
|
656
|
-
@settings.send(:parse_config_files)
|
842
|
+
File.write(config_file, "[main]\none = mainval\n[agent]\none = modeval\n")
|
843
|
+
@settings.initialize_global_settings
|
657
844
|
|
658
845
|
expect(@settings[:one]).to eq("modeval")
|
659
846
|
end
|
@@ -663,17 +850,15 @@ describe Puppet::Settings do
|
|
663
850
|
before(:each) { @settings.preferred_run_mode = run_mode }
|
664
851
|
|
665
852
|
it "returns values set in the 'master' section if the 'server' section does not exist" do
|
666
|
-
|
667
|
-
|
668
|
-
@settings.send(:parse_config_files)
|
853
|
+
File.write(config_file, "[main]\none = mainval\n[master]\none = modeval\n")
|
854
|
+
@settings.initialize_global_settings
|
669
855
|
|
670
856
|
expect(@settings[:one]).to eq("modeval")
|
671
857
|
end
|
672
858
|
|
673
859
|
it "prioritizes values set in the 'server' section if set" do
|
674
|
-
|
675
|
-
|
676
|
-
@settings.send(:parse_config_files)
|
860
|
+
File.write(config_file, "[main]\none = mainval\n[server]\none = serverval\n[master]\none = masterval\n")
|
861
|
+
@settings.initialize_global_settings
|
677
862
|
|
678
863
|
expect(@settings[:one]).to eq("serverval")
|
679
864
|
end
|
@@ -681,9 +866,9 @@ describe Puppet::Settings do
|
|
681
866
|
end
|
682
867
|
|
683
868
|
it "should not return values outside of its search path" do
|
684
|
-
|
685
|
-
|
686
|
-
|
869
|
+
File.write(config_file, "[other]\none = oval\n")
|
870
|
+
@settings.initialize_global_settings
|
871
|
+
|
687
872
|
expect(@settings[:one]).to eq("ONE")
|
688
873
|
end
|
689
874
|
|
@@ -705,7 +890,7 @@ describe Puppet::Settings do
|
|
705
890
|
expect(Puppet::FileSystem).to receive(:exist?).with(main_config_file_default_location).and_return(false)
|
706
891
|
expect(Puppet::FileSystem).not_to receive(:exist?).with(user_config_file_default_location)
|
707
892
|
|
708
|
-
@settings.
|
893
|
+
@settings.initialize_global_settings
|
709
894
|
end
|
710
895
|
end
|
711
896
|
|
@@ -715,7 +900,7 @@ describe Puppet::Settings do
|
|
715
900
|
|
716
901
|
expect(Puppet::FileSystem).to receive(:exist?).with(user_config_file_default_location).and_return(false)
|
717
902
|
|
718
|
-
@settings.
|
903
|
+
@settings.initialize_global_settings
|
719
904
|
end
|
720
905
|
end
|
721
906
|
|
@@ -724,7 +909,7 @@ describe Puppet::Settings do
|
|
724
909
|
expect(Puppet::FileSystem).to receive(:exist?).with(user_config_file_default_location).and_return(true)
|
725
910
|
expect(@settings).to receive(:read_file).and_raise('Permission denied')
|
726
911
|
|
727
|
-
expect{ @settings.
|
912
|
+
expect{ @settings.initialize_global_settings }.to raise_error(RuntimeError, /Could not load #{user_config_file_default_location}: Permission denied/)
|
728
913
|
end
|
729
914
|
|
730
915
|
it "does not fail if the file is not readable and when `require_config` is false" do
|
@@ -734,7 +919,7 @@ describe Puppet::Settings do
|
|
734
919
|
expect(@settings).not_to receive(:parse_config)
|
735
920
|
expect(Puppet).to receive(:log_exception)
|
736
921
|
|
737
|
-
expect{ @settings.
|
922
|
+
expect{ @settings.initialize_global_settings([], false) }.not_to raise_error
|
738
923
|
end
|
739
924
|
|
740
925
|
it "reads the file if it is readable" do
|
@@ -742,7 +927,7 @@ describe Puppet::Settings do
|
|
742
927
|
expect(@settings).to receive(:read_file).and_return('server = host.string')
|
743
928
|
expect(@settings).to receive(:parse_config)
|
744
929
|
|
745
|
-
@settings.
|
930
|
+
@settings.initialize_global_settings
|
746
931
|
end
|
747
932
|
end
|
748
933
|
|
@@ -751,7 +936,7 @@ describe Puppet::Settings do
|
|
751
936
|
expect(Puppet::FileSystem).to receive(:exist?).with(user_config_file_default_location).and_return(false)
|
752
937
|
expect(@settings).not_to receive(:parse_config)
|
753
938
|
|
754
|
-
@settings.
|
939
|
+
@settings.initialize_global_settings
|
755
940
|
end
|
756
941
|
end
|
757
942
|
end
|
@@ -761,43 +946,41 @@ describe Puppet::Settings do
|
|
761
946
|
@settings = Puppet::Settings.new
|
762
947
|
allow(@settings).to receive(:service_user_available?).and_return(true)
|
763
948
|
allow(@settings).to receive(:service_group_available?).and_return(true)
|
764
|
-
@file =
|
765
|
-
@userconfig = make_absolute("/test/userconfigfile")
|
949
|
+
@file = tmpfile("somefile")
|
766
950
|
@settings.define_settings :section, :user => { :default => "suser", :desc => "doc" }, :group => { :default => "sgroup", :desc => "doc" }
|
767
951
|
@settings.define_settings :section,
|
768
952
|
:config => { :type => :file, :default => @file, :desc => "eh" },
|
769
953
|
:one => { :default => "ONE", :desc => "a" },
|
770
954
|
:two => { :default => "$one TWO", :desc => "b" },
|
771
955
|
:three => { :default => "$one $two THREE", :desc => "c" }
|
772
|
-
|
773
|
-
|
774
|
-
allow(
|
956
|
+
|
957
|
+
userconfig = tmpfile("userconfig")
|
958
|
+
allow(@settings).to receive(:user_config_file).and_return(userconfig)
|
775
959
|
end
|
776
960
|
|
777
961
|
it "should not ignore the report setting" do
|
778
962
|
@settings.define_settings :section, :report => { :default => "false", :desc => "a" }
|
779
|
-
|
780
|
-
myfile = File.expand_path(@file)
|
781
|
-
@settings[:config] = myfile
|
782
|
-
text = <<-CONF
|
963
|
+
File.write(@file, <<~CONF)
|
783
964
|
[puppetd]
|
784
|
-
|
965
|
+
report=true
|
785
966
|
CONF
|
786
|
-
|
787
|
-
|
788
|
-
|
967
|
+
|
968
|
+
@settings.initialize_global_settings
|
969
|
+
|
789
970
|
expect(@settings[:report]).to be_truthy
|
790
971
|
end
|
791
972
|
|
792
973
|
it "should use its current ':config' value for the file to parse" do
|
793
|
-
myfile =
|
794
|
-
|
795
|
-
|
796
|
-
|
974
|
+
myfile = tmpfile('myfile')
|
975
|
+
File.write(myfile, <<~CONF)
|
976
|
+
[main]
|
977
|
+
one=myfile
|
978
|
+
CONF
|
797
979
|
|
798
|
-
|
980
|
+
@settings[:config] = myfile
|
981
|
+
@settings.initialize_global_settings
|
799
982
|
|
800
|
-
@settings.
|
983
|
+
expect(@settings[:one]).to eq('myfile')
|
801
984
|
end
|
802
985
|
|
803
986
|
it "should not try to parse non-existent files" do
|
@@ -805,42 +988,50 @@ describe Puppet::Settings do
|
|
805
988
|
|
806
989
|
expect(File).not_to receive(:read).with(@file)
|
807
990
|
|
808
|
-
@settings.
|
991
|
+
@settings.initialize_global_settings
|
809
992
|
end
|
810
993
|
|
811
994
|
it "should return values set in the configuration file" do
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
995
|
+
File.write(@file, <<~CONF)
|
996
|
+
[main]
|
997
|
+
one = fileval
|
998
|
+
CONF
|
999
|
+
|
1000
|
+
@settings.initialize_global_settings
|
817
1001
|
expect(@settings[:one]).to eq("fileval")
|
818
1002
|
end
|
819
1003
|
|
820
1004
|
#484 - this should probably be in the regression area
|
821
1005
|
it "should not throw an exception on unknown parameters" do
|
822
|
-
|
823
|
-
|
824
|
-
|
1006
|
+
File.write(@file, <<~CONF)
|
1007
|
+
[main]
|
1008
|
+
nosuchparam = mval
|
1009
|
+
CONF
|
1010
|
+
|
1011
|
+
expect { @settings.initialize_global_settings }.not_to raise_error
|
825
1012
|
end
|
826
1013
|
|
827
1014
|
it "should convert booleans in the configuration file into Ruby booleans" do
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
1015
|
+
File.write(@file, <<~CONF)
|
1016
|
+
[main]
|
1017
|
+
one = true
|
1018
|
+
two = false
|
1019
|
+
CONF
|
1020
|
+
|
1021
|
+
@settings.initialize_global_settings
|
1022
|
+
|
834
1023
|
expect(@settings[:one]).to eq(true)
|
835
1024
|
expect(@settings[:two]).to eq(false)
|
836
1025
|
end
|
837
1026
|
|
838
1027
|
it "should convert integers in the configuration file into Ruby Integers" do
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
1028
|
+
File.write(@file, <<~CONF)
|
1029
|
+
[main]
|
1030
|
+
one = 65
|
1031
|
+
CONF
|
1032
|
+
|
1033
|
+
@settings.initialize_global_settings
|
1034
|
+
|
844
1035
|
expect(@settings[:one]).to eq(65)
|
845
1036
|
end
|
846
1037
|
|
@@ -871,25 +1062,21 @@ describe Puppet::Settings do
|
|
871
1062
|
end
|
872
1063
|
|
873
1064
|
it "should support loading metadata (owner, group, or mode) from a run_mode section in the configuration file" do
|
874
|
-
default_values = {}
|
875
|
-
PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS.keys.each do |key|
|
876
|
-
default_values[key] = 'default value'
|
877
|
-
end
|
878
1065
|
@settings.define_settings :main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS
|
879
1066
|
@settings.define_settings :server, :myfile => { :type => :file, :default => make_absolute("/myfile"), :desc => "a" }
|
880
1067
|
|
881
1068
|
otherfile = make_absolute("/other/file")
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
1069
|
+
File.write(@file, <<~CONF)
|
1070
|
+
[server]
|
1071
|
+
myfile = #{otherfile} {mode = 664}
|
1072
|
+
CONF
|
886
1073
|
|
887
1074
|
# will start initialization as user
|
888
1075
|
expect(@settings.preferred_run_mode).to eq(:user)
|
889
|
-
@settings.
|
1076
|
+
@settings.initialize_global_settings
|
890
1077
|
|
891
1078
|
# change app run_mode to server
|
892
|
-
@settings.initialize_app_defaults(
|
1079
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :server))
|
893
1080
|
expect(@settings.preferred_run_mode).to eq(:server)
|
894
1081
|
|
895
1082
|
# initializing the app should have reloaded the metadata based on run_mode
|
@@ -899,18 +1086,18 @@ describe Puppet::Settings do
|
|
899
1086
|
|
900
1087
|
context "when setting serverport and masterport" do
|
901
1088
|
before(:each) do
|
902
|
-
default_values = {}
|
903
|
-
PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS.keys.each do |key|
|
904
|
-
default_values[key] = 'default value'
|
905
|
-
end
|
906
1089
|
@settings.define_settings :main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS
|
907
1090
|
@settings.define_settings :server, :masterport => { :desc => "a", :default => 1000 }
|
908
|
-
@settings.define_settings :server, :serverport => { :
|
1091
|
+
@settings.define_settings :server, :serverport => { :type => :alias, :alias_for => :masterport }
|
909
1092
|
@settings.define_settings :server, :ca_port => { :desc => "a", :default => "$serverport" }
|
910
1093
|
@settings.define_settings :server, :report_port => { :desc => "a", :default => "$serverport" }
|
911
|
-
|
912
|
-
|
913
|
-
@settings
|
1094
|
+
|
1095
|
+
config_file = tmpfile('config')
|
1096
|
+
@settings[:config] = config_file
|
1097
|
+
File.write(config_file, text)
|
1098
|
+
|
1099
|
+
@settings.initialize_global_settings
|
1100
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :agent))
|
914
1101
|
expect(@settings.preferred_run_mode).to eq(:agent)
|
915
1102
|
end
|
916
1103
|
|
@@ -923,9 +1110,10 @@ describe Puppet::Settings do
|
|
923
1110
|
"
|
924
1111
|
end
|
925
1112
|
|
926
|
-
it { expect(@settings[:serverport]).to eq(
|
927
|
-
it { expect(@settings[:ca_port]).to eq("
|
928
|
-
it { expect(@settings[:report_port]).to eq("
|
1113
|
+
it { expect(@settings[:serverport]).to eq(444) }
|
1114
|
+
it { expect(@settings[:ca_port]).to eq("444") }
|
1115
|
+
it { expect(@settings[:report_port]).to eq("444") }
|
1116
|
+
it { expect(@settings[:masterport]).to eq(445) }
|
929
1117
|
end
|
930
1118
|
|
931
1119
|
context 'with serverport and masterport in main' do
|
@@ -939,6 +1127,7 @@ describe Puppet::Settings do
|
|
939
1127
|
it { expect(@settings[:serverport]).to eq(445) }
|
940
1128
|
it { expect(@settings[:ca_port]).to eq("445") }
|
941
1129
|
it { expect(@settings[:report_port]).to eq("445") }
|
1130
|
+
it { expect(@settings[:masterport]).to eq(444) }
|
942
1131
|
end
|
943
1132
|
|
944
1133
|
context 'with serverport and masterport in agent' do
|
@@ -952,6 +1141,7 @@ describe Puppet::Settings do
|
|
952
1141
|
it { expect(@settings[:serverport]).to eq(445) }
|
953
1142
|
it { expect(@settings[:ca_port]).to eq("445") }
|
954
1143
|
it { expect(@settings[:report_port]).to eq("445") }
|
1144
|
+
it { expect(@settings[:masterport]).to eq(444) }
|
955
1145
|
end
|
956
1146
|
|
957
1147
|
context 'with both serverport and masterport in main and agent' do
|
@@ -968,6 +1158,7 @@ describe Puppet::Settings do
|
|
968
1158
|
it { expect(@settings[:serverport]).to eq(445) }
|
969
1159
|
it { expect(@settings[:ca_port]).to eq("445") }
|
970
1160
|
it { expect(@settings[:report_port]).to eq("445") }
|
1161
|
+
it { expect(@settings[:masterport]).to eq(444) }
|
971
1162
|
end
|
972
1163
|
|
973
1164
|
context 'with serverport in agent and masterport in main' do
|
@@ -982,6 +1173,7 @@ describe Puppet::Settings do
|
|
982
1173
|
it { expect(@settings[:serverport]).to eq(444) }
|
983
1174
|
it { expect(@settings[:ca_port]).to eq("444") }
|
984
1175
|
it { expect(@settings[:report_port]).to eq("444") }
|
1176
|
+
it { expect(@settings[:masterport]).to eq(445) }
|
985
1177
|
end
|
986
1178
|
|
987
1179
|
context 'with masterport in main' do
|
@@ -994,6 +1186,7 @@ describe Puppet::Settings do
|
|
994
1186
|
it { expect(@settings[:serverport]).to eq(445) }
|
995
1187
|
it { expect(@settings[:ca_port]).to eq("445") }
|
996
1188
|
it { expect(@settings[:report_port]).to eq("445") }
|
1189
|
+
it { expect(@settings[:masterport]).to eq(445) }
|
997
1190
|
end
|
998
1191
|
|
999
1192
|
context 'with masterport in agent' do
|
@@ -1006,6 +1199,7 @@ describe Puppet::Settings do
|
|
1006
1199
|
it { expect(@settings[:serverport]).to eq(445) }
|
1007
1200
|
it { expect(@settings[:ca_port]).to eq("445") }
|
1008
1201
|
it { expect(@settings[:report_port]).to eq("445") }
|
1202
|
+
it { expect(@settings[:masterport]).to eq(445) }
|
1009
1203
|
end
|
1010
1204
|
|
1011
1205
|
context 'with serverport in agent' do
|
@@ -1016,7 +1210,7 @@ describe Puppet::Settings do
|
|
1016
1210
|
end
|
1017
1211
|
|
1018
1212
|
it { expect(@settings[:serverport]).to eq(445) }
|
1019
|
-
it { expect(@settings[:masterport]).to eq(
|
1213
|
+
it { expect(@settings[:masterport]).to eq(1000) }
|
1020
1214
|
it { expect(@settings[:ca_port]).to eq("445") }
|
1021
1215
|
it { expect(@settings[:report_port]).to eq("445") }
|
1022
1216
|
end
|
@@ -1029,36 +1223,31 @@ describe Puppet::Settings do
|
|
1029
1223
|
end
|
1030
1224
|
|
1031
1225
|
it { expect(@settings[:serverport]).to eq(445) }
|
1032
|
-
it { expect(@settings[:masterport]).to eq(
|
1226
|
+
it { expect(@settings[:masterport]).to eq(1000) }
|
1033
1227
|
it { expect(@settings[:ca_port]).to eq("445") }
|
1034
1228
|
it { expect(@settings[:report_port]).to eq("445") }
|
1035
1229
|
end
|
1036
1230
|
end
|
1037
1231
|
|
1038
1232
|
it "does not use the metadata from the same setting in a different section" do
|
1039
|
-
default_values = {}
|
1040
|
-
PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS.keys.each do |key|
|
1041
|
-
default_values[key] = 'default value'
|
1042
|
-
end
|
1043
|
-
|
1044
1233
|
file = make_absolute("/file")
|
1045
1234
|
default_mode = "0600"
|
1046
1235
|
@settings.define_settings :main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS
|
1047
1236
|
@settings.define_settings :server, :myfile => { :type => :file, :default => file, :desc => "a", :mode => default_mode }
|
1048
1237
|
|
1049
|
-
|
1050
|
-
|
1051
|
-
|
1052
|
-
|
1053
|
-
|
1054
|
-
|
1238
|
+
File.write(@file, <<~CONF)
|
1239
|
+
[server]
|
1240
|
+
myfile = #{file}/foo
|
1241
|
+
[agent]
|
1242
|
+
myfile = #{file} {mode = 664}
|
1243
|
+
CONF
|
1055
1244
|
|
1056
1245
|
# will start initialization as user
|
1057
1246
|
expect(@settings.preferred_run_mode).to eq(:user)
|
1058
|
-
@settings.
|
1247
|
+
@settings.initialize_global_settings
|
1059
1248
|
|
1060
1249
|
# change app run_mode to server
|
1061
|
-
@settings.initialize_app_defaults(
|
1250
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:run_mode => :server))
|
1062
1251
|
expect(@settings.preferred_run_mode).to eq(:server)
|
1063
1252
|
|
1064
1253
|
# initializing the app should have reloaded the metadata based on run_mode
|
@@ -1070,11 +1259,12 @@ describe Puppet::Settings do
|
|
1070
1259
|
values = []
|
1071
1260
|
@settings.define_settings :section, :mysetting => {:default => "defval", :desc => "a", :hook => proc { |v| values << v }}
|
1072
1261
|
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
@settings.
|
1262
|
+
File.write(@file, <<~CONF)
|
1263
|
+
[main]
|
1264
|
+
mysetting = setval
|
1265
|
+
CONF
|
1266
|
+
@settings.initialize_global_settings
|
1267
|
+
|
1078
1268
|
expect(values).to eq(["setval"])
|
1079
1269
|
end
|
1080
1270
|
|
@@ -1082,13 +1272,14 @@ describe Puppet::Settings do
|
|
1082
1272
|
values = []
|
1083
1273
|
@settings.define_settings :section, :mysetting => {:default => "defval", :desc => "a", :hook => proc { |v| values << v }}
|
1084
1274
|
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1088
|
-
|
1089
|
-
|
1090
|
-
|
1091
|
-
@settings.
|
1275
|
+
File.write(@file, <<~CONF)
|
1276
|
+
[user]
|
1277
|
+
mysetting = setval
|
1278
|
+
[main]
|
1279
|
+
mysetting = other
|
1280
|
+
CONF
|
1281
|
+
@settings.initialize_global_settings
|
1282
|
+
|
1092
1283
|
expect(values).to eq(["setval"])
|
1093
1284
|
end
|
1094
1285
|
|
@@ -1097,11 +1288,12 @@ describe Puppet::Settings do
|
|
1097
1288
|
@settings.define_settings :section, :base => {:default => "yay", :desc => "a", :hook => proc { |v| values << v }}
|
1098
1289
|
@settings.define_settings :section, :mysetting => {:default => "defval", :desc => "a", :hook => proc { |v| values << v }}
|
1099
1290
|
|
1100
|
-
|
1101
|
-
|
1102
|
-
|
1103
|
-
|
1104
|
-
@settings.
|
1291
|
+
File.write(@file, <<~CONF)
|
1292
|
+
[main]
|
1293
|
+
mysetting = $base/setval
|
1294
|
+
CONF
|
1295
|
+
@settings.initialize_global_settings
|
1296
|
+
|
1105
1297
|
expect(values).to eq(["yay/setval"])
|
1106
1298
|
end
|
1107
1299
|
|
@@ -1111,23 +1303,25 @@ describe Puppet::Settings do
|
|
1111
1303
|
:hook => proc { |v| hook_invoked = true },
|
1112
1304
|
:call_hook => :on_initialize_and_write, }
|
1113
1305
|
|
1306
|
+
# This test relies on `confdir` defaulting to nil which causes the default
|
1307
|
+
# value of `deferred=$confdir/goose` to raise an interpolation error during
|
1308
|
+
# global initialization, and the hook to be skipped
|
1114
1309
|
@settings.define_settings(:main,
|
1115
|
-
|
1116
|
-
|
1117
|
-
:codedir => { :type => :directory, :default => nil, :desc => "codedir" },
|
1118
|
-
:vardir => { :type => :directory, :default => nil, :desc => "vardir" })
|
1310
|
+
PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS.merge(
|
1311
|
+
:confdir => { :type => :directory, :default => nil, :desc => "confdir" }))
|
1119
1312
|
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1313
|
+
File.write(@file, <<~EOD)
|
1314
|
+
[main]
|
1315
|
+
deferred=$confdir/goose
|
1123
1316
|
EOD
|
1124
1317
|
|
1125
|
-
allow(@settings).to receive(:read_file).and_return(text)
|
1126
1318
|
@settings.initialize_global_settings
|
1127
1319
|
|
1128
1320
|
expect(hook_invoked).to be_falsey
|
1129
1321
|
|
1130
|
-
|
1322
|
+
# And now that we initialize app defaults with `confdir`, then `deferred`
|
1323
|
+
# can be interpolated and its hook called
|
1324
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:confdir => '/path/to/confdir'))
|
1131
1325
|
|
1132
1326
|
expect(hook_invoked).to be_truthy
|
1133
1327
|
expect(@settings[:deferred]).to eq(File.expand_path('/path/to/confdir/goose'))
|
@@ -1136,45 +1330,33 @@ describe Puppet::Settings do
|
|
1136
1330
|
it "does not require the value for a setting without a hook to resolve during global setup" do
|
1137
1331
|
@settings.define_settings :section, :can_cause_problems => {:desc => '' }
|
1138
1332
|
|
1139
|
-
@settings.define_settings(:main,
|
1140
|
-
:logdir => { :type => :directory, :default => nil, :desc => "logdir" },
|
1141
|
-
:confdir => { :type => :directory, :default => nil, :desc => "confdir" },
|
1142
|
-
:codedir => { :type => :directory, :default => nil, :desc => "codedir" },
|
1143
|
-
:vardir => { :type => :directory, :default => nil, :desc => "vardir" })
|
1333
|
+
@settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
|
1144
1334
|
|
1145
|
-
|
1335
|
+
File.write(@file, <<~EOD)
|
1146
1336
|
[main]
|
1147
1337
|
can_cause_problems=$confdir/goose
|
1148
1338
|
EOD
|
1149
1339
|
|
1150
|
-
allow(@settings).to receive(:read_file).and_return(text)
|
1151
1340
|
@settings.initialize_global_settings
|
1152
|
-
@settings.initialize_app_defaults(:
|
1341
|
+
@settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES.merge(:confdir => '/path/to/confdir'))
|
1153
1342
|
|
1154
|
-
expect(@settings[:can_cause_problems]).to eq(
|
1343
|
+
expect(@settings[:can_cause_problems]).to eq('/path/to/confdir/goose')
|
1155
1344
|
end
|
1156
1345
|
|
1157
1346
|
it "should allow empty values" do
|
1158
1347
|
@settings.define_settings :section, :myarg => { :default => "myfile", :desc => "a" }
|
1159
1348
|
|
1160
|
-
|
1161
|
-
|
1162
|
-
|
1163
|
-
|
1164
|
-
@settings.
|
1349
|
+
File.write(@file, <<~CONF)
|
1350
|
+
[main]
|
1351
|
+
myarg =
|
1352
|
+
CONF
|
1353
|
+
@settings.initialize_global_settings
|
1354
|
+
|
1165
1355
|
expect(@settings[:myarg]).to eq("")
|
1166
1356
|
end
|
1167
1357
|
|
1168
1358
|
describe "deprecations" do
|
1169
1359
|
let(:settings) { Puppet::Settings.new }
|
1170
|
-
let(:app_defaults) {
|
1171
|
-
{
|
1172
|
-
:logdir => "/dev/null",
|
1173
|
-
:confdir => "/dev/null",
|
1174
|
-
:codedir => "/dev/null",
|
1175
|
-
:vardir => "/dev/null",
|
1176
|
-
}
|
1177
|
-
}
|
1178
1360
|
|
1179
1361
|
def assert_accessing_setting_is_deprecated(settings, setting)
|
1180
1362
|
expect(Puppet).to receive(:deprecation_warning).with("Accessing '#{setting}' as a setting is deprecated.")
|
@@ -1184,12 +1366,7 @@ describe Puppet::Settings do
|
|
1184
1366
|
end
|
1185
1367
|
|
1186
1368
|
before(:each) do
|
1187
|
-
settings.define_settings(:main,
|
1188
|
-
:logdir => { :default => 'a', :desc => 'a' },
|
1189
|
-
:confdir => { :default => 'b', :desc => 'b' },
|
1190
|
-
:vardir => { :default => 'c', :desc => 'c' },
|
1191
|
-
:codedir => { :default => 'd', :desc => 'd' },
|
1192
|
-
})
|
1369
|
+
settings.define_settings(:main, PuppetSpec::Settings::TEST_APP_DEFAULT_DEFINITIONS)
|
1193
1370
|
end
|
1194
1371
|
|
1195
1372
|
context "complete" do
|
@@ -1210,7 +1387,7 @@ describe Puppet::Settings do
|
|
1210
1387
|
completely_deprecated_settings.parse_config(<<-CONF)
|
1211
1388
|
completely_deprecated_setting='should warn'
|
1212
1389
|
CONF
|
1213
|
-
completely_deprecated_settings.initialize_app_defaults(
|
1390
|
+
completely_deprecated_settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
|
1214
1391
|
end
|
1215
1392
|
|
1216
1393
|
it "warns when set on the commandline" do
|
@@ -1218,7 +1395,7 @@ describe Puppet::Settings do
|
|
1218
1395
|
|
1219
1396
|
args = ["--completely_deprecated_setting", "/some/value"]
|
1220
1397
|
completely_deprecated_settings.send(:parse_global_options, args)
|
1221
|
-
completely_deprecated_settings.initialize_app_defaults(
|
1398
|
+
completely_deprecated_settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
|
1222
1399
|
end
|
1223
1400
|
|
1224
1401
|
it "warns when set in code" do
|
@@ -1243,7 +1420,7 @@ describe Puppet::Settings do
|
|
1243
1420
|
partially_deprecated_settings.parse_config(<<-CONF)
|
1244
1421
|
partially_deprecated_setting='should warn'
|
1245
1422
|
CONF
|
1246
|
-
partially_deprecated_settings.initialize_app_defaults(
|
1423
|
+
partially_deprecated_settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
|
1247
1424
|
end
|
1248
1425
|
|
1249
1426
|
it "does not warn when manifest is set on command line" do
|
@@ -1251,7 +1428,7 @@ describe Puppet::Settings do
|
|
1251
1428
|
|
1252
1429
|
args = ["--partially_deprecated_setting", "/some/value"]
|
1253
1430
|
partially_deprecated_settings.send(:parse_global_options, args)
|
1254
|
-
partially_deprecated_settings.initialize_app_defaults(
|
1431
|
+
partially_deprecated_settings.initialize_app_defaults(PuppetSpec::Settings::TEST_APP_DEFAULT_VALUES)
|
1255
1432
|
end
|
1256
1433
|
|
1257
1434
|
it "warns when set in code" do
|
@@ -1344,23 +1521,24 @@ describe Puppet::Settings do
|
|
1344
1521
|
|
1345
1522
|
describe "when reparsing its configuration" do
|
1346
1523
|
before do
|
1347
|
-
@file =
|
1348
|
-
@
|
1524
|
+
@file = tmpfile("testfile")
|
1525
|
+
Puppet::FileSystem.touch(@file)
|
1526
|
+
|
1349
1527
|
@settings = Puppet::Settings.new
|
1350
1528
|
@settings.define_settings :section,
|
1351
1529
|
:config => { :type => :file, :default => @file, :desc => "a" },
|
1352
1530
|
:one => { :default => "ONE", :desc => "a" },
|
1353
1531
|
:two => { :default => "$one TWO", :desc => "b" },
|
1354
1532
|
:three => { :default => "$one $two THREE", :desc => "c" }
|
1355
|
-
|
1356
|
-
|
1357
|
-
allow(@settings).to receive(:user_config_file).and_return(
|
1533
|
+
|
1534
|
+
userconfig = tmpfile("userconfig")
|
1535
|
+
allow(@settings).to receive(:user_config_file).and_return(userconfig)
|
1358
1536
|
end
|
1359
1537
|
|
1360
1538
|
it "does not create the WatchedFile instance and should not parse if the file does not exist" do
|
1361
|
-
|
1362
|
-
expect(Puppet::Util::WatchedFile).not_to receive(:new)
|
1539
|
+
Puppet::FileSystem.unlink(@file)
|
1363
1540
|
|
1541
|
+
expect(Puppet::Util::WatchedFile).not_to receive(:new)
|
1364
1542
|
expect(@settings).not_to receive(:parse_config_files)
|
1365
1543
|
|
1366
1544
|
@settings.reparse_config_files
|
@@ -1399,8 +1577,8 @@ describe Puppet::Settings do
|
|
1399
1577
|
@settings[:one] = "init"
|
1400
1578
|
|
1401
1579
|
# Now replace the value
|
1402
|
-
|
1403
|
-
|
1580
|
+
File.write(@file, "[main]\none = disk-replace\n")
|
1581
|
+
|
1404
1582
|
@settings.reparse_config_files
|
1405
1583
|
expect(@settings[:one]).to eq("disk-replace")
|
1406
1584
|
end
|
@@ -1409,23 +1587,20 @@ describe Puppet::Settings do
|
|
1409
1587
|
it "should retain parameters set by cli when configuration files are reparsed" do
|
1410
1588
|
@settings.handlearg("--one", "clival")
|
1411
1589
|
|
1412
|
-
|
1413
|
-
|
1414
|
-
@settings.send(:parse_config_files)
|
1590
|
+
File.write(@file, "[main]\none = on-disk\n")
|
1591
|
+
@settings.initialize_global_settings
|
1415
1592
|
|
1416
1593
|
expect(@settings[:one]).to eq("clival")
|
1417
1594
|
end
|
1418
1595
|
|
1419
1596
|
it "should remove in-memory values that are no longer set in the file" do
|
1420
1597
|
# Init the value
|
1421
|
-
|
1422
|
-
expect(@settings).to receive(:read_file).and_return(text)
|
1598
|
+
File.write(@file, "[main]\none = disk-init\n")
|
1423
1599
|
@settings.send(:parse_config_files)
|
1424
1600
|
expect(@settings[:one]).to eq("disk-init")
|
1425
1601
|
|
1426
1602
|
# Now replace the value
|
1427
|
-
|
1428
|
-
expect(@settings).to receive(:read_file).and_return(text)
|
1603
|
+
File.write(@file, "[main]\ntwo = disk-replace\n")
|
1429
1604
|
@settings.send(:parse_config_files)
|
1430
1605
|
|
1431
1606
|
# The originally-overridden value should be replaced with the default
|
@@ -1437,14 +1612,12 @@ describe Puppet::Settings do
|
|
1437
1612
|
|
1438
1613
|
it "should retain in-memory values if the file has a syntax error" do
|
1439
1614
|
# Init the value
|
1440
|
-
|
1441
|
-
|
1442
|
-
@settings.send(:parse_config_files)
|
1615
|
+
File.write(@file, "[main]\none = initial-value\n")
|
1616
|
+
@settings.initialize_global_settings
|
1443
1617
|
expect(@settings[:one]).to eq("initial-value")
|
1444
1618
|
|
1445
1619
|
# Now replace the value with something bogus
|
1446
|
-
|
1447
|
-
expect(@settings).to receive(:read_file).with(@file).and_return(text)
|
1620
|
+
File.write(@file, "[main]\nkenny = killed-by-what-follows\n1 is 2, blah blah florp\n")
|
1448
1621
|
@settings.send(:parse_config_files)
|
1449
1622
|
|
1450
1623
|
# The originally-overridden value should not be replaced with the default
|
@@ -1456,46 +1629,49 @@ describe Puppet::Settings do
|
|
1456
1629
|
end
|
1457
1630
|
|
1458
1631
|
it "should provide a method for creating a catalog of resources from its configuration" do
|
1459
|
-
expect(Puppet::Settings.new).to
|
1632
|
+
expect(Puppet::Settings.new.to_catalog).to be_an_instance_of(Puppet::Resource::Catalog)
|
1460
1633
|
end
|
1461
1634
|
|
1462
1635
|
describe "when creating a catalog" do
|
1636
|
+
let(:maindir) { make_absolute('/maindir') }
|
1637
|
+
let(:seconddir) { make_absolute('/seconddir') }
|
1638
|
+
let(:otherdir) { make_absolute('/otherdir') }
|
1639
|
+
|
1463
1640
|
before do
|
1464
1641
|
@settings = Puppet::Settings.new
|
1465
1642
|
allow(@settings).to receive(:service_user_available?).and_return(true)
|
1466
|
-
@prefix = Puppet.features.posix? ? "" : "C:"
|
1467
1643
|
end
|
1468
1644
|
|
1469
1645
|
it "should add all file resources to the catalog if no sections have been specified" do
|
1470
1646
|
@settings.define_settings :main,
|
1471
|
-
:maindir => { :type => :directory, :default =>
|
1472
|
-
:seconddir => { :type => :directory, :default =>
|
1647
|
+
:maindir => { :type => :directory, :default => maindir, :desc => "a"},
|
1648
|
+
:seconddir => { :type => :directory, :default => seconddir, :desc => "a"}
|
1473
1649
|
@settings.define_settings :other,
|
1474
|
-
:otherdir => { :type => :directory, :default =>
|
1650
|
+
:otherdir => { :type => :directory, :default => otherdir, :desc => "a" }
|
1475
1651
|
|
1476
1652
|
catalog = @settings.to_catalog
|
1477
1653
|
|
1478
|
-
[
|
1654
|
+
[maindir, seconddir, otherdir].each do |path|
|
1479
1655
|
expect(catalog.resource(:file, path)).to be_instance_of(Puppet::Resource)
|
1480
1656
|
end
|
1481
1657
|
end
|
1482
1658
|
|
1483
1659
|
it "should add only files in the specified sections if section names are provided" do
|
1484
|
-
@settings.define_settings :main, :maindir => { :type => :directory, :default =>
|
1485
|
-
@settings.define_settings :other, :otherdir => { :type => :directory, :default =>
|
1660
|
+
@settings.define_settings :main, :maindir => { :type => :directory, :default => maindir, :desc => "a" }
|
1661
|
+
@settings.define_settings :other, :otherdir => { :type => :directory, :default => otherdir, :desc => "a" }
|
1486
1662
|
catalog = @settings.to_catalog(:main)
|
1487
|
-
expect(catalog.resource(:file,
|
1488
|
-
expect(catalog.resource(:file,
|
1663
|
+
expect(catalog.resource(:file, otherdir)).to be_nil
|
1664
|
+
expect(catalog.resource(:file, maindir)).to be_instance_of(Puppet::Resource)
|
1489
1665
|
end
|
1490
1666
|
|
1491
1667
|
it "should not try to add the same file twice" do
|
1492
|
-
@settings.define_settings :main, :maindir => { :type => :directory, :default =>
|
1493
|
-
@settings.define_settings :other, :otherdir => { :type => :directory, :default =>
|
1668
|
+
@settings.define_settings :main, :maindir => { :type => :directory, :default => maindir, :desc => "a" }
|
1669
|
+
@settings.define_settings :other, :otherdir => { :type => :directory, :default => maindir, :desc => "a" }
|
1494
1670
|
expect { @settings.to_catalog }.not_to raise_error
|
1495
1671
|
end
|
1496
1672
|
|
1497
1673
|
it "should ignore files whose :to_resource method returns nil" do
|
1498
|
-
@settings.define_settings :main, :maindir => { :type => :directory, :default =>
|
1674
|
+
@settings.define_settings :main, :maindir => { :type => :directory, :default => maindir, :desc => "a" }
|
1499
1675
|
expect(@settings.setting(:maindir)).to receive(:to_resource).and_return(nil)
|
1500
1676
|
|
1501
1677
|
expect_any_instance_of(Puppet::Resource::Catalog).not_to receive(:add_resource)
|
@@ -1525,6 +1701,7 @@ describe Puppet::Settings do
|
|
1525
1701
|
describe "adding default directory environment to the catalog" do
|
1526
1702
|
let(:tmpenv) { tmpdir("envs") }
|
1527
1703
|
let(:default_path) { "#{tmpenv}/environments" }
|
1704
|
+
|
1528
1705
|
before(:each) do
|
1529
1706
|
@settings.define_settings :main,
|
1530
1707
|
:environment => { :default => "production", :desc => "env"},
|