puppet 7.4.1 → 7.5.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/Gemfile.lock +19 -13
- data/lib/puppet/application/ssl.rb +11 -0
- data/lib/puppet/defaults.rb +8 -0
- data/lib/puppet/environments.rb +16 -1
- data/lib/puppet/ffi/windows/api_types.rb +1 -1
- data/lib/puppet/file_system/memory_file.rb +8 -1
- data/lib/puppet/file_system/windows.rb +2 -0
- data/lib/puppet/http/factory.rb +4 -0
- data/lib/puppet/network/http.rb +5 -2
- data/lib/puppet/network/http/api.rb +10 -6
- data/lib/puppet/network/http/api/master.rb +3 -2
- data/lib/puppet/network/http/api/master/v3.rb +2 -25
- data/lib/puppet/network/http/api/master/v3/environments.rb +2 -33
- data/lib/puppet/network/http/api/server.rb +10 -0
- data/lib/puppet/network/http/api/server/v3.rb +39 -0
- data/lib/puppet/network/http/api/server/v3/environments.rb +48 -0
- data/lib/puppet/pops/parser/lexer2.rb +0 -4
- data/lib/puppet/pops/validation/checker4_0.rb +0 -1
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/util/monkey_patches.rb +7 -0
- data/lib/puppet/util/windows/adsi.rb +46 -0
- data/lib/puppet/util/windows/principal.rb +9 -2
- data/lib/puppet/util/windows/sid.rb +4 -2
- data/lib/puppet/version.rb +1 -1
- data/man/man5/puppet.conf.5 +10 -2
- 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-lookup.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 +5 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/integration/application/plugin_spec.rb +1 -1
- data/spec/integration/http/client_spec.rb +12 -0
- data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
- data/spec/integration/parser/collection_spec.rb +10 -0
- data/spec/integration/util/windows/adsi_spec.rb +18 -0
- data/spec/integration/util/windows/principal_spec.rb +21 -0
- data/spec/integration/util/windows/registry_spec.rb +6 -0
- data/spec/unit/application/facts_spec.rb +5 -5
- data/spec/unit/application/ssl_spec.rb +23 -0
- data/spec/unit/environments_spec.rb +164 -88
- data/spec/unit/file_system_spec.rb +9 -0
- data/spec/unit/http/factory_spec.rb +19 -0
- data/spec/unit/network/http/api/master_spec.rb +38 -0
- data/spec/unit/network/http/api/{master → server}/v3/environments_spec.rb +2 -2
- data/spec/unit/network/http/api/{master → server}/v3_spec.rb +19 -19
- data/spec/unit/network/http/api_spec.rb +11 -11
- data/spec/unit/pops/parser/lexer2_spec.rb +0 -4
- data/spec/unit/pops/validator/validator_spec.rb +20 -43
- data/spec/unit/util/windows/sid_spec.rb +6 -0
- metadata +11 -16
- data/spec/lib/matchers/include.rb +0 -27
- data/spec/lib/matchers/include_spec.rb +0 -32
- data/spec/unit/pops/parser/parse_application_spec.rb +0 -13
- data/spec/unit/pops/parser/parse_capabilities_spec.rb +0 -23
- data/spec/unit/pops/parser/parse_site_spec.rb +0 -43
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'matchers/include'
|
3
2
|
|
4
3
|
require 'puppet/indirector/file_content/file'
|
5
4
|
require 'puppet/indirector/file_metadata/file'
|
@@ -30,7 +29,6 @@ end
|
|
30
29
|
|
31
30
|
describe Puppet::Indirector::DirectFileServer, " when interacting with FileServing::Fileset and the model" do
|
32
31
|
include PuppetSpec::Files
|
33
|
-
include Matchers::Include
|
34
32
|
|
35
33
|
matcher :file_with_content do |name, content|
|
36
34
|
match do |actual|
|
@@ -52,7 +50,7 @@ describe Puppet::Indirector::DirectFileServer, " when interacting with FileServi
|
|
52
50
|
terminus = Puppet::Indirector::FileContent::File.new
|
53
51
|
request = terminus.indirection.request(:search, Puppet::Util.path_to_uri(path).to_s, nil, :recurse => true)
|
54
52
|
|
55
|
-
expect(terminus.search(request)).to
|
53
|
+
expect(terminus.search(request)).to contain_exactly(
|
56
54
|
file_with_content(File.join(path, "one"), "one content"),
|
57
55
|
file_with_content(File.join(path, "two"), "two content"),
|
58
56
|
directory_named(path))
|
@@ -235,6 +235,16 @@ describe 'collectors' do
|
|
235
235
|
MANIFEST
|
236
236
|
end
|
237
237
|
|
238
|
+
it "splats attributes from a hash" do
|
239
|
+
expect_the_message_to_be(["overridden message"], <<-MANIFEST)
|
240
|
+
@notify { "testing": message => "original message" }
|
241
|
+
|
242
|
+
Notify <| |> {
|
243
|
+
* => { message => "overridden message" }
|
244
|
+
}
|
245
|
+
MANIFEST
|
246
|
+
end
|
247
|
+
|
238
248
|
it "collects with override when inside a class (#10963)" do
|
239
249
|
expect_the_message_to_be(["overridden message"], <<-MANIFEST)
|
240
250
|
@notify { "testing": message => "original message" }
|
@@ -55,6 +55,24 @@ describe Puppet::Util::Windows::ADSI::User,
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
58
|
+
|
59
|
+
describe '.current_user_name_with_format' do
|
60
|
+
context 'when desired format is NameSamCompatible' do
|
61
|
+
it 'should get the same user name as the current_user_name method but fully qualified' do
|
62
|
+
user_name = Puppet::Util::Windows::ADSI::User.current_user_name
|
63
|
+
fully_qualified_user_name = Puppet::Util::Windows::ADSI::User.current_sam_compatible_user_name
|
64
|
+
|
65
|
+
expect(fully_qualified_user_name).to match(/^.+\\#{user_name}$/)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should have the same SID as with the current_user_name method' do
|
69
|
+
user_name = Puppet::Util::Windows::ADSI::User.current_user_name
|
70
|
+
fully_qualified_user_name = Puppet::Util::Windows::ADSI::User.current_sam_compatible_user_name
|
71
|
+
|
72
|
+
expect(Puppet::Util::Windows::SID.name_to_sid(user_name)).to eq(Puppet::Util::Windows::SID.name_to_sid(fully_qualified_user_name))
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
58
76
|
end
|
59
77
|
|
60
78
|
describe Puppet::Util::Windows::ADSI::Group,
|
@@ -7,6 +7,7 @@ describe Puppet::Util::Windows::SID::Principal, :if => Puppet::Util::Platform.wi
|
|
7
7
|
let (:system_bytes) { [1, 1, 0, 0, 0, 0, 0, 5, 18, 0, 0, 0] }
|
8
8
|
let (:null_sid_bytes) { [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }
|
9
9
|
let (:administrator_bytes) { [1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 32, 2, 0, 0] }
|
10
|
+
let (:all_application_packages_bytes) { [1, 2, 0, 0, 0, 0, 0, 15, 2, 0, 0, 0, 1, 0, 0, 0] }
|
10
11
|
let (:computer_sid) { Puppet::Util::Windows::SID.name_to_principal(Puppet::Util::Windows::ADSI.computer_name) }
|
11
12
|
# BUILTIN is localized on German Windows, but not French
|
12
13
|
# looking this up like this dilutes the values of the tests as we're comparing two mechanisms
|
@@ -121,6 +122,26 @@ describe Puppet::Util::Windows::SID::Principal, :if => Puppet::Util::Platform.wi
|
|
121
122
|
expect(principal.to_s).to eq(builtin_localized)
|
122
123
|
end
|
123
124
|
|
125
|
+
it "should always sanitize the account name first" do
|
126
|
+
expect(Puppet::Util::Windows::SID::Principal).to receive(:sanitize_account_name).with('NT AUTHORITY\\SYSTEM').and_call_original
|
127
|
+
Puppet::Util::Windows::SID::Principal.lookup_account_name('NT AUTHORITY\\SYSTEM')
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should be able to create an instance from an account name prefixed by APPLICATION PACKAGE AUTHORITY" do
|
131
|
+
principal = Puppet::Util::Windows::SID::Principal.lookup_account_name('APPLICATION PACKAGE AUTHORITY\\ALL APPLICATION PACKAGES')
|
132
|
+
expect(principal.account).to eq('ALL APPLICATION PACKAGES')
|
133
|
+
expect(principal.sid_bytes).to eq(all_application_packages_bytes)
|
134
|
+
expect(principal.sid).to eq('S-1-15-2-1')
|
135
|
+
expect(principal.domain).to eq('APPLICATION PACKAGE AUTHORITY')
|
136
|
+
expect(principal.domain_account).to eq('APPLICATION PACKAGE AUTHORITY\\ALL APPLICATION PACKAGES')
|
137
|
+
expect(principal.account_type).to eq(:SidTypeWellKnownGroup)
|
138
|
+
expect(principal.to_s).to eq('APPLICATION PACKAGE AUTHORITY\\ALL APPLICATION PACKAGES')
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should fail without proper account name sanitization when it is prefixed by APPLICATION PACKAGE AUTHORITY" do
|
142
|
+
given_account_name = 'APPLICATION PACKAGE AUTHORITY\\ALL APPLICATION PACKAGES'
|
143
|
+
expect { Puppet::Util::Windows::SID::Principal.lookup_account_name(nil, false, given_account_name) }.to raise_error(Puppet::Util::Windows::Error, /No mapping between account names and security IDs was done./)
|
144
|
+
end
|
124
145
|
end
|
125
146
|
|
126
147
|
describe ".lookup_account_sid" do
|
@@ -263,6 +263,12 @@ describe Puppet::Util::Windows::Registry do
|
|
263
263
|
type: Win32::Registry::REG_EXPAND_SZ,
|
264
264
|
value: "\0\0\0reg expand string",
|
265
265
|
expected_value: ""
|
266
|
+
},
|
267
|
+
{
|
268
|
+
name: 'REG_EXPAND_SZ_2',
|
269
|
+
type: Win32::Registry::REG_EXPAND_SZ,
|
270
|
+
value: "1\x002\x003\x004\x00\x00\x00\x90\xD8UoY".force_encoding("UTF-16LE"),
|
271
|
+
expected_value: "1234"
|
266
272
|
}
|
267
273
|
].each do |pair|
|
268
274
|
it 'reads up to the first wide null' do
|
@@ -3,7 +3,7 @@ require 'puppet/application/facts'
|
|
3
3
|
|
4
4
|
describe Puppet::Application::Facts do
|
5
5
|
let(:app) { Puppet::Application[:facts] }
|
6
|
-
let(:values) { {"filesystems" => "apfs,autofs,devfs", "macaddress" => "64:52:11:22:03:
|
6
|
+
let(:values) { {"filesystems" => "apfs,autofs,devfs", "macaddress" => "64:52:11:22:03:2e"} }
|
7
7
|
|
8
8
|
before :each do
|
9
9
|
Puppet::Node::Facts.indirection.terminus_class = :memory
|
@@ -21,7 +21,7 @@ describe Puppet::Application::Facts do
|
|
21
21
|
name: whatever
|
22
22
|
values:
|
23
23
|
filesystems: apfs,autofs,devfs
|
24
|
-
macaddress: "64:52:11:22:03:
|
24
|
+
macaddress: "64:52:11:22:03:2e"
|
25
25
|
END
|
26
26
|
|
27
27
|
expect {
|
@@ -42,7 +42,7 @@ describe Puppet::Application::Facts do
|
|
42
42
|
name: #{Puppet[:certname]}
|
43
43
|
values:
|
44
44
|
filesystems: apfs,autofs,devfs
|
45
|
-
macaddress: "64:52:11:22:03:
|
45
|
+
macaddress: "64:52:11:22:03:2e"
|
46
46
|
END
|
47
47
|
|
48
48
|
expect {
|
@@ -55,7 +55,7 @@ describe Puppet::Application::Facts do
|
|
55
55
|
let(:expected) { <<~END }
|
56
56
|
{
|
57
57
|
"filesystems": "apfs,autofs,devfs",
|
58
|
-
"macaddress": "64:52:11:22:03:
|
58
|
+
"macaddress": "64:52:11:22:03:2e"
|
59
59
|
}
|
60
60
|
END
|
61
61
|
|
@@ -119,7 +119,7 @@ describe Puppet::Application::Facts do
|
|
119
119
|
let(:expected) { <<~END }
|
120
120
|
---
|
121
121
|
filesystems: apfs,autofs,devfs
|
122
|
-
macaddress: 64:52:11:22:03:
|
122
|
+
macaddress: 64:52:11:22:03:2e
|
123
123
|
END
|
124
124
|
|
125
125
|
before :each do
|
@@ -432,4 +432,27 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
|
|
432
432
|
expects_command_to_pass
|
433
433
|
end
|
434
434
|
end
|
435
|
+
|
436
|
+
context 'when showing' do
|
437
|
+
before do
|
438
|
+
ssl.command_line.args << 'show'
|
439
|
+
File.write(Puppet[:hostcert], @host[:cert].to_pem)
|
440
|
+
end
|
441
|
+
|
442
|
+
it 'reports if the key is missing' do
|
443
|
+
File.delete(Puppet[:hostprivkey])
|
444
|
+
|
445
|
+
expects_command_to_fail(/The private key is missing from/)
|
446
|
+
end
|
447
|
+
|
448
|
+
it 'reports if the cert is missing' do
|
449
|
+
File.delete(Puppet[:hostcert])
|
450
|
+
|
451
|
+
expects_command_to_fail(/The client certificate is missing from/)
|
452
|
+
end
|
453
|
+
|
454
|
+
it 'prints certificate information' do
|
455
|
+
expects_command_to_pass(@host[:cert].to_text)
|
456
|
+
end
|
457
|
+
end
|
435
458
|
end
|
@@ -1,13 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'puppet/environments'
|
3
3
|
require 'puppet/file_system'
|
4
|
-
require 'matchers/include'
|
5
|
-
require 'matchers/include_in_order'
|
6
4
|
|
7
|
-
module PuppetEnvironments
|
8
5
|
describe Puppet::Environments do
|
9
|
-
include Matchers::Include
|
10
|
-
|
11
6
|
FS = Puppet::FileSystem
|
12
7
|
|
13
8
|
before(:each) do
|
@@ -49,7 +44,7 @@ describe Puppet::Environments do
|
|
49
44
|
loader_from(:filesystem => [directory_tree, global_path_1, global_path_2],
|
50
45
|
:directory => directory_tree.children.first,
|
51
46
|
:modulepath => [global_path_1_location, global_path_2_location]) do |loader|
|
52
|
-
expect(loader.list).to
|
47
|
+
expect(loader.list).to contain_exactly(
|
53
48
|
environment(:an_environment).
|
54
49
|
with_manifest("#{FS.path_string(directory_tree)}/envdir/an_environment/manifests").
|
55
50
|
with_modulepath(["#{FS.path_string(directory_tree)}/envdir/an_environment/modules",
|
@@ -87,7 +82,7 @@ describe Puppet::Environments do
|
|
87
82
|
|
88
83
|
loader_from(:filesystem => [envdir],
|
89
84
|
:directory => envdir) do |loader|
|
90
|
-
expect(loader.list).to
|
85
|
+
expect(loader.list).to contain_exactly(environment(:env1), environment(:env2))
|
91
86
|
end
|
92
87
|
end
|
93
88
|
|
@@ -406,33 +401,29 @@ config_version=$vardir/random/scripts
|
|
406
401
|
]),
|
407
402
|
])
|
408
403
|
|
409
|
-
|
410
|
-
|
411
|
-
loader = Puppet::Environments::Cached.new(dir_loader)
|
412
|
-
Puppet.override(:environments => loader) do
|
413
|
-
original_env = loader.get("env3") # force the environment.conf to be read
|
414
|
-
|
415
|
-
changed_envdir = FS::MemoryFile.a_directory(base_dir, [
|
416
|
-
FS::MemoryFile.a_directory("env3", [
|
417
|
-
FS::MemoryFile.a_regular_file_containing("environment.conf", <<-EOF)
|
418
|
-
manifest=/manifest_changed
|
419
|
-
modulepath=/modules_changed
|
420
|
-
environment_timeout=0
|
421
|
-
EOF
|
422
|
-
]),
|
423
|
-
])
|
404
|
+
cached_loader_from(:filesystem => [original_envdir], :directory => original_envdir) do |loader|
|
405
|
+
original_env = loader.get("env3") # force the environment.conf to be read
|
424
406
|
|
425
|
-
|
426
|
-
|
407
|
+
changed_envdir = FS::MemoryFile.a_directory(base_dir, [
|
408
|
+
FS::MemoryFile.a_directory("env3", [
|
409
|
+
FS::MemoryFile.a_regular_file_containing("environment.conf", <<-EOF)
|
410
|
+
manifest=/manifest_changed
|
411
|
+
modulepath=/modules_changed
|
412
|
+
environment_timeout=0
|
413
|
+
EOF
|
414
|
+
]),
|
415
|
+
])
|
427
416
|
|
428
|
-
|
429
|
-
|
430
|
-
with_full_modulepath([File.expand_path("/modules_orig")])
|
417
|
+
FS.overlay(changed_envdir) do
|
418
|
+
changed_env = loader.get("env3")
|
431
419
|
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
420
|
+
expect(original_env).to environment(:env3).
|
421
|
+
with_manifest(File.expand_path("/manifest_orig")).
|
422
|
+
with_full_modulepath([File.expand_path("/modules_orig")])
|
423
|
+
|
424
|
+
expect(changed_env).to environment(:env3).
|
425
|
+
with_manifest(File.expand_path("/manifest_changed")).
|
426
|
+
with_full_modulepath([File.expand_path("/modules_changed")])
|
436
427
|
end
|
437
428
|
end
|
438
429
|
end
|
@@ -558,24 +549,49 @@ config_version=$vardir/random/scripts
|
|
558
549
|
|
559
550
|
describe "cached loaders" do
|
560
551
|
it "lists environments" do
|
561
|
-
|
562
|
-
expect(
|
552
|
+
cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
|
553
|
+
expect(loader.list).to contain_exactly(
|
563
554
|
environment(:an_environment),
|
564
555
|
environment(:another_environment),
|
565
556
|
environment(:symlinked_environment))
|
566
557
|
end
|
567
558
|
end
|
568
559
|
|
560
|
+
it "returns the same cached environment object for list and get methods" do
|
561
|
+
cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
|
562
|
+
env = loader.list.find { |e| e.name == :an_environment }
|
563
|
+
|
564
|
+
expect(env).to equal(loader.get(:an_environment)) # same object
|
565
|
+
end
|
566
|
+
end
|
567
|
+
|
568
|
+
it "returns the same cached environment object for multiple list calls" do
|
569
|
+
cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
|
570
|
+
expect(loader.list.first).to equal(loader.list.first) # same object
|
571
|
+
end
|
572
|
+
end
|
573
|
+
|
574
|
+
it "expires environments and returns a new environment object with the same value" do
|
575
|
+
Puppet[:environment_timeout] = "0"
|
576
|
+
|
577
|
+
cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
|
578
|
+
a = loader.list.first
|
579
|
+
b = loader.list.first
|
580
|
+
expect(a).to eq(b) # same value
|
581
|
+
expect(a).to_not equal(b) # not same object
|
582
|
+
end
|
583
|
+
end
|
584
|
+
|
569
585
|
it "has search_paths" do
|
570
|
-
|
571
|
-
expect(
|
586
|
+
cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
|
587
|
+
expect(loader.search_paths).to eq(["file://#{directory_tree.children.first}"])
|
572
588
|
end
|
573
589
|
end
|
574
590
|
|
575
591
|
context "#get" do
|
576
592
|
it "gets an environment" do
|
577
|
-
|
578
|
-
expect(
|
593
|
+
cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
|
594
|
+
expect(loader.get(:an_environment)).to environment(:an_environment)
|
579
595
|
end
|
580
596
|
end
|
581
597
|
|
@@ -592,16 +608,16 @@ config_version=$vardir/random/scripts
|
|
592
608
|
end
|
593
609
|
|
594
610
|
it "returns nil if env not found" do
|
595
|
-
|
596
|
-
expect(
|
611
|
+
cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
|
612
|
+
expect(loader.get(:doesnotexist)).to be_nil
|
597
613
|
end
|
598
614
|
end
|
599
615
|
end
|
600
616
|
|
601
617
|
context "#get!" do
|
602
618
|
it "gets an environment" do
|
603
|
-
|
604
|
-
expect(
|
619
|
+
cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
|
620
|
+
expect(loader.get!(:an_environment)).to environment(:an_environment)
|
605
621
|
end
|
606
622
|
end
|
607
623
|
|
@@ -618,14 +634,41 @@ config_version=$vardir/random/scripts
|
|
618
634
|
end
|
619
635
|
|
620
636
|
it "raises error if environment is not found" do
|
621
|
-
|
637
|
+
cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
|
622
638
|
expect do
|
623
|
-
|
639
|
+
loader.get!(:doesnotexist)
|
624
640
|
end.to raise_error(Puppet::Environments::EnvironmentNotFound)
|
625
641
|
end
|
626
642
|
end
|
627
643
|
end
|
628
644
|
|
645
|
+
context "#get_conf" do
|
646
|
+
it "loads environment.conf" do
|
647
|
+
cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
|
648
|
+
expect(loader.get_conf(:an_environment)).to match_environment_conf(:an_environment).
|
649
|
+
with_env_path(directory_tree.children.first).
|
650
|
+
with_global_module_path([])
|
651
|
+
end
|
652
|
+
end
|
653
|
+
|
654
|
+
it "always reloads environment.conf" do
|
655
|
+
env = Puppet::Node::Environment.create(:cached, [])
|
656
|
+
mocked_loader = double('loader')
|
657
|
+
expect(mocked_loader).to receive(:get_conf).with(:cached).and_return(Puppet::Settings::EnvironmentConf.static_for(env, 20)).twice
|
658
|
+
|
659
|
+
cached = Puppet::Environments::Cached.new(mocked_loader)
|
660
|
+
|
661
|
+
cached.get_conf(:cached)
|
662
|
+
cached.get_conf(:cached)
|
663
|
+
end
|
664
|
+
|
665
|
+
it "returns nil if environment is not found" do
|
666
|
+
cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
|
667
|
+
expect(loader.get_conf(:doesnotexist)).to be_nil
|
668
|
+
end
|
669
|
+
end
|
670
|
+
end
|
671
|
+
|
629
672
|
context "expiration policies" do
|
630
673
|
let(:service) { ReplayExpirationService.new }
|
631
674
|
|
@@ -647,8 +690,6 @@ config_version=$vardir/random/scripts
|
|
647
690
|
end
|
648
691
|
|
649
692
|
it "evicts an expired environment" do
|
650
|
-
service = ReplayExpirationService.new
|
651
|
-
|
652
693
|
expect(service).to receive(:expired?).and_return(true)
|
653
694
|
|
654
695
|
with_environment_loaded(service) do |cached|
|
@@ -700,13 +741,15 @@ config_version=$vardir/random/scripts
|
|
700
741
|
expect(service.created_envs).to eq([:an_environment, :an_environment])
|
701
742
|
expect(service.evicted_envs).to eq([:an_environment])
|
702
743
|
end
|
703
|
-
end
|
704
744
|
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
745
|
+
it "evicts expired environments when listing" do
|
746
|
+
expect(service).to receive(:expired?).with(:an_environment).and_return(true)
|
747
|
+
|
748
|
+
with_environment_loaded(service) do |cached|
|
749
|
+
cached.list
|
750
|
+
end
|
751
|
+
|
752
|
+
expect(service.evicted_envs).to eq([:an_environment])
|
710
753
|
end
|
711
754
|
end
|
712
755
|
|
@@ -724,6 +767,30 @@ config_version=$vardir/random/scripts
|
|
724
767
|
|
725
768
|
context '#clear_all' do
|
726
769
|
let(:service) { ReplayExpirationService.new }
|
770
|
+
let(:envdir) { File.expand_path("envdir") }
|
771
|
+
let(:default_dir) { File.join(envdir, "cached_env", "modules") }
|
772
|
+
let(:expected_dir) { File.join(envdir, "cached_env", "site") }
|
773
|
+
|
774
|
+
let(:base_dir) do
|
775
|
+
FS::MemoryFile.a_directory(envdir, [
|
776
|
+
FS::MemoryFile.a_directory("cached_env", [
|
777
|
+
FS::MemoryFile.a_missing_file("environment.conf")
|
778
|
+
])
|
779
|
+
])
|
780
|
+
end
|
781
|
+
|
782
|
+
let(:updated_dir) do
|
783
|
+
FS::MemoryFile.a_directory(envdir, [
|
784
|
+
FS::MemoryFile.a_directory("cached_env", [
|
785
|
+
FS::MemoryFile.a_directory("site"),
|
786
|
+
FS::MemoryFile.a_missing_directory("modules"),
|
787
|
+
FS::MemoryFile.a_regular_file_containing("environment.conf", <<-EOF)
|
788
|
+
modulepath=site
|
789
|
+
environment_timeout=unlimited
|
790
|
+
EOF
|
791
|
+
])
|
792
|
+
])
|
793
|
+
end
|
727
794
|
|
728
795
|
it 'evicts all environments' do
|
729
796
|
with_environment_loaded(service) do |cached|
|
@@ -735,48 +802,44 @@ config_version=$vardir/random/scripts
|
|
735
802
|
end
|
736
803
|
end
|
737
804
|
|
738
|
-
it '
|
739
|
-
base_dir
|
740
|
-
|
741
|
-
FS::MemoryFile.a_directory("env3", [
|
742
|
-
FS::MemoryFile.a_regular_file_containing("environment.conf", <<-EOF)
|
743
|
-
manifest=/manifest_orig
|
744
|
-
modulepath=/modules_orig
|
745
|
-
environment_timeout=60
|
746
|
-
EOF
|
747
|
-
]),
|
748
|
-
])
|
805
|
+
it "recomputes modulepath if 'get' is called before 'clear_all'" do
|
806
|
+
cached_loader_from(:filesystem => [base_dir], :directory => base_dir) do |loader|
|
807
|
+
loader.get(:cached_env)
|
749
808
|
|
750
|
-
|
751
|
-
dir_loader = Puppet::Environments::Directories.new(original_envdir, [])
|
752
|
-
loader = Puppet::Environments::Cached.new(dir_loader)
|
753
|
-
Puppet.override(:environments => loader) do
|
754
|
-
original_env = loader.get("env3") # force the environment.conf to be read
|
755
|
-
|
756
|
-
changed_envdir = FS::MemoryFile.a_directory(base_dir, [
|
757
|
-
FS::MemoryFile.a_directory("env3", [
|
758
|
-
FS::MemoryFile.a_regular_file_containing("environment.conf", <<-EOF)
|
759
|
-
manifest=/manifest_changed
|
760
|
-
modulepath=/modules_changed
|
761
|
-
environment_timeout=60
|
762
|
-
EOF
|
763
|
-
]),
|
764
|
-
])
|
809
|
+
expect(Puppet.settings.value(:modulepath, :cached_env)).to eq(default_dir)
|
765
810
|
|
766
|
-
|
811
|
+
FS.overlay(updated_dir) do
|
767
812
|
loader.clear_all
|
768
813
|
|
769
|
-
|
770
|
-
|
814
|
+
expect(loader.get(:cached_env).modulepath).to contain_exactly(expected_dir)
|
815
|
+
end
|
816
|
+
end
|
817
|
+
end
|
818
|
+
|
819
|
+
it "recomputes modulepath if 'list' is called before 'clear_all'" do
|
820
|
+
cached_loader_from(:filesystem => [base_dir], :directory => base_dir) do |loader|
|
821
|
+
loader.list
|
771
822
|
|
772
|
-
|
773
|
-
with_manifest(File.expand_path("/manifest_orig")).
|
774
|
-
with_full_modulepath([File.expand_path("/modules_orig")])
|
823
|
+
expect(Puppet.settings.value(:modulepath, :cached_env)).to eq(default_dir)
|
775
824
|
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
825
|
+
FS.overlay(updated_dir) do
|
826
|
+
loader.clear_all
|
827
|
+
|
828
|
+
expect(loader.get(:cached_env).modulepath).to contain_exactly(expected_dir)
|
829
|
+
end
|
830
|
+
end
|
831
|
+
end
|
832
|
+
|
833
|
+
it "recomputes modulepath if 'get_conf' is called before 'clear_all'" do
|
834
|
+
cached_loader_from(:filesystem => [base_dir], :directory => base_dir) do |loader|
|
835
|
+
loader.get_conf(:cached_env)
|
836
|
+
|
837
|
+
expect(Puppet.settings.value(:modulepath, :cached_env)).to eq(default_dir)
|
838
|
+
|
839
|
+
FS.overlay(updated_dir) do
|
840
|
+
loader.clear_all
|
841
|
+
|
842
|
+
expect(loader.get(:cached_env).modulepath).to contain_exactly(expected_dir)
|
780
843
|
end
|
781
844
|
end
|
782
845
|
end
|
@@ -862,6 +925,20 @@ config_version=$vardir/random/scripts
|
|
862
925
|
end
|
863
926
|
end
|
864
927
|
|
928
|
+
def cached_loader_from(options, &block)
|
929
|
+
FS.overlay(*options[:filesystem]) do
|
930
|
+
environments = Puppet::Environments::Cached.new(
|
931
|
+
Puppet::Environments::Directories.new(
|
932
|
+
options[:directory],
|
933
|
+
options[:modulepath] || []
|
934
|
+
)
|
935
|
+
)
|
936
|
+
Puppet.override(:environments => environments) do
|
937
|
+
yield environments
|
938
|
+
end
|
939
|
+
end
|
940
|
+
end
|
941
|
+
|
865
942
|
def loader_from(options, &block)
|
866
943
|
FS.overlay(*options[:filesystem]) do
|
867
944
|
environments = Puppet::Environments::Directories.new(
|
@@ -914,4 +991,3 @@ config_version=$vardir/random/scripts
|
|
914
991
|
end
|
915
992
|
end
|
916
993
|
end
|
917
|
-
end
|