puppet 6.15.0-x86-mingw32 → 6.19.1-x86-mingw32

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 (418) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/Gemfile +4 -2
  4. data/Gemfile.lock +29 -27
  5. data/README.md +3 -4
  6. data/Rakefile +4 -12
  7. data/lib/puppet.rb +32 -8
  8. data/lib/puppet/agent.rb +18 -4
  9. data/lib/puppet/agent/locker.rb +0 -7
  10. data/lib/puppet/application/agent.rb +23 -8
  11. data/lib/puppet/application/apply.rb +18 -20
  12. data/lib/puppet/application/device.rb +1 -1
  13. data/lib/puppet/application/doc.rb +1 -1
  14. data/lib/puppet/application/lookup.rb +16 -4
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/ssl.rb +1 -1
  17. data/lib/puppet/configurer.rb +61 -21
  18. data/lib/puppet/configurer/downloader.rb +31 -10
  19. data/lib/puppet/confine.rb +2 -2
  20. data/lib/puppet/confine/any.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +119 -39
  24. data/lib/puppet/environments.rb +51 -10
  25. data/lib/puppet/face/catalog.rb +1 -1
  26. data/lib/puppet/face/config.rb +46 -16
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/help.rb +29 -3
  29. data/lib/puppet/face/module/search.rb +5 -0
  30. data/lib/puppet/face/node.rb +3 -3
  31. data/lib/puppet/face/node/clean.rb +2 -2
  32. data/lib/puppet/face/plugin.rb +1 -1
  33. data/lib/puppet/face/status.rb +1 -1
  34. data/lib/puppet/feature/base.rb +1 -1
  35. data/lib/puppet/file_bucket/dipper.rb +1 -1
  36. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  37. data/lib/puppet/file_serving/metadata.rb +4 -1
  38. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  39. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  40. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  41. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  42. data/lib/puppet/file_system/file_impl.rb +4 -4
  43. data/lib/puppet/file_system/uniquefile.rb +12 -16
  44. data/lib/puppet/forge.rb +1 -1
  45. data/lib/puppet/forge/cache.rb +1 -1
  46. data/lib/puppet/forge/repository.rb +4 -7
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/lstrip.rb +4 -4
  49. data/lib/puppet/functions/new.rb +8 -3
  50. data/lib/puppet/functions/reverse_each.rb +1 -1
  51. data/lib/puppet/functions/rstrip.rb +4 -4
  52. data/lib/puppet/functions/step.rb +1 -1
  53. data/lib/puppet/functions/strip.rb +4 -4
  54. data/lib/puppet/gettext/config.rb +5 -5
  55. data/lib/puppet/gettext/module_translations.rb +4 -4
  56. data/lib/puppet/http.rb +1 -0
  57. data/lib/puppet/http/client.rb +28 -12
  58. data/lib/puppet/http/external_client.rb +0 -6
  59. data/lib/puppet/http/redirector.rb +9 -7
  60. data/lib/puppet/http/resolver.rb +5 -8
  61. data/lib/puppet/http/resolver/server_list.rb +18 -36
  62. data/lib/puppet/http/resolver/settings.rb +4 -4
  63. data/lib/puppet/http/resolver/srv.rb +5 -5
  64. data/lib/puppet/http/response.rb +19 -0
  65. data/lib/puppet/http/service.rb +3 -1
  66. data/lib/puppet/http/service/compiler.rb +1 -1
  67. data/lib/puppet/http/service/file_server.rb +1 -1
  68. data/lib/puppet/http/service/puppetserver.rb +39 -0
  69. data/lib/puppet/http/session.rb +5 -4
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/facts/facter.rb +3 -3
  74. data/lib/puppet/indirector/facts/yaml.rb +1 -1
  75. data/lib/puppet/indirector/file_content/http.rb +5 -0
  76. data/lib/puppet/indirector/file_content/rest.rb +1 -1
  77. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  78. data/lib/puppet/indirector/file_metadata/rest.rb +2 -2
  79. data/lib/puppet/indirector/hiera.rb +4 -0
  80. data/lib/puppet/indirector/indirection.rb +1 -1
  81. data/lib/puppet/indirector/json.rb +1 -1
  82. data/lib/puppet/indirector/msgpack.rb +1 -1
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/request.rb +5 -5
  85. data/lib/puppet/indirector/rest.rb +7 -1
  86. data/lib/puppet/indirector/yaml.rb +1 -1
  87. data/lib/puppet/module.rb +1 -2
  88. data/lib/puppet/network/format_support.rb +2 -2
  89. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  90. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  91. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  92. data/lib/puppet/network/http/compression.rb +7 -0
  93. data/lib/puppet/network/http/connection.rb +2 -0
  94. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  95. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  96. data/lib/puppet/network/http/route.rb +2 -2
  97. data/lib/puppet/network/http_pool.rb +2 -2
  98. data/lib/puppet/node/environment.rb +12 -5
  99. data/lib/puppet/node/facts.rb +17 -0
  100. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  101. data/lib/puppet/pal/pal_impl.rb +31 -4
  102. data/lib/puppet/parameter.rb +1 -1
  103. data/lib/puppet/parser/ast/leaf.rb +5 -5
  104. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  105. data/lib/puppet/parser/compiler.rb +29 -26
  106. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  107. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  108. data/lib/puppet/parser/environment_compiler.rb +4 -1
  109. data/lib/puppet/parser/functions.rb +21 -17
  110. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  111. data/lib/puppet/parser/functions/filter.rb +1 -0
  112. data/lib/puppet/parser/resource.rb +3 -2
  113. data/lib/puppet/parser/resource/param.rb +6 -0
  114. data/lib/puppet/parser/type_loader.rb +2 -2
  115. data/lib/puppet/pops/adaptable.rb +7 -13
  116. data/lib/puppet/pops/adapters.rb +8 -4
  117. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  118. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  119. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  120. data/lib/puppet/pops/issues.rb +5 -0
  121. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  122. data/lib/puppet/pops/loaders.rb +18 -11
  123. data/lib/puppet/pops/lookup/context.rb +1 -1
  124. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  125. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  126. data/lib/puppet/pops/types/iterable.rb +34 -8
  127. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  128. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  129. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  130. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  131. data/lib/puppet/provider/file/windows.rb +1 -1
  132. data/lib/puppet/provider/package/aix.rb +17 -2
  133. data/lib/puppet/provider/package/apt.rb +38 -1
  134. data/lib/puppet/provider/package/aptitude.rb +1 -1
  135. data/lib/puppet/provider/package/dnfmodule.rb +24 -4
  136. data/lib/puppet/provider/package/dpkg.rb +1 -1
  137. data/lib/puppet/provider/package/gem.rb +4 -2
  138. data/lib/puppet/provider/package/pip.rb +60 -37
  139. data/lib/puppet/provider/package/pip2.rb +17 -0
  140. data/lib/puppet/provider/package/portage.rb +2 -2
  141. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  142. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  143. data/lib/puppet/provider/package/yum.rb +9 -1
  144. data/lib/puppet/provider/package/zypper.rb +62 -1
  145. data/lib/puppet/provider/service/systemd.rb +21 -4
  146. data/lib/puppet/provider/service/windows.rb +23 -7
  147. data/lib/puppet/provider/user/aix.rb +1 -1
  148. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  149. data/lib/puppet/provider/user/useradd.rb +16 -5
  150. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  151. data/lib/puppet/reports/http.rb +7 -3
  152. data/lib/puppet/resource.rb +2 -1
  153. data/lib/puppet/resource/type.rb +10 -1
  154. data/lib/puppet/rest/route.rb +2 -2
  155. data/lib/puppet/runtime.rb +25 -2
  156. data/lib/puppet/settings.rb +43 -6
  157. data/lib/puppet/ssl/ssl_context.rb +2 -2
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  159. data/lib/puppet/ssl/state_machine.rb +33 -8
  160. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  161. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  162. data/lib/puppet/test/test_helper.rb +19 -14
  163. data/lib/puppet/transaction.rb +2 -2
  164. data/lib/puppet/transaction/persistence.rb +1 -1
  165. data/lib/puppet/transaction/report.rb +12 -8
  166. data/lib/puppet/trusted_external.rb +29 -1
  167. data/lib/puppet/type.rb +15 -7
  168. data/lib/puppet/type/file.rb +40 -15
  169. data/lib/puppet/type/file/checksum.rb +4 -4
  170. data/lib/puppet/type/file/source.rb +33 -13
  171. data/lib/puppet/type/filebucket.rb +1 -1
  172. data/lib/puppet/type/notify.rb +2 -2
  173. data/lib/puppet/type/package.rb +16 -1
  174. data/lib/puppet/type/service.rb +59 -8
  175. data/lib/puppet/type/user.rb +19 -10
  176. data/lib/puppet/util.rb +41 -3
  177. data/lib/puppet/util/autoload.rb +10 -25
  178. data/lib/puppet/util/character_encoding.rb +9 -5
  179. data/lib/puppet/util/checksums.rb +19 -4
  180. data/lib/puppet/util/connection.rb +8 -8
  181. data/lib/puppet/util/execution.rb +2 -2
  182. data/lib/puppet/util/fileparsing.rb +2 -2
  183. data/lib/puppet/util/log/destinations.rb +1 -10
  184. data/lib/puppet/util/package/version/range.rb +4 -1
  185. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  186. data/lib/puppet/util/provider_features.rb +1 -1
  187. data/lib/puppet/util/reference.rb +1 -1
  188. data/lib/puppet/util/run_mode.rb +5 -1
  189. data/lib/puppet/util/windows.rb +1 -0
  190. data/lib/puppet/util/windows/api_types.rb +60 -33
  191. data/lib/puppet/util/windows/eventlog.rb +1 -6
  192. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  193. data/lib/puppet/util/windows/principal.rb +8 -6
  194. data/lib/puppet/util/windows/registry.rb +11 -11
  195. data/lib/puppet/util/windows/security.rb +4 -4
  196. data/lib/puppet/util/windows/service.rb +43 -26
  197. data/lib/puppet/util/windows/user.rb +242 -8
  198. data/lib/puppet/version.rb +1 -1
  199. data/locales/puppet.pot +541 -427
  200. data/man/man5/puppet.conf.5 +84 -19
  201. data/man/man8/puppet-agent.8 +7 -4
  202. data/man/man8/puppet-apply.8 +1 -1
  203. data/man/man8/puppet-catalog.8 +1 -1
  204. data/man/man8/puppet-config.8 +6 -6
  205. data/man/man8/puppet-describe.8 +1 -1
  206. data/man/man8/puppet-device.8 +1 -1
  207. data/man/man8/puppet-doc.8 +1 -1
  208. data/man/man8/puppet-epp.8 +1 -1
  209. data/man/man8/puppet-facts.8 +1 -1
  210. data/man/man8/puppet-filebucket.8 +1 -1
  211. data/man/man8/puppet-generate.8 +1 -1
  212. data/man/man8/puppet-help.8 +6 -3
  213. data/man/man8/puppet-key.8 +1 -1
  214. data/man/man8/puppet-lookup.8 +2 -2
  215. data/man/man8/puppet-man.8 +1 -1
  216. data/man/man8/puppet-module.8 +4 -1
  217. data/man/man8/puppet-node.8 +4 -4
  218. data/man/man8/puppet-parser.8 +1 -1
  219. data/man/man8/puppet-plugin.8 +1 -1
  220. data/man/man8/puppet-report.8 +1 -1
  221. data/man/man8/puppet-resource.8 +1 -1
  222. data/man/man8/puppet-script.8 +1 -1
  223. data/man/man8/puppet-ssl.8 +1 -1
  224. data/man/man8/puppet-status.8 +2 -2
  225. data/man/man8/puppet.8 +2 -2
  226. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  227. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  228. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  229. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  230. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-enabled.txt → dnf-module-list.txt} +6 -0
  231. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  232. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  233. data/spec/integration/application/agent_spec.rb +202 -52
  234. data/spec/integration/application/apply_spec.rb +149 -149
  235. data/spec/integration/application/config_spec.rb +74 -0
  236. data/spec/integration/application/doc_spec.rb +16 -6
  237. data/spec/integration/application/filebucket_spec.rb +70 -21
  238. data/spec/integration/application/help_spec.rb +42 -0
  239. data/spec/integration/application/lookup_spec.rb +13 -0
  240. data/spec/integration/application/module_spec.rb +68 -0
  241. data/spec/integration/application/plugin_spec.rb +75 -2
  242. data/spec/integration/configurer_spec.rb +14 -0
  243. data/spec/integration/data_binding_spec.rb +82 -0
  244. data/spec/integration/defaults_spec.rb +27 -3
  245. data/spec/integration/directory_environments_spec.rb +17 -17
  246. data/spec/integration/http/client_spec.rb +6 -1
  247. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  248. data/spec/integration/network/http_pool_spec.rb +73 -0
  249. data/spec/integration/node/environment_spec.rb +1 -1
  250. data/spec/integration/parser/compiler_spec.rb +11 -0
  251. data/spec/integration/type/file_spec.rb +1 -1
  252. data/spec/integration/util/execution_spec.rb +22 -0
  253. data/spec/integration/util/windows/adsi_spec.rb +7 -2
  254. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  255. data/spec/integration/util/windows/process_spec.rb +26 -32
  256. data/spec/integration/util/windows/registry_spec.rb +7 -7
  257. data/spec/integration/util/windows/user_spec.rb +47 -5
  258. data/spec/integration/util_spec.rb +7 -33
  259. data/spec/lib/puppet_spec/https.rb +6 -0
  260. data/spec/lib/puppet_spec/matchers.rb +0 -80
  261. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  262. data/spec/shared_contexts/types_setup.rb +2 -0
  263. data/spec/unit/agent_spec.rb +47 -1
  264. data/spec/unit/application/agent_spec.rb +7 -8
  265. data/spec/unit/application/doc_spec.rb +2 -2
  266. data/spec/unit/application/face_base_spec.rb +6 -4
  267. data/spec/unit/application/facts_spec.rb +41 -10
  268. data/spec/unit/application/man_spec.rb +52 -0
  269. data/spec/unit/application/resource_spec.rb +3 -1
  270. data/spec/unit/application/ssl_spec.rb +15 -2
  271. data/spec/unit/application_spec.rb +9 -4
  272. data/spec/unit/configurer/downloader_spec.rb +10 -0
  273. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  274. data/spec/unit/configurer_spec.rb +86 -37
  275. data/spec/unit/confine_spec.rb +2 -1
  276. data/spec/unit/context/trusted_information_spec.rb +25 -2
  277. data/spec/unit/daemon_spec.rb +5 -64
  278. data/spec/unit/environments_spec.rb +99 -32
  279. data/spec/unit/face/config_spec.rb +59 -1
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/node_spec.rb +2 -2
  282. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  283. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  284. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  285. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  286. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  287. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  288. data/spec/unit/file_system_spec.rb +1 -2
  289. data/spec/unit/http/client_spec.rb +74 -19
  290. data/spec/unit/http/external_client_spec.rb +9 -9
  291. data/spec/unit/http/resolver_spec.rb +24 -5
  292. data/spec/unit/http/response_spec.rb +6 -0
  293. data/spec/unit/http/service/ca_spec.rb +2 -3
  294. data/spec/unit/http/service/compiler_spec.rb +2 -3
  295. data/spec/unit/http/service/file_server_spec.rb +2 -3
  296. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  297. data/spec/unit/http/service/report_spec.rb +2 -3
  298. data/spec/unit/http/service_spec.rb +0 -1
  299. data/spec/unit/http/session_spec.rb +8 -21
  300. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  301. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  302. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  303. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  304. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  305. data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
  306. data/spec/unit/indirector/json_spec.rb +8 -8
  307. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  308. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  309. data/spec/unit/indirector/request_spec.rb +5 -5
  310. data/spec/unit/indirector/rest_spec.rb +14 -1
  311. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  312. data/spec/unit/indirector/yaml_spec.rb +7 -7
  313. data/spec/unit/interface_spec.rb +3 -3
  314. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  315. data/spec/unit/network/format_support_spec.rb +3 -2
  316. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  317. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  318. data/spec/unit/network/http/connection_spec.rb +552 -190
  319. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  320. data/spec/unit/network/http_pool_spec.rb +63 -57
  321. data/spec/unit/network/http_spec.rb +1 -1
  322. data/spec/unit/node/environment_spec.rb +18 -1
  323. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  324. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  325. data/spec/unit/parser/scope_spec.rb +1 -1
  326. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  327. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  328. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  329. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  330. data/spec/unit/provider/exec_spec.rb +4 -3
  331. data/spec/unit/provider/package/aix_spec.rb +29 -0
  332. data/spec/unit/provider/package/apt_spec.rb +77 -0
  333. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  334. data/spec/unit/provider/package/dnfmodule_spec.rb +25 -5
  335. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  336. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  337. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  338. data/spec/unit/provider/package/pip_spec.rb +42 -16
  339. data/spec/unit/provider/package/portage_spec.rb +5 -0
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  341. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  342. data/spec/unit/provider/package/yum_spec.rb +47 -8
  343. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  344. data/spec/unit/provider/service/base_spec.rb +2 -4
  345. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  346. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  347. data/spec/unit/provider/service/debian_spec.rb +3 -5
  348. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  349. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  350. data/spec/unit/provider/service/init_spec.rb +46 -5
  351. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  352. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  353. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  354. data/spec/unit/provider/service/openwrt_spec.rb +2 -1
  355. data/spec/unit/provider/service/redhat_spec.rb +10 -1
  356. data/spec/unit/provider/service/runit_spec.rb +2 -1
  357. data/spec/unit/provider/service/smf_spec.rb +1 -1
  358. data/spec/unit/provider/service/src_spec.rb +3 -5
  359. data/spec/unit/provider/service/systemd_spec.rb +87 -19
  360. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  361. data/spec/unit/provider/service/windows_spec.rb +50 -14
  362. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  363. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  364. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  365. data/spec/unit/puppet_pal_2pec.rb +40 -0
  366. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  367. data/spec/unit/puppet_spec.rb +33 -0
  368. data/spec/unit/reports/http_spec.rb +1 -1
  369. data/spec/unit/reports/store_spec.rb +17 -13
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/rest/route_spec.rb +4 -4
  372. data/spec/unit/settings_spec.rb +182 -22
  373. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  374. data/spec/unit/ssl/state_machine_spec.rb +52 -8
  375. data/spec/unit/test/test_helper_spec.rb +17 -0
  376. data/spec/unit/transaction/persistence_spec.rb +15 -0
  377. data/spec/unit/transaction/report_spec.rb +3 -1
  378. data/spec/unit/type/file/source_spec.rb +4 -4
  379. data/spec/unit/type/file_spec.rb +122 -96
  380. data/spec/unit/type/filebucket_spec.rb +1 -1
  381. data/spec/unit/type/service_spec.rb +218 -8
  382. data/spec/unit/type/user_spec.rb +32 -3
  383. data/spec/unit/type_spec.rb +50 -0
  384. data/spec/unit/util/autoload_spec.rb +2 -1
  385. data/spec/unit/util/character_encoding_spec.rb +4 -4
  386. data/spec/unit/util/checksums_spec.rb +16 -0
  387. data/spec/unit/util/command_line_spec.rb +11 -6
  388. data/spec/unit/util/log/destinations_spec.rb +1 -29
  389. data/spec/unit/util/package/version/range_spec.rb +22 -1
  390. data/spec/unit/util/run_mode_spec.rb +6 -6
  391. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  392. data/spec/unit/util/windows/service_spec.rb +4 -4
  393. data/spec/unit/util_spec.rb +3 -3
  394. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  395. data/tasks/manpages.rake +5 -35
  396. metadata +43 -49
  397. data/spec/integration/faces/config_spec.rb +0 -91
  398. data/spec/integration/faces/documentation_spec.rb +0 -57
  399. data/spec/integration/file_bucket/file_spec.rb +0 -50
  400. data/spec/integration/file_serving/content_spec.rb +0 -7
  401. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  402. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  403. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  404. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  405. data/spec/integration/module_tool/forge_spec.rb +0 -51
  406. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  407. data/spec/integration/provider/service/init_spec.rb +0 -48
  408. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  409. data/spec/integration/provider/service/windows_spec.rb +0 -50
  410. data/spec/integration/reference/providers_spec.rb +0 -21
  411. data/spec/integration/reports_spec.rb +0 -13
  412. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  413. data/spec/integration/ssl/host_spec.rb +0 -72
  414. data/spec/integration/ssl/key_spec.rb +0 -99
  415. data/spec/integration/test/test_helper_spec.rb +0 -31
  416. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  417. data/spec/unit/face/man_spec.rb +0 -25
  418. data/spec/unit/man_spec.rb +0 -31
