puppet 7.9.0 → 7.10.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 (182) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +6 -6
  3. data/{ext → examples/enc}/regexp_nodes/classes/databases +0 -0
  4. data/{ext → examples/enc}/regexp_nodes/classes/webservers +0 -0
  5. data/{ext → examples/enc}/regexp_nodes/environment/development +0 -0
  6. data/{ext → examples/enc}/regexp_nodes/parameters/service/prod +0 -0
  7. data/{ext → examples/enc}/regexp_nodes/parameters/service/qa +0 -0
  8. data/{ext → examples/enc}/regexp_nodes/parameters/service/sandbox +0 -0
  9. data/{ext → examples/enc}/regexp_nodes/regexp_nodes.rb +0 -0
  10. data/{ext → examples}/nagios/check_puppet.rb +2 -2
  11. data/ext/README.md +13 -0
  12. data/lib/puppet/configurer.rb +155 -46
  13. data/lib/puppet/defaults.rb +51 -26
  14. data/lib/puppet/environments.rb +66 -26
  15. data/lib/puppet/file_serving/configuration.rb +2 -0
  16. data/lib/puppet/file_serving/configuration/parser.rb +2 -0
  17. data/lib/puppet/file_serving/mount/scripts.rb +24 -0
  18. data/lib/puppet/functions/find_template.rb +2 -2
  19. data/lib/puppet/http/service/compiler.rb +6 -1
  20. data/lib/puppet/indirector/catalog/compiler.rb +21 -3
  21. data/lib/puppet/indirector/catalog/rest.rb +1 -0
  22. data/lib/puppet/indirector/terminus.rb +4 -0
  23. data/lib/puppet/module/plan.rb +0 -1
  24. data/lib/puppet/module/task.rb +1 -1
  25. data/lib/puppet/module_tool/applications/installer.rb +8 -4
  26. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  27. data/lib/puppet/node/environment.rb +10 -11
  28. data/lib/puppet/pops/serialization/to_data_converter.rb +18 -6
  29. data/lib/puppet/provider/package/pkg.rb +8 -1
  30. data/lib/puppet/provider/service/launchd.rb +1 -1
  31. data/lib/puppet/provider/service/systemd.rb +1 -1
  32. data/lib/puppet/provider/user/useradd.rb +42 -9
  33. data/lib/puppet/transaction/persistence.rb +11 -1
  34. data/lib/puppet/transaction/report.rb +15 -1
  35. data/lib/puppet/type.rb +1 -1
  36. data/lib/puppet/type/exec.rb +10 -1
  37. data/lib/puppet/type/file.rb +6 -6
  38. data/lib/puppet/type/filebucket.rb +2 -2
  39. data/lib/puppet/version.rb +1 -1
  40. data/locales/puppet.pot +134 -94
  41. data/man/man5/puppet.conf.5 +65 -25
  42. data/man/man8/puppet-agent.8 +1 -1
  43. data/man/man8/puppet-apply.8 +1 -1
  44. data/man/man8/puppet-catalog.8 +1 -1
  45. data/man/man8/puppet-config.8 +1 -1
  46. data/man/man8/puppet-describe.8 +1 -1
  47. data/man/man8/puppet-device.8 +1 -1
  48. data/man/man8/puppet-doc.8 +1 -1
  49. data/man/man8/puppet-epp.8 +1 -1
  50. data/man/man8/puppet-facts.8 +1 -1
  51. data/man/man8/puppet-filebucket.8 +1 -1
  52. data/man/man8/puppet-generate.8 +1 -1
  53. data/man/man8/puppet-help.8 +1 -1
  54. data/man/man8/puppet-lookup.8 +1 -1
  55. data/man/man8/puppet-module.8 +3 -3
  56. data/man/man8/puppet-node.8 +1 -1
  57. data/man/man8/puppet-parser.8 +1 -1
  58. data/man/man8/puppet-plugin.8 +1 -1
  59. data/man/man8/puppet-report.8 +1 -1
  60. data/man/man8/puppet-resource.8 +1 -1
  61. data/man/man8/puppet-script.8 +1 -1
  62. data/man/man8/puppet-ssl.8 +1 -1
  63. data/man/man8/puppet.8 +2 -2
  64. data/spec/fixtures/integration/application/agent/lib/facter/agent_spec_role.rb +3 -0
  65. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Gemfile +4 -0
  66. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Rakefile +3 -0
  67. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/lib/puppet/functions/l10n.rb +8 -0
  68. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/config.yaml +25 -0
  69. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/ja/puppet-l10n.po +19 -0
  70. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/puppet-l10n.pot +20 -0
  71. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/metadata.json +8 -0
  72. data/spec/integration/application/agent_spec.rb +102 -52
  73. data/spec/integration/application/filebucket_spec.rb +5 -0
  74. data/spec/integration/configurer_spec.rb +17 -1
  75. data/spec/integration/l10n/compiler_spec.rb +37 -0
  76. data/spec/lib/puppet_spec/modules.rb +13 -2
  77. data/spec/lib/puppet_spec/puppetserver.rb +15 -0
  78. data/spec/shared_behaviours/documentation_on_faces.rb +0 -2
  79. data/spec/shared_contexts/l10n.rb +27 -0
  80. data/spec/spec_helper.rb +1 -10
  81. data/spec/unit/configurer_spec.rb +265 -54
  82. data/spec/unit/environments_spec.rb +150 -1
  83. data/spec/unit/file_serving/configuration/parser_spec.rb +23 -0
  84. data/spec/unit/file_serving/configuration_spec.rb +12 -4
  85. data/spec/unit/file_serving/mount/scripts_spec.rb +69 -0
  86. data/spec/unit/functions/logging_spec.rb +1 -0
  87. data/spec/unit/http/service/compiler_spec.rb +8 -0
  88. data/spec/unit/indirector/catalog/compiler_spec.rb +87 -0
  89. data/spec/unit/indirector/catalog/rest_spec.rb +8 -0
  90. data/spec/unit/interface/action_spec.rb +0 -9
  91. data/spec/unit/module_spec.rb +14 -0
  92. data/spec/unit/module_tool/applications/installer_spec.rb +39 -12
  93. data/spec/unit/pops/parser/parse_containers_spec.rb +0 -11
  94. data/spec/unit/pops/serialization/to_from_hr_spec.rb +58 -0
  95. data/spec/unit/provider/package/pkg_spec.rb +19 -5
  96. data/spec/unit/provider/service/launchd_spec.rb +11 -0
  97. data/spec/unit/provider/service/systemd_spec.rb +1 -1
  98. data/spec/unit/provider/user/useradd_spec.rb +3 -2
  99. metadata +34 -94
  100. data/ext/README.environment +0 -8
  101. data/ext/dbfix.sql +0 -132
  102. data/ext/debian/README.Debian +0 -8
  103. data/ext/debian/README.source +0 -2
  104. data/ext/debian/TODO.Debian +0 -1
  105. data/ext/debian/changelog.erb +0 -1122
  106. data/ext/debian/compat +0 -1
  107. data/ext/debian/control +0 -144
  108. data/ext/debian/copyright +0 -339
  109. data/ext/debian/docs +0 -1
  110. data/ext/debian/fileserver.conf +0 -41
  111. data/ext/debian/puppet-common.dirs +0 -13
  112. data/ext/debian/puppet-common.install +0 -3
  113. data/ext/debian/puppet-common.lintian-overrides +0 -5
  114. data/ext/debian/puppet-common.manpages +0 -28
  115. data/ext/debian/puppet-common.postinst +0 -35
  116. data/ext/debian/puppet-common.postrm +0 -33
  117. data/ext/debian/puppet-el.dirs +0 -1
  118. data/ext/debian/puppet-el.emacsen-install +0 -25
  119. data/ext/debian/puppet-el.emacsen-remove +0 -11
  120. data/ext/debian/puppet-el.emacsen-startup +0 -9
  121. data/ext/debian/puppet-el.install +0 -1
  122. data/ext/debian/puppet-testsuite.install +0 -2
  123. data/ext/debian/puppet-testsuite.lintian-overrides +0 -4
  124. data/ext/debian/puppet.lintian-overrides +0 -3
  125. data/ext/debian/puppet.logrotate +0 -20
  126. data/ext/debian/puppet.postinst +0 -20
  127. data/ext/debian/puppet.postrm +0 -20
  128. data/ext/debian/puppet.preinst +0 -20
  129. data/ext/debian/puppetmaster-common.install +0 -2
  130. data/ext/debian/puppetmaster-common.manpages +0 -2
  131. data/ext/debian/puppetmaster-common.postinst +0 -6
  132. data/ext/debian/puppetmaster-passenger.dirs +0 -4
  133. data/ext/debian/puppetmaster-passenger.postinst +0 -162
  134. data/ext/debian/puppetmaster-passenger.postrm +0 -61
  135. data/ext/debian/puppetmaster.README.debian +0 -17
  136. data/ext/debian/puppetmaster.default +0 -14
  137. data/ext/debian/puppetmaster.init +0 -137
  138. data/ext/debian/puppetmaster.lintian-overrides +0 -3
  139. data/ext/debian/puppetmaster.postinst +0 -20
  140. data/ext/debian/puppetmaster.postrm +0 -5
  141. data/ext/debian/puppetmaster.preinst +0 -22
  142. data/ext/debian/rules +0 -132
  143. data/ext/debian/source/format +0 -1
  144. data/ext/debian/source/options +0 -1
  145. data/ext/debian/vim-puppet.README.Debian +0 -13
  146. data/ext/debian/vim-puppet.dirs +0 -5
  147. data/ext/debian/vim-puppet.yaml +0 -7
  148. data/ext/debian/watch +0 -2
  149. data/ext/freebsd/puppetd +0 -26
  150. data/ext/freebsd/puppetmasterd +0 -26
  151. data/ext/gentoo/conf.d/puppet +0 -5
  152. data/ext/gentoo/conf.d/puppetmaster +0 -12
  153. data/ext/gentoo/init.d/puppet +0 -38
  154. data/ext/gentoo/init.d/puppetmaster +0 -51
  155. data/ext/gentoo/puppet/fileserver.conf +0 -41
  156. data/ext/ips/puppet-agent +0 -44
  157. data/ext/ips/puppet-master +0 -44
  158. data/ext/ips/puppet.p5m.erb +0 -12
  159. data/ext/ips/puppetagent.xml +0 -42
  160. data/ext/ips/puppetmaster.xml +0 -42
  161. data/ext/ips/rules +0 -19
  162. data/ext/ips/transforms +0 -34
  163. data/ext/ldap/puppet.schema +0 -24
  164. data/ext/logcheck/puppet +0 -23
  165. data/ext/osx/file_mapping.yaml +0 -28
  166. data/ext/osx/postflight.erb +0 -109
  167. data/ext/osx/preflight.erb +0 -52
  168. data/ext/osx/prototype.plist.erb +0 -38
  169. data/ext/redhat/fileserver.conf +0 -41
  170. data/ext/redhat/logrotate +0 -21
  171. data/ext/redhat/puppet.spec.erb +0 -841
  172. data/ext/redhat/server.init +0 -128
  173. data/ext/redhat/server.sysconfig +0 -13
  174. data/ext/solaris/pkginfo +0 -6
  175. data/ext/solaris/smf/puppetd.xml +0 -77
  176. data/ext/solaris/smf/puppetmasterd.xml +0 -77
  177. data/ext/solaris/smf/svc-puppetd +0 -71
  178. data/ext/solaris/smf/svc-puppetmasterd +0 -67
  179. data/ext/suse/puppet.spec +0 -310
  180. data/ext/suse/server.init +0 -173
  181. data/ext/yaml_nodes.rb +0 -105
  182. data/spec/unit/indirector/store_configs_spec.rb +0 -7
