puppet 7.9.0-x64-mingw32 → 7.12.1-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (292) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/Gemfile.lock +12 -12
  4. data/{ext → examples/enc}/regexp_nodes/classes/databases +0 -0
  5. data/{ext → examples/enc}/regexp_nodes/classes/webservers +0 -0
  6. data/{ext → examples/enc}/regexp_nodes/environment/development +0 -0
  7. data/{ext → examples/enc}/regexp_nodes/parameters/service/prod +0 -0
  8. data/{ext → examples/enc}/regexp_nodes/parameters/service/qa +0 -0
  9. data/{ext → examples/enc}/regexp_nodes/parameters/service/sandbox +0 -0
  10. data/{ext → examples/enc}/regexp_nodes/regexp_nodes.rb +0 -0
  11. data/{ext → examples}/nagios/check_puppet.rb +2 -2
  12. data/ext/README.md +13 -0
  13. data/lib/puppet/application/agent.rb +4 -0
  14. data/lib/puppet/application/apply.rb +20 -2
  15. data/lib/puppet/application/resource.rb +15 -13
  16. data/lib/puppet/concurrent/thread_local_singleton.rb +1 -0
  17. data/lib/puppet/configurer.rb +236 -58
  18. data/lib/puppet/confine/variable.rb +1 -1
  19. data/lib/puppet/defaults.rb +66 -29
  20. data/lib/puppet/environments.rb +66 -26
  21. data/lib/puppet/facter_impl.rb +96 -0
  22. data/lib/puppet/file_serving/configuration/parser.rb +2 -0
  23. data/lib/puppet/file_serving/configuration.rb +2 -0
  24. data/lib/puppet/file_serving/mount/file.rb +4 -4
  25. data/lib/puppet/file_serving/mount/scripts.rb +24 -0
  26. data/lib/puppet/file_system/file_impl.rb +3 -1
  27. data/lib/puppet/file_system.rb +2 -1
  28. data/lib/puppet/forge.rb +1 -1
  29. data/lib/puppet/functions/find_template.rb +2 -2
  30. data/lib/puppet/http/client.rb +1 -1
  31. data/lib/puppet/http/redirector.rb +5 -0
  32. data/lib/puppet/http/service/compiler.rb +6 -1
  33. data/lib/puppet/indirector/catalog/compiler.rb +24 -6
  34. data/lib/puppet/indirector/catalog/rest.rb +1 -0
  35. data/lib/puppet/indirector/facts/facter.rb +6 -6
  36. data/lib/puppet/indirector/indirection.rb +1 -1
  37. data/lib/puppet/indirector/terminus.rb +4 -0
  38. data/lib/puppet/module/plan.rb +0 -1
  39. data/lib/puppet/module/task.rb +1 -1
  40. data/lib/puppet/module_tool/applications/installer.rb +8 -4
  41. data/lib/puppet/module_tool/applications/uninstaller.rb +1 -1
  42. data/lib/puppet/module_tool/applications/upgrader.rb +1 -1
  43. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  44. data/lib/puppet/node/environment.rb +10 -11
  45. data/lib/puppet/pal/pal_impl.rb +1 -1
  46. data/lib/puppet/parser/resource.rb +1 -1
  47. data/lib/puppet/parser/scope.rb +8 -7
  48. data/lib/puppet/parser/templatewrapper.rb +1 -0
  49. data/lib/puppet/pops/evaluator/closure.rb +7 -5
  50. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -0
  51. data/lib/puppet/pops/lookup/lookup_adapter.rb +3 -2
  52. data/lib/puppet/pops/model/ast.rb +1 -0
  53. data/lib/puppet/pops/model/factory.rb +14 -13
  54. data/lib/puppet/pops/parser/egrammar.ra +2 -2
  55. data/lib/puppet/pops/parser/eparser.rb +752 -753
  56. data/lib/puppet/pops/parser/lexer2.rb +69 -68
  57. data/lib/puppet/pops/parser/slurp_support.rb +1 -0
  58. data/lib/puppet/pops/serialization/to_data_converter.rb +18 -6
  59. data/lib/puppet/pops/serialization/to_stringified_converter.rb +1 -1
  60. data/lib/puppet/pops/types/type_formatter.rb +7 -6
  61. data/lib/puppet/pops/types/types.rb +1 -1
  62. data/lib/puppet/provider/aix_object.rb +1 -1
  63. data/lib/puppet/provider/group/groupadd.rb +5 -2
  64. data/lib/puppet/provider/package/pkg.rb +19 -2
  65. data/lib/puppet/provider/package/puppet_gem.rb +1 -1
  66. data/lib/puppet/provider/package/puppetserver_gem.rb +1 -1
  67. data/lib/puppet/provider/package/yum.rb +1 -1
  68. data/lib/puppet/provider/service/base.rb +1 -1
  69. data/lib/puppet/provider/service/init.rb +5 -5
  70. data/lib/puppet/provider/service/launchd.rb +2 -2
  71. data/lib/puppet/provider/service/redhat.rb +1 -1
  72. data/lib/puppet/provider/service/smf.rb +3 -3
  73. data/lib/puppet/provider/service/systemd.rb +2 -2
  74. data/lib/puppet/provider/service/upstart.rb +5 -5
  75. data/lib/puppet/provider/user/aix.rb +44 -1
  76. data/lib/puppet/provider/user/directoryservice.rb +1 -1
  77. data/lib/puppet/provider/user/useradd.rb +72 -16
  78. data/lib/puppet/provider.rb +1 -1
  79. data/lib/puppet/reference/providers.rb +2 -2
  80. data/lib/puppet/resource/catalog.rb +1 -1
  81. data/lib/puppet/resource/type_collection.rb +2 -1
  82. data/lib/puppet/resource.rb +38 -5
  83. data/lib/puppet/runtime.rb +11 -1
  84. data/lib/puppet/settings/file_setting.rb +3 -8
  85. data/lib/puppet/settings.rb +2 -2
  86. data/lib/puppet/test/test_helper.rb +4 -1
  87. data/lib/puppet/transaction/persistence.rb +11 -1
  88. data/lib/puppet/transaction/report.rb +15 -1
  89. data/lib/puppet/type/exec.rb +19 -2
  90. data/lib/puppet/type/file.rb +6 -6
  91. data/lib/puppet/type/filebucket.rb +2 -2
  92. data/lib/puppet/type/group.rb +0 -1
  93. data/lib/puppet/type/resources.rb +1 -1
  94. data/lib/puppet/type/service.rb +8 -3
  95. data/lib/puppet/type/user.rb +0 -1
  96. data/lib/puppet/type.rb +1 -1
  97. data/lib/puppet/util/autoload.rb +1 -1
  98. data/lib/puppet/util/command_line.rb +1 -1
  99. data/lib/puppet/util/filetype.rb +2 -2
  100. data/lib/puppet/util/json.rb +3 -0
  101. data/lib/puppet/util/log.rb +1 -2
  102. data/lib/puppet/util/logging.rb +1 -25
  103. data/lib/puppet/util/pidlock.rb +1 -1
  104. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
  105. data/lib/puppet/util/suidmanager.rb +1 -2
  106. data/lib/puppet/util/tagging.rb +1 -0
  107. data/lib/puppet/util/windows/service.rb +0 -5
  108. data/lib/puppet/util/windows/user.rb +0 -1
  109. data/lib/puppet/util/windows.rb +3 -0
  110. data/lib/puppet/util.rb +4 -3
  111. data/lib/puppet/version.rb +1 -1
  112. data/lib/puppet.rb +2 -6
  113. data/locales/puppet.pot +265 -221
  114. data/man/man5/puppet.conf.5 +73 -25
  115. data/man/man8/puppet-agent.8 +4 -1
  116. data/man/man8/puppet-apply.8 +1 -1
  117. data/man/man8/puppet-catalog.8 +1 -1
  118. data/man/man8/puppet-config.8 +1 -1
  119. data/man/man8/puppet-describe.8 +1 -1
  120. data/man/man8/puppet-device.8 +1 -1
  121. data/man/man8/puppet-doc.8 +1 -1
  122. data/man/man8/puppet-epp.8 +1 -1
  123. data/man/man8/puppet-facts.8 +1 -1
  124. data/man/man8/puppet-filebucket.8 +1 -1
  125. data/man/man8/puppet-generate.8 +1 -1
  126. data/man/man8/puppet-help.8 +1 -1
  127. data/man/man8/puppet-lookup.8 +1 -1
  128. data/man/man8/puppet-module.8 +3 -3
  129. data/man/man8/puppet-node.8 +1 -1
  130. data/man/man8/puppet-parser.8 +1 -1
  131. data/man/man8/puppet-plugin.8 +1 -1
  132. data/man/man8/puppet-report.8 +1 -1
  133. data/man/man8/puppet-resource.8 +1 -1
  134. data/man/man8/puppet-script.8 +1 -1
  135. data/man/man8/puppet-ssl.8 +1 -1
  136. data/man/man8/puppet.8 +2 -2
  137. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +2 -1
  138. data/spec/fixtures/integration/application/agent/lib/facter/agent_spec_role.rb +3 -0
  139. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Gemfile +4 -0
  140. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Rakefile +3 -0
  141. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/lib/puppet/functions/l10n.rb +8 -0
  142. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/config.yaml +25 -0
  143. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/ja/puppet-l10n.po +19 -0
  144. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/puppet-l10n.pot +20 -0
  145. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/metadata.json +8 -0
  146. data/spec/integration/application/agent_spec.rb +146 -52
  147. data/spec/integration/application/filebucket_spec.rb +5 -0
  148. data/spec/integration/configurer_spec.rb +18 -2
  149. data/spec/integration/indirector/facts/facter_spec.rb +3 -3
  150. data/spec/integration/l10n/compiler_spec.rb +37 -0
  151. data/spec/integration/parser/pcore_resource_spec.rb +10 -0
  152. data/spec/integration/transaction/report_spec.rb +1 -1
  153. data/spec/integration/type/file_spec.rb +2 -2
  154. data/spec/integration/type/package_spec.rb +6 -6
  155. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  156. data/spec/integration/util/windows/process_spec.rb +1 -9
  157. data/spec/lib/puppet_spec/modules.rb +13 -2
  158. data/spec/lib/puppet_spec/puppetserver.rb +15 -0
  159. data/spec/shared_behaviours/documentation_on_faces.rb +0 -2
  160. data/spec/shared_contexts/l10n.rb +27 -0
  161. data/spec/spec_helper.rb +1 -10
  162. data/spec/unit/application/apply_spec.rb +76 -56
  163. data/spec/unit/application/resource_spec.rb +29 -0
  164. data/spec/unit/configurer_spec.rb +353 -57
  165. data/spec/unit/environments_spec.rb +150 -1
  166. data/spec/unit/facter_impl_spec.rb +31 -0
  167. data/spec/unit/file_bucket/dipper_spec.rb +2 -2
  168. data/spec/unit/file_serving/configuration/parser_spec.rb +23 -0
  169. data/spec/unit/file_serving/configuration_spec.rb +12 -4
  170. data/spec/unit/file_serving/mount/scripts_spec.rb +69 -0
  171. data/spec/unit/file_system_spec.rb +7 -0
  172. data/spec/unit/functions/logging_spec.rb +1 -0
  173. data/spec/unit/functions/lookup_spec.rb +64 -0
  174. data/spec/unit/http/client_spec.rb +58 -1
  175. data/spec/unit/http/service/compiler_spec.rb +8 -0
  176. data/spec/unit/indirector/catalog/compiler_spec.rb +87 -0
  177. data/spec/unit/indirector/catalog/rest_spec.rb +8 -0
  178. data/spec/unit/indirector/indirection_spec.rb +10 -3
  179. data/spec/unit/interface/action_spec.rb +0 -9
  180. data/spec/unit/module_spec.rb +14 -0
  181. data/spec/unit/module_tool/applications/installer_spec.rb +39 -12
  182. data/spec/unit/network/formats_spec.rb +6 -0
  183. data/spec/unit/pops/parser/parse_containers_spec.rb +0 -11
  184. data/spec/unit/pops/serialization/to_from_hr_spec.rb +58 -0
  185. data/spec/unit/pops/serialization/to_stringified_spec.rb +5 -0
  186. data/spec/unit/pops/types/type_calculator_spec.rb +6 -0
  187. data/spec/unit/provider/package/gem_spec.rb +1 -1
  188. data/spec/unit/provider/package/pip2_spec.rb +1 -1
  189. data/spec/unit/provider/package/pip3_spec.rb +1 -1
  190. data/spec/unit/provider/package/pip_spec.rb +1 -1
  191. data/spec/unit/provider/package/pkg_spec.rb +34 -5
  192. data/spec/unit/provider/package/puppet_gem_spec.rb +1 -1
  193. data/spec/unit/provider/package/puppetserver_gem_spec.rb +1 -1
  194. data/spec/unit/provider/service/launchd_spec.rb +11 -0
  195. data/spec/unit/provider/service/systemd_spec.rb +1 -1
  196. data/spec/unit/provider/user/aix_spec.rb +100 -0
  197. data/spec/unit/provider/user/directoryservice_spec.rb +1 -1
  198. data/spec/unit/provider/user/useradd_spec.rb +43 -2
  199. data/spec/unit/provider_spec.rb +4 -4
  200. data/spec/unit/puppet_spec.rb +12 -4
  201. data/spec/unit/resource/catalog_spec.rb +14 -1
  202. data/spec/unit/resource_spec.rb +58 -2
  203. data/spec/unit/settings/file_setting_spec.rb +10 -7
  204. data/spec/unit/type/service_spec.rb +27 -0
  205. data/spec/unit/type_spec.rb +2 -2
  206. data/spec/unit/util/autoload_spec.rb +25 -8
  207. data/spec/unit/util/logging_spec.rb +2 -0
  208. data/tasks/parallel.rake +3 -3
  209. metadata +37 -94
  210. data/ext/README.environment +0 -8
  211. data/ext/dbfix.sql +0 -132
  212. data/ext/debian/README.Debian +0 -8
  213. data/ext/debian/README.source +0 -2
  214. data/ext/debian/TODO.Debian +0 -1
  215. data/ext/debian/changelog.erb +0 -1122
  216. data/ext/debian/compat +0 -1
  217. data/ext/debian/control +0 -144
  218. data/ext/debian/copyright +0 -339
  219. data/ext/debian/docs +0 -1
  220. data/ext/debian/fileserver.conf +0 -41
  221. data/ext/debian/puppet-common.dirs +0 -13
  222. data/ext/debian/puppet-common.install +0 -3
  223. data/ext/debian/puppet-common.lintian-overrides +0 -5
  224. data/ext/debian/puppet-common.manpages +0 -28
  225. data/ext/debian/puppet-common.postinst +0 -35
  226. data/ext/debian/puppet-common.postrm +0 -33
  227. data/ext/debian/puppet-el.dirs +0 -1
  228. data/ext/debian/puppet-el.emacsen-install +0 -25
  229. data/ext/debian/puppet-el.emacsen-remove +0 -11
  230. data/ext/debian/puppet-el.emacsen-startup +0 -9
  231. data/ext/debian/puppet-el.install +0 -1
  232. data/ext/debian/puppet-testsuite.install +0 -2
  233. data/ext/debian/puppet-testsuite.lintian-overrides +0 -4
  234. data/ext/debian/puppet.lintian-overrides +0 -3
  235. data/ext/debian/puppet.logrotate +0 -20
  236. data/ext/debian/puppet.postinst +0 -20
  237. data/ext/debian/puppet.postrm +0 -20
  238. data/ext/debian/puppet.preinst +0 -20
  239. data/ext/debian/puppetmaster-common.install +0 -2
  240. data/ext/debian/puppetmaster-common.manpages +0 -2
  241. data/ext/debian/puppetmaster-common.postinst +0 -6
  242. data/ext/debian/puppetmaster-passenger.dirs +0 -4
  243. data/ext/debian/puppetmaster-passenger.postinst +0 -162
  244. data/ext/debian/puppetmaster-passenger.postrm +0 -61
  245. data/ext/debian/puppetmaster.README.debian +0 -17
  246. data/ext/debian/puppetmaster.default +0 -14
  247. data/ext/debian/puppetmaster.init +0 -137
  248. data/ext/debian/puppetmaster.lintian-overrides +0 -3
  249. data/ext/debian/puppetmaster.postinst +0 -20
  250. data/ext/debian/puppetmaster.postrm +0 -5
  251. data/ext/debian/puppetmaster.preinst +0 -22
  252. data/ext/debian/rules +0 -132
  253. data/ext/debian/source/format +0 -1
  254. data/ext/debian/source/options +0 -1
  255. data/ext/debian/vim-puppet.README.Debian +0 -13
  256. data/ext/debian/vim-puppet.dirs +0 -5
  257. data/ext/debian/vim-puppet.yaml +0 -7
  258. data/ext/debian/watch +0 -2
  259. data/ext/freebsd/puppetd +0 -26
  260. data/ext/freebsd/puppetmasterd +0 -26
  261. data/ext/gentoo/conf.d/puppet +0 -5
  262. data/ext/gentoo/conf.d/puppetmaster +0 -12
  263. data/ext/gentoo/init.d/puppet +0 -38
  264. data/ext/gentoo/init.d/puppetmaster +0 -51
  265. data/ext/gentoo/puppet/fileserver.conf +0 -41
  266. data/ext/ips/puppet-agent +0 -44
  267. data/ext/ips/puppet-master +0 -44
  268. data/ext/ips/puppet.p5m.erb +0 -12
  269. data/ext/ips/puppetagent.xml +0 -42
  270. data/ext/ips/puppetmaster.xml +0 -42
  271. data/ext/ips/rules +0 -19
  272. data/ext/ips/transforms +0 -34
  273. data/ext/ldap/puppet.schema +0 -24
  274. data/ext/logcheck/puppet +0 -23
  275. data/ext/osx/file_mapping.yaml +0 -28
  276. data/ext/osx/postflight.erb +0 -109
  277. data/ext/osx/preflight.erb +0 -52
  278. data/ext/osx/prototype.plist.erb +0 -38
  279. data/ext/redhat/fileserver.conf +0 -41
  280. data/ext/redhat/logrotate +0 -21
  281. data/ext/redhat/puppet.spec.erb +0 -841
  282. data/ext/redhat/server.init +0 -128
  283. data/ext/redhat/server.sysconfig +0 -13
  284. data/ext/solaris/pkginfo +0 -6
  285. data/ext/solaris/smf/puppetd.xml +0 -77
  286. data/ext/solaris/smf/puppetmasterd.xml +0 -77
  287. data/ext/solaris/smf/svc-puppetd +0 -71
  288. data/ext/solaris/smf/svc-puppetmasterd +0 -67
  289. data/ext/suse/puppet.spec +0 -310
  290. data/ext/suse/server.init +0 -173
  291. data/ext/yaml_nodes.rb +0 -105
  292. 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
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Puppet::FacterImpl' do
4
+ subject(:facter_impl) { Puppet::FacterImpl.new }
5
+
6
+ it { is_expected.to respond_to(:value) }
7
+ it { is_expected.to respond_to(:add) }
8
+
9
+ describe '.value' do
10
+ let(:method_name) { :value }
11
+
12
+ before { allow(Facter).to receive(method_name) }
13
+
14
+ it 'delegates to Facter API' do
15
+ facter_impl.value('test_fact')
16
+ expect(Facter).to have_received(method_name).with('test_fact')
17
+ end
18
+ end
19
+
20
+ describe '.add' do
21
+ let(:block) { Proc.new { setcode 'test' } }
22
+ let(:method_name) { :add }
23
+
24
+ before { allow(Facter).to receive(method_name) }
25
+
26
+ it 'delegates to Facter API' do
27
+ facter_impl.add('test_fact', &block)
28
+ expect(Facter).to have_received(method_name).with('test_fact', &block)
29
+ end
30
+ end
31
+ end
@@ -104,8 +104,8 @@ describe Puppet::FileBucket::Dipper, :uses_checksums => true do
104
104
  # Diff without the context