@@ -18,18 +18,18 @@ class Loaders
18
18
  attr_reader :private_environment_loader
19
19
  attr_reader :environment
20
20
 
21
- def self.new(environment, for_agent = false)
21
+ def self.new(environment, for_agent = false, load_from_pcore = true)
22
22
  environment.lock.synchronize do
23
23
  obj = environment.loaders
24
24
  if obj.nil?
25
25
  obj = self.allocate
26
- obj.send(:initialize, environment, for_agent)
26
+ obj.send(:initialize, environment, for_agent, load_from_pcore)
27
27
  end
28
28
  obj
29
29
  end
30
30
  end
31
31
 
32
- def initialize(environment, for_agent)
32
+ def initialize(environment, for_agent, load_from_pcore = true)
33
33
  # Protect against environment havoc
34
34
  raise ArgumentError.new(_("Attempt to redefine already initialized loaders for environment")) unless environment.loaders.nil?
35
35
  environment.loaders = self
@@ -51,12 +51,13 @@ class Loaders
51
51
  # TODO: loaders need to work when also running in an agent doing catalog application. There is no
52
52
  # concept of environment the same way as when running as a master (except when doing apply).
53
53
  # The creation mechanisms should probably differ between the two.
54
- @private_environment_loader = if for_agent
55
- @puppet_cache_loader = create_puppet_cache_loader()
56
- create_environment_loader(environment, @puppet_cache_loader)
57
- else
58
- create_environment_loader(environment, @puppet_system_loader)
59
- end
54
+ @private_environment_loader =
55
+ if for_agent
56
+ @puppet_cache_loader = create_puppet_cache_loader
57
+ create_environment_loader(environment, @puppet_cache_loader, load_from_pcore)
58
+ else
59
+ create_environment_loader(environment, @puppet_system_loader, load_from_pcore)
60
+ end
60
61
 