@@ -139,6 +139,14 @@ describe Puppet::Environments do
139
139
  end
140
140
  end
141
141
 
142
+ it "implements guard and unguard" do
143
+ loader_from(:filesystem => [directory_tree],
144
+ :directory => directory_tree.children.first) do |loader|
145
+ expect(loader.guard('env1')).to be_nil
146
+ expect(loader.unguard('env1')).to be_nil
147
+ end
148
+ end
149
+
142
150
  context "with an environment.conf" do
143
151
  let(:envdir) do
144
152
  FS::MemoryFile.a_directory(File.expand_path("envdir"), [
@@ -631,7 +639,7 @@ config_version=$vardir/random/scripts
631
639
  ])
632
640
 
633
641
  loader_from(:filesystem => [envdir], :directory => envdir) do |loader|
634
- cached = Puppet::Environments::Cached.new(loader)
642
+ cached = Puppet::Environments::Cached.new(loader)
635
643
  cached.get(:env1)
636
644
  cached.get(:env2)
637
645
  cached.get(:env3)
@@ -642,6 +650,51 @@ config_version=$vardir/random/scripts
642
650
  end
643
651
  end
644
652
 
653
+ it "normalizes environment name to symbol" do
654
+ env = Puppet::Node::Environment.create(:cached, [])
655
+ mocked_loader = double('loader')
656
+
657
+ expect(mocked_loader).not_to receive(:get).with('cached')
658
+ expect(mocked_loader).to receive(:get).with(:cached).and_return(env).once
659
+ expect(mocked_loader).to receive(:get_conf).with(:cached).and_return(Puppet::Settings::EnvironmentConf.static_for(env, 20)).once
660
+
661
+ cached = Puppet::Environments::Cached.new(mocked_loader)
662
+ cached.get('cached')
663
+ cached.get(:cached)
664
+ end
665
+
666
+ it "caches environment name as symbol and only once" do
667
+ mocked_loader = double('loader')
668
+
669
+ env = Puppet::Node::Environment.create(:cached, [])
670
+ allow(mocked_loader).to receive(:get).with(:cached).and_return(env)
671
+ allow(mocked_loader).to receive(:get_conf).with(:cached).and_return(Puppet::Settings::EnvironmentConf.static_for(env, 20))
672
+
673
+ cached = Puppet::Environments::Cached.new(mocked_loader)
674
+ cached.get(:cached)
675
+ cached.get('cached')
676
+
677
+ expect(cached.instance_variable_get(:@cache).keys).to eq([:cached])
678
+ end
679
+
680
+ it "is able to cache multiple environments" do
681
+ mocked_loader = double('loader')
682
+
683
+ env1 = Puppet::Node::Environment.create(:env1, [])
684
+ allow(mocked_loader).to receive(:get).with(:env1).and_return(env1)
685
+ allow(mocked_loader).to receive(:get_conf).with(:env1).and_return(Puppet::Settings::EnvironmentConf.static_for(env1, 20))
686
+
687
+ env2 = Puppet::Node::Environment.create(:env2, [])
688
+ allow(mocked_loader).to receive(:get).with(:env2).and_return(env2)
689
+ allow(mocked_loader).to receive(:get_conf).with(:env2).and_return(Puppet::Settings::EnvironmentConf.static_for(env2, 20))
690
+
691
+ cached = Puppet::Environments::Cached.new(mocked_loader)
692
+ cached.get('env1')
693
+ cached.get('env2')
694
+
695
+ expect(cached.instance_variable_get(:@cache).keys).to eq([:env1, :env2])
696
+ end
697
+
645
698
  it "returns nil if env not found" do
