puppetlabs-onceover 5.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. checksums.yaml +7 -0
  2. data/.devcontainer/devcontainer.json +31 -0
  3. data/.gitattributes +2 -0
  4. data/.github/workflows/ci.yml +81 -0
  5. data/.github/workflows/mend.yml +14 -0
  6. data/.github/workflows/nightly.yml +66 -0
  7. data/.github/workflows/release.yaml +16 -0
  8. data/.github/workflows/release_prep.yml +20 -0
  9. data/.gitignore +19 -0
  10. data/.rubocop.yml +19 -0
  11. data/.rubocop_todo.yml +804 -0
  12. data/.vscode/extensions.json +4 -0
  13. data/ARCHIVE.md +395 -0
  14. data/CHANGELOG.md +25 -0
  15. data/CODEOWNERS +2 -0
  16. data/Gemfile +65 -0
  17. data/LICENSE +202 -0
  18. data/README.md +965 -0
  19. data/Rakefile +86 -0
  20. data/bin/puppetlabs-onceover +17 -0
  21. data/cucumber.yml +1 -0
  22. data/factsets/AIX-6.1-powerpc.json +210 -0
  23. data/factsets/AIX-7.1-powerpc.json +215 -0
  24. data/factsets/Amazon-2018.03.json +420 -0
  25. data/factsets/CentOS-5.11-32.json +263 -0
  26. data/factsets/CentOS-5.11-64.json +263 -0
  27. data/factsets/CentOS-6.6-32.json +306 -0
  28. data/factsets/CentOS-6.6-64.json +342 -0
  29. data/factsets/CentOS-7.0-64.json +352 -0
  30. data/factsets/CentOS-8.3.2011-64.json +485 -0
  31. data/factsets/Debian-10.4-64.json +476 -0
  32. data/factsets/Debian-6.0.10-32.json +322 -0
  33. data/factsets/Debian-6.0.10-64.json +322 -0
  34. data/factsets/Debian-7.8-32.json +338 -0
  35. data/factsets/Debian-7.8-64.json +338 -0
  36. data/factsets/Debian-8.11-64.json +480 -0
  37. data/factsets/Debian-9.12-64.json +476 -0
  38. data/factsets/RHEL-6.7.json +415 -0
  39. data/factsets/RHEL-7.4.json +489 -0
  40. data/factsets/SLES-11.3-64.json +317 -0
  41. data/factsets/SLES-12.1-64.json +353 -0
  42. data/factsets/Ubuntu-12.04-32.json +328 -0
  43. data/factsets/Ubuntu-12.04-64.json +328 -0
  44. data/factsets/Ubuntu-14.04-32.json +337 -0
  45. data/factsets/Ubuntu-14.04-64.json +373 -0
  46. data/factsets/Ubuntu-18.04-64.json +556 -0
  47. data/factsets/Ubuntu-20.04-64.json +504 -0
  48. data/factsets/Windows_Server-2008r2-64.json +184 -0
  49. data/factsets/Windows_Server-2012r2-64.json +165 -0
  50. data/factsets/solaris-10_u9-sparc-64.json +769 -0
  51. data/factsets/solaris-11.2-sparc-64.json +774 -0
  52. data/factsets/windows-10-64.json +104 -0
  53. data/features/auto_vendored.feature +27 -0
  54. data/features/cache.feature +38 -0
  55. data/features/factsets.feature +48 -0
  56. data/features/formatting.feature +36 -0
  57. data/features/help.feature +14 -0
  58. data/features/init.feature +18 -0
  59. data/features/show.feature +28 -0
  60. data/features/step_definitions/cache.rb +38 -0
  61. data/features/step_definitions/common.rb +123 -0
  62. data/features/step_definitions/formatter.rb +41 -0
  63. data/features/step_definitions/init.rb +17 -0
  64. data/features/step_definitions/run.rb +17 -0
  65. data/features/support/cache_helper.rb +54 -0
  66. data/features/support/command_helper.rb +32 -0
  67. data/features/support/controlrepo_helper.rb +36 -0
  68. data/features/support/env.rb +2 -0
  69. data/features/windows.feature +35 -0
  70. data/features/zzz_run.feature +93 -0
  71. data/lib/puppetlabs-onceover/beaker/spec_helper.rb +71 -0
  72. data/lib/puppetlabs-onceover/beaker.rb +241 -0
  73. data/lib/puppetlabs-onceover/class.rb +56 -0
  74. data/lib/puppetlabs-onceover/cli/init.rb +34 -0
  75. data/lib/puppetlabs-onceover/cli/plugins.rb +10 -0
  76. data/lib/puppetlabs-onceover/cli/run.rb +85 -0
  77. data/lib/puppetlabs-onceover/cli/show.rb +79 -0
  78. data/lib/puppetlabs-onceover/cli/update.rb +48 -0
  79. data/lib/puppetlabs-onceover/cli.rb +47 -0
  80. data/lib/puppetlabs-onceover/controlrepo.rb +688 -0
  81. data/lib/puppetlabs-onceover/deploy.rb +171 -0
  82. data/lib/puppetlabs-onceover/group.rb +78 -0
  83. data/lib/puppetlabs-onceover/logger.rb +32 -0
  84. data/lib/puppetlabs-onceover/node.rb +72 -0
  85. data/lib/puppetlabs-onceover/rake_tasks.rb +95 -0
  86. data/lib/puppetlabs-onceover/rspec/formatters.rb +315 -0
  87. data/lib/puppetlabs-onceover/runner.rb +139 -0
  88. data/lib/puppetlabs-onceover/test.rb +135 -0
  89. data/lib/puppetlabs-onceover/testconfig.rb +315 -0
  90. data/lib/puppetlabs-onceover/vendored_modules.rb +202 -0
  91. data/lib/puppetlabs-onceover/version.rb +5 -0
  92. data/puppetlabs-onceover.gemspec +40 -0
  93. data/spec/fixtures/controlrepos/basic/Puppetfile +17 -0
  94. data/spec/fixtures/controlrepos/basic/environment.conf +7 -0
  95. data/spec/fixtures/controlrepos/basic/hieradata/common.yaml +2 -0
  96. data/spec/fixtures/controlrepos/basic/hieradata/nodes/example-node.yaml +1 -0
  97. data/spec/fixtures/controlrepos/basic/manifests/site.pp +32 -0
  98. data/spec/fixtures/controlrepos/basic/manifests_alternate/site.pp +2 -0
  99. data/spec/fixtures/controlrepos/basic/site/profile/manifests/base.pp +5 -0
  100. data/spec/fixtures/controlrepos/basic/site/profile/manifests/example.pp +3 -0
  101. data/spec/fixtures/controlrepos/basic/site/role/manifests/database_server.pp +7 -0
  102. data/spec/fixtures/controlrepos/basic/site/role/manifests/example.pp +3 -0
  103. data/spec/fixtures/controlrepos/basic/site/role/manifests/webserver.pp +7 -0
  104. data/spec/fixtures/controlrepos/caching/.gitignore +1 -0
  105. data/spec/fixtures/controlrepos/caching/.travis.yml +2 -0
  106. data/spec/fixtures/controlrepos/caching/Gemfile +5 -0
  107. data/spec/fixtures/controlrepos/caching/Puppetfile +17 -0
  108. data/spec/fixtures/controlrepos/caching/Rakefile +1 -0
  109. data/spec/fixtures/controlrepos/caching/deleteme.txt +0 -0
  110. data/spec/fixtures/controlrepos/caching/environment.conf +2 -0
  111. data/spec/fixtures/controlrepos/caching/hieradata/common.yaml +2 -0
  112. data/spec/fixtures/controlrepos/caching/hieradata/nodes/example-node.yaml +1 -0
  113. data/spec/fixtures/controlrepos/caching/manifests/site.pp +33 -0
  114. data/spec/fixtures/controlrepos/caching/site/profile/manifests/base.pp +5 -0
  115. data/spec/fixtures/controlrepos/caching/site/profile/manifests/example.pp +3 -0
  116. data/spec/fixtures/controlrepos/caching/site/role/manifests/database_server.pp +7 -0
  117. data/spec/fixtures/controlrepos/caching/site/role/manifests/example.pp +3 -0
  118. data/spec/fixtures/controlrepos/caching/site/role/manifests/webserver.pp +7 -0
  119. data/spec/fixtures/controlrepos/caching/spec/factsets/Debian-10-facter-4.json +1091 -0
  120. data/spec/fixtures/controlrepos/caching/spec/factsets/README.md +7 -0
  121. data/spec/fixtures/controlrepos/caching/spec/onceover.yaml +55 -0
  122. data/spec/fixtures/controlrepos/caching/spec/pre_conditions/README.md +24 -0
  123. data/spec/fixtures/controlrepos/caching/spec/pre_conditions/escaping.pp +7 -0
  124. data/spec/fixtures/controlrepos/caching/spec/r10k.yaml +3 -0
  125. data/spec/fixtures/controlrepos/control_branch/Puppetfile +18 -0
  126. data/spec/fixtures/controlrepos/control_branch/environment.conf +2 -0
  127. data/spec/fixtures/controlrepos/custom_puppetfile/Puppetfile.custom +3 -0
  128. data/spec/fixtures/controlrepos/custom_puppetfile/environment.conf +7 -0
  129. data/spec/fixtures/controlrepos/factsets/environment.conf +1 -0
  130. data/spec/fixtures/controlrepos/factsets/site/profile/manifests/base.pp +6 -0
  131. data/spec/fixtures/controlrepos/factsets/site/role/manifests/example.pp +4 -0
  132. data/spec/fixtures/controlrepos/factsets/site/role/manifests/trusted_extensions.pp +6 -0
  133. data/spec/fixtures/controlrepos/factsets/site/role/manifests/trusted_external.pp +6 -0
  134. data/spec/fixtures/controlrepos/factsets/spec/factsets/README.md +7 -0
  135. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_notrusted.json +530 -0
  136. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_trusted_extensions_nested.json +535 -0
  137. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_trusted_extensions_top.json +533 -0
  138. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_trusted_external_nested.json +537 -0
  139. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_trusted_external_top.json +535 -0
  140. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos_7_facter_4.json +706 -0
  141. data/spec/fixtures/controlrepos/factsets/spec/factsets/centos_with_env.json +353 -0
  142. data/spec/fixtures/controlrepos/function_mocking/.gitignore +1 -0
  143. data/spec/fixtures/controlrepos/function_mocking/Puppetfile +4 -0
  144. data/spec/fixtures/controlrepos/function_mocking/Rakefile +1 -0
  145. data/spec/fixtures/controlrepos/function_mocking/environment.conf +2 -0
  146. data/spec/fixtures/controlrepos/function_mocking/site/profile/functions/fail_puppet.pp +5 -0
  147. data/spec/fixtures/controlrepos/function_mocking/site/profile/lib/puppet/functions/profile/fail_ruby.rb +9 -0
  148. data/spec/fixtures/controlrepos/function_mocking/site/profile/manifests/base.pp +10 -0
  149. data/spec/fixtures/controlrepos/function_mocking/site/role/manifests/fail.pp +7 -0
  150. data/spec/fixtures/controlrepos/function_mocking/site/role/manifests/test_data_return.pp +19 -0
  151. data/spec/fixtures/controlrepos/function_mocking/site/role/manifests/test_new_functions.pp +12 -0
  152. data/spec/fixtures/controlrepos/function_mocking/spec/onceover.yaml +50 -0
  153. data/spec/fixtures/controlrepos/minimal/environment.conf +2 -0
  154. data/spec/fixtures/controlrepos/puppet_controlrepo/.atom-build.json +9 -0
  155. data/spec/fixtures/controlrepos/puppet_controlrepo/.gitignore +5 -0
  156. data/spec/fixtures/controlrepos/puppet_controlrepo/.ruby-version +1 -0
  157. data/spec/fixtures/controlrepos/puppet_controlrepo/.travis.yml +13 -0
  158. data/spec/fixtures/controlrepos/puppet_controlrepo/Gemfile +22 -0
  159. data/spec/fixtures/controlrepos/puppet_controlrepo/Jenkinsfile +50 -0
  160. data/spec/fixtures/controlrepos/puppet_controlrepo/Puppetfile +102 -0
  161. data/spec/fixtures/controlrepos/puppet_controlrepo/README.md +4 -0
  162. data/spec/fixtures/controlrepos/puppet_controlrepo/Rakefile +33 -0
  163. data/spec/fixtures/controlrepos/puppet_controlrepo/data/common.yaml +558 -0
  164. data/spec/fixtures/controlrepos/puppet_controlrepo/data/datacenter/melbourne.yaml +12 -0
  165. data/spec/fixtures/controlrepos/puppet_controlrepo/data/datacenter/singapore.yaml +12 -0
  166. data/spec/fixtures/controlrepos/puppet_controlrepo/data/environments/development.yaml +3 -0
  167. data/spec/fixtures/controlrepos/puppet_controlrepo/data/environments/production.yaml +3 -0
  168. data/spec/fixtures/controlrepos/puppet_controlrepo/data/size/vol.large.yaml +27 -0
  169. data/spec/fixtures/controlrepos/puppet_controlrepo/environment.conf +3 -0
  170. data/spec/fixtures/controlrepos/puppet_controlrepo/hiera.yaml +25 -0
  171. data/spec/fixtures/controlrepos/puppet_controlrepo/manifests/site.pp +11 -0
  172. data/spec/fixtures/controlrepos/puppet_controlrepo/scripts/code_manager_config_version.rb +19 -0
  173. data/spec/fixtures/controlrepos/puppet_controlrepo/scripts/config_version.rb +25 -0
  174. data/spec/fixtures/controlrepos/puppet_controlrepo/scripts/config_version.sh +12 -0
  175. data/spec/fixtures/controlrepos/puppet_controlrepo/scripts/count_changed_classes.rb +26 -0
  176. data/spec/fixtures/controlrepos/puppet_controlrepo/scripts/get_changed_classes.rb +26 -0
  177. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/console/functions/user/token.pp +10 -0
  178. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/console/manifests/init.pp +14 -0
  179. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/console/manifests/user.pp +35 -0
  180. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/deployments/lib/puppet/functions/deployments/generate.rb +15 -0
  181. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/deployments/plans/signed_deployment.pp +126 -0
  182. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/facts.d/test.sh +2 -0
  183. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/files/artifactory/config_descriptor.xml +265 -0
  184. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/files/autosign.sh +23 -0
  185. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/files/hudson.tasks.Shell.xml +4 -0
  186. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/files/motd +4 -0
  187. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/files/polar_clock/index.html +198 -0
  188. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/apt.pp +9 -0
  189. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/aws_nodes.pp +54 -0
  190. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/base/aws.pp +9 -0
  191. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/base/rhel.pp +50 -0
  192. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/base/windows/hardening.pp +57 -0
  193. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/base/windows.pp +52 -0
  194. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/base.pp +79 -0
  195. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/cd4pe/artifactory.pp +64 -0
  196. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/cd4pe/connection.pp +95 -0
  197. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/cd4pe/haproxy.pp +65 -0
  198. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/cd4pe/replicated.pp +53 -0
  199. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/compile/balancer.pp +28 -0
  200. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/compile/master.pp +19 -0
  201. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/dns/host_record.pp +16 -0
  202. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/dns/server.pp +66 -0
  203. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/docker.pp +5 -0
  204. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/eyeunify/base.pp +43 -0
  205. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/eyeunify/core/database_connection.pp +42 -0
  206. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/eyeunify/core.pp +72 -0
  207. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/eyeunify/ctrl.pp +57 -0
  208. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/eyeunify/database.pp +32 -0
  209. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/eyeunify/exec.pp +11 -0
  210. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/file_sync/client.pp +165 -0
  211. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/file_sync/master_patch.pp +37 -0
  212. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/grafana/dashboard.pp +17 -0
  213. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/haproxy.pp +43 -0
  214. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/init.pp +3 -0
  215. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/jenkins/plugins.pp +87 -0
  216. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/jenkins.pp +65 -0
  217. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/jira/aio.pp +39 -0
  218. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/jira/app.pp +27 -0
  219. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/jira/db.pp +25 -0
  220. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/metrics/collectd/compile.pp +82 -0
  221. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/metrics/collectd.pp +28 -0
  222. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/metrics/dashboard.pp +28 -0
  223. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/mysql_server.pp +7 -0
  224. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/nginx.pp +24 -0
  225. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/polar_clock.pp +55 -0
  226. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/puppetmaster/api_auth.pp +82 -0
  227. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/puppetmaster/autosign.pp +33 -0
  228. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/puppetmaster/aws.pp +58 -0
  229. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/puppetmaster/tuning.pp +139 -0
  230. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/puppetmaster.pp +139 -0
  231. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/rvm.pp +13 -0
  232. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/sumologic.pp +11 -0
  233. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/sunburst/windows.pp +104 -0
  234. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/vagrant.pp +25 -0
  235. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/windows/webserver.pp +27 -0
  236. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/templates/cd4pe/connection_script.sh.epp +110 -0
  237. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/templates/controlrepo_deploy_jenkins_job.xml.epp +51 -0
  238. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/templates/dashboard.json.epp +403 -0
  239. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/templates/jenkins_secret_text.json.epp +1 -0
  240. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/templates/onceover_jenkins_job.xml.epp +51 -0
  241. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/templates/userdata.epp +17 -0
  242. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/cd4pe.pp +29 -0
  243. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/clock.pp +16 -0
  244. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/compile/balancer.pp +5 -0
  245. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/compile/master.pp +5 -0
  246. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/eyeunify/aio.pp +10 -0
  247. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/eyeunify/controller.pp +10 -0
  248. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/eyeunify/database.pp +7 -0
  249. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/eyeunify/exec.pp +6 -0
  250. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/init.pp +3 -0
  251. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/lb.pp +14 -0
  252. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/metrics.pp +5 -0
  253. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/mysql.pp +13 -0
  254. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/windows/base.pp +5 -0
  255. data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/windows/webserver.pp +6 -0
  256. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/.gitignore +5 -0
  257. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/acceptance/nodesets/onceover-nodes.yml +94 -0
  258. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/classes/test_spec.rb +8 -0
  259. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/factsets/CentOS-7.0-64-master-2017.3.2.json +531 -0
  260. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/factsets/CentOS-7.0-64-master.json +429 -0
  261. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/factsets/CentOS-7.0-64.json +353 -0
  262. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/factsets/Windows_Server-2008r2-64.json +184 -0
  263. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/factsets/Windows_Server-2012r2-64.json +165 -0
  264. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/hiera.yaml +18 -0
  265. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/matchers/file_matchers.rb +16 -0
  266. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/onceover.yaml +54 -0
  267. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/pre_conditions/site.pp +150 -0
  268. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/r10k.yaml +2 -0
  269. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/shared_examples/helper.rb +91 -0
  270. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/unit/00_parse_spec.rb +76 -0
  271. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/unit/01_linting_spec_example.rb +69 -0
  272. data/spec/fixtures/controlrepos/puppet_controlrepo/spec/unit/03_puppetfile_spec_example.rb +35 -0
  273. data/spec/fixtures/controlrepos/vendored/Puppetfile +3 -0
  274. data/spec/fixtures/controlrepos/vendored/Puppetfile.cron +5 -0
  275. data/spec/fixtures/controlrepos/vendored/environment.conf +1 -0
  276. data/spec/fixtures/controlrepos/vendored/site-modules/role/manifests/cron.pp +9 -0
  277. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/augeas_core-puppet_agent-7.30.0.json +1 -0
  278. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/augeas_core-puppet_agent-8.6.0.json +1 -0
  279. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/cron_core-puppet_agent-7.30.0.json +1 -0
  280. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/cron_core-puppet_agent-8.6.0.json +1 -0
  281. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/host_core-puppet_agent-7.30.0.json +1 -0
  282. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/host_core-puppet_agent-8.6.0.json +1 -0
  283. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/mount_core-puppet_agent-7.30.0.json +1 -0
  284. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/mount_core-puppet_agent-8.6.0.json +1 -0
  285. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/repo_tree-puppet_agent-7.30.0.json +1 -0
  286. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/repo_tree-puppet_agent-8.6.0.json +1 -0
  287. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/scheduled_task-puppet_agent-7.30.0.json +1 -0
  288. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/scheduled_task-puppet_agent-8.6.0.json +1 -0
  289. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/selinux_core-puppet_agent-7.30.0.json +1 -0
  290. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/selinux_core-puppet_agent-8.6.0.json +1 -0
  291. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/sshkeys_core-puppet_agent-7.30.0.json +1 -0
  292. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/sshkeys_core-puppet_agent-8.6.0.json +1 -0
  293. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/yumrepo_core-puppet_agent-7.30.0.json +1 -0
  294. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/yumrepo_core-puppet_agent-8.6.0.json +1 -0
  295. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/zfs_core-puppet_agent-7.30.0.json +1 -0
  296. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/zfs_core-puppet_agent-8.6.0.json +1 -0
  297. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/zone_core-puppet_agent-7.30.0.json +1 -0
  298. data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/zone_core-puppet_agent-8.6.0.json +1 -0
  299. data/spec/fixtures/controlrepos/windows/Gemfile +3 -0
  300. data/spec/fixtures/controlrepos/windows/Puppetfile +8 -0
  301. data/spec/fixtures/controlrepos/windows/environment.conf +1 -0
  302. data/spec/fixtures/controlrepos/windows/site/role/manifests/groups.pp +8 -0
  303. data/spec/fixtures/controlrepos/windows/site/role/manifests/users.pp +9 -0
  304. data/spec/fixtures/controlrepos/windows/site-modules/role/manifests/acl.pp +12 -0
  305. data/spec/fixtures/controlrepos/windows/site-modules/role/manifests/choco.pp +9 -0
  306. data/spec/fixtures/controlrepos/windows/site-modules/role/manifests/groups.pp +8 -0
  307. data/spec/fixtures/controlrepos/windows/site-modules/role/manifests/users.pp +9 -0
  308. data/spec/fixtures/controlrepos/windows/spec/onceover.yaml +24 -0
  309. data/spec/puppetlabs-onceover/controlrepo_spec.rb +18 -0
  310. data/spec/spec_helper.rb +8 -0
  311. data/templates/.fixtures.yml.erb +24 -0
  312. data/templates/Gemfile.erb +3 -0
  313. data/templates/Rakefile.erb +1 -0
  314. data/templates/acceptance_test_spec.rb.erb +66 -0
  315. data/templates/controlrepo.yaml.erb +38 -0
  316. data/templates/error_summary.yaml.erb +17 -0
  317. data/templates/factsets_README.md.erb +10 -0
  318. data/templates/nodeset.yaml.erb +12 -0
  319. data/templates/pre_conditions_README.md.erb +24 -0
  320. data/templates/spec_helper.rb.erb +35 -0
  321. data/templates/spec_helper_acceptance.rb.erb +1 -0
  322. data/templates/test_spec.rb.erb +150 -0
  323. data/templates/testconfig_Rakefile.erb +47 -0
  324. metadata +602 -0