61
62
  Pcore.init_env(@private_environment_loader)
62
63
 
@@ -362,7 +363,7 @@ class Loaders
362
363
  Loader::ModuleLoaders.cached_loader_from(puppet_system_loader, self)
363
364
  end
364
365
 
365
- def create_environment_loader(environment, parent_loader)
366
+ def create_environment_loader(environment, parent_loader, load_from_pcore = true)
366
367
  # This defines where to start parsing/evaluating - the "initial import" (to use 3x terminology)
367
368
  # Is either a reference to a single .pp file, or a directory of manifests. If the environment becomes
368
369
  # a module and can hold functions, types etc. then these are available across all other modules without
@@ -387,7 +388,13 @@ class Loaders
387
388
  else
388
389
  # Create the 3.x resource type loader
389
390
  static_loader.runtime_3_init
390
- @runtime3_type_loader = add_loader_by_name(Loader::Runtime3TypeLoader.new(parent_loader, self, environment, env_conf.nil? ? nil : env_path))
391
+ # Create pcore resource type loader, if applicable
392
+ pcore_resource_type_loader = if load_from_pcore && env_path
393
+ Loader::ModuleLoaders.pcore_resource_type_loader_from(parent_loader, self, env_path)
394
+ else
395
+ nil
396
+ end
397
+ @runtime3_type_loader = add_loader_by_name(Loader::Runtime3TypeLoader.new(parent_loader, self, environment, pcore_resource_type_loader))
391
398
 