646
699
  cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
647
700
  expect(loader.get(:doesnotexist)).to be_nil
@@ -697,6 +750,17 @@ config_version=$vardir/random/scripts
697
750
  cached.get_conf(:cached)
698
751
  end
699
752
 
753
+ it "normalizes environment name to symbol" do
754
+ env = Puppet::Node::Environment.create(:cached, [])
755
+ mocked_loader = double('loader')
756
+ expect(mocked_loader).to receive(:get_conf).with(:cached).and_return(Puppet::Settings::EnvironmentConf.static_for(env, 20)).twice
757
+
758
+ cached = Puppet::Environments::Cached.new(mocked_loader)
759
+
760
+ cached.get_conf('cached')
761
+ cached.get_conf(:cached)
762
+ end
763
+
700
764
  it "returns nil if environment is not found" do
701
765
  cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
702
766
  expect(loader.get_conf(:doesnotexist)).to be_nil
@@ -786,6 +850,83 @@ config_version=$vardir/random/scripts
786
850
 
787
851
  expect(service.evicted_envs).to eq([:an_environment])
788
852
  end
853
+
854
+ context "when guarding an environment" do
855
+ before :each do
856
+ Puppet[:environment_timeout] = 0
857
+ end
858
+
859
+ let(:name) { :an_environment }
860
+
861
+ def with_guard(cached, name, &block)
862
+ cached.guard(name)
863
+ begin
864
+ yield
865
+ ensure
866
+ cached.unguard(name)
867
+ end
868
+ end
869
+
870
+ it "evicts an expired and unguarded environment" do
871
+ with_environment_loaded(service) do |cached|
872
+ cached.get!(name)
873
+ end
874
+
875
+ expect(service.created_envs).to eq([name, name])
876
+ expect(service.evicted_envs).to eq([name])
877
+ end
878
+
879
+ it "does not evict an expired, but guarded environment" do
880
+ with_environment_loaded(service) do |cached|
881
+ with_guard(cached, name) do
882
+ cached.get!(name) # these shouldn't reload
883
+ cached.get!(name)
884
+ end
885
+ end
886
+
887
+ expect(service.created_envs).to eq([name])
888
+ expect(service.evicted_envs).to eq([])
889
+ end
890
+
891
+ it "does not evict an environment marked for expiration, but is guarded" do
892
+ Puppet[:environment_timeout] = 'unlimited'
893
+
894
+ expect(service).to receive(:expired?).never
895
+
896
+ with_environment_loaded(service) do |cached|
897
+ with_guard(cached, name) do
898
+ cached.get!(name)
899
+ end
900
+ end
901
+
902
+ expect(service.created_envs).to eq([name])
903
+ expect(service.evicted_envs).to eq([])
904
+ end
905
+
906
+ it "evicts an environment that is no longer guarded" do
907
+ with_environment_loaded(service) do |cached|
908
+ with_guard(cached, name) {}
909
+
910
+ cached.get!(name) # this reloads
911
+ end
912
+
913
+ expect(service.created_envs).to eq([name, name])
914
+ expect(service.evicted_envs).to eq([name])
915
+ end
916
+
917
+ it "can nest guards" do
918
+ with_environment_loaded(service) do |cached|
919
+ with_guard(cached, name) do
920
+ with_guard(cached, name) do
921
+ cached.get!(name) # doesn't reload
922
+ end
923
+ end
924
+ end
925
+
926
+ expect(service.created_envs).to eq([name])
927
+ expect(service.evicted_envs).to eq([])
928
+ end
929
+ end
789
930
  end