105
105
  # Lines we need to see match 'Content' instead of trimming diff output filter out
106
106
  # surrounding noise...or hard code the check values
107
- if Facter.value(:osfamily) == 'Solaris' &&
108
- Puppet::Util::Package.versioncmp(Facter.value(:operatingsystemrelease), '11.0') >= 0
107
+ if Puppet.runtime[:facter].value(:osfamily) == 'Solaris' &&
108
+ Puppet::Util::Package.versioncmp(Puppet.runtime[:facter].value(:operatingsystemrelease), '11.0') >= 0
109
109
  # Use gdiff on Solaris
110
110
  diff12 = Puppet::Util::Execution.execute("gdiff -uN #{file1} #{file2}| grep Content")
111
111
  diff21 = Puppet::Util::Execution.execute("gdiff -uN #{file2} #{file1}| grep Content")
@@ -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
@@ -296,6 +296,13 @@ describe "Puppet::FileSystem" do
296
296
  expect(Puppet::FileSystem.read_preserve_line_endings(file)).to eq("file content \n")
297
297
  end
298
298
  end
299
+
300
+ it "should not warn about misusage of BOM with non-UTF encoding" do
301
+ allow(Encoding).to receive(:default_external).and_return(Encoding::US_ASCII)
302
+ with_file_content("file content \n") do |file|
303
+ expect{ Puppet::FileSystem.read_preserve_line_endings(file) }.not_to output(/BOM with non-UTF encoding US-ASCII is nonsense/).to_stderr
304
+ end
305
+ end
299
306
  end