392
399
  if env_path.nil?
393
400
  # Not a real directory environment, cannot work as a module TODO: Drop when legacy env are dropped?
@@ -47,7 +47,7 @@ class EnvironmentContext < Adaptable::Adapter
47
47
  file_data = @file_data_cache[path]
48
48
  stat = Puppet::FileSystem.stat(path)
49
49
  unless file_data && file_data.valid?(stat)
50
- Puppet.debug("File at '#{path}' was changed, reloading") if file_data
50
+ Puppet.debug { "File at '#{path}' was changed, reloading" } if file_data
51
51
  content = Puppet::FileSystem.read(path, :encoding => 'utf-8')
52
52
  file_data = FileData.new(path, stat.ino, stat.mtime, stat.size, block_given? ? yield(content) : content)
53
53
  @file_data_cache[path] = file_data
@@ -46,6 +46,7 @@ class HieraConfig
46
46
  KEY_DATADIR = 'datadir'.freeze
47
47
  KEY_DEFAULT_HIERARCHY = 'default_hierarchy'.freeze
48
48
  KEY_HIERARCHY = 'hierarchy'.freeze
49
+ KEY_PLAN_HIERARCHY = 'plan_hierarchy'.freeze
49
50
  KEY_LOGGER = 'logger'.freeze