790
931
 
791
932
  context '#clear' do
@@ -798,6 +939,14 @@ config_version=$vardir/random/scripts
798
939
 
799
940
  expect(service.evicted_envs).to eq([:an_environment])
800
941
  end
942
+
943
+ it "normalizes environment name to symbol" do
944
+ with_environment_loaded(service) do |cached|
945
+ cached.clear('an_environment')
946
+ end
947
+
948
+ expect(service.evicted_envs).to eq([:an_environment])
949
+ end
801
950
  end
802
951
 
803
952
  context '#clear_all' do
@@ -159,6 +159,29 @@ describe Puppet::FileServing::Configuration::Parser do
159
159
  end
160
160
  end
161
161
 
162
+ describe Puppet::FileServing::Configuration::Parser, " when parsing the scripts mount" do
163
+ include FSConfigurationParserTesting
164
+
165
+ before do
166
+ @mount = double('scriptsmount', :name => "scripts", :validate => true)
167
+ end
168
+
169
+ it "should create an instance of the Scripts Mount class" do
170
+ write_config_file "[scripts]\n"
171
+
172
+ expect(Puppet::FileServing::Mount::Scripts).to receive(:new).with("scripts").and_return(@mount)
173
+ @parser.parse
174
+ end
175
+
176
+ it "should warn if a path is set" do
177
+ write_config_file "[scripts]\npath /some/path\n"
178
+ expect(Puppet::FileServing::Mount::Scripts).to receive(:new).with("scripts").and_return(@mount)
179
+
180
+ expect(Puppet).to receive(:warning)
181
+ @parser.parse
182
+ end
183
+ end
184
+
162
185
  describe Puppet::FileServing::Configuration::Parser, " when parsing the plugins mount" do
