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.
- checksums.yaml +7 -0
- data/.devcontainer/devcontainer.json +31 -0
- data/.gitattributes +2 -0
- data/.github/workflows/ci.yml +81 -0
- data/.github/workflows/mend.yml +14 -0
- data/.github/workflows/nightly.yml +66 -0
- data/.github/workflows/release.yaml +16 -0
- data/.github/workflows/release_prep.yml +20 -0
- data/.gitignore +19 -0
- data/.rubocop.yml +19 -0
- data/.rubocop_todo.yml +804 -0
- data/.vscode/extensions.json +4 -0
- data/ARCHIVE.md +395 -0
- data/CHANGELOG.md +25 -0
- data/CODEOWNERS +2 -0
- data/Gemfile +65 -0
- data/LICENSE +202 -0
- data/README.md +965 -0
- data/Rakefile +86 -0
- data/bin/puppetlabs-onceover +17 -0
- data/cucumber.yml +1 -0
- data/factsets/AIX-6.1-powerpc.json +210 -0
- data/factsets/AIX-7.1-powerpc.json +215 -0
- data/factsets/Amazon-2018.03.json +420 -0
- data/factsets/CentOS-5.11-32.json +263 -0
- data/factsets/CentOS-5.11-64.json +263 -0
- data/factsets/CentOS-6.6-32.json +306 -0
- data/factsets/CentOS-6.6-64.json +342 -0
- data/factsets/CentOS-7.0-64.json +352 -0
- data/factsets/CentOS-8.3.2011-64.json +485 -0
- data/factsets/Debian-10.4-64.json +476 -0
- data/factsets/Debian-6.0.10-32.json +322 -0
- data/factsets/Debian-6.0.10-64.json +322 -0
- data/factsets/Debian-7.8-32.json +338 -0
- data/factsets/Debian-7.8-64.json +338 -0
- data/factsets/Debian-8.11-64.json +480 -0
- data/factsets/Debian-9.12-64.json +476 -0
- data/factsets/RHEL-6.7.json +415 -0
- data/factsets/RHEL-7.4.json +489 -0
- data/factsets/SLES-11.3-64.json +317 -0
- data/factsets/SLES-12.1-64.json +353 -0
- data/factsets/Ubuntu-12.04-32.json +328 -0
- data/factsets/Ubuntu-12.04-64.json +328 -0
- data/factsets/Ubuntu-14.04-32.json +337 -0
- data/factsets/Ubuntu-14.04-64.json +373 -0
- data/factsets/Ubuntu-18.04-64.json +556 -0
- data/factsets/Ubuntu-20.04-64.json +504 -0
- data/factsets/Windows_Server-2008r2-64.json +184 -0
- data/factsets/Windows_Server-2012r2-64.json +165 -0
- data/factsets/solaris-10_u9-sparc-64.json +769 -0
- data/factsets/solaris-11.2-sparc-64.json +774 -0
- data/factsets/windows-10-64.json +104 -0
- data/features/auto_vendored.feature +27 -0
- data/features/cache.feature +38 -0
- data/features/factsets.feature +48 -0
- data/features/formatting.feature +36 -0
- data/features/help.feature +14 -0
- data/features/init.feature +18 -0
- data/features/show.feature +28 -0
- data/features/step_definitions/cache.rb +38 -0
- data/features/step_definitions/common.rb +123 -0
- data/features/step_definitions/formatter.rb +41 -0
- data/features/step_definitions/init.rb +17 -0
- data/features/step_definitions/run.rb +17 -0
- data/features/support/cache_helper.rb +54 -0
- data/features/support/command_helper.rb +32 -0
- data/features/support/controlrepo_helper.rb +36 -0
- data/features/support/env.rb +2 -0
- data/features/windows.feature +35 -0
- data/features/zzz_run.feature +93 -0
- data/lib/puppetlabs-onceover/beaker/spec_helper.rb +71 -0
- data/lib/puppetlabs-onceover/beaker.rb +241 -0
- data/lib/puppetlabs-onceover/class.rb +56 -0
- data/lib/puppetlabs-onceover/cli/init.rb +34 -0
- data/lib/puppetlabs-onceover/cli/plugins.rb +10 -0
- data/lib/puppetlabs-onceover/cli/run.rb +85 -0
- data/lib/puppetlabs-onceover/cli/show.rb +79 -0
- data/lib/puppetlabs-onceover/cli/update.rb +48 -0
- data/lib/puppetlabs-onceover/cli.rb +47 -0
- data/lib/puppetlabs-onceover/controlrepo.rb +688 -0
- data/lib/puppetlabs-onceover/deploy.rb +171 -0
- data/lib/puppetlabs-onceover/group.rb +78 -0
- data/lib/puppetlabs-onceover/logger.rb +32 -0
- data/lib/puppetlabs-onceover/node.rb +72 -0
- data/lib/puppetlabs-onceover/rake_tasks.rb +95 -0
- data/lib/puppetlabs-onceover/rspec/formatters.rb +315 -0
- data/lib/puppetlabs-onceover/runner.rb +139 -0
- data/lib/puppetlabs-onceover/test.rb +135 -0
- data/lib/puppetlabs-onceover/testconfig.rb +315 -0
- data/lib/puppetlabs-onceover/vendored_modules.rb +202 -0
- data/lib/puppetlabs-onceover/version.rb +5 -0
- data/puppetlabs-onceover.gemspec +40 -0
- data/spec/fixtures/controlrepos/basic/Puppetfile +17 -0
- data/spec/fixtures/controlrepos/basic/environment.conf +7 -0
- data/spec/fixtures/controlrepos/basic/hieradata/common.yaml +2 -0
- data/spec/fixtures/controlrepos/basic/hieradata/nodes/example-node.yaml +1 -0
- data/spec/fixtures/controlrepos/basic/manifests/site.pp +32 -0
- data/spec/fixtures/controlrepos/basic/manifests_alternate/site.pp +2 -0
- data/spec/fixtures/controlrepos/basic/site/profile/manifests/base.pp +5 -0
- data/spec/fixtures/controlrepos/basic/site/profile/manifests/example.pp +3 -0
- data/spec/fixtures/controlrepos/basic/site/role/manifests/database_server.pp +7 -0
- data/spec/fixtures/controlrepos/basic/site/role/manifests/example.pp +3 -0
- data/spec/fixtures/controlrepos/basic/site/role/manifests/webserver.pp +7 -0
- data/spec/fixtures/controlrepos/caching/.gitignore +1 -0
- data/spec/fixtures/controlrepos/caching/.travis.yml +2 -0
- data/spec/fixtures/controlrepos/caching/Gemfile +5 -0
- data/spec/fixtures/controlrepos/caching/Puppetfile +17 -0
- data/spec/fixtures/controlrepos/caching/Rakefile +1 -0
- data/spec/fixtures/controlrepos/caching/deleteme.txt +0 -0
- data/spec/fixtures/controlrepos/caching/environment.conf +2 -0
- data/spec/fixtures/controlrepos/caching/hieradata/common.yaml +2 -0
- data/spec/fixtures/controlrepos/caching/hieradata/nodes/example-node.yaml +1 -0
- data/spec/fixtures/controlrepos/caching/manifests/site.pp +33 -0
- data/spec/fixtures/controlrepos/caching/site/profile/manifests/base.pp +5 -0
- data/spec/fixtures/controlrepos/caching/site/profile/manifests/example.pp +3 -0
- data/spec/fixtures/controlrepos/caching/site/role/manifests/database_server.pp +7 -0
- data/spec/fixtures/controlrepos/caching/site/role/manifests/example.pp +3 -0
- data/spec/fixtures/controlrepos/caching/site/role/manifests/webserver.pp +7 -0
- data/spec/fixtures/controlrepos/caching/spec/factsets/Debian-10-facter-4.json +1091 -0
- data/spec/fixtures/controlrepos/caching/spec/factsets/README.md +7 -0
- data/spec/fixtures/controlrepos/caching/spec/onceover.yaml +55 -0
- data/spec/fixtures/controlrepos/caching/spec/pre_conditions/README.md +24 -0
- data/spec/fixtures/controlrepos/caching/spec/pre_conditions/escaping.pp +7 -0
- data/spec/fixtures/controlrepos/caching/spec/r10k.yaml +3 -0
- data/spec/fixtures/controlrepos/control_branch/Puppetfile +18 -0
- data/spec/fixtures/controlrepos/control_branch/environment.conf +2 -0
- data/spec/fixtures/controlrepos/custom_puppetfile/Puppetfile.custom +3 -0
- data/spec/fixtures/controlrepos/custom_puppetfile/environment.conf +7 -0
- data/spec/fixtures/controlrepos/factsets/environment.conf +1 -0
- data/spec/fixtures/controlrepos/factsets/site/profile/manifests/base.pp +6 -0
- data/spec/fixtures/controlrepos/factsets/site/role/manifests/example.pp +4 -0
- data/spec/fixtures/controlrepos/factsets/site/role/manifests/trusted_extensions.pp +6 -0
- data/spec/fixtures/controlrepos/factsets/site/role/manifests/trusted_external.pp +6 -0
- data/spec/fixtures/controlrepos/factsets/spec/factsets/README.md +7 -0
- data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_notrusted.json +530 -0
- data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_trusted_extensions_nested.json +535 -0
- data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_trusted_extensions_top.json +533 -0
- data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_trusted_external_nested.json +537 -0
- data/spec/fixtures/controlrepos/factsets/spec/factsets/centos7_trusted_external_top.json +535 -0
- data/spec/fixtures/controlrepos/factsets/spec/factsets/centos_7_facter_4.json +706 -0
- data/spec/fixtures/controlrepos/factsets/spec/factsets/centos_with_env.json +353 -0
- data/spec/fixtures/controlrepos/function_mocking/.gitignore +1 -0
- data/spec/fixtures/controlrepos/function_mocking/Puppetfile +4 -0
- data/spec/fixtures/controlrepos/function_mocking/Rakefile +1 -0
- data/spec/fixtures/controlrepos/function_mocking/environment.conf +2 -0
- data/spec/fixtures/controlrepos/function_mocking/site/profile/functions/fail_puppet.pp +5 -0
- data/spec/fixtures/controlrepos/function_mocking/site/profile/lib/puppet/functions/profile/fail_ruby.rb +9 -0
- data/spec/fixtures/controlrepos/function_mocking/site/profile/manifests/base.pp +10 -0
- data/spec/fixtures/controlrepos/function_mocking/site/role/manifests/fail.pp +7 -0
- data/spec/fixtures/controlrepos/function_mocking/site/role/manifests/test_data_return.pp +19 -0
- data/spec/fixtures/controlrepos/function_mocking/site/role/manifests/test_new_functions.pp +12 -0
- data/spec/fixtures/controlrepos/function_mocking/spec/onceover.yaml +50 -0
- data/spec/fixtures/controlrepos/minimal/environment.conf +2 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/.atom-build.json +9 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/.gitignore +5 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/.ruby-version +1 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/.travis.yml +13 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/Gemfile +22 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/Jenkinsfile +50 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/Puppetfile +102 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/README.md +4 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/Rakefile +33 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/data/common.yaml +558 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/data/datacenter/melbourne.yaml +12 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/data/datacenter/singapore.yaml +12 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/data/environments/development.yaml +3 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/data/environments/production.yaml +3 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/data/size/vol.large.yaml +27 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/environment.conf +3 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/hiera.yaml +25 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/manifests/site.pp +11 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/scripts/code_manager_config_version.rb +19 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/scripts/config_version.rb +25 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/scripts/config_version.sh +12 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/scripts/count_changed_classes.rb +26 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/scripts/get_changed_classes.rb +26 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/console/functions/user/token.pp +10 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/console/manifests/init.pp +14 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/console/manifests/user.pp +35 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/deployments/lib/puppet/functions/deployments/generate.rb +15 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/deployments/plans/signed_deployment.pp +126 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/facts.d/test.sh +2 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/files/artifactory/config_descriptor.xml +265 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/files/autosign.sh +23 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/files/hudson.tasks.Shell.xml +4 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/files/motd +4 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/files/polar_clock/index.html +198 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/apt.pp +9 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/aws_nodes.pp +54 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/base/aws.pp +9 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/base/rhel.pp +50 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/base/windows/hardening.pp +57 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/base/windows.pp +52 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/base.pp +79 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/cd4pe/artifactory.pp +64 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/cd4pe/connection.pp +95 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/cd4pe/haproxy.pp +65 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/cd4pe/replicated.pp +53 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/compile/balancer.pp +28 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/compile/master.pp +19 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/dns/host_record.pp +16 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/dns/server.pp +66 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/docker.pp +5 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/eyeunify/base.pp +43 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/eyeunify/core/database_connection.pp +42 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/eyeunify/core.pp +72 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/eyeunify/ctrl.pp +57 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/eyeunify/database.pp +32 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/eyeunify/exec.pp +11 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/file_sync/client.pp +165 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/file_sync/master_patch.pp +37 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/grafana/dashboard.pp +17 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/haproxy.pp +43 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/init.pp +3 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/jenkins/plugins.pp +87 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/jenkins.pp +65 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/jira/aio.pp +39 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/jira/app.pp +27 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/jira/db.pp +25 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/metrics/collectd/compile.pp +82 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/metrics/collectd.pp +28 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/metrics/dashboard.pp +28 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/mysql_server.pp +7 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/nginx.pp +24 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/polar_clock.pp +55 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/puppetmaster/api_auth.pp +82 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/puppetmaster/autosign.pp +33 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/puppetmaster/aws.pp +58 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/puppetmaster/tuning.pp +139 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/puppetmaster.pp +139 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/rvm.pp +13 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/sumologic.pp +11 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/sunburst/windows.pp +104 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/vagrant.pp +25 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/manifests/windows/webserver.pp +27 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/templates/cd4pe/connection_script.sh.epp +110 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/templates/controlrepo_deploy_jenkins_job.xml.epp +51 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/templates/dashboard.json.epp +403 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/templates/jenkins_secret_text.json.epp +1 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/templates/onceover_jenkins_job.xml.epp +51 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/profile/templates/userdata.epp +17 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/cd4pe.pp +29 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/clock.pp +16 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/compile/balancer.pp +5 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/compile/master.pp +5 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/eyeunify/aio.pp +10 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/eyeunify/controller.pp +10 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/eyeunify/database.pp +7 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/eyeunify/exec.pp +6 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/init.pp +3 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/lb.pp +14 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/metrics.pp +5 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/mysql.pp +13 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/windows/base.pp +5 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/site-modules/role/manifests/windows/webserver.pp +6 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/.gitignore +5 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/acceptance/nodesets/onceover-nodes.yml +94 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/classes/test_spec.rb +8 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/factsets/CentOS-7.0-64-master-2017.3.2.json +531 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/factsets/CentOS-7.0-64-master.json +429 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/factsets/CentOS-7.0-64.json +353 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/factsets/Windows_Server-2008r2-64.json +184 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/factsets/Windows_Server-2012r2-64.json +165 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/hiera.yaml +18 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/matchers/file_matchers.rb +16 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/onceover.yaml +54 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/pre_conditions/site.pp +150 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/r10k.yaml +2 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/shared_examples/helper.rb +91 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/unit/00_parse_spec.rb +76 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/unit/01_linting_spec_example.rb +69 -0
- data/spec/fixtures/controlrepos/puppet_controlrepo/spec/unit/03_puppetfile_spec_example.rb +35 -0
- data/spec/fixtures/controlrepos/vendored/Puppetfile +3 -0
- data/spec/fixtures/controlrepos/vendored/Puppetfile.cron +5 -0
- data/spec/fixtures/controlrepos/vendored/environment.conf +1 -0
- data/spec/fixtures/controlrepos/vendored/site-modules/role/manifests/cron.pp +9 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/augeas_core-puppet_agent-7.30.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/augeas_core-puppet_agent-8.6.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/cron_core-puppet_agent-7.30.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/cron_core-puppet_agent-8.6.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/host_core-puppet_agent-7.30.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/host_core-puppet_agent-8.6.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/mount_core-puppet_agent-7.30.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/mount_core-puppet_agent-8.6.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/repo_tree-puppet_agent-7.30.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/repo_tree-puppet_agent-8.6.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/scheduled_task-puppet_agent-7.30.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/scheduled_task-puppet_agent-8.6.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/selinux_core-puppet_agent-7.30.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/selinux_core-puppet_agent-8.6.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/sshkeys_core-puppet_agent-7.30.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/sshkeys_core-puppet_agent-8.6.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/yumrepo_core-puppet_agent-7.30.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/yumrepo_core-puppet_agent-8.6.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/zfs_core-puppet_agent-7.30.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/zfs_core-puppet_agent-8.6.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/zone_core-puppet_agent-7.30.0.json +1 -0
- data/spec/fixtures/controlrepos/vendored/spec/vendored_modules/zone_core-puppet_agent-8.6.0.json +1 -0
- data/spec/fixtures/controlrepos/windows/Gemfile +3 -0
- data/spec/fixtures/controlrepos/windows/Puppetfile +8 -0
- data/spec/fixtures/controlrepos/windows/environment.conf +1 -0
- data/spec/fixtures/controlrepos/windows/site/role/manifests/groups.pp +8 -0
- data/spec/fixtures/controlrepos/windows/site/role/manifests/users.pp +9 -0
- data/spec/fixtures/controlrepos/windows/site-modules/role/manifests/acl.pp +12 -0
- data/spec/fixtures/controlrepos/windows/site-modules/role/manifests/choco.pp +9 -0
- data/spec/fixtures/controlrepos/windows/site-modules/role/manifests/groups.pp +8 -0
- data/spec/fixtures/controlrepos/windows/site-modules/role/manifests/users.pp +9 -0
- data/spec/fixtures/controlrepos/windows/spec/onceover.yaml +24 -0
- data/spec/puppetlabs-onceover/controlrepo_spec.rb +18 -0
- data/spec/spec_helper.rb +8 -0
- data/templates/.fixtures.yml.erb +24 -0
- data/templates/Gemfile.erb +3 -0
- data/templates/Rakefile.erb +1 -0
- data/templates/acceptance_test_spec.rb.erb +66 -0
- data/templates/controlrepo.yaml.erb +38 -0
- data/templates/error_summary.yaml.erb +17 -0
- data/templates/factsets_README.md.erb +10 -0
- data/templates/nodeset.yaml.erb +12 -0
- data/templates/pre_conditions_README.md.erb +24 -0
- data/templates/spec_helper.rb.erb +35 -0
- data/templates/spec_helper_acceptance.rb.erb +1 -0
- data/templates/test_spec.rb.erb +150 -0
- data/templates/testconfig_Rakefile.erb +47 -0
- 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,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 @@
|
|
|
1
|
+
---
|
|
@@ -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 @@
|
|
|
1
|
+
.onceover
|