From 3c779da1f77da010951e0f0ac5b1cd8ac6530cb2 Mon Sep 17 00:00:00 2001 From: Nick Walker Date: Fri, 1 Feb 2019 11:47:16 -0800 Subject: [PATCH] Make module PDK compatible --- .fixtures.yml | 6 + .gitattributes | 5 + .gitignore | 25 +++- .pdkignore | 37 ++++++ .puppet-lint.rc | 2 + .rspec | 2 + .rubocop.yml | 122 ++++++++++++++++++ .sync.yml | 17 +++ .travis.yml | 43 ++++++ .yardopts | 1 + Gemfile | 71 ++++++++++ Rakefile | 77 +++++++++++ .../functions/master_classifer_settings.rb | 2 +- manifests/code_manager.pp | 10 +- manifests/init.pp | 6 + manifests/zack_r10k_webhook.pp | 6 + manifests/zack_r10k_webhook_disable.pp | 6 + metadata.json | 30 +++-- spec/classes/init_spec.rb | 15 +++ spec/default_facts.yml | 9 ++ spec/spec_helper.rb | 51 ++++++++ 21 files changed, 530 insertions(+), 13 deletions(-) create mode 100644 .fixtures.yml create mode 100644 .gitattributes create mode 100644 .pdkignore create mode 100644 .puppet-lint.rc create mode 100644 .rspec create mode 100644 .rubocop.yml create mode 100644 .sync.yml create mode 100644 .travis.yml create mode 100644 .yardopts create mode 100644 Gemfile create mode 100644 Rakefile create mode 100644 spec/classes/init_spec.rb create mode 100644 spec/default_facts.yml create mode 100644 spec/spec_helper.rb diff --git a/.fixtures.yml b/.fixtures.yml new file mode 100644 index 0000000..b6866a0 --- /dev/null +++ b/.fixtures.yml @@ -0,0 +1,6 @@ +--- +fixtures: + repositories: + stdlib: "git://github.com/puppetlabs/puppetlabs-stdlib" + pltraining-rbac: "git://github.com/puppetlabs/pltraining-rbac.git" + abrader-gms: "git://github.com/abrader/abrader-gms.git" \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9032a01 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +*.rb eol=lf +*.erb eol=lf +*.pp eol=lf +*.sh eol=lf +*.epp eol=lf diff --git a/.gitignore b/.gitignore index 088af20..650022e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,24 @@ -pkg/* +.git/ +.*.sw[op] +.metadata +.yardoc +.yardwarns +*.iml +/.bundle/ +/.idea/ +/.vagrant/ +/coverage/ +/bin/ +/doc/ +/Gemfile.local +/Gemfile.lock +/junit/ +/log/ +/pkg/ +/spec/fixtures/manifests/ +/spec/fixtures/modules/ +/tmp/ +/vendor/ +/convert_report.txt +/update_report.txt +.DS_Store diff --git a/.pdkignore b/.pdkignore new file mode 100644 index 0000000..b713b3b --- /dev/null +++ b/.pdkignore @@ -0,0 +1,37 @@ +.git/ +.*.sw[op] +.metadata +.yardoc +.yardwarns +*.iml +/.bundle/ +/.idea/ +/.vagrant/ +/coverage/ +/bin/ +/doc/ +/Gemfile.local +/Gemfile.lock +/junit/ +/log/ +/pkg/ +/spec/fixtures/manifests/ +/spec/fixtures/modules/ +/tmp/ +/vendor/ +/convert_report.txt +/update_report.txt +.DS_Store +/appveyor.yml +/.fixtures.yml +/Gemfile +/.gitattributes +/.gitignore +/.gitlab-ci.yml +/.pdkignore +/Rakefile +/.rspec +/.rubocop.yml +/.travis.yml +/.yardopts +/spec/ diff --git a/.puppet-lint.rc b/.puppet-lint.rc new file mode 100644 index 0000000..a79ce0f --- /dev/null +++ b/.puppet-lint.rc @@ -0,0 +1,2 @@ +--relative +--no-140chars-check diff --git a/.rspec b/.rspec new file mode 100644 index 0000000..16f9cdb --- /dev/null +++ b/.rspec @@ -0,0 +1,2 @@ +--color +--format documentation diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..f5a6c2a --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,122 @@ +--- +require: rubocop-rspec +AllCops: + DisplayCopNames: true + TargetRubyVersion: '2.1' + Include: + - "./**/*.rb" + Exclude: + - bin/* + - ".vendor/**/*" + - "**/Gemfile" + - "**/Rakefile" + - pkg/**/* + - spec/fixtures/**/* + - vendor/**/* + - "**/Puppetfile" + - "**/Vagrantfile" + - "**/Guardfile" +Metrics/LineLength: + Description: People have wide screens, use them. + Max: 200 +GetText/DecorateString: + Description: We don't want to decorate test output. + Exclude: + - spec/* +RSpec/BeforeAfterAll: + Description: Beware of using after(:all) as it may cause state to leak between tests. + A necessary evil in acceptance testing. + Exclude: + - spec/acceptance/**/*.rb +RSpec/HookArgument: + Description: Prefer explicit :each argument, matching existing module's style + EnforcedStyle: each +Style/BlockDelimiters: + Description: Prefer braces for chaining. Mostly an aesthetical choice. Better to + be consistent then. + EnforcedStyle: braces_for_chaining +Style/ClassAndModuleChildren: + Description: Compact style reduces the required amount of indentation. + EnforcedStyle: compact +Style/EmptyElse: + Description: Enforce against empty else clauses, but allow `nil` for clarity. + EnforcedStyle: empty +Style/FormatString: + Description: Following the main puppet project's style, prefer the % format format. + EnforcedStyle: percent +Style/FormatStringToken: + Description: Following the main puppet project's style, prefer the simpler template + tokens over annotated ones. + EnforcedStyle: template +Style/Lambda: + Description: Prefer the keyword for easier discoverability. + EnforcedStyle: literal +Style/RegexpLiteral: + Description: Community preference. See https://github.com/voxpupuli/modulesync_config/issues/168 + EnforcedStyle: percent_r +Style/TernaryParentheses: + Description: Checks for use of parentheses around ternary conditions. Enforce parentheses + on complex expressions for better readability, but seriously consider breaking + it up. + EnforcedStyle: require_parentheses_when_complex +Style/TrailingCommaInArguments: + Description: Prefer always trailing comma on multiline argument lists. This makes + diffs, and re-ordering nicer. + EnforcedStyleForMultiline: comma +Style/TrailingCommaInLiteral: + Description: Prefer always trailing comma on multiline literals. This makes diffs, + and re-ordering nicer. + EnforcedStyleForMultiline: comma +Style/SymbolArray: + Description: Using percent style obscures symbolic intent of array's contents. + EnforcedStyle: brackets +RSpec/MessageSpies: + EnforcedStyle: receive +Style/Documentation: + Exclude: + - lib/puppet/parser/functions/**/* + - spec/**/* +Style/WordArray: + EnforcedStyle: brackets +Style/CollectionMethods: + Enabled: true +Style/MethodCalledOnDoEndBlock: + Enabled: true +Style/StringMethods: + Enabled: true +Layout/EndOfLine: + Enabled: false +Layout/IndentHeredoc: + Enabled: false +Metrics/AbcSize: + Enabled: false +Metrics/BlockLength: + Enabled: false +Metrics/ClassLength: + Enabled: false +Metrics/CyclomaticComplexity: + Enabled: false +Metrics/MethodLength: + Enabled: false +Metrics/ModuleLength: + Enabled: false +Metrics/ParameterLists: + Enabled: false +Metrics/PerceivedComplexity: + Enabled: false +RSpec/DescribeClass: + Enabled: false +RSpec/ExampleLength: + Enabled: false +RSpec/MessageExpectation: + Enabled: false +RSpec/MultipleExpectations: + Enabled: false +RSpec/NestedGroups: + Enabled: false +Style/AsciiComments: + Enabled: false +Style/IfUnlessModifier: + Enabled: false +Style/SymbolProc: + Enabled: false diff --git a/.sync.yml b/.sync.yml new file mode 100644 index 0000000..38dda00 --- /dev/null +++ b/.sync.yml @@ -0,0 +1,17 @@ +--- +mock_with: ':rspec' + +appveyor.yml: + delete: true +.project: + delete: true +.gitlab-ci.yml: + delete: true + +spec/default_facts.yml: + extra_facts: + pe_server_version: 2018.1.0 + +Rakefile: + extra_disabled_lint_checks: + - '140chars' diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..521510d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,43 @@ +--- +dist: trusty +language: ruby +cache: bundler +before_install: + - bundle -v + - rm -f Gemfile.lock + - gem update --system $RUBYGEMS_VERSION + - gem --version + - bundle -v +script: + - 'bundle exec rake $CHECK' +bundler_args: --without system_tests +rvm: + - 2.5.1 +env: + global: + - BEAKER_PUPPET_COLLECTION=puppet6 PUPPET_GEM_VERSION="~> 6.0" +matrix: + fast_finish: true + include: + - + env: CHECK="syntax lint metadata_lint check:symlinks check:git_ignore check:dot_underscore check:test_file rubocop" + - + env: CHECK=parallel_spec + - + env: PUPPET_GEM_VERSION="~> 5.0" CHECK=parallel_spec + rvm: 2.4.4 +branches: + only: + - master + - /^v\d/ +notifications: + email: false +deploy: + provider: puppetforge + user: puppet + password: + secure: "" + on: + tags: true + all_branches: true + condition: "$DEPLOY_TO_FORGE = yes" diff --git a/.yardopts b/.yardopts new file mode 100644 index 0000000..29c933b --- /dev/null +++ b/.yardopts @@ -0,0 +1 @@ +--markup markdown diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..cf2c387 --- /dev/null +++ b/Gemfile @@ -0,0 +1,71 @@ +source ENV['GEM_SOURCE'] || 'https://rubygems.org' + +def location_for(place_or_version, fake_version = nil) + git_url_regex = %r{\A(?(https?|git)[:@][^#]*)(#(?.*))?} + file_url_regex = %r{\Afile:\/\/(?.*)} + + if place_or_version && (git_url = place_or_version.match(git_url_regex)) + [fake_version, { git: git_url[:url], branch: git_url[:branch], require: false }].compact + elsif place_or_version && (file_url = place_or_version.match(file_url_regex)) + ['>= 0', { path: File.expand_path(file_url[:path]), require: false }] + else + [place_or_version, { require: false }] + end +end + +ruby_version_segments = Gem::Version.new(RUBY_VERSION.dup).segments +minor_version = ruby_version_segments[0..1].join('.') + +group :development do + gem "fast_gettext", '1.1.0', require: false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.1.0') + gem "fast_gettext", require: false if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.1.0') + gem "json_pure", '<= 2.0.1', require: false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.0.0') + gem "json", '= 1.8.1', require: false if Gem::Version.new(RUBY_VERSION.dup) == Gem::Version.new('2.1.9') + gem "json", '= 2.0.4', require: false if Gem::Requirement.create('~> 2.4.2').satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) + gem "json", '= 2.1.0', require: false if Gem::Requirement.create(['>= 2.5.0', '< 2.7.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) + gem "puppet-module-posix-default-r#{minor_version}", require: false, platforms: [:ruby] + gem "puppet-module-posix-dev-r#{minor_version}", require: false, platforms: [:ruby] + gem "puppet-module-win-default-r#{minor_version}", require: false, platforms: [:mswin, :mingw, :x64_mingw] + gem "puppet-module-win-dev-r#{minor_version}", require: false, platforms: [:mswin, :mingw, :x64_mingw] +end + +puppet_version = ENV['PUPPET_GEM_VERSION'] +facter_version = ENV['FACTER_GEM_VERSION'] +hiera_version = ENV['HIERA_GEM_VERSION'] + +gems = {} + +gems['puppet'] = location_for(puppet_version) + +# If facter or hiera versions have been specified via the environment +# variables + +gems['facter'] = location_for(facter_version) if facter_version +gems['hiera'] = location_for(hiera_version) if hiera_version + +if Gem.win_platform? && puppet_version =~ %r{^(file:///|git://)} + # If we're using a Puppet gem on Windows which handles its own win32-xxx gem + # dependencies (>= 3.5.0), set the maximum versions (see PUP-6445). + gems['win32-dir'] = ['<= 0.4.9', require: false] + gems['win32-eventlog'] = ['<= 0.6.5', require: false] + gems['win32-process'] = ['<= 0.7.5', require: false] + gems['win32-security'] = ['<= 0.2.5', require: false] + gems['win32-service'] = ['0.8.8', require: false] +end + +gems.each do |gem_name, gem_params| + gem gem_name, *gem_params +end + +# Evaluate Gemfile.local and ~/.gemfile if they exist +extra_gemfiles = [ + "#{__FILE__}.local", + File.join(Dir.home, '.gemfile'), +] + +extra_gemfiles.each do |gemfile| + if File.file?(gemfile) && File.readable?(gemfile) + eval(File.read(gemfile), binding) + end +end +# vim: syntax=ruby diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..9369ef8 --- /dev/null +++ b/Rakefile @@ -0,0 +1,77 @@ +require 'puppetlabs_spec_helper/rake_tasks' +require 'puppet-syntax/tasks/puppet-syntax' +require 'puppet_blacksmith/rake_tasks' if Bundler.rubygems.find_name('puppet-blacksmith').any? +require 'github_changelog_generator/task' if Bundler.rubygems.find_name('github_changelog_generator').any? +require 'puppet-strings/tasks' if Bundler.rubygems.find_name('puppet-strings').any? + +def changelog_user + return unless Rake.application.top_level_tasks.include? "changelog" + returnVal = nil || JSON.load(File.read('metadata.json'))['author'] + raise "unable to find the changelog_user in .sync.yml, or the author in metadata.json" if returnVal.nil? + puts "GitHubChangelogGenerator user:#{returnVal}" + returnVal +end + +def changelog_project + return unless Rake.application.top_level_tasks.include? "changelog" + returnVal = nil || JSON.load(File.read('metadata.json'))['name'] + raise "unable to find the changelog_project in .sync.yml or the name in metadata.json" if returnVal.nil? + puts "GitHubChangelogGenerator project:#{returnVal}" + returnVal +end + +def changelog_future_release + return unless Rake.application.top_level_tasks.include? "changelog" + returnVal = JSON.load(File.read('metadata.json'))['version'] + raise "unable to find the future_release (version) in metadata.json" if returnVal.nil? + puts "GitHubChangelogGenerator future_release:#{returnVal}" + returnVal +end + +PuppetLint.configuration.send('disable_relative') +PuppetLint.configuration.send('disable_140chars') + +if Bundler.rubygems.find_name('github_changelog_generator').any? + GitHubChangelogGenerator::RakeTask.new :changelog do |config| + raise "Set CHANGELOG_GITHUB_TOKEN environment variable eg 'export CHANGELOG_GITHUB_TOKEN=valid_token_here'" if Rake.application.top_level_tasks.include? "changelog" and ENV['CHANGELOG_GITHUB_TOKEN'].nil? + config.user = "#{changelog_user}" + config.project = "#{changelog_project}" + config.future_release = "#{changelog_future_release}" + config.exclude_labels = ['maintenance'] + config.header = "# Change log\n\nAll notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org)." + config.add_pr_wo_labels = true + config.issues = false + config.merge_prefix = "### UNCATEGORIZED PRS; GO LABEL THEM" + config.configure_sections = { + "Changed" => { + "prefix" => "### Changed", + "labels" => ["backwards-incompatible"], + }, + "Added" => { + "prefix" => "### Added", + "labels" => ["feature", "enhancement"], + }, + "Fixed" => { + "prefix" => "### Fixed", + "labels" => ["bugfix"], + }, + } + end +else + desc 'Generate a Changelog from GitHub' + task :changelog do + raise <= Gem::Version.new('2.2.2')" +EOM + end +end + diff --git a/lib/puppet/parser/functions/master_classifer_settings.rb b/lib/puppet/parser/functions/master_classifer_settings.rb index 4c6db92..0d3e516 100644 --- a/lib/puppet/parser/functions/master_classifer_settings.rb +++ b/lib/puppet/parser/functions/master_classifer_settings.rb @@ -1,5 +1,5 @@ module Puppet::Parser::Functions - newfunction(:master_classifer_settings, :type => :rvalue) do |args| + newfunction(:master_classifer_settings, type: :rvalue) do function_parseyaml([function_file([File.join(lookupvar('settings::confdir').to_s, 'classifier.yaml')])]) end end diff --git a/manifests/code_manager.pp b/manifests/code_manager.pp index 10e223a..af47407 100644 --- a/manifests/code_manager.pp +++ b/manifests/code_manager.pp @@ -1,3 +1,9 @@ +# Configures Code Manager in PE +# +# @summary Configures Code Manager in PE +# +# @example +# include pe_code_manager_webhook::code_manager class pe_code_manager_webhook::code_manager ( Boolean $authenticate_webhook = hiera('puppet_enterprise::master::code_manager::authenticate_webhook', true), String $code_manager_service_user = 'code_manager_service_user', @@ -151,8 +157,8 @@ } $code_manager_webhook_type = $git_management_system ? { - 'gitlab' => 'github', - default => $git_management_system, + 'gitlab' => 'github', # lint:ignore:2sp_soft_tabs + default => $git_management_system, # lint:ignore:2sp_soft_tabs } $webhook_url = "https://${::fqdn}:8170/code-manager/v1/webhook?type=${code_manager_webhook_type}${token_info}" diff --git a/manifests/init.pp b/manifests/init.pp index 79f22f4..e0c5ffc 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -1,3 +1,9 @@ +# Configures Code Manager in PE +# +# @summary Configures Code Manager in PE +# +# @example +# include pe_code_manager_webhook class pe_code_manager_webhook ( Boolean $force_zack_r10k_webhook = false, Boolean $force_code_manager_webhook = false, diff --git a/manifests/zack_r10k_webhook.pp b/manifests/zack_r10k_webhook.pp index e075926..5044985 100644 --- a/manifests/zack_r10k_webhook.pp +++ b/manifests/zack_r10k_webhook.pp @@ -1,3 +1,9 @@ +# A description of what this class does +# +# @summary A short summary of the purpose of this class +# +# @example +# include pe_code_manager_webhook::zack_r10k_webhook class pe_code_manager_webhook::zack_r10k_webhook ( $use_mcollective = false, $username = hiera('webhook_username', fqdn_rand_string(10, '', 'username')), diff --git a/manifests/zack_r10k_webhook_disable.pp b/manifests/zack_r10k_webhook_disable.pp index 90ab3f6..c06594b 100644 --- a/manifests/zack_r10k_webhook_disable.pp +++ b/manifests/zack_r10k_webhook_disable.pp @@ -1,3 +1,9 @@ +# A description of what this class does +# +# @summary A short summary of the purpose of this class +# +# @example +# include pe_code_manager_webhook::zack_r10k_webhook_disable class pe_code_manager_webhook::zack_r10k_webhook_disable { file { '/etc/webhook.yaml' : diff --git a/metadata.json b/metadata.json index 2729413..cbaea8a 100644 --- a/metadata.json +++ b/metadata.json @@ -1,6 +1,6 @@ { - "name": "npwalker/pe_code_manager_webhook", - "version": "2.0.1", + "name": "npwalker-pe_code_manager_webhook", + "version": "2.0.2", "author": "npwalker", "summary": "A module for configuring Code Manager in Puppet Enterprise", "license": "Apache-2.0", @@ -8,9 +8,18 @@ "project_page": "https://github.com/npwalker/pe_code_manager_webhook", "issues_url": "https://github.com/npwalker/pe_code_manager_webhook/issues", "dependencies": [ - {"name":"puppetlabs-stdlib","version_requirement":">= 4.1.0 < 5.0.0"}, - {"name":"pltraining-rbac","version_requirement":">= 0.0.5 < 0.0.6"}, - {"name":"abrader-gms","version_requirement":">= 1.0.2 < 2.0.0"} + { + "name": "puppetlabs-stdlib", + "version_requirement": ">= 4.1.0 < 6.0.0" + }, + { + "name": "pltraining-rbac", + "version_requirement": ">= 0.0.5 < 0.0.6" + }, + { + "name": "abrader-gms", + "version_requirement": ">= 1.0.2 < 2.0.0" + } ], "operatingsystem_support": [ { @@ -63,8 +72,11 @@ ], "requirements": [ { - "name": "pe", - "version_requirement": ">= 2015.3.0" + "name": "puppet", + "version_requirement": ">= 4.0" } - ] -} + ], + "pdk-version": "1.10.0.pre (heads/master-0-g553e6e0)", + "template-url": "https://github.com/puppetlabs/pdk-templates", + "template-ref": "tags/1.9.0-0-g7281db5" +} \ No newline at end of file diff --git a/spec/classes/init_spec.rb b/spec/classes/init_spec.rb new file mode 100644 index 0000000..58cb3b1 --- /dev/null +++ b/spec/classes/init_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe 'pe_code_manager_webhook' do + let(:params) do + {} + end + + on_supported_os.each do |os, os_facts| + context "on #{os}" do + let(:facts) { os_facts } + + it { is_expected.to compile } + end + end +end diff --git a/spec/default_facts.yml b/spec/default_facts.yml new file mode 100644 index 0000000..5f4a353 --- /dev/null +++ b/spec/default_facts.yml @@ -0,0 +1,9 @@ +# Use default_module_facts.yml for module specific facts. +# +# Facts specified here will override the values provided by rspec-puppet-facts. +--- +ipaddress: "172.16.254.254" +is_pe: false +macaddress: "AA:AA:AA:AA:AA:AA" +pe_server_version: 2018.1.0 + diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000..7dfbc49 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,51 @@ +RSpec.configure do |c| + c.mock_with :rspec +end + +require 'puppetlabs_spec_helper/module_spec_helper' +require 'rspec-puppet-facts' + +require 'spec_helper_local' if File.file?(File.join(File.dirname(__FILE__), 'spec_helper_local.rb')) + +include RspecPuppetFacts + +default_facts = { + puppetversion: Puppet.version, + facterversion: Facter.version, +} + +default_fact_files = [ + File.expand_path(File.join(File.dirname(__FILE__), 'default_facts.yml')), + File.expand_path(File.join(File.dirname(__FILE__), 'default_module_facts.yml')), +] + +default_fact_files.each do |f| + next unless File.exist?(f) && File.readable?(f) && File.size?(f) + + begin + default_facts.merge!(YAML.safe_load(File.read(f))) + rescue => e + RSpec.configuration.reporter.message "WARNING: Unable to load #{f}: #{e}" + end +end + +RSpec.configure do |c| + c.default_facts = default_facts + c.before :each do + # set to strictest setting for testing + # by default Puppet runs at warning level + Puppet.settings[:strict] = :warning + end + c.filter_run_excluding(bolt: true) unless ENV['GEM_BOLT'] + c.after(:suite) do + end +end + +def ensure_module_defined(module_name) + module_name.split('::').reduce(Object) do |last_module, next_module| + last_module.const_set(next_module, Module.new) unless last_module.const_defined?(next_module, false) + last_module.const_get(next_module, false) + end +end + +# 'spec_overrides' from sync.yml will appear below this line