163
186
  include FSConfigurationParserTesting
164
187
 
@@ -80,15 +80,16 @@ describe Puppet::FileServing::Configuration do
80
80
  expect(config.mounted?("one")).to be_truthy
81
81
  end
82
82
 
83
- it "should add modules, plugins, and tasks mounts even if the file does not exist" do
83
+ it "should add modules, plugins, scripts, and tasks mounts even if the file does not exist" do
84
84
  expect(Puppet::FileSystem).to receive(:exist?).and_return(false) # the file doesn't exist
85
85
  config = Puppet::FileServing::Configuration.configuration
86
86
  expect(config.mounted?("modules")).to be_truthy
87
87
  expect(config.mounted?("plugins")).to be_truthy
88
+ expect(config.mounted?("scripts")).to be_truthy
88
89
  expect(config.mounted?("tasks")).to be_truthy
89
90
  end
90
91
 
91
- it "should allow all access to modules, plugins, and tasks if no fileserver.conf exists" do
92
+ it "should allow all access to modules, plugins, scripts, and tasks if no fileserver.conf exists" do
92
93
  expect(Puppet::FileSystem).to receive(:exist?).and_return(false) # the file doesn't exist
93
94
  modules = double('modules')
94
95
  allow(Puppet::FileServing::Mount::Modules).to receive(:new).and_return(modules)
