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
@@ -2,11 +2,27 @@ require 'spec_helper'
2
2
  require 'puppet/configurer'
3
3
 
4
4
  describe Puppet::Configurer do
5
+ include PuppetSpec::Files
6
+
5
7
  before do
6
8
  Puppet[:server] = "puppetmaster"
7
9
  Puppet[:report] = true
8
10
 
9
11
  catalog.add_resource(resource)
12
+ allow_any_instance_of(described_class).to(
13
+ receive(:valid_server_environment?).and_return(true)
14
+ )
15
+
16
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
17
+ ---
18
+ version:
19
+ config: 1624882680
20
+ puppet: #{Puppet.version}
21
+ application:
22
+ initial_environment: #{Puppet[:environment]}
23
+ converged_environment: #{Puppet[:environment]}
24
+ run_mode: agent
25
+ SUMMARY
10
26
  end
11
27
 
12
28
  let(:node_name) { Puppet[:node_name_value] }
@@ -78,10 +94,10 @@ describe Puppet::Configurer do
78
94
  configurer.run(:pluginsync => false)
79
95
  end
80
96
 
81
- it "should carry on when it can't fetch its node definition" do
82
- error = Net::HTTPError.new(400, 'dummy server communication error')
83
- expect(Puppet::Node.indirection).to receive(:find).and_raise(error)
84
- expect(configurer.run).to eq(0)
97
+ it "does not download plugins when specified environment is not vaild on server" do
98
+ expect(configurer).to receive(:valid_server_environment?).and_return(false)
99
+ expect(configurer).not_to receive(:download_plugins)
100
+ configurer.run(:pluginsync => true)
85
101
  end
86
102
 
87
103
  it "fails the run if pluginsync fails when usecacheonfailure is false" do
@@ -125,7 +141,6 @@ describe Puppet::Configurer do
125
141
  it "applies a cached catalog when it can't connect to the master" do
126
142
  error = Errno::ECONNREFUSED.new('Connection refused - connect(2)')
127
143
 
128
- expect(Puppet::Node.indirection).to receive(:find).and_raise(error)
129
144
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_cache => true)).and_raise(error)
130
145
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_terminus => true)).and_return(catalog)
131
146
 
@@ -149,6 +164,126 @@ describe Puppet::Configurer do
149
164
  expect(report.host).to eq('node_name_from_fact')
150
165
  end
151
166
 