300
307
 
301
308
  context "read without an encoding specified" do
@@ -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
@@ -870,6 +870,46 @@ describe "The lookup function" do
870
870
  end
871
871
  end
872
872
 
873
+ context 'with lookup_options' do
874
+ let(:environment_files) do
875
+ {
876
+ env_name => {
877
+ 'hiera.yaml' => <<-YAML.unindent,
878
+ ---
879
+ version: 5
880
+ YAML
881
+ 'data' => {
882
+ 'common.yaml' => common_yaml
883
+ }
884
+ }
885
+ }
886
+ end
887
+
888
+ context 'that are empty' do
889
+ let(:common_yaml) { <<-YAML.unindent }
890
+ lookup_options:
891
+ a: b
892
+ YAML
893
+
894
+ it 'ignores empty options' do
895
+ expect(lookup('a')).to eq("b")
896
+ end
897
+ end
898
+
899
+ context 'that contains a legal yaml hash with unexpected types' do
900
+ let(:common_yaml) { <<-YAML.unindent }
901
+ lookup_options:
902
+ :invalid_symbol
903
+ YAML
904
+
905
+ it 'fails lookup and reports a type mismatch' do
906
+ expect {
907
+ lookup('a')
908
+ }.to raise_error(Puppet::DataBinding::LookupError, /has wrong type, expects Puppet::LookupValue, got Runtime\[ruby, 'Symbol'\]/)
909
+ end
910
+ end
911
+ end
912
+
873
913
  context 'with lookup_options configured using patterns' do