50
51
  KEY_OPTIONS = 'options'.freeze
51
52
  KEY_PATH = 'path'.freeze
@@ -580,6 +581,7 @@ class HieraConfigV5 < HieraConfig
580
581
  tf.optional(KEY_OPTIONS) => tf.hash_kv(option_name_t, tf.data),
581
582
  }),
582
583
  tf.optional(KEY_HIERARCHY) => hierarchy_t,
584
+ tf.optional(KEY_PLAN_HIERARCHY) => hierarchy_t,
583
585
  tf.optional(KEY_DEFAULT_HIERARCHY) => hierarchy_t
584
586
  })
585
587
  end
@@ -600,7 +602,15 @@ class HieraConfigV5 < HieraConfig
600
602
  return data_providers
601
603
  end
602
604
 
603
- @config[use_default_hierarchy ? KEY_DEFAULT_HIERARCHY : KEY_HIERARCHY].each do |he|
605
+ compiler = Puppet.lookup(:pal_compiler) { nil }
606
+ config_key = if compiler.is_a?(Puppet::Pal::ScriptCompiler) && !@config[KEY_PLAN_HIERARCHY].nil?
607
+ KEY_PLAN_HIERARCHY
608
+ elsif use_default_hierarchy
609
+ KEY_DEFAULT_HIERARCHY
610
+ else
611
+ KEY_HIERARCHY
612
+ end
613
+ @config[config_key].each do |he|
604
614
  name = he[KEY_NAME]
605
615
  if data_providers.include?(name)