167
+ it "should warn the user when the fact value length limits are exceeded" do
168
+ Puppet[:fact_name_length_soft_limit] = 0
169
+ Puppet[:fact_value_length_soft_limit] = 1
170
+ Puppet[:top_level_facts_soft_limit] = 0
171
+ Puppet[:number_of_facts_soft_limit] = 0
172
+ Puppet[:payload_soft_limit] = 0
173
+
174
+ facts.values = { 'processors' => {
175
+ 'cores' => 1,
176
+ 'count' => 2,
177
+ 'isa' => "i386",
178
+ 'models' => [
179
+ "CPU1 @ 2.80GHz"
180
+ ],
181
+ 'physicalcount' => 4 }
182
+ }
183
+ Puppet::Node::Facts.indirection.save(facts)
184
+
185
+ expect(Puppet).to receive(:warning).with(/Fact value '.+' with the value length: '[1-9]*' exceeds the value length limit: [1-9]*/).twice
186
+ configurer.run
187
+ end
188
+
189
+ it "should warn the user when the payload limits are exceeded" do
190
+ Puppet[:fact_name_length_soft_limit] = 0
191
+ Puppet[:fact_value_length_soft_limit] = 0
192
+ Puppet[:top_level_facts_soft_limit] = 0
193
+ Puppet[:number_of_facts_soft_limit] = 0
194
+ Puppet[:payload_soft_limit] = 1
195
+
196
+ facts.values = { 'processors' => {
197
+ 'cores' => 1,
198
+ 'count' => 2,
199
+ 'isa' => "i386",
200
+ 'models' => [
201
+ "CPU1 @ 2.80GHz"
202
+ ],
203
+ 'physicalcount' => 4 }
204
+ }
205
+ Puppet::Node::Facts.indirection.save(facts)
206
+
207
+ expect(Puppet).to receive(:warning).with(/Payload with the current size of: '\d*' exceeds the payload size limit: \d*/)
208
+ configurer.run
209
+ end
210
+
211
+ it "should warn the user when the total number of facts limit is exceeded" do
212
+ Puppet[:fact_name_length_soft_limit] = 0
213
+ Puppet[:fact_value_length_soft_limit] = 0
214
+ Puppet[:top_level_facts_soft_limit] = 0
215
+ Puppet[:number_of_facts_soft_limit] = 1
216
+ Puppet[:payload_soft_limit] = 0
217
+
218
+ facts.values = {
219
+ 'processors' => {
220
+ 'cores' => 1,
221
+ 'count' => 2,
222
+ 'isa' => "i386",
223
+ 'models' => [
224
+ "CPU1 @ 2.80GHz",
225
+ "CPU1 @ 2.80GHz",
226
+ "CPU1 @ 2.80GHz",
227
+ "CPU1 @ 2.80GHz",
228
+ "CPU1 @ 2.80GHz",
229
+ {
230
+ 'processors' => {
231
+ 'cores' => [1,2]
232
+ }
233
+ }
234
+ ],
235
+ 'physicalcount' => 4
236
+ }
237
+ }
238
+ Puppet::Node::Facts.indirection.save(facts)
239
+
240
+ expect(Puppet).to receive(:warning).with(/The current total number of facts: [1-9]* exceeds the number of facts limit: [1-9]*/)
241
+ configurer.run
242
+ end
243
+
244
+ it "should warn the user when the top level facts size limits are exceeded" do
245
+ Puppet[:fact_name_length_soft_limit] = 0
246
+ Puppet[:fact_value_length_soft_limit] = 0
247
+ Puppet[:top_level_facts_soft_limit] = 1
248
+ Puppet[:number_of_facts_soft_limit] = 0
249
+ Puppet[:payload_soft_limit] = 0
250
+
251
+ facts.values = {'my_new_fact_name' => 'my_new_fact_value',
252
+ 'my_new_fact_name2' => 'my_new_fact_value2'}
253
+ Puppet::Node::Facts.indirection.save(facts)
254
+
255
+ expect(Puppet).to receive(:warning).with(/The current number of top level facts: [1-9]* exceeds the top facts limit: [1-9]*/)
256
+ configurer.run
257
+ end
258
+
259
+ it "should warn the user when the fact name length limits are exceeded" do
260
+ Puppet[:fact_name_length_soft_limit] = 1
261
+ Puppet[:fact_value_length_soft_limit] = 0
262
+ Puppet[:top_level_facts_soft_limit] = 0
263
+ Puppet[:number_of_facts_soft_limit] = 0
264
+ Puppet[:payload_soft_limit] = 0
265
+
266
+ facts.values = {'my_new_fact_name' => 'my_new_fact_value'}
267
+ Puppet::Node::Facts.indirection.save(facts)
268
+
269
+ expect(Puppet).to receive(:warning).with(/Fact .+ with length: '[1-9]*' exceeds the length limit: [1-9]*/)
270
+ configurer.run
271
+ end
272
+
273
+ it "shouldn't warn the user when the fact limit settings are set to 0" do
274
+ Puppet[:fact_name_length_soft_limit] = 0
275
+ Puppet[:fact_value_length_soft_limit] = 0
276
+ Puppet[:top_level_facts_soft_limit] = 0
277
+ Puppet[:number_of_facts_soft_limit] = 0
278
+ Puppet[:payload_soft_limit] = 0
279
+
280
+ facts.values = {'my_new_fact_name' => 'my_new_fact_value'}
281
+ Puppet::Node::Facts.indirection.save(facts)
282
+
283
+ expect(Puppet).not_to receive(:warning)
284
+ configurer.run
285
+ end
286
+
152
287
  it "creates a new report when applying the catalog" do
153
288
  options = {}
154
289
  configurer.run(options)
@@ -461,7 +596,7 @@ describe Puppet::Configurer do
461
596
  it "should save the report if reporting is enabled" do
462
597
  Puppet.settings[:report] = true
463
598
 
464
- expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash))
599
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash)).twice
465
600
  configurer.send_report(report)
466
601
  end
467
602
 
@@ -489,12 +624,22 @@ describe Puppet::Configurer do
489
624
  it "should log but not fail if saving the report fails" do
490
625
  Puppet.settings[:report] = true
491
626
 
492
- expect(Puppet::Transaction::Report.indirection).to receive(:save).and_raise("whatever")
627
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_cache: true)).and_raise("whatever")
628
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_terminus: true))
493
629
 
494
630
  configurer.send_report(report)
495
631
 
496
632
  expect(@logs).to include(an_object_having_attributes(level: :err, message: 'Could not send report: whatever'))
497
633
  end