@@ -0,0 +1,315 @@
1
+ require 'puppetlabs-onceover/class'
2
+ require 'puppetlabs-onceover/node'
3
+ require 'puppetlabs-onceover/group'
4
+ require 'puppetlabs-onceover/test'
5
+ require 'puppetlabs-onceover/logger'
6
+ require 'puppetlabs-onceover/controlrepo'
7
+ require 'git'
8
+ include PuppetlabsOnceover::Logger
9
+
10
+ class PuppetlabsOnceover
11
+ class TestConfig
12
+ require 'yaml'
13
+
14
+ attr_accessor :classes
15
+ attr_accessor :nodes
16
+ attr_accessor :node_groups
17
+ attr_accessor :class_groups
18
+ attr_accessor :spec_tests
19
+ attr_accessor :acceptance_tests
20
+ attr_accessor :environment
21
+ attr_accessor :opts
22
+ attr_accessor :filter_tags
23
+ attr_accessor :filter_classes
24
+ attr_accessor :filter_nodes
25
+ attr_accessor :mock_functions
26
+ attr_accessor :before_conditions
27
+ attr_accessor :after_conditions
28
+ attr_accessor :skip_r10k
29
+ attr_accessor :force
30
+ attr_accessor :fail_fast
31
+ attr_accessor :strict_variables
32
+ attr_accessor :formatters
33
+
34
+ def initialize(file, opts = {})
35
+ begin
36
+ config = YAML.safe_load_file(file, permitted_classes: [Symbol])
37
+ rescue Errno::ENOENT
38
+ raise "Could not find #{file}"
39
+ rescue Psych::SyntaxError
40
+ raise "Could not parse #{file}, check that it is valid YAML and that the encoding is correct"
41
+ end
42
+
43
+ @classes = []
44
+ @nodes = []
45
+ @node_groups = []
46
+ @class_groups = []
47
+ @spec_tests = []
48
+ @acceptance_tests = []
49
+ @opts = opts
50
+ @mock_functions = config['functions']
51
+ @before_conditions = config['before'] || []
52
+ @after_conditions = config['after']
53
+ @strict_variables = opts[:strict_variables] ? 'yes' : 'no'
54
+ @included_specs = [config['include_spec_files'] || ['**/*']].flatten
55
+
56
+ # Set dynamic defaults for format
57
+ if Array(opts[:format]) == [:defaults]
58
+ @formatters = opts[:parallel] ? ['PuppetlabsOnceoverFormatterParallel'] : ['PuppetlabsOnceoverFormatter']
59
+ else
60
+ @formatters = Array(opts[:format])
61
+ end
62
+
63
+ # Initialise all of the classes and nodes
64
+ config['classes'].each { |clarse| PuppetlabsOnceover::Class.new(clarse) } unless config['classes'] == nil
65
+ @classes = PuppetlabsOnceover::Class.all
66
+
67
+ config['nodes'].each { |node| PuppetlabsOnceover::Node.new(node) } unless config['nodes'] == nil
68
+ @nodes = PuppetlabsOnceover::Node.all
69
+
70
+ # Add the 'all_classes' and 'all_nodes' default groups
71
+ @node_groups << PuppetlabsOnceover::Group.new('all_nodes', @nodes)
72
+ @class_groups << PuppetlabsOnceover::Group.new('all_classes', @classes)
73
+
74
+ # Initialise all of the groups
75
+ config['node_groups'].each { |name, members| @node_groups << PuppetlabsOnceover::Group.new(name, members) } unless config['node_groups'] == nil
76
+ config['class_groups'].each { |name, members| @class_groups << PuppetlabsOnceover::Group.new(name, members) } unless config['class_groups'] == nil
77
+
78
+ @filter_tags = opts[:tags] ? [opts[:tags].split(',')].flatten : nil
79
+ @filter_classes = opts[:classes] ? [opts[:classes].split(',')].flatten.map {|x| PuppetlabsOnceover::Class.find(x)} : nil
80
+ @filter_nodes = opts[:nodes] ? [opts[:nodes].split(',')].flatten.map {|x| PuppetlabsOnceover::Node.find(x)} : nil
81
+ @skip_r10k = opts[:skip_r10k] ? true : false
82
+ @force = opts[:force] || false
83
+ @fail_fast = opts[:fail_fast] || false
84
+
85
+ # Validate the mock_functions
86
+ if @mock_functions && @mock_functions.any? { |name, details| details.has_key? 'type' }
87
+ logger.warn "The 'type' key for mocked functions is deprecated and will be ignored, please remove it."
88
+ end
89
+
90
+ # Loop over all of the items in the test matrix and add those as test
91
+ # objects to the list of tests
92
+ config['test_matrix'].each do |test_hash|
93
+ test_hash.each do |machines, settings|
94
+ if settings['tests'] == 'spec'
95
+ @spec_tests << PuppetlabsOnceover::Test.new(machines, settings['classes'], settings)
96
+ elsif settings['tests'] == 'acceptance'
97
+ @acceptance_tests << PuppetlabsOnceover::Test.new(machines, settings['classes'], settings)
98
+ elsif settings['tests'] == 'all_tests'
99
+ tst = PuppetlabsOnceover::Test.new(machines,settings['classes'],settings)
100
+ @spec_tests << tst
101
+ @acceptance_tests << tst
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ def to_s
108
+ require 'colored'
109
+
110
+ <<-TESTCONF.gsub(/^\s{4}/,'')
111
+ #{'classes'.green} #{@classes.map{|c|c.name}}
112
+ #{'nodes'.green} #{@nodes.map{|n|n.name}}
113
+ #{'class_groups'.green} #{@class_groups}
114
+ #{'node_groups'.green} #{@node_groups.map{|g|g.name}}
115
+ TESTCONF
116
+ end
117
+
118
+ def self.find_list(thing)
119
+ # Takes a string and finds an object or list of objects to match, will
120
+ # take nodes, classes or groups
121
+
122
+ # We want to supress warnings for this bit
123
+ old_level = logger.level
124
+ logger.level = :error
125
+ if PuppetlabsOnceover::Group.find(thing)
126
+ logger.level = old_level
127
+ return PuppetlabsOnceover::Group.find(thing).members
128
+ elsif PuppetlabsOnceover::Class.find(thing)
129
+ logger.level = old_level
130
+ return [PuppetlabsOnceover::Class.find(thing)]
131
+ elsif PuppetlabsOnceover::Node.find(thing)
132
+ logger.level = old_level
133
+ return [PuppetlabsOnceover::Node.find(thing)]
134
+ else
135
+ logger.level = old_level
136
+ raise "Could not find #{thing} in list of classes, nodes or groups"
137
+ end
138
+ end
139
+
140
+ def self.subtractive_to_list(subtractive_hash)
141
+ # Take a hash that looks like this:
142
+ # { 'include' => 'somegroup'
143
+ # 'exclude' => 'other'}
144
+ # and return a list of classes/nodes
145
+ if subtractive_hash.has_key?('include') && subtractive_hash.has_key?('exclude')
146
+ include_list = PuppetlabsOnceover::TestConfig.find_list(subtractive_hash['include']).flatten
147
+ exclude_list = PuppetlabsOnceover::TestConfig.find_list(subtractive_hash['exclude']).flatten
148
+ include_list - exclude_list
149
+ else
150
+ raise "The classes/nodes hash must have an `exclude` if using an `include`"
151
+ end
152
+ end
153
+
154
+ def verify_spec_test(controlrepo, test)
155
+ test.nodes.each do |node|
156
+ unless controlrepo.facts_files.any? { |file| file =~ /\/#{node.name}\.json/ }
157
+ raise "Could not find factset for node: #{node.name}"
158
+ end
159
+ end
160
+ end
161
+
162
+ def verify_acceptance_test(controlrepo, test)
163
+ warn "[DEPRECATION] #{__method__} is deprecated due to the removal of Beaker"
164
+
165
+ require 'yaml'
166
+ nodeset = YAML.load_file(controlrepo.nodeset_file)
167
+ test.nodes.each do |node|
168
+ unless nodeset['HOSTS'].has_key?(node.name)
169
+ raise "Could not find nodeset for node: #{node.name}"
170
+ end
171
+ end
172
+ end
173
+
174
+ def pre_condition
175
+ # Read all the pre_conditions and return the string
176
+ spec_dir = PuppetlabsOnceover::Controlrepo.new(@opts).spec_dir
177
+ puppetcode = []
178
+ Dir["#{spec_dir}/pre_conditions/*.pp"].each do |condition_file|
179
+ logger.debug "Reading pre_conditions from #{condition_file}"
180
+ puppetcode << File.read(condition_file)
181
+ end
182
+ return nil if puppetcode.count.zero?
183
+
184
+ puppetcode.join("\n")
185
+ end
186
+
187
+ def write_spec_test(location, test)
188
+ # Use an ERB template to write a spec test
189
+ File.write(
190
+ "#{location}/#{test.to_s}_spec.rb",
191
+ PuppetlabsOnceover::Controlrepo.evaluate_template('test_spec.rb.erb', binding)
192
+ )
193
+ end
194
+
195
+ def write_acceptance_tests(location, tests)
196
+ warn "[DEPRECATION] #{__method__} is deprecated due to the removal of Beaker"
197
+
198
+ File.write(
199
+ "#{location}/acceptance_spec.rb",
200
+ PuppetlabsOnceover::Controlrepo.evaluate_template('acceptance_test_spec.rb.erb', binding))
201
+ end
202
+
203
+ def write_spec_helper_acceptance(location, repo)
204
+ File.write(
205
+ "#{location}/spec_helper_acceptance.rb",
206
+ PuppetlabsOnceover::Controlrepo.evaluate_template('spec_helper_acceptance.rb.erb', binding)
207
+ )
208
+ end
209
+
210
+ def write_rakefile(location, pattern)
211
+ File.write(
212
+ "#{location}/Rakefile",
213
+ PuppetlabsOnceover::Controlrepo.evaluate_template('testconfig_Rakefile.erb', binding)
214
+ )
215
+ end
216
+
217
+ def write_spec_helper(location, repo)
218
+ environmentpath = "#{repo.tempdir}/#{repo.environmentpath}"
219
+ modulepath = repo.config['modulepath']
220
+ modulepath.delete("$basemodulepath")
221
+ modulepath.map! do |path|
222
+ "#{environmentpath}/production/#{path}"
223
+ end
224
+
225
+ # We need to select the right delimiter based on OS
226
+ require 'facter'
227
+ if Facter[:kernel].value == 'windows'
228
+ modulepath = modulepath.join(";")
229
+ else
230
+ modulepath = modulepath.join(':')
231
+ end
232
+
233
+ repo.temp_modulepath = modulepath
234
+
235
+ # Use an ERB template to write a spec test
236
+ File.write(
237
+ "#{location}/spec_helper.rb",
238
+ PuppetlabsOnceover::Controlrepo.evaluate_template('spec_helper.rb.erb', binding)
239
+ )
240
+ end
241
+
242
+ def copy_spec_files(repo)
243
+ source_files = @included_specs.map { |glob| Dir.glob "#{repo.spec_dir}/#{glob}" }.flatten.uniq
244
+ source_files.each do |source_file|
245
+ target_file = File.join(repo.tempdir, 'spec', source_file.sub(/^#{repo.spec_dir}/, ''))
246
+ if File.directory?(source_file)
247
+ FileUtils.cp_r source_file, target_file unless File.exist? target_file
248
+ else
249
+ FileUtils.mkdir_p File.dirname target_file
250
+ FileUtils.cp source_file, target_file
251
+ end
252
+ end
253
+ end
254
+
255
+ def create_fixtures_symlinks(repo)
256
+ logger.debug "Creating fixtures symlinks"
257
+ FileUtils.rm_rf("#{repo.tempdir}/spec/fixtures/modules")
258
+ FileUtils.mkdir_p("#{repo.tempdir}/spec/fixtures/modules")
259
+ repo.temp_modulepath.split(':').each do |path|
260
+ Dir["#{path}/*"].each do |mod|
261
+ modulename = File.basename(mod)
262
+ link = "#{repo.tempdir}/spec/fixtures/modules/#{modulename}"
263
+ logger.debug "Symlinking #{mod} to #{link}"
264
+ unless File.symlink?(link)
265
+ # Ruby only sets File::ALT_SEPARATOR on Windows and Rubys standard library
266
+ # uses this to check for Windows
267
+ if !!File::ALT_SEPARATOR
268
+ mod = File.join(File.dirname(link), mod) unless Pathname.new(mod).absolute?
269
+ if Dir.respond_to?(:create_junction)
270
+ Dir.create_junction(link, mod)
271
+ else
272
+ system("call mklink /J \"#{link.gsub('/', '\\')}\" \"#{mod.gsub('/', '\\')}\"")
273
+ end
274
+ else
275
+ FileUtils.ln_s(mod, link)
276
+ end
277
+ end
278
+ end
279
+ end
280
+ end
281
+
282
+ def run_filters(tests)
283
+ # All of this needs to be applied AFTER deduplication but BEFORE writing
284
+ filters = {
285
+ 'tags' => @filter_tags,
286
+ 'classes' => @filter_classes,
287
+ 'nodes' => @filter_nodes
288
+ }
289
+ filters.each do |method, filter_list|
290
+ if filter_list
291
+ # Remove tests that do not have matching tags
292
+ tests.keep_if do |test|
293
+ filter_list.any? do |filter|
294
+ filter_test test, method, filter
295
+ end
296
+ end
297
+ end
298
+ end
299
+ tests
300
+ end
301
+
302
+ def filter_test(test, method, filter)
303
+ if test.send(method)
304
+ if method == 'tags' && filter.start_with?('~')
305
+ filter = filter.sub(/^~/, '')
306
+ ! test.send(method).include?(filter)
307
+ else
308
+ test.send(method).include?(filter)
309
+ end
310
+ else
311
+ false
312
+ end
313
+ end
314
+ end
315
+ end
@@ -0,0 +1,202 @@
1
+ require 'puppet/version'
2
+ require 'net/http'
3
+ require 'uri'
4
+ require 'multi_json'
5
+ require 'r10k/module_loader/puppetfile'
6
+ require 'puppetlabs-onceover/logger'
7
+
8
+ ### operations
9
+ #
10
+ # 1. resolve all the component json files in the puppet-agent repo for vendored modules
11
+ # 2. parse each json file and determine vendored modules repo + ref
12
+ #
13
+ ###
14
+
15
+ ## Example
16
+ #
17
+ # vm = PuppetlabsOnceover::VendoredModules.new
18
+ # puts vm.vendored_references
19
+ # puppetfile = R10K::ModuleLoader::Puppetfile.new(basedir: '.')
20
+ # vm.puppetfile_missing_vendored(puppetfile)
21
+ # puts vm.missing_vendored.inspect
22
+
23
+ class PuppetlabsOnceover
24
+ class VendoredModules
25
+ # The "core type" modules puppet-agent vendors (cron, host, mount, etc.).
26
+ # This set is stable and rarely changes -- what varies release to
27
+ # release is each module's *version*, not the list of modules. Each is
28
+ # its own actively-maintained puppetlabs repo (confirmed: all ten pushed
29
+ # within the last year, well ahead of either OpenVox's or the public
30
+ # puppet-agent mirror's data), so there's no need to go through any
31
+ # third-party component manifest to find out what to vendor.
32
+ CORE_MODULES = %w[
33
+ augeas_core cron_core host_core mount_core scheduled_task
34
+ selinux_core sshkeys_core yumrepo_core zfs_core zone_core
35
+ ].freeze
36
+
37
+ attr_reader :vendored_references, :missing_vendored
38
+
39
+ def initialize(opts = {})
40
+ @repo = opts[:repo] || PuppetlabsOnceover::Controlrepo.new
41
+ @cachedir = opts[:cachedir] || File.join(@repo.tempdir, 'vendored_modules')
42
+ @puppet_version = Gem::Version.new(Puppet.version)
43
+ @puppet_major_version = Gem::Version.new(@puppet_version.segments[0])
44
+ @force_update = opts[:force_update] || false
45
+
46
+ @missing_vendored = []
47
+
48
+ # This only applies to puppet >= 6 so bail early
49
+ raise 'Auto resolving vendored modules only applies to puppet versions >= 6' unless @puppet_major_version >= Gem::Version.new('6')
50
+
51
+ # Create cachedir
52
+ unless File.directory?(@cachedir)
53
+ logger.debug "Creating #{@cachedir}"
54
+ FileUtils.mkdir_p(@cachedir)
55
+ end
56
+
57
+ # Location of user provided caches:
58
+ # control-repo/spec/vendored_modules/<component>-puppet_agent-<agent version>.json
59
+ @manual_vendored_dir = File.join(@repo.spec_dir, 'vendored_modules')
60
+
61
+ # Resolve each core module's current release directly from its own
62
+ # puppetlabs-owned repo (CAT-2777). Previously this went through a
63
+ # component manifest fetched from an agent repo's git tree -- first
64
+ # OpenVoxProject/openvox-agent (a live functional dependency on
65
+ # OpenVox this whole re-ownership program exists to eliminate, and
66
+ # whose manifest data pointed at openvoxproject-org module forks, not
67
+ # puppetlabs' own), then puppetlabs/puppet-agent was considered and
68
+ # rejected (its public mirror last tagged 8.10.0, stale relative to
69
+ # any puppet version this gem tests against). Neither is needed: the
70
+ # module list is stable (see CORE_MODULES) and each module's own repo
71
+ # is the authoritative source for its own latest version.
72
+ # https://docs.github.com/en/rest/repos/repos#list-repository-tags
73
+ @vendored_references = CORE_MODULES.map do |mod_name|
74
+ tags = query_or_cache(
75
+ "https://api.github.com/repos/puppetlabs/puppetlabs-#{mod_name}/tags",
76
+ nil,
77
+ component_cache(mod_name),
78
+ )
79
+ latest_tag = tags.first['name']
80
+ {
81
+ 'url' => "https://github.com/puppetlabs/puppetlabs-#{mod_name}.git",
82
+ 'ref' => "refs/tags/#{latest_tag}"
83
+ }
84
+ end
85
+ end
86
+
87
+ def component_cache(component)
88
+ # Ideally we want a cache for the version of the puppet agent used in tests
89
+ desired_name = "#{component}-puppet_agent-#{@puppet_version}.json"
90
+ # By default look for any caches created during previous runs
91
+ cache_file = File.join(@cachedir, desired_name)
92
+
93
+ # If the user provides their own cache
94
+ if !@force_update && File.directory?(@manual_vendored_dir)
95
+ # Check for any '<component>-puppet_agent-<puppet version>.json' files
96
+ dg = Dir.glob(File.join(@manual_vendored_dir, "#{component}-puppet_agent*"))
97
+ # Check if there are multiple versions of the component cache
98
+ if dg.size > 1
99
+ # If there is the same version supplied as whats being tested against use that
100
+ if dg.any? { |s| s[desired_name] }
101
+ cache_file = File.join(@manual_vendored_dir, desired_name)
102
+ # If there are any with the same major version, use the latest supplied
103
+ elsif dg.any? { |s| s["#{component}-puppet_agent-#{@puppet_major_version}"] }
104
+ maj_match = dg.select { |f| /#{component}-puppet_agent-#{@puppet_major_version}.\d+\.\d+\.json/.match(f) }
105
+ maj_match.each do |f|
106
+ next unless (version_from_file(cache_file) == version_from_file(desired_name)) || (version_from_file(f) >= version_from_file(cache_file))
107
+
108
+ # if the current cache version matches the desired version, use the first matching major version in user cache
109
+ # if there are multiple major version matches in user cache, use the latest
110
+ cache_file = f
111
+ end
112
+ # Otherwise just use the latest supplied
113
+ else
114
+ dg.each { |f| cache_file = f if version_from_file(f) >= version_from_file(cache_file) }
115
+ end
116
+ # If there is only one use that
117
+ elsif dg.size == 1
118
+ cache_file = dg[0]
119
+ end
120
+ end
121
+
122
+ # Warn the user if cached version does not match whats being used to test
123
+ cache_version = version_from_file(cache_file)
124
+ logger.warn "Cache for #{component} is for puppet_agent #{cache_version}, while you are testing against puppet_agent #{@puppet_version}. Consider updating your cache to ensure consistent behavior in your tests" if cache_version != @puppet_version
125
+
126
+ cache_file
127
+ end
128
+
129
+ def version_from_file(cache_file)
130
+ version_regex = /.*-puppet_agent-(\d+\.\d+\.\d+)\.json/
131
+ Gem::Version.new(version_regex.match(cache_file)[1])
132
+ end
133
+
134
+ # Currently expects to be passed a R10K::Puppetfile object.
135
+ # ex: R10K::ModuleLoader::Puppetfile.new(basedir: '.')
136
+ def puppetfile_missing_vendored(puppetfile)
137
+ puppetfile.load
138
+ @vendored_references.each do |mod|
139
+ # Extract name and slug from url
140
+ mod_slug = mod['url'].match(/.*(puppetlabs-\w+)\.git/)[1]
141
+ mod_name = mod_slug.match(/^puppetlabs-(\w+)$/)[1]
142
+ # Array of modules whos names match
143
+ existing = puppetfile.modules.select { |e_mod| e_mod.name == mod_name }
144
+ if existing.empty?
145
+ # Change url to https instead of ssh to allow anonymous git clones
146
+ # so that users do not need to have an ssh keypair associated with a Github account
147
+ url = mod['url'].gsub('git@github.com:', 'https://github.com/')
148
+ @missing_vendored << { mod_slug => { git: url, ref: mod['ref'] } }
149
+ logger.debug "#{mod_name} found to be missing in Puppetfile"
150
+ else
151
+ logger.debug "#{mod_name} found in Puppetfile. Using the specified version"
152
+ end
153
+ end
154
+ end
155
+
156
+ # Return json from a query whom caches, or from the cache to avoid spamming github
157
+ def query_or_cache(url, params, filepath)
158
+ if (File.exist? filepath) && (@force_update == false)
159
+ logger.debug "Using cache: #{filepath}"
160
+ json = read_json_dump(filepath)
161
+ else
162
+ logger.debug "Making GET request to: #{url}"
163
+ json = github_get(url, params)
164
+ logger.debug "Caching response to: #{filepath}"
165
+ write_json_dump(filepath, json)
166
+ end
167
+ json
168
+ end
169
+
170
+ # Given a github url and optional query parameters, return the parsed json body
171
+ def github_get(url, params)
172
+ uri = URI.parse(url)
173
+ uri.query = URI.encode_www_form(params) if params
174
+ http = Net::HTTP.new(uri.host, uri.port)
175
+ http.use_ssl = (uri.scheme == 'https')
176
+ request = Net::HTTP::Get.new(uri.request_uri)
177
+ request['Accept'] = 'application/vnd.github.raw+json'
178
+ request['X-GitHub-Api-Version'] = '2022-11-28'
179
+ response = http.request(request)
180
+
181
+ case response
182
+ when Net::HTTPOK # 200
183
+ MultiJson.load(response.body)
184
+ else
185
+ # Expose the ratelimit response headers
186
+ # https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api?apiVersion=2022-11-28#checking-the-status-of-your-rate-limit
187
+ ratelimit_headers = response.to_hash.select { |k, _v| k =~ /x-ratelimit.*/ }
188
+ raise "#{response.code} #{response.message} #{ratelimit_headers}"
189
+ end
190
+ end
191
+
192
+ # Returns parsed json of file
193
+ def read_json_dump(filepath)
194
+ MultiJson.load(File.read(filepath))
195
+ end
196
+
197
+ # Writes json to a file
198
+ def write_json_dump(filepath, json_data)
199
+ File.write(filepath, MultiJson.dump(json_data))
200
+ end
201
+ end
202
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PuppetlabsOnceover
4
+ VERSION = '5.0.3'
5
+ end
@@ -0,0 +1,40 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ $LOAD_PATH.unshift File.expand_path('lib', __dir__)
4
+ require 'puppetlabs-onceover/version'
5
+
6
+ Gem::Specification.new do |s| # rubocop:disable Gemspec/RequireMFA
7
+ s.name = "puppetlabs-onceover"
8
+ s.version = PuppetlabsOnceover::VERSION
9
+ s.authors = ['Puppet, Inc.']
10
+ s.email = ['modules-team@puppet.com']
11
+ s.homepage = "https://github.com/puppetlabs/puppetlabs-onceover"
12
+ s.summary = "Testing tools for Puppet controlrepos"
13
+ s.description = "Automatically generates tests for your Puppet code"
14
+ s.licenses = 'Apache-2.0'
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ #s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.bindir = 'bin'
19
+ s.executables = 'puppetlabs-onceover'
20
+
21
+ s.required_ruby_version = Gem::Requirement.new('>= 3.2')
22
+
23
+ # Runtime dependencies, but also probably dependencies of requiring projects
24
+ s.add_dependency 'backticks', '~> 1.0'
25
+ s.add_dependency 'colored', '~> 1.2'
26
+ s.add_dependency 'cri', '~> 2.6'
27
+ s.add_dependency 'deep_merge', '~> 1.0'
28
+ s.add_dependency 'git', '~> 4.0', '>= 4.0.5'
29
+ s.add_dependency 'logging', '~> 2.0'
30
+ s.add_dependency 'multi_json', '~> 1.10'
31
+ s.add_dependency 'parallel_tests', '~> 5.3'
32
+ s.add_dependency 'puppet', '>= 8', '< 10'
33
+ s.add_dependency 'r10k', '~> 5.0'
34
+ s.add_dependency 'rake', '~> 13.3'
35
+ s.add_dependency 'rspec', '~> 3.0'
36
+ s.add_dependency 'rspec_junit_formatter', '~> 0.6'
37
+ s.add_dependency 'rspec-puppet', '~> 5.0'
38
+ s.add_dependency 'terminal-table', '~> 4.0'
39
+ s.add_dependency 'versionomy', '~> 0.5'
40
+ end
@@ -0,0 +1,17 @@
1
+ forge "http://forge.puppetlabs.com"
2
+ #
3
+ # I want to download some modules to check if r10k feature in Onceover works correctly.
4
+ #
5
+
6
+ # Versions should be updated to be the latest at the time you start
7
+ mod "puppetlabs/stdlib", '4.11.0'
8
+
9
+ # Modules from Git
10
+ # Examples: https://github.com/puppetlabs/r10k/blob/master/doc/puppetfile.mkd#examples
11
+ mod 'apache',
12
+ :git => 'https://github.com/puppetlabs/puppetlabs-apache',
13
+ :commit => '83401079053dca11d61945bd9beef9ecf7576cbf'
14
+
15
+ #mod 'apache',
16
+ # :git => 'https://github.com/puppetlabs/puppetlabs-apache',
17
+ # :branch => 'docs_experiment'
@@ -0,0 +1,7 @@
1
+ modulepath = site:modules:$basemodulepath
2
+
3
+ # Comments!
4
+
5
+ value_with_equals = 'foo=bar'
6
+
7
+ config_version = 'scripts/config_version.sh $environmentpath $environment'
@@ -0,0 +1,2 @@
1
+ ---
2
+ message: "This node is using common data"
@@ -0,0 +1,32 @@
1
+ ## site.pp ##
2
+
3
+ # This file (/etc/puppetlabs/puppet/manifests/site.pp) is the main entry point
4
+ # used when an agent connects to a master and asks for an updated configuration.
5
+ #
6
+ # Global objects like filebuckets and resource defaults should go in this file,
7
+ # as should the default node definition. (The default node can be omitted
8
+ # if you use the console and don't define any other nodes in site.pp. See
9
+ # http://docs.puppetlabs.com/guides/language_guide.html#nodes for more on
10
+ # node definitions.)
11
+
12
+ ## Active Configurations ##
13
+
14
+ # Disable filebucket by default for all File resources:
15
+ #https://docs.puppet.com/pe/2015.3/release_notes.html#filebucket-resource-no-longer-created-by-default
16
+ File { backup => false }
17
+
18
+ # DEFAULT NODE
19
+ # Node definitions in this file are merged with node data from the console. See
20
+ # http://docs.puppetlabs.com/guides/language_guide.html#nodes for more on
21
+ # node definitions.
22
+
23
+ # The default node definition matches any node lacking a more specific node
24
+ # definition. If there are no other nodes in this file, classes declared here
25
+ # will be included in every node's catalog, *in addition* to any classes
26
+ # specified in the console for that node.
27
+
28
+ node default {
29
+ # This is where you can declare classes for all nodes.
30
+ # Example:
31
+ # class { 'my_class': }
32
+ }
@@ -0,0 +1,2 @@
1
+ # This will fail all compilations so that we can quickly tell if it's being used
2
+ fail('Using alternate site.pp')
@@ -0,0 +1,5 @@
1
+ class profile::base {
2
+
3
+ #the base profile should include component modules that will be on all nodes
4
+
5
+ }
@@ -0,0 +1,3 @@
1
+ class profile::example {
2
+
3
+ }
@@ -0,0 +1,7 @@
1
+ class role::database_server {
2
+
3
+ #This role would be made of all the profiles that need to be included to make a database server work
4
+ #All roles should include the base profile
5
+ include profile::base
6
+
7
+ }
@@ -0,0 +1,3 @@
1
+ class role::example {
2
+
3
+ }
@@ -0,0 +1,7 @@
1
+ class role::webserver {
2
+
3
+ #This role would be made of all the profiles that need to be included to make a webserver work
4
+ #All roles should include the base profile
5
+ include profile::base
6
+
7
+ }
@@ -0,0 +1 @@
1
+ .onceover
@@ -0,0 +1,2 @@
1
+ ---
2
+ some: stuff