@@ -99,10 +100,13 @@ describe Puppet::FileServing::Configuration do
99
100
  tasks = double('tasks')
100
101
  allow(Puppet::FileServing::Mount::Tasks).to receive(:new).and_return(tasks)
101
102
 
103
+ scripts = double('scripts')
104
+ allow(Puppet::FileServing::Mount::Scripts).to receive(:new).and_return(scripts)
105
+
102
106
  Puppet::FileServing::Configuration.configuration
103
107
  end
104
108
 
105
- it "should not allow access from all to modules, plugins, and tasks if the fileserver.conf provided some rules" do
109
+ it "should not allow access from all to modules, plugins, scripts, and tasks if the fileserver.conf provided some rules" do
106
110
  expect(Puppet::FileSystem).to receive(:exist?).and_return(false) # the file doesn't exist
107
111
 
108
112
  modules = double('modules')
@@ -114,15 +118,19 @@ describe Puppet::FileServing::Configuration do
114
118
  tasks = double('tasks')
115
119
  allow(Puppet::FileServing::Mount::Tasks).to receive(:new).and_return(tasks)
116
120
 
121
+ scripts = double('scripts', :empty? => false)
122
+ allow(Puppet::FileServing::Mount::Scripts).to receive(:new).and_return(scripts)
123
+
117
124
  Puppet::FileServing::Configuration.configuration
118
125
  end
119
126
 
120
- it "should add modules, plugins, and tasks mounts even if they are not returned by the parser" do
127
+ it "should add modules, plugins, scripts, and tasks mounts even if they are not returned by the parser" do
121
128
  expect(@parser).to receive(:parse).and_return("one" => double("mount"))
122
129
  expect(Puppet::FileSystem).to receive(:exist?).and_return(true) # the file doesn't exist
123
130
  config = Puppet::FileServing::Configuration.configuration
124
131
  expect(config.mounted?("modules")).to be_truthy
125
132
  expect(config.mounted?("plugins")).to be_truthy
133
+ expect(config.mounted?("scripts")).to be_truthy
126
134
  expect(config.mounted?("tasks")).to be_truthy
127
135
  end
128
136
  end