634
+
635
+ it "should save the cached report if fails to send the report" do
636
+ allow(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_terminus: true)).and_call_original
637
+ allow(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_cache: true)).and_raise("whatever")
638
+
639
+ expect(File).to_not be_exist(Puppet[:lastrunfile])
640
+ configurer.send_report(report)
641
+ expect(File.read(Puppet[:lastrunfile])).to match(/puppet: #{Puppet::PUPPETVERSION}/)
642
+ end
498
643
  end
499
644
 
500
645
  describe "when saving the summary report file" do
@@ -553,24 +698,6 @@ describe Puppet::Configurer do
553
698
  end
554
699
  end
555
700
 
556
- describe "when requesting a node" do
557
- it "uses the transaction uuid in the request" do
558
- expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(transaction_uuid: anything)).twice
559
- configurer.run
560
- end
561
-
562
- it "sends an explicitly configured environment request" do
563
- expect(Puppet.settings).to receive(:set_by_config?).with(:environment).and_return(true)
564
- expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(configured_environment: Puppet[:environment])).twice
565
- configurer.run
566
- end
567
-
568
- it "does not send a configured_environment when using the default" do
569
- expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(configured_environment: nil)).twice
570
- configurer.run
571
- end
572
- end
573
-
574
701
  def expects_pluginsync
575
702
  metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":420,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
576
703
  stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
@@ -581,7 +708,7 @@ describe Puppet::Configurer do
581
708
  end
582
709
 
583
710
  def expects_new_catalog_only(catalog)
584
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
711
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true, check_environment: true)).and_return(catalog)
585
712
  expect(Puppet::Resource::Catalog.indirection).not_to receive(:find).with(anything, hash_including(ignore_terminus: true))
586
713
  end
587
714
 
@@ -598,7 +725,7 @@ describe Puppet::Configurer do
598
725
  def expects_fallback_to_new_catalog(catalog)
599
726
  expects_pluginsync
600
727
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(nil)
601
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
728
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true, check_environment: true)).and_return(catalog)
602
729
  end
603
730
 
604
731
  def expects_neither_new_or_cached_catalog
@@ -622,21 +749,13 @@ describe Puppet::Configurer do
622
749
  configurer.run
623
750
  end
624
751
 
625
- it "should not make a node request or pluginsync when a cached catalog is successfully retrieved" do
626
- expect(Puppet::Node.indirection).not_to receive(:find)
752
+ it "should not pluginsync when a cached catalog is successfully retrieved" do
627
753
  expects_cached_catalog_only(catalog)
628
754
  expect(configurer).not_to receive(:download_plugins)
629
755
 
630
756
  configurer.run
631
757
  end
632
758
 
633
- it "should make a node request and pluginsync when a cached catalog cannot be retrieved" do
634
- expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
635
- expects_fallback_to_new_catalog(catalog)
636
-
637
- configurer.run
638
- end
639
-
640
759
  it "should set its cached_catalog_status to 'explicitly_requested'" do
641
760
  expects_cached_catalog_only(catalog)
642
761
 
@@ -672,7 +791,6 @@ describe Puppet::Configurer do
672
791
  it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
673
792
  Puppet[:ignore_plugin_errors] = true
674
793
 
675
- expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
676
794
  expects_neither_new_or_cached_catalog
677
795
  expects_pluginsync
678
796
 
@@ -728,16 +846,6 @@ describe Puppet::Configurer do
728
846
  Puppet.settings[:strict_environment_mode] = true
729
847
  end
730
848
 
731
- it "should not make a node request" do
732
- stub_request(:get, %r{/puppet/v3/file_metadatas?/plugins}).to_return(:status => 404)
733
- stub_request(:get, %r{/puppet/v3/file_metadatas?/pluginfacts}).to_return(:status => 404)
734
- expects_new_catalog_only(catalog)
735
-
736
- expect(Puppet::Node.indirection).not_to receive(:find)
737
-
738
- configurer.run
739
- end
740
-
741
849
  it "should return nil when the catalog's environment doesn't match the agent specified environment" do
742
850
  Puppet[:environment] = 'second_env'
743
851
  configurer = Puppet::Configurer.new
@@ -771,7 +879,7 @@ describe Puppet::Configurer do
771
879
  expect(configurer.run).to be_nil
772
880
  end
773
881
 
774
- it "should proceed with the cached catalog if its environment matchs the local environment" do
882
+ it "should proceed with the cached catalog if its environment matches the local environment" do
775
883
  expects_cached_catalog_only(catalog)
776
884
 
777
885
  expect(configurer.run).to eq(0)