606
616
  first_line = find_line_matching(/\s+name:\s+['"]?#{name}(?:[^\w]|$)/)
@@ -691,6 +701,9 @@ class HieraConfigV5 < HieraConfig
691
701
  defaults = config[KEY_DEFAULTS]
692
702
  validate_defaults(defaults) unless defaults.nil?
693
703
  config[KEY_HIERARCHY].each { |he| validate_hierarchy(he, defaults, owner) }
704
+ if config.include?(KEY_PLAN_HIERARCHY)
705
+ config[KEY_PLAN_HIERARCHY].each { |he| validate_hierarchy(he, defaults, owner) }
706
+ end
694
707
 
695
708
  if config.include?(KEY_DEFAULT_HIERARCHY)
696
709
  unless owner.is_a?(ModuleDataProvider)
@@ -248,6 +248,8 @@ class ResourceTypeImpl
248
248
  #######################
249
249
 
250
250
  # Applications are not supported
251
+ #
252
+ # @deprecated application orchestration will be removed in puppet 7
251
253
  def application?
252
254
  false
253
255
  end
@@ -23,13 +23,16 @@ module Puppet::Pops::Types
23
23
  #
24
24
  # An `ArgumentError` is raised for all other objects.
25
25
  #
26
- # @param o [Object] The object to produce an `Iterable` for
26
+ # @param my_caller [Object] The calling object to reference in errors
27
+ # @param obj [Object] The object to produce an `Iterable` for
28
+ # @param infer_elements [Boolean] Whether or not to recursively infer all elements of obj. Optional
29
+ #
27
30
  # @return [Iterable,nil] The produced `Iterable`
28
31
  # @raise [ArgumentError] In case an `Iterable` cannot be produced
29
32
  # @api public
30
- def self.asserted_iterable(caller, obj)
31
- iter = self.on(obj)
32
- raise ArgumentError, "#{caller.class}(): wrong argument type (#{obj.class}; is not Iterable." if iter.nil?
33
+ def self.asserted_iterable(my_caller, obj, infer_elements = false)
34
+ iter = self.on(obj, nil, infer_elements)
35
+ raise ArgumentError, "#{my_caller.class}(): wrong argument type (#{obj.class}; is not Iterable." if iter.nil?
33
36
  iter
34
37
  end
35
38
 
@@ -48,11 +51,14 @@ module Puppet::Pops::Types
48
51
  # The value `nil` is returned for all other objects.
49
52
  #
50
53
  # @param o [Object] The object to produce an `Iterable` for
51
- # @param element_type [PAnyType] the element type for the iterator. Optional (inferred if not provided)
54
+ # @param element_type [PAnyType] the element type for the iterator. Optional
55
+ # @param infer_elements [Boolean] if element_type is nil, whether or not to recursively
56
+ # infer types for the entire collection. Optional
57
+ #
52
58
  # @return [Iterable,nil] The produced `Iterable` or `nil` if it couldn't be produced
53
59
  #
54
60
  # @api public
55
- def self.on(o, element_type = nil)
61
+ def self.on(o, element_type = nil, infer_elements = true)
56
62
  case o
57
63
  when IteratorProducer
58
64
  o.iterator
@@ -64,7 +70,7 @@ module Puppet::Pops::Types
64
70
  if o.empty?
65
71
  Iterator.new(PUnitType::DEFAULT, o.each)
66
72
  else
67
- if element_type.nil?
73
+ if element_type.nil? && infer_elements
68
74
  tc = TypeCalculator.singleton
69
75
  element_type = PVariantType.maybe_create(o.map {|e| tc.infer_set(e) })
70
76
  end
@@ -75,7 +81,7 @@ module Puppet::Pops::Types
75
81
  if o.empty?
76
82
  HashIterator.new(PHashType::DEFAULT_KEY_PAIR_TUPLE, o.each)
77
83
  else
78
- if element_type.nil?
84
+ if element_type.nil? && infer_elements
79
85
  tc = TypeCalculator.singleton
80
86
  element_type = PTupleType.new([
81
87
  PVariantType.maybe_create(o.keys.map {|e| tc.infer_set(e) }),
@@ -202,6 +208,26 @@ module Puppet::Pops::Types
202
208
  @enumeration.send(name, *arguments, &block)
203
209
  end
204
210
 
211
+ def next
212
+ @enumeration.next
213
+ end
214
+
215
+ def map(*args, &block)
216
+ @enumeration.map(*args, &block)
217
+ end
218
+
219
+ def reduce(*args, &block)
220
+ @enumeration.reduce(*args, &block)
221
+ end
222
+
223
+ def all?(&block)
224
+ @enumeration.all?(&block)
225
+ end
226
+
227
+ def any?(&block)
228
+ @enumeration.any?(&block)
229
+ end
230
+
205
231
  def step(step, &block)
206
232
  raise ArgumentError if step <= 0
207
233
  r = self
@@ -22,7 +22,7 @@ class PMetaType < PAnyType
22
22
  end
23
23
 
24
24
  def instance?(o, guard = nil)
25
- assignable?(TypeCalculator.infer(o), guard)
25
+ raise NotImplementedError, "Subclass of PMetaType should implement 'instance?'"
26
26
  end
27
27
 
28
28
  # Called from the TypeParser once it has found a type using the Loader. The TypeParser will
@@ -349,6 +349,10 @@ class PTypeSetType < PMetaType
349
349
  self.class == o.class && @name_authority == o.name_authority && @name == o.name && @version == o.version
350
350
  end
351
351
 
352
+ def instance?(o, guard = nil)
353
+ o.is_a?(PTypeSetType)
354
+ end
355
+
352
356
  DEFAULT = self.new({
353
357
  KEY_NAME => 'DefaultTypeSet',
354
358
  KEY_NAME_AUTHORITY => Pcore::RUNTIME_NAME_AUTHORITY,
@@ -199,6 +199,11 @@ class Checker4_0 < Evaluator::LiteralEvaluator
199
199
  end
200
200
  end
201
201
 
202
+ def check_Application(o)
203
+ check_NamedDefinition(o)
204
+ acceptor.accept(Issues::DEPRECATED_APP_ORCHESTRATION, o, {:klass => o})
205
+ end
206
+
202
207
  def check_AssignmentExpression(o)
203
208
  case o.operator
204
209
  when '='
@@ -296,6 +301,7 @@ class Checker4_0 < Evaluator::LiteralEvaluator
296
301
  end
297
302
 
298
303
  def check_CapabilityMapping(o)
304
+ acceptor.accept(Issues::DEPRECATED_APP_ORCHESTRATION, o, {:klass => o})
299
305
  ok =
300
306
  case o.component
301
307
  when Model::QualifiedReference
@@ -589,36 +595,40 @@ class Checker4_0 < Evaluator::LiteralEvaluator
589
595
  # @api private
590
596
  class Puppet::Util::FileNamespaceAdapter < Puppet::Pops::Adaptable::Adapter
591
597
  attr_accessor :file_to_namespace
598
+
599
+ def self.create_adapter(env)
600
+ adapter = super(env)
601
+ adapter.file_to_namespace = {}
602
+ adapter
603
+ end
592
604
  end
593
605
 
594
606
  def namespace_for_file(file)
595
607
  env = Puppet.lookup(:current_environment)
596
608
  return NO_NAMESPACE if env.nil?
597
609
 
598
- Puppet::Util::FileNamespaceAdapter.adapt(env) do |adapter|
599
- adapter.file_to_namespace ||= {}
610
+ adapter = Puppet::Util::FileNamespaceAdapter.adapt(env)
600
611
 
601
- file_namespace = adapter.file_to_namespace[file]
602
- return file_namespace unless file_namespace.nil? # No cache entry, so we do the calculation
612
+ file_namespace = adapter.file_to_namespace[file]
613
+ return file_namespace unless file_namespace.nil? # No cache entry, so we do the calculation
603
614
 
604
- path = Pathname.new(file)
615
+ path = Pathname.new(file)
605
616
 
606
- return adapter.file_to_namespace[file] = NO_NAMESPACE if path.extname != ".pp"
617
+ return adapter.file_to_namespace[file] = NO_NAMESPACE if path.extname != ".pp"
607
618
 
608
- path = path.expand_path
619
+ path = path.expand_path
609
620
 
610
- return adapter.file_to_namespace[file] = NO_NAMESPACE if initial_manifest?(path, env.manifest)
621
+ return adapter.file_to_namespace[file] = NO_NAMESPACE if initial_manifest?(path, env.manifest)
611
622
 
612
- #All auto-loaded files from modules come from a module search path dir
613
- relative_path = get_module_relative_path(path, env.full_modulepath)
623
+ #All auto-loaded files from modules come from a module search path dir
624
+ relative_path = get_module_relative_path(path, env.full_modulepath)
614
625
 
615
- return adapter.file_to_namespace[file] = NO_NAMESPACE if relative_path == NO_PATH
626
+ return adapter.file_to_namespace[file] = NO_NAMESPACE if relative_path == NO_PATH
616
627
 
617
- #If a file comes from a module, but isn't in the right place, always error
618
- names = dir_to_names(relative_path)
628
+ #If a file comes from a module, but isn't in the right place, always error
629
+ names = dir_to_names(relative_path)
619
630
 
620
- return adapter.file_to_namespace[file] = (names == BAD_MODULE_FILE ? BAD_MODULE_FILE : names.join("::").freeze)
621
- end
631
+ return adapter.file_to_namespace[file] = (names == BAD_MODULE_FILE ? BAD_MODULE_FILE : names.join("::").freeze)
622
632
  end
623
633
 
624
634
  def initial_manifest?(path, manifest_setting)
@@ -865,6 +875,10 @@ class Checker4_0 < Evaluator::LiteralEvaluator
865
875
  rvalue(o.matching_expr)
866
876
  end
867
877
 
878
+ def check_SiteDefinition(o)
879
+ acceptor.accept(Issues::DEPRECATED_APP_ORCHESTRATION, o, {:klass => o})
880
+ end
881
+
868
882
  def check_UnaryExpression(o)
869
883
  rvalue(o.expr)
870
884
  end
@@ -31,6 +31,7 @@ class ValidatorFactory_4_0 < Factory
31
31
  p[Issues::RT_NO_STORECONFIGS] = Puppet[:storeconfigs] ? :ignore : :warning
32
32
 
33
33
  p[Issues::FUTURE_RESERVED_WORD] = :deprecation
34
+ p[Issues::DEPRECATED_APP_ORCHESTRATION] = :deprecation
34
35
 
35
36
  p[Issues::DUPLICATE_KEY] = Puppet[:strict] == :off ? :ignore : Puppet[:strict]
36
37
  p[Issues::NAME_WITH_HYPHEN] = :error
@@ -126,7 +126,7 @@ Puppet::Type.type(:file).provide :windows do
126
126
  # If the SYSTEM account does _not_ have FullControl in this scenario, we should
127
127
  # force the resource out of sync no matter what.
128
128
  #TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
129
- Puppet.debug _("%{resource_name}: %{mode_part_type} set to SYSTEM. SYSTEM permissions cannot be set below FullControl ('7')") % { resource_name: resource[:name], mode_part_type: mode_part['type']}
129
+ Puppet.debug { _("%{resource_name}: %{mode_part_type} set to SYSTEM. SYSTEM permissions cannot be set below FullControl ('7')") % { resource_name: resource[:name], mode_part_type: mode_part['type']} }
130
130
  return nil
131
131
  end
132
132
  end
@@ -29,6 +29,15 @@ Puppet::Type.type(:package).provide :aix, :parent => Puppet::Provider::Package d
29
29
 
30
30
  attr_accessor :latest_info
31
31
 
32
+ STATE_CODE = {
33
+ 'A' => :applied,
34
+ 'B' => :broken,
35
+ 'C' => :committed,
36
+ 'E' => :efix_locked,
37
+ 'O' => :obsolete,
38
+ '?' => :inconsistent,
39
+ }.freeze
40
+
32
41
  def self.srclistcmd(source)
33
42
  [ command(:installp), "-L", "-d", source ]
34
43
  end
@@ -97,6 +106,11 @@ Puppet::Type.type(:package).provide :aix, :parent => Puppet::Provider::Package d
97
106
  if output =~ /^#{Regexp.escape(@resource[:name])}\s+.*\s+Already superseded by.*$/
98
107
  self.fail _("aix package provider is unable to downgrade packages")
99
108
  end
109
+
110
+ pkg_info = query
111
+ if pkg_info && [:broken, :inconsistent].include?(pkg_info[:status])
112
+ self.fail _("Package '%{name}' is in a %{status} state and requires manual intervention") % { name: @resource[:name], status: pkg_info[:status] }
113
+ end
100
114
  end
101
115
 
102
116
  def self.pkglist(hash = {})
@@ -108,8 +122,9 @@ Puppet::Type.type(:package).provide :aix, :parent => Puppet::Provider::Package d
108
122
  end
109
123
 
110
124
  begin
111
- list = execute(cmd).scan(/^[^#][^:]*:([^:]*):([^:]*)/).collect { |n,e|
112
- { :name => n, :ensure => e, :provider => self.name }
125
+ list = execute(cmd).scan(/^[^#][^:]*:([^:]*):([^:]*):[^:]*:[^:]*:([^:])/).collect { |n,e,s|
126
+ e = :absent if [:broken, :inconsistent].include?(STATE_CODE[s])
127
+ { :name => n, :ensure => e, :status => STATE_CODE[s], :provider => self.name }
113
128
  }
114
129
  rescue Puppet::ExecutionFailure => detail
115
130
  if hash[:pkgname]
@@ -16,6 +16,7 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
16
16
 
17
17
  commands :aptget => "/usr/bin/apt-get"
18
18
  commands :aptcache => "/usr/bin/apt-cache"
19
+ commands :aptmark => "/usr/bin/apt-mark"
19
20
  commands :preseed => "/usr/bin/debconf-set-selections"
20
21
 
21
22
  defaultfor :osfamily => :debian
@@ -30,6 +31,39 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
30
31
  false
31
32
  end
32
33
 
34
+ def self.instances
35
+ packages = super
36
+ manual_marks = aptmark('showmanual').split("\n")
37
+ packages.each do |package|
38
+ package.mark = :manual if manual_marks.include?(package.name)
39
+ end
40
+ packages
41
+ end
42
+
43
+ def query
44
+ hash = super
45
+ hash[:mark] = :manual if aptmark('showmanual').split("\n").include?(@resource[:name])
46
+ hash
47
+ end
48
+
49
+ def initialize(value={})
50
+ super(value)
51
+ @property_flush = {}
52
+ end
53
+
54
+ def mark=(value)
55
+ @property_flush[:mark] = value
56
+ end
57
+
58
+ def flush
59
+ # unless we are removing the package mark it if it hasn't already been marked
60
+ if @property_flush
61
+ unless @property_flush[:mark] || [:purge, :absent].include?(resource[:ensure])
62
+ aptmark('manual', resource[:name])
63
+ end
64
+ end
65
+ end
66
+
33
67
  # A derivative of DPKG; this is how most people actually manage
34
68
  # Debian boxes, and the only thing that differs is that it can
35
69
  # install packages from remote sites.
@@ -77,7 +111,10 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
77
111
  if should.is_a?(String)
78
112
  begin
79
113
  should_range = VersionRange.parse(should, DebianVersion)
80
- should = best_version(should_range)
114
+
115
+ unless should_range.is_a?(VersionRange::Eq)
116
+ should = best_version(should_range)
117
+ end
81
118
  rescue VersionRange::ValidationFailure, DebianVersion::ValidationFailure
82
119
  Puppet.debug("Cannot parse #{should} as a debian version range, falling through")
83
120
  end
@@ -16,7 +16,7 @@ Puppet::Type.type(:package).provide :aptitude, :parent => :apt, :source => :dpkg
16
16
  output = aptitude(*args)
17
17
 
18
18
  # Yay, stupid aptitude doesn't throw an error when the package is missing.
19
- if args.include?(:install) and output =~ /Couldn't find any package/
19
+ if args.include?(:install) and output.to_s =~ /Couldn't find any package/
20
20
  raise Puppet::Error.new(
21
21
  _("Could not find package %{name}") % { name: self.name }
22
22
  )
@@ -12,7 +12,7 @@ require 'puppet/provider/package'
12
12
 
13
13
  Puppet::Type.type(:package).provide :dnfmodule, :parent => :dnf do
14
14
 
15
- has_feature :installable, :uninstallable, :versionable, :supports_flavors
15
+ has_feature :installable, :uninstallable, :versionable, :supports_flavors, :disableable
16
16
  #has_feature :upgradeable
17
17
  # it's not (yet) feasible to make this upgradeable since module streams don't
18
18
  # always have matching version types (i.e. idm has streams DL1 and client,
@@ -34,10 +34,10 @@ Puppet::Type.type(:package).provide :dnfmodule, :parent => :dnf do
34
34
 
35
35
  def self.instances
36
36
  packages = []
37
- cmd = "#{command(:dnf)} module list --enabled -d 0 -e #{error_level}"
37
+ cmd = "#{command(:dnf)} module list -d 0 -e #{error_level}"
38
38
  execute(cmd).each_line do |line|
39
39
  # select only lines with actual packages since DNF clutters the output
40
- next unless line =~ /\[[ei]\][, ]/
40
+ next unless line =~ /\[[eix]\][, ]/
41
41
  line.gsub!(/\[d\]/, '') # we don't care about the default flag
42
42
 
43
43
  flavor = if line.include?('[i]')
@@ -48,7 +48,11 @@ Puppet::Type.type(:package).provide :dnfmodule, :parent => :dnf do
48
48
 
49
49
  packages << new(
50
50
  name: line.split[0],
51
- ensure: line.split[1],
51
+ ensure: if line.include?('[x]')
52
+ :disabled
53
+ else
54
+ line.split[1]
55
+ end,
52
56
  flavor: flavor,
53
57
  provider: name
54
58
  )
@@ -98,6 +102,18 @@ Puppet::Type.type(:package).provide :dnfmodule, :parent => :dnf do
98
102
  end
99
103
  end
100
104
 
105
+ # should only get here when @resource[ensure] is :disabled
106
+ def insync?(is)
107
+ if resource[:ensure] == :disabled
108
+ # in sync only if package is already disabled
109
+ pkg = self.class.instances.find do |package|
110
+ @resource[:name] == package.name && package.properties[:ensure] == :disabled
111
+ end
112
+ return true if pkg
113
+ end
114
+ return false
115
+ end
116
+
101
117
  def enable(args = @resource[:name])
102
118
  execute([command(:dnf), 'module', 'enable', '-d', '0', '-e', self.class.error_level, '-y', args])
103
119
  end
@@ -107,6 +123,10 @@ Puppet::Type.type(:package).provide :dnfmodule, :parent => :dnf do
107
123
  reset # reset module to the default stream
108
124
  end
109
125
 
126
+ def disable(args = @resource[:name])
127
+ execute([command(:dnf), 'module', 'disable', '-d', '0', '-e', self.class.error_level, '-y', args])
128
+ end
129
+
110
130
  def reset
111
131
  execute([command(:dnf), 'module', 'reset', '-d', '0', '-e', self.class.error_level, '-y', @resource[:name]])
112
132
  end