@@ -0,0 +1,69 @@
1
+ require 'spec_helper'
2
+ require 'puppet/file_serving/mount/scripts'
3
+
4
+ describe Puppet::FileServing::Mount::Scripts do
5
+ before do
6
+ @mount = Puppet::FileServing::Mount::Scripts.new("scripts")
7
+
8
+ @environment = double('environment', :module => nil)
9
+ @request = double('request', :environment => @environment)
10
+ end
11
+
12
+ describe "when finding files" do
13
+ it "should fail if no module is specified" do
14
+ expect { @mount.find("", @request) }.to raise_error(/No module specified/)
15
+ end
16
+
17
+ it "should use the provided environment to find the module" do
18
+ expect(@environment).to receive(:module)
19
+
20
+ @mount.find("foo", @request)
21
+ end
22
+
23
+ it "should treat the first field of the relative path as the module name" do
24
+ expect(@environment).to receive(:module).with("foo")
25
+ @mount.find("foo/bar/baz", @request)
26
+ end
27
+
28
+ it "should return nil if the specified module does not exist" do
29
+ expect(@environment).to receive(:module).with("foo")
30
+ @mount.find("foo/bar/baz", @request)
31
+ end
32
+
33
+ it "should return the file path from the module" do
34
+ mod = double('module')
35
+ expect(mod).to receive(:script).with("bar/baz").and_return("eh")
36
+ expect(@environment).to receive(:module).with("foo").and_return(mod)
37
+ expect(@mount.find("foo/bar/baz", @request)).to eq("eh")
38
+ end
39
+ end
40
+
41
+ describe "when searching for files" do
42
+ it "should fail if no module is specified" do
43
+ expect { @mount.search("", @request) }.to raise_error(/No module specified/)
44
+ end
45
+
46
+ it "should use the node's environment to search the module" do
47
+ expect(@environment).to receive(:module)
48
+
49
+ @mount.search("foo", @request)
50
+ end
51
+
52
+ it "should treat the first field of the relative path as the module name" do
53
+ expect(@environment).to receive(:module).with("foo")
54
+ @mount.search("foo/bar/baz", @request)
55
+ end
56
+
57
+ it "should return nil if the specified module does not exist" do
58
+ expect(@environment).to receive(:module).with("foo").and_return(nil)
59
+ @mount.search("foo/bar/baz", @request)
60
+ end
61
+
62
+ it "should return the script path as an array from the module" do
63
+ mod = double('module')
64
+ expect(mod).to receive(:script).with("bar/baz").and_return("eh")
65
+ expect(@environment).to receive(:module).with("foo").and_return(mod)
66
+ expect(@mount.search("foo/bar/baz", @request)).to eq(["eh"])
67
+ end
68
+ end
69
+ end
@@ -6,6 +6,7 @@ describe 'the log function' do
6
6
 
7
7
  def collect_logs(code)
8
8
  Puppet[:code] = code
9
+ Puppet[:environment_timeout] = 10
9
10
  node = Puppet::Node.new('logtest')
10
11
  compiler = Puppet::Parser::Compiler.new(node)
11
12
  node.environment.check_for_reparse
@@ -95,6 +95,14 @@ describe Puppet::HTTP::Service::Compiler do
95
95
  subject.post_catalog(certname, environment: 'production', facts: facts, configured_environment: 'agent_specified')
96
96
  end
97
97
 
98
+ it 'includes check_environment' do
99
+ stub_request(:post, uri)
100
+ .with(body: hash_including('check_environment' => 'false'))
101
+ .to_return(**catalog_response)
102
+
103
+ subject.post_catalog(certname, environment: 'production', facts: facts)
104
+ end
105
+
98
106
  it 'includes transaction_uuid' do
99
107
  uuid = "ec3d2844-b236-4287-b0ad-632fbb4d1ff0"
100
108
 
@@ -11,6 +11,9 @@ def set_facts(fact_hash)
11
11
  end
12
12
 
13
13
  describe Puppet::Resource::Catalog::Compiler do
14
+ include Matchers::Resource
15
+ include PuppetSpec::Files
16
+
14
17
  let(:compiler) { described_class.new }
15
18
  let(:node_name) { "foo" }
16
19
  let(:node) { Puppet::Node.new(node_name)}