@@ -951,9 +1059,23 @@ describe Puppet::Configurer do
951
1059
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(apple, banana, banana)
952
1060
 
953
1061
  allow(Puppet).to receive(:notice)
1062
+ allow(Puppet).to receive(:push_context)
954
1063
  expect(Puppet).to receive(:notice).with("Local environment: 'production' doesn't match server specified environment 'apple', restarting agent run with environment 'apple'")
955
1064
  expect(Puppet).to receive(:notice).with("Local environment: 'apple' doesn't match server specified environment 'banana', restarting agent run with environment 'banana'")
956
1065
 
1066
+ expect(Puppet).to receive(:push_context).with(
1067
+ hash_including(current_environment: an_object_having_attributes(name: :production)),
1068
+ 'Local node environment production for configurer transaction'
1069
+ )
1070
+ expect(Puppet).to receive(:push_context).with(
1071
+ hash_including(current_environment: an_object_having_attributes(name: :apple)),
1072
+ 'Local node environment apple for configurer transaction'
1073
+ )
1074
+ expect(Puppet).to receive(:push_context).with(
1075
+ hash_including(current_environment: an_object_having_attributes(name: :banana)),
1076
+ 'Local node environment banana for configurer transaction'
1077
+ )
1078
+
957
1079
  configurer.run
958
1080
  end
959
1081
 
@@ -1110,20 +1232,194 @@ describe Puppet::Configurer do
1110
1232
  expect(configurer.run(options)).to eq(0)
1111
1233
  expect(options[:report].server_used).to be_nil
1112
1234
  end
1235
+ end
1113
1236
 
1114
- it "should not make multiple node requests when the server is found" do
1115
- Puppet.settings[:server_list] = ["myserver:123"]
1237
+ describe "when selecting an environment" do
1238
+ include PuppetSpec::Settings
1116
1239
 
1117
- Puppet::Node.indirection.terminus_class = :rest
1118
- Puppet::Resource::Catalog.indirection.terminus_class = :rest
1240
+ describe "when the last used environment is available" do
1241
+ let(:last_server_specified_environment) { 'development' }
1119
1242
 
1120
- stub_request(:get, 'https://myserver:123/status/v1/simple/server').to_return(status: 200)
1121
- stub_request(:post, %r{https://myserver:123/puppet/v3/catalog}).to_return(status: 200)
1122
- node_request = stub_request(:get, %r{https://myserver:123/puppet/v3/node/}).to_return(status: 200)
1243
+ before do
1244
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1245
+ ---
1246
+ version:
1247
+ config: 1624882680
1248
+ puppet: 6.24.0
1249
+ application:
1250
+ initial_environment: #{Puppet[:environment]}
1251
+ converged_environment: #{last_server_specified_environment}
1252
+ run_mode: agent
1253
+ SUMMARY
1123
1254
 
1124
- configurer.run
1255
+ expect(Puppet::Node.indirection).not_to receive(:find)
1256
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1257
+ end
1258
+
1259
+ it "prefers the environment set via cli" do
1260
+ Puppet.settings.handlearg('--environment', 'usethis')
1261
+ configurer.run
1262
+
1263
+ expect(configurer.environment).to eq('usethis')
1264
+ end
1265
+
1266
+ it "prefers the environment set via lastrunfile over config" do
1267
+ FileUtils.mkdir_p(Puppet[:confdir])
1268
+ set_puppet_conf(Puppet[:confdir], <<~CONF)
1269
+ [main]
1270
+ environment = usethis
1271
+ lastrunfile = #{Puppet[:lastrunfile]}
1272
+ CONF
1273
+
1274
+ Puppet.initialize_settings
1275
+ configurer.run
1276
+
1277
+ expect(configurer.environment).to eq(last_server_specified_environment)
1278
+ end
1279
+
1280
+ it "uses the environment from Puppet[:environment] if given a catalog" do
1281
+ configurer.run(catalog: catalog)
1282
+
1283
+ expect(configurer.environment).to eq(Puppet[:environment])
1284
+ end
1285
+
1286
+ it "uses the environment from Puppet[:environment] if use_cached_catalog = true" do
1287
+ Puppet[:use_cached_catalog] = true
1288
+ expects_cached_catalog_only(catalog)
1289
+ configurer.run
1290
+
1291
+ expect(configurer.environment).to eq(Puppet[:environment])
1292
+ end
1293
+
1294
+ describe "when the environment is not set via CLI" do
1295
+ it "uses the environment found in lastrunfile if the key exists" do
1296
+ configurer.run
1297
+
1298
+ expect(configurer.environment).to eq(last_server_specified_environment)
1299
+ end
1300
+
1301
+ it "pushes the converged environment found in lastrunfile over the existing context" do
1302
+ initial_env = Puppet::Node::Environment.remote('production')
1303
+ Puppet.push_context(
1304
+ current_environment: initial_env,
1305
+ loaders: Puppet::Pops::Loaders.new(initial_env, true))
1306
+
1307
+ expect(Puppet).to receive(:push_context).with(
1308
+ hash_including(:current_environment, :loaders),
1309
+ "Local node environment #{last_server_specified_environment} for configurer transaction"
1310
+ ).once.and_call_original
1311
+
1312
+ configurer.run
1313
+ end
1125
1314
 
1126
- expect(node_request).to have_been_requested.once
1315
+ it "uses the environment from Puppet[:environment] if strict_environment_mode is set" do
1316
+ Puppet[:strict_environment_mode] = true
1317
+ configurer.run
1318
+
1319
+ expect(configurer.environment).to eq(Puppet[:environment])
1320
+ end
1321
+
1322
+ it "uses the environment from Puppet[:environment] if initial_environment is the same as converged_environment" do
1323
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1324
+ ---
1325
+ version:
1326
+ config: 1624882680
1327
+ puppet: 6.24.0
1328
+ application:
1329
+ initial_environment: development
1330
+ converged_environment: development
1331
+ run_mode: agent
1332
+ SUMMARY
1333
+ configurer.run
1334
+
1335
+ expect(configurer.environment).to eq(Puppet[:environment])
1336
+ end
1337
+ end
1338
+ end
1339
+
1340
+ describe "when the last used environment is not available" do
1341
+ describe "when the node request succeeds" do
1342
+ let(:node_environment) { Puppet::Node::Environment.remote(:salam) }
1343
+ let(:node) { Puppet::Node.new(Puppet[:node_name_value]) }
1344
+ let(:last_server_specified_environment) { 'development' }
1345
+
1346
+ before do
1347
+ node.environment = node_environment
1348
+
1349
+ allow(Puppet::Node.indirection).to receive(:find)
1350
+ allow(Puppet::Node.indirection).to receive(:find)
1351
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1352
+ .and_return(node)
1353
+ end
1354
+
1355
+ it "uses the environment from the node request if the run mode doesn't match" do
1356
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1357
+ ---
1358
+ version:
1359
+ config: 1624882680
1360
+ puppet: 6.24.0
1361
+ application:
1362
+ initial_environment: #{Puppet[:environment]}
1363
+ converged_environment: #{last_server_specified_environment}
1364
+ run_mode: user
1365
+ SUMMARY
1366
+ configurer.run
1367
+
1368
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1369
+ end
1370
+
1371
+ it "uses the environment from the node request if lastrunfile does not contain the expected keys" do
1372
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1373
+ ---
1374
+ version:
1375
+ config: 1624882680
1376
+ puppet: 6.24.0
1377
+ SUMMARY
1378
+ configurer.run
1379
+
1380
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1381
+ end
1382
+
1383
+ it "uses the environment from the node request if lastrunfile is invalid YAML" do
1384
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1385
+ Key: 'this is my very very very ' +
1386
+ 'long string'
1387
+ SUMMARY
1388
+ configurer.run
1389
+
1390
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1391
+ end
1392
+
1393
+ it "uses the environment from the node request if lastrunfile exists but is empty" do
1394
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', '')
1395
+ configurer.run
1396
+
1397
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1398
+ end
1399
+
1400
+ it "uses the environment from the node request if the last used one cannot be found" do
1401
+ Puppet[:lastrunfile] = tmpfile('last_run_summary.yaml')
1402
+ configurer.run
1403
+
1404
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1405
+ end
1406
+ end
1407
+
1408
+ describe "when the node request fails" do
1409
+ before do
1410
+ allow(Puppet::Node.indirection).to receive(:find).and_call_original
1411
+ allow(Puppet::Node.indirection).to receive(:find)
1412
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1413
+ .and_raise(Puppet::Error)
1414
+ end
1415
+
1416
+ it "uses the environment from Puppet[:environment] if the last used one cannot be found" do
1417
+ Puppet[:lastrunfile] = tmpfile('last_run_summary.yaml')
1418
+ configurer.run
1419
+
1420
+ expect(configurer.environment).to eq(Puppet[:environment])
1421
+ end
1422
+ end
1127
1423
  end
1128
1424
  end
1129
1425
  end