874
914
  let(:mod_common) {
875
915
  <<-YAML.unindent
@@ -1019,6 +1059,30 @@ describe "The lookup function" do
1019
1059
  })
1020
1060
  end
1021
1061
 
1062
+ context 'and lookup_options is empty' do
1063
+ let(:mod_common) { <<-YAML.unindent }
1064
+ lookup_options:
1065
+ mod::a: b
1066
+ YAML
1067
+
1068
+ it 'ignores empty options' do
1069
+ expect(lookup('mod::a')).to eq("b")
1070
+ end
1071
+ end
1072
+
1073
+ context 'and lookup_options contains a legal hash with unexpected types' do
1074
+ let(:mod_common) { <<-YAML.unindent }
1075
+ lookup_options:
1076
+ :invalid_symbol
1077
+ YAML
1078
+
1079
+ it 'fails lookup and reports a type mismatch' do
1080
+ expect {
1081
+ lookup('mod::a')
1082
+ }.to raise_error(Puppet::DataBinding::LookupError, /has wrong type, expects Puppet::LookupValue, got Runtime\[ruby, 'Symbol'\]/)
1083
+ end
1084
+ end
1085
+
1022
1086
  context 'and patterns in module are not limited to module keys' do
1023
1087
  let(:mod_common) {
1024
1088
  <<-YAML.unindent
@@ -597,11 +597,68 @@ describe Puppet::HTTP::Client do
597
597
  expect(response).to be_success
598
598
  end
599
599
 
600
- it "preserves basic authorization" do
600
+ it "does not preserve basic authorization when redirecting to different hosts" do
601
+ stub_request(:get, start_url).with(basic_auth: credentials).to_return(redirect_to(url: other_host))
602
+ stub_request(:get, other_host).to_return(status: 200)
603
+
604
+ client.get(start_url, options: {basic_auth: {user: 'user', password: 'pass'}})
605
+ expect(a_request(:get, other_host).
606
+ with{ |req| !req.headers.key?('Authorization')}).to have_been_made
607
+ end
608
+
609
+ it "does preserve basic authorization when redirecting to the same hosts" do
610
+ stub_request(:get, start_url).with(basic_auth: credentials).to_return(redirect_to(url: bar_url))
611
+ stub_request(:get, bar_url).with(basic_auth: credentials).to_return(status: 200)
612
+
613
+ client.get(start_url, options: {basic_auth: {user: 'user', password: 'pass'}})
614
+ expect(a_request(:get, bar_url).
615
+ with{ |req| req.headers.key?('Authorization')}).to have_been_made
616
+ end
617
+
618
+ it "does not preserve cookie header when redirecting to different hosts" do
619
+ headers = { 'Cookie' => 'TEST_COOKIE'}
620
+
621
+ stub_request(:get, start_url).with(headers: headers).to_return(redirect_to(url: other_host))
622
+ stub_request(:get, other_host).to_return(status: 200)
623
+
624
+ client.get(start_url, headers: headers)
625
+ expect(a_request(:get, other_host).
626
+ with{ |req| !req.headers.key?('Cookie')}).to have_been_made
627
+ end
628
+
629
+ it "does preserve cookie header when redirecting to the same hosts" do
630
+ headers = { 'Cookie' => 'TEST_COOKIE'}
631
+
632
+ stub_request(:get, start_url).with(headers: headers).to_return(redirect_to(url: bar_url))
633
+ stub_request(:get, bar_url).with(headers: headers).to_return(status: 200)
634
+
635
+ client.get(start_url, headers: headers)
636
+ expect(a_request(:get, bar_url).
637
+ with{ |req| req.headers.key?('Cookie')}).to have_been_made
638
+ end
639
+
640
+ it "does preserves cookie header and basic authentication when Puppet[:location_trusted] is true redirecting to different hosts" do
641
+ headers = { 'cookie' => 'TEST_COOKIE'}
642
+ Puppet[:location_trusted] = true
643
+
644
+ stub_request(:get, start_url).with(headers: headers, basic_auth: credentials).to_return(redirect_to(url: other_host))
645
+ stub_request(:get, other_host).with(headers: headers, basic_auth: credentials).to_return(status: 200)
646
+
647
+ client.get(start_url, headers: headers, options: {basic_auth: {user: 'user', password: 'pass'}})
648
+ expect(a_request(:get, other_host).
649
+ with{ |req| req.headers.key?('Authorization') && req.headers.key?('Cookie')}).to have_been_made
650
+ end
651
+
652
+ it "treats hosts as case-insensitive" do
653
+ start_url = URI("https://www.EXAmple.com:8140/Start")
654
+ bar_url = "https://www.example.com:8140/bar"
655
+
601
656
  stub_request(:get, start_url).with(basic_auth: credentials).to_return(redirect_to(url: bar_url))
602
657
  stub_request(:get, bar_url).with(basic_auth: credentials).to_return(status: 200)
603
658
 
604
659
  client.get(start_url, options: {basic_auth: {user: 'user', password: 'pass'}})
660
+ expect(a_request(:get, bar_url).
661
+ with{ |req| req.headers.key?('Authorization')}).to have_been_made
605
662
  end
606
663
 
607
664
  it "redirects given a relative location" do
@@ -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}':