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.

Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +19 -13
  3. data/lib/puppet/application/ssl.rb +11 -0
  4. data/lib/puppet/defaults.rb +8 -0
  5. data/lib/puppet/environments.rb +16 -1
  6. data/lib/puppet/ffi/windows/api_types.rb +1 -1
  7. data/lib/puppet/file_system/memory_file.rb +8 -1
  8. data/lib/puppet/file_system/windows.rb +2 -0
  9. data/lib/puppet/http/factory.rb +4 -0
  10. data/lib/puppet/network/http.rb +5 -2
  11. data/lib/puppet/network/http/api.rb +10 -6
  12. data/lib/puppet/network/http/api/master.rb +3 -2
  13. data/lib/puppet/network/http/api/master/v3.rb +2 -25
  14. data/lib/puppet/network/http/api/master/v3/environments.rb +2 -33
  15. data/lib/puppet/network/http/api/server.rb +10 -0
  16. data/lib/puppet/network/http/api/server/v3.rb +39 -0
  17. data/lib/puppet/network/http/api/server/v3/environments.rb +48 -0
  18. data/lib/puppet/pops/parser/lexer2.rb +0 -4
  19. data/lib/puppet/pops/validation/checker4_0.rb +0 -1
  20. data/lib/puppet/settings/environment_conf.rb +1 -0
  21. data/lib/puppet/util/monkey_patches.rb +7 -0
  22. data/lib/puppet/util/windows/adsi.rb +46 -0
  23. data/lib/puppet/util/windows/principal.rb +9 -2
  24. data/lib/puppet/util/windows/sid.rb +4 -2
  25. data/lib/puppet/version.rb +1 -1
  26. data/man/man5/puppet.conf.5 +10 -2
  27. data/man/man8/puppet-agent.8 +1 -1
  28. data/man/man8/puppet-apply.8 +1 -1
  29. data/man/man8/puppet-catalog.8 +1 -1
  30. data/man/man8/puppet-config.8 +1 -1
  31. data/man/man8/puppet-describe.8 +1 -1
  32. data/man/man8/puppet-device.8 +1 -1
  33. data/man/man8/puppet-doc.8 +1 -1
  34. data/man/man8/puppet-epp.8 +1 -1
  35. data/man/man8/puppet-facts.8 +1 -1
  36. data/man/man8/puppet-filebucket.8 +1 -1
  37. data/man/man8/puppet-generate.8 +1 -1
  38. data/man/man8/puppet-help.8 +1 -1
  39. data/man/man8/puppet-lookup.8 +1 -1
  40. data/man/man8/puppet-module.8 +1 -1
  41. data/man/man8/puppet-node.8 +1 -1
  42. data/man/man8/puppet-parser.8 +1 -1
  43. data/man/man8/puppet-plugin.8 +1 -1
  44. data/man/man8/puppet-report.8 +1 -1
  45. data/man/man8/puppet-resource.8 +1 -1
  46. data/man/man8/puppet-script.8 +1 -1
  47. data/man/man8/puppet-ssl.8 +5 -1
  48. data/man/man8/puppet.8 +2 -2
  49. data/spec/integration/application/plugin_spec.rb +1 -1
  50. data/spec/integration/http/client_spec.rb +12 -0
  51. data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
  52. data/spec/integration/parser/collection_spec.rb +10 -0
  53. data/spec/integration/util/windows/adsi_spec.rb +18 -0
  54. data/spec/integration/util/windows/principal_spec.rb +21 -0
  55. data/spec/integration/util/windows/registry_spec.rb +6 -0
  56. data/spec/unit/application/facts_spec.rb +5 -5
  57. data/spec/unit/application/ssl_spec.rb +23 -0
  58. data/spec/unit/environments_spec.rb +164 -88
  59. data/spec/unit/file_system_spec.rb +9 -0
  60. data/spec/unit/http/factory_spec.rb +19 -0
  61. data/spec/unit/network/http/api/master_spec.rb +38 -0
  62. data/spec/unit/network/http/api/{master → server}/v3/environments_spec.rb +2 -2
  63. data/spec/unit/network/http/api/{master → server}/v3_spec.rb +19 -19
  64. data/spec/unit/network/http/api_spec.rb +11 -11
  65. data/spec/unit/pops/parser/lexer2_spec.rb +0 -4
  66. data/spec/unit/pops/validator/validator_spec.rb +20 -43
  67. data/spec/unit/util/windows/sid_spec.rb +6 -0
  68. metadata +11 -16
  69. data/spec/lib/matchers/include.rb +0 -27
  70. data/spec/lib/matchers/include_spec.rb +0 -32
  71. data/spec/unit/pops/parser/parse_application_spec.rb +0 -13
  72. data/spec/unit/pops/parser/parse_capabilities_spec.rb +0 -23
  73. 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 include_in_any_order(
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:25"} }
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:25"
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:25"
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:25"
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:25
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 include_in_any_order(
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 include_in_any_order(environment(:env1), environment(:env2))
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
- FS.overlay(original_envdir) do
410
- dir_loader = Puppet::Environments::Directories.new(original_envdir, [])
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
- FS.overlay(changed_envdir) do
426
- changed_env = loader.get("env3")
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
- expect(original_env).to environment(:env3).
429
- with_manifest(File.expand_path("/manifest_orig")).
430
- with_full_modulepath([File.expand_path("/modules_orig")])
417
+ FS.overlay(changed_envdir) do
418
+ changed_env = loader.get("env3")
431
419
 
432
- expect(changed_env).to environment(:env3).
433
- with_manifest(File.expand_path("/manifest_changed")).
434
- with_full_modulepath([File.expand_path("/modules_changed")])
435
- end
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
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
562
- expect(Puppet::Environments::Cached.new(loader).list).to include_in_any_order(
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
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
571
- expect(Puppet::Environments::Cached.new(loader).search_paths).to eq(["file://#{directory_tree.children.first}"])
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
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
578
- expect(Puppet::Environments::Cached.new(loader).get(:an_environment)).to environment(:an_environment)
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
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
596
- expect(Puppet::Environments::Cached.new(loader).get(:doesnotexist)).to be_nil
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
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
604
- expect(Puppet::Environments::Cached.new(loader).get!(:an_environment)).to environment(:an_environment)
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
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
637
+ cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
622
638
  expect do
623
- Puppet::Environments::Cached.new(loader).get!(:doesnotexist)
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
- it "gets an environment.conf" do
706
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
707
- expect(Puppet::Environments::Cached.new(loader).get_conf(:an_environment)).to match_environment_conf(:an_environment).
708
- with_env_path(directory_tree.children.first).
709
- with_global_module_path([])
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 'clears cached environment settings' do
739
- base_dir = File.expand_path("envdir")
740
- original_envdir = FS::MemoryFile.a_directory(base_dir, [
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
- FS.overlay(original_envdir) do
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
- #Clear all cached environments
811
+ FS.overlay(updated_dir) do
767
812
  loader.clear_all
768
813
 
769
- FS.overlay(changed_envdir) do
770
- changed_env = loader.get("env3")
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
- expect(original_env).to environment(:env3).
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
- expect(changed_env).to environment(:env3).
777
- with_manifest(File.expand_path("/manifest_changed")).
778
- with_full_modulepath([File.expand_path("/modules_changed")])
779
- end
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