@@ -236,6 +239,46 @@ describe Puppet::Resource::Catalog::Compiler do
236
239
  expect { compiler.find(@request) }.to raise_error Puppet::Error,
237
240
  "Unable to find a common checksum type between agent '' and master '[:sha256, :sha256lite, :md5, :md5lite, :sha1, :sha1lite, :sha512, :sha384, :sha224, :mtime, :ctime, :none]'."
238
241
  end
242
+
243
+ it "prevents the environment from being evicted during compilation" do
244
+ Puppet[:environment_timeout] = 0
245
+
246
+ envs = Puppet.lookup(:environments)
247
+
248
+ expect(compiler).to receive(:compile) do
249
+ # we should get the same object
250
+ expect(envs.get!(:production)).to equal(envs.get!(:production))
251
+ end
252
+
253
+ compiler.find(@request)
254
+ end
255
+
256
+ context 'when checking agent and server specified environments' do
257
+ before :each do
258
+ FileUtils.mkdir_p(File.join(Puppet[:environmentpath], 'env_server'))
259
+ FileUtils.mkdir_p(File.join(Puppet[:environmentpath], 'env_agent'))
260
+
261
+ node.environment = 'env_server'
262
+ allow(Puppet::Node.indirection).to receive(:find).and_return(node)
263
+
264
+ @request.environment = 'env_agent'
265
+ end
266
+
267
+ it 'ignores mismatched environments by default' do
268
+ catalog = compiler.find(@request)
269
+
270
+ expect(catalog.environment).to eq('env_server')
271
+ expect(catalog).to have_resource('Stage[main]')
272
+ end
273
+
274
+ it 'returns an empty catalog if asked to check the environment and they are mismatched' do
275
+ @request.options[:check_environment] = "true"
276
+ catalog = compiler.find(@request)
277
+
278
+ expect(catalog.environment).to eq('env_server')
279
+ expect(catalog.resources).to be_empty
280
+ end
281
+ end
239
282
  end
240
283
 
241
284
  describe "when handling a request with facts" do
@@ -564,6 +607,50 @@ describe Puppet::Resource::Catalog::Compiler do
564
607
  metadata
565
608
  end
566
609
 
610
+ describe "and the environment is a symlink and versioned_environment_dirs is true" do
611
+
612
+ let(:tmpdir) { Dir.mktmpdir }
613
+
614
+ before(:each) do
615
+ Puppet[:versioned_environment_dirs] = true
616
+ prod_path = File.join(Puppet[:environmentpath], 'production')
617
+ FileUtils.rm_rf(prod_path)
618
+ FileUtils.symlink(tmpdir, prod_path)
619
+ end
620
+
621
+ it "inlines metadata for a file" do
622
+ catalog = compile_to_catalog(<<-MANIFEST, node)
623
+ file { '#{path}':
624
+ ensure => file,
625
+ source => '#{source}'
626
+ }
627
+ MANIFEST
628
+
629
+ module_relative_path = 'modules/mymodule/files/config_file.txt'
630
+ metadata = stubs_file_metadata(checksum_type,
631
+ checksum_value,
632
+ module_relative_path,
633
+ File.join(tmpdir, module_relative_path) )
634
+ expect(metadata).to receive(:source=).with(source)
635
+ expect(metadata).to receive(:content_uri=).with("puppet:///#{module_relative_path}")
636
+
637
+ options = {
638
+ :environment => catalog.environment_instance,
639
+ :links => :manage,
640
+ :checksum_type => checksum_type.to_sym,
641
+ :source_permissions => :ignore
642
+ }
643
+ expect(Puppet::FileServing::Metadata.indirection).to receive(:find).with(source, options).and_return(metadata)
644
+
645
+ compiler.send(:inline_metadata, catalog, checksum_type)
646
+
647
+
648
+ expect(catalog.metadata[path]).to eq(metadata)
649
+ expect(catalog.recursive_metadata).to be_empty
650
+
651
+ end
652
+ end
653
+
567
654
  it "inlines metadata for a file" do
568
655
  catalog = compile_to_catalog(<<-MANIFEST, node)
569
656
  file { '#{path}':