diff --git a/.gitignore b/.gitignore index 3f15512..0efe175 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,9 @@ .envrc /inventory.yaml /spec/fixtures/litmus_inventory.yaml +.resource_types +.modules +.task_cache.json +.plan_cache.json +.rerun.json +bolt-debug.log diff --git a/.pdkignore b/.pdkignore index 862847a..9403b08 100644 --- a/.pdkignore +++ b/.pdkignore @@ -26,6 +26,12 @@ .envrc /inventory.yaml /spec/fixtures/litmus_inventory.yaml +.resource_types +.modules +.task_cache.json +.plan_cache.json +.rerun.json +bolt-debug.log /.fixtures.yml /Gemfile /.gitattributes diff --git a/.rubocop.yml b/.rubocop.yml index 5be1f9f..21b82b9 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -3,6 +3,7 @@ require: - rubocop-performance - rubocop-rspec AllCops: + NewCops: enable DisplayCopNames: true TargetRubyVersion: '2.6' Include: @@ -527,6 +528,8 @@ Lint/DuplicateBranch: Enabled: false Lint/DuplicateMagicComment: Enabled: false +Lint/DuplicateMatchPattern: + Enabled: false Lint/DuplicateRegexpCharacterClassElement: Enabled: false Lint/EmptyBlock: @@ -643,6 +646,8 @@ Style/ComparableClamp: Enabled: false Style/ConcatArrayLiterals: Enabled: false +Style/DataInheritance: + Enabled: false Style/DirEmpty: Enabled: false Style/DocumentDynamicEvalDefinition: @@ -711,6 +716,8 @@ Style/RedundantHeredocDelimiterQuotes: Enabled: false Style/RedundantInitialize: Enabled: false +Style/RedundantLineContinuation: + Enabled: false Style/RedundantSelfAssignmentBranch: Enabled: false Style/RedundantStringEscape: diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 2f1e4f7..6da8d47 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,6 @@ { "recommendations": [ "puppet.puppet-vscode", - "rebornix.Ruby" + "Shopify.ruby-lsp" ] } diff --git a/Gemfile b/Gemfile index ca0e773..197de74 100644 --- a/Gemfile +++ b/Gemfile @@ -20,30 +20,30 @@ group :development do gem "json", '= 2.6.1', require: false if Gem::Requirement.create(['>= 3.1.0', '< 3.1.3']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) gem "json", '= 2.6.3', require: false if Gem::Requirement.create(['>= 3.2.0', '< 4.0.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) gem "racc", '~> 1.4.0', require: false if Gem::Requirement.create(['>= 2.7.0', '< 3.0.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) + gem "deep_merge", '~> 1.2.2', require: false gem "voxpupuli-puppet-lint-plugins", '~> 5.0', require: false - gem "facterdb", '~> 1.18', require: false - gem "metadata-json-lint", '~> 3.0', require: false - gem "puppetlabs_spec_helper", '~> 6.0', require: false - gem "rspec-puppet-facts", '~> 2.0', require: false - gem "codecov", '~> 0.2', require: false + gem "facterdb", '~> 1.26', require: false + gem "metadata-json-lint", '~> 4.0', require: false + gem "rspec-puppet-facts", '~> 3.0', require: false gem "dependency_checker", '~> 1.0.0', require: false gem "parallel_tests", '= 3.12.1', require: false gem "pry", '~> 0.10', require: false - gem "simplecov-console", '~> 0.5', require: false + gem "simplecov-console", '~> 0.9', require: false gem "puppet-debugger", '~> 1.0', require: false - gem "rubocop", '= 1.48.1', require: false + gem "rubocop", '~> 1.50.0', require: false gem "rubocop-performance", '= 1.16.0', require: false gem "rubocop-rspec", '= 2.19.0', require: false - gem "puppet-strings", '~> 4.0', require: false gem "rb-readline", '= 0.5.5', require: false, platforms: [:mswin, :mingw, :x64_mingw] + gem "rexml", '>= 3.0.0', '< 3.2.7', require: false end -group :system_tests do - gem "puppet_litmus", '~> 1.0', require: false, platforms: [:ruby, :x64_mingw] - gem "serverspec", '~> 2.41', require: false -end -group :release_prep do +group :development, :release_prep do gem "puppet-strings", '~> 4.0', require: false - gem "puppetlabs_spec_helper", '~> 6.0', require: false + gem "puppetlabs_spec_helper", '~> 7.0', require: false +end +group :system_tests do + gem "puppet_litmus", '~> 1.0', require: false, platforms: [:ruby, :x64_mingw] + gem "CFPropertyList", '< 3.0.7', require: false, platforms: [:mswin, :mingw, :x64_mingw] + gem "serverspec", '~> 2.41', require: false end puppet_version = ENV['PUPPET_GEM_VERSION'] diff --git a/metadata.json b/metadata.json index 46d588b..106873e 100644 --- a/metadata.json +++ b/metadata.json @@ -98,7 +98,7 @@ "arbitrator", "garbd" ], - "pdk-version": "3.0.1", + "pdk-version": "3.2.0", "template-url": "https://github.com/markt-de/pdk-templates.git#main", - "template-ref": "heads/main-0-g909fd77" + "template-ref": "heads/main-0-g1829b3f" } diff --git a/spec/classes/galera_arbitrator_spec.rb b/spec/classes/galera_arbitrator_spec.rb index 0d46575..b49dae1 100644 --- a/spec/classes/galera_arbitrator_spec.rb +++ b/spec/classes/galera_arbitrator_spec.rb @@ -4,7 +4,7 @@ on_supported_os.each do |os, facts| context "on #{os}" do let(:facts) do - facts.merge({}) + facts end let(:default_params) do @@ -55,7 +55,7 @@ it { is_expected.to contain_service('arbitrator-service').with_enable(true) } describe 'with parameter: arbitrator_service_enabled=false' do - let(:params) { default_params.merge!(arbitrator_service_enabled: false) } + let(:params) { default_params.deep_merge!(arbitrator_service_enabled: false) } it { is_expected.to contain_service('arbitrator-service').with_enable(false) } end diff --git a/spec/classes/galera_debian_spec.rb b/spec/classes/galera_debian_spec.rb index 1faad7e..8bf5c64 100644 --- a/spec/classes/galera_debian_spec.rb +++ b/spec/classes/galera_debian_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe 'galera::debian' do - let :pre_condition do + let(:pre_condition) do "class { 'galera': cluster_name => 'testcluster', galera_master => 'control1', @@ -30,7 +30,7 @@ context 'when this node is the master' do before(:each) do - facts.merge!(networking: { 'fqdn' => 'control1' }) + facts.deep_merge!(networking: { 'fqdn' => 'control1' }) end let(:node) { 'control1' } @@ -69,7 +69,7 @@ context 'when this node is a slave' do before(:each) do - facts.merge!(networking: { 'fqdn' => 'slave' }) + facts.deep_merge!(networking: { 'fqdn' => 'slave' }) end let(:node) { 'slave' } @@ -91,7 +91,7 @@ on_supported_os.each do |os, facts| context "on #{os}" do # rubocop:disable RSpec/EmptyExampleGroup let(:facts) do - facts.merge({}) + facts end case facts[:osfamily] diff --git a/spec/classes/galera_init_spec.rb b/spec/classes/galera_init_spec.rb index 1008fa5..e43c566 100644 --- a/spec/classes/galera_init_spec.rb +++ b/spec/classes/galera_init_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe 'galera' do - let :params do + let(:params) do { arbitrator_config_file: '/etc/default/garb', arbitrator_package_ensure: 'present', @@ -76,17 +76,17 @@ end context 'when node is the master' do - before(:each) { params.merge!(galera_master: facts[:networking]['fqdn']) } + before(:each) { params.deep_merge!(galera_master: facts[:networking]['fqdn']) } it { is_expected.to contain_exec('bootstrap_galera_cluster') } end context 'when node is not the master' do - before(:each) { params.merge!(galera_master: "not_#{facts[:networking]['fqdn']}") } + before(:each) { params.deep_merge!(galera_master: "not_#{facts[:networking]['fqdn']}") } it { is_expected.not_to contain_exec('bootstrap_galera_cluster') } end context 'when installing mariadb' do - before(:each) { params.merge!(vendor_type: 'mariadb', vendor_version: '10.3') } + before(:each) { params.deep_merge!(vendor_type: 'mariadb', vendor_version: '10.3') } it { is_expected.to contain_class('mysql::server').with( package_name: os_params[:m_mysql_package_name], @@ -102,7 +102,7 @@ end context 'when using xtrabackup' do - before(:each) { params.merge!(wsrep_sst_method: 'xtrabackup') } + before(:each) { params.deep_merge!(wsrep_sst_method: 'xtrabackup') } it { if os_params[:p_xtrabackup_package] != 'NONE' is_expected.to contain_package(os_params[:p_xtrabackup_package]).with(ensure: 'installed') @@ -111,7 +111,7 @@ end context 'when using xtrabackup-v2' do - before(:each) { params.merge!(wsrep_sst_method: 'xtrabackup-v2') } + before(:each) { params.deep_merge!(wsrep_sst_method: 'xtrabackup-v2') } it { if os_params[:p_xtrabackup_package] != 'NONE' is_expected.to contain_package(os_params[:p_xtrabackup_package]).with(ensure: 'installed') @@ -120,7 +120,7 @@ end context 'when using mariabackup' do - before(:each) { params.merge!(vendor_type: 'mariadb', vendor_version: '10.3', wsrep_sst_method: 'mariabackup') } + before(:each) { params.deep_merge!(vendor_type: 'mariadb', vendor_version: '10.3', wsrep_sst_method: 'mariabackup') } it { if os_params[:m_mariadb_backup_package_name] != 'NONE' is_expected.to contain_package(os_params[:m_mariadb_backup_package_name]).with_ensure('installed') @@ -130,38 +130,38 @@ end context 'when managing root .my.cnf' do - before(:each) { params.merge!(create_root_my_cnf: true) } + before(:each) { params.deep_merge!(create_root_my_cnf: true) } it { is_expected.to contain_class('mysql::server').with(create_root_my_cnf: true) } it { is_expected.to contain_exec('create .my.cnf for user root') } end context 'when not managing root .my.cnf' do - before(:each) { params.merge!(create_root_my_cnf: false) } + before(:each) { params.deep_merge!(create_root_my_cnf: false) } it { is_expected.to contain_class('mysql::server').with(create_root_my_cnf: false) } it { is_expected.not_to contain_exec('create .my.cnf for user root') } end context 'when create_root_user=undef (default) and the master' do - before(:each) { params.merge!(galera_master: facts[:networking]['fqdn']) } + before(:each) { params.deep_merge!(galera_master: facts[:networking]['fqdn']) } it { is_expected.to contain_class('galera').with(create_root_user: nil) } it { is_expected.to contain_class('mysql::server').with(create_root_user: true) } it { is_expected.to contain_mysql_user('root@localhost') } end context 'when create_root_user=undef (default) and not the master' do - before(:each) { params.merge!(galera_master: "not_#{facts[:networking]['fqdn']}") } + before(:each) { params.deep_merge!(galera_master: "not_#{facts[:networking]['fqdn']}") } it { is_expected.to contain_class('mysql::server').with(create_root_user: false) } it { is_expected.not_to contain_mysql_user('root@localhost') } end context 'when create_root_user=true' do - before(:each) { params.merge!(create_root_user: true) } + before(:each) { params.deep_merge!(create_root_user: true) } it { is_expected.to contain_class('mysql::server').with(create_root_user: true) } it { is_expected.to contain_mysql_user('root@localhost') } end context 'when create root user is false' do - before(:each) { params.merge!(create_root_user: false) } + before(:each) { params.deep_merge!(create_root_user: false) } it { is_expected.to contain_class('mysql::server').with(create_root_user: false) } it { is_expected.not_to contain_mysql_user('root@localhost') } end @@ -174,7 +174,7 @@ end context 'when create_status_user=false' do - before(:each) { params.merge!(create_status_user: false) } + before(:each) { params.deep_merge!(create_status_user: false) } it { is_expected.not_to contain_mysql_user('clustercheck@localhost') } it { is_expected.not_to contain_mysql_user('clustercheck@%') } it { is_expected.not_to contain_mysql_grant('clustercheck@localhost/*.*') } @@ -182,7 +182,7 @@ end context 'when status_allow=example' do - before(:each) { params.merge!(status_allow: 'example') } + before(:each) { params.deep_merge!(status_allow: 'example') } it { is_expected.to contain_mysql_user('clustercheck@localhost') } it { is_expected.to contain_mysql_user('clustercheck@example') } it { is_expected.not_to contain_mysql_user('clustercheck@%') } @@ -196,13 +196,13 @@ end context 'when validate_connection=false' do - before(:each) { params.merge!(validate_connection: false) } + before(:each) { params.deep_merge!(validate_connection: false) } it { is_expected.not_to contain_class('galera::validate') } it { is_expected.not_to contain_exec('validate_connection') } end context 'when installing codership' do - before(:each) { params.merge!(vendor_type: 'codership') } + before(:each) { params.deep_merge!(vendor_type: 'codership') } it { is_expected.to contain_class('mysql::server').with( package_name: os_params[:c_mysql_package_name], @@ -218,7 +218,7 @@ context 'when specifying package names' do before(:each) do - params.merge!(mysql_package_name: 'mysql-package-test', + params.deep_merge!(mysql_package_name: 'mysql-package-test', galera_package_name: 'galera-package-test', galera_package_ensure: 'present') end @@ -246,7 +246,7 @@ # Class[Mysql::Server]: parameter 'package_ensure' expects a match for Variant[Enum['absent', 'present'] # # context 'when package_ensure=latest' do - # before(:each) { params.merge!(package_ensure: 'latest') } + # before(:each) { params.deep_merge!(package_ensure: 'latest') } # it { is_expected.to contain_package(os_params[:p_galera_package_name]).with(ensure: 'absent') } # it { # is_expected.to contain_class('mysql::server').with( @@ -257,19 +257,19 @@ # end # # context 'when galera_package_ensure=latest' do - # before(:each) { params.merge!(galera_package_ensure: 'latest') } + # before(:each) { params.deep_merge!(galera_package_ensure: 'latest') } # it { is_expected.to contain_package(os_params[:p_galera_package_name]).with(ensure: 'latest') } # end context 'when configure_firewall=false' do - before(:each) { params.merge!(configure_firewall: false) } + before(:each) { params.deep_merge!(configure_firewall: false) } it { is_expected.not_to contain_class('galera::firewall') } it { is_expected.not_to contain_firewall('4567 galera accept tcp') } end context 'when specifying logging options' do before(:each) do - params.merge!(status_log_on_success: 'PID HOST USERID EXIT DURATION TRAFFIC', + params.deep_merge!(status_log_on_success: 'PID HOST USERID EXIT DURATION TRAFFIC', status_log_on_success_operator: '-=', status_log_on_failure: 'USERID') end @@ -286,7 +286,7 @@ on_supported_os.each do |os, facts| context "on #{os}" do # rubocop:disable RSpec/EmptyExampleGroup let(:facts) do - facts.merge({}) + facts end let(:os_params) do diff --git a/spec/classes/galera_redhat_spec.rb b/spec/classes/galera_redhat_spec.rb index 2a0721a..9bd9140 100644 --- a/spec/classes/galera_redhat_spec.rb +++ b/spec/classes/galera_redhat_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe 'galera' do - let :params do + let(:params) do { arbitrator_config_file: '/etc/default/garb', arbitrator_package_ensure: 'present', @@ -38,12 +38,12 @@ end context 'when node is the master' do - before(:each) { params.merge!(galera_master: facts[:networking]['fqdn']) } + before(:each) { params.deep_merge!(galera_master: facts[:networking]['fqdn']) } it { is_expected.to contain_exec('bootstrap_galera_cluster').with_command(%r{systemctl start mysql@bootstrap.service}) } end context 'when installing mariadb' do - before(:each) { params.merge!(vendor_type: 'mariadb', vendor_version: '10.3') } + before(:each) { params.deep_merge!(vendor_type: 'mariadb', vendor_version: '10.3') } it { is_expected.to contain_file('/var/log/mariadb') } it { is_expected.to contain_file('/var/run/mariadb') } @@ -52,7 +52,7 @@ shared_examples_for 'galera on RedHat 6' do context 'when node is the master' do - before(:each) { params.merge!(galera_master: facts[:networking]['fqdn']) } + before(:each) { params.deep_merge!(galera_master: facts[:networking]['fqdn']) } it { is_expected.to contain_exec('bootstrap_galera_cluster').with_command(%r{/etc/init.d/mysql bootstrap-pxc}) } end end @@ -60,7 +60,7 @@ on_supported_os.each do |os, facts| context "on #{os}" do # rubocop:disable RSpec/EmptyExampleGroup let(:facts) do - facts.merge({}) + facts end let(:os_params) do diff --git a/spec/classes/galera_repo_spec.rb b/spec/classes/galera_repo_spec.rb index 27c1a49..50bf30a 100644 --- a/spec/classes/galera_repo_spec.rb +++ b/spec/classes/galera_repo_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe 'galera' do - let :params do + let(:params) do { configure_repo: true, cluster_name: 'testcluster', @@ -12,7 +12,7 @@ shared_examples_for 'repo on RedHat-family' do context 'for codership' do before(:each) do - params.merge!(vendor_type: 'codership', vendor_version: '5.7') + params.deep_merge!(vendor_type: 'codership', vendor_version: '5.7') end it { is_expected.to contain_galera__repo__config('codership') } it { is_expected.to contain_galera__repo__config('codership_lib') } @@ -22,7 +22,7 @@ context 'for codership with wsrep_sst_method=xtrabackup' do before(:each) do - params.merge!(vendor_type: 'codership', vendor_version: '5.7', wsrep_sst_method: 'xtrabackup') + params.deep_merge!(vendor_type: 'codership', vendor_version: '5.7', wsrep_sst_method: 'xtrabackup') end it { is_expected.to contain_galera__repo__config('codership') } it { is_expected.to contain_galera__repo__config('codership_lib') } @@ -34,7 +34,7 @@ context 'for mariadb' do before(:each) do - params.merge!(vendor_type: 'mariadb', vendor_version: '10.3') + params.deep_merge!(vendor_type: 'mariadb', vendor_version: '10.3') end it { is_expected.to contain_galera__repo__config('mariadb') } it { is_expected.to contain_yumrepo('galera_mariadb').with(enabled: 1) } @@ -42,7 +42,7 @@ context 'for mariadb with wsrep_sst_method=xtrabackup-v2' do before(:each) do - params.merge!(vendor_type: 'mariadb', vendor_version: '10.3', wsrep_sst_method: 'xtrabackup-v2') + params.deep_merge!(vendor_type: 'mariadb', vendor_version: '10.3', wsrep_sst_method: 'xtrabackup-v2') end it { is_expected.to contain_galera__repo__config('mariadb') } it { is_expected.to contain_galera__repo__config('percona_tools') } @@ -52,7 +52,7 @@ context 'for percona' do before(:each) do - params.merge!(vendor_type: 'percona', vendor_version: '5.7') + params.deep_merge!(vendor_type: 'percona', vendor_version: '5.7') end it { is_expected.to contain_galera__repo__config('percona') } it { is_expected.to contain_galera__repo__config('percona_tools') } @@ -62,7 +62,7 @@ context 'with configure_repo=false' do before(:each) do - params.merge!(configure_repo: false) + params.deep_merge!(configure_repo: false) end it { is_expected.not_to contain_galera__repo__config('codership') } it { is_expected.not_to contain_galera__repo__config('codership_lib') } @@ -82,7 +82,7 @@ context 'with epel_needed=false' do before(:each) do - params.merge!(epel_needed: false) + params.deep_merge!(epel_needed: false) end it { is_expected.not_to contain_class('epel') } end @@ -91,7 +91,7 @@ shared_examples_for 'repo on Debian-family' do context 'for codership' do before(:each) do - params.merge!(vendor_type: 'codership', vendor_version: '5.7') + params.deep_merge!(vendor_type: 'codership', vendor_version: '5.7') end it { is_expected.to contain_galera__repo__config('codership') } it { is_expected.to contain_galera__repo__config('codership_lib') } @@ -101,7 +101,7 @@ context 'for codership with wsrep_sst_method=xtrabackup' do before(:each) do - params.merge!(vendor_type: 'codership', vendor_version: '5.7', wsrep_sst_method: 'xtrabackup') + params.deep_merge!(vendor_type: 'codership', vendor_version: '5.7', wsrep_sst_method: 'xtrabackup') end it { is_expected.to contain_galera__repo__config('codership') } it { is_expected.to contain_galera__repo__config('codership_lib') } @@ -113,14 +113,14 @@ context 'for mariadb' do before(:each) do - params.merge!(vendor_type: 'mariadb', vendor_version: '10.3') + params.deep_merge!(vendor_type: 'mariadb', vendor_version: '10.3') end it { is_expected.to contain_apt__source('galera_mariadb').with(repos: 'main') } end context 'for mariadb with wsrep_sst_method=xtrabackup-v2' do before(:each) do - params.merge!(vendor_type: 'mariadb', vendor_version: '10.3', wsrep_sst_method: 'xtrabackup-v2') + params.deep_merge!(vendor_type: 'mariadb', vendor_version: '10.3', wsrep_sst_method: 'xtrabackup-v2') end it { is_expected.to contain_galera__repo__config('mariadb') } it { is_expected.to contain_galera__repo__config('percona_tools') } @@ -130,7 +130,7 @@ context 'for percona' do before(:each) do - params.merge!(vendor_type: 'percona', vendor_version: '5.7') + params.deep_merge!(vendor_type: 'percona', vendor_version: '5.7') end it { is_expected.to contain_galera__repo__config('percona') } it { is_expected.to contain_galera__repo__config('percona_tools') } @@ -140,7 +140,7 @@ context 'with configure_repo=false' do before(:each) do - params.merge!(configure_repo: false) + params.deep_merge!(configure_repo: false) end it { is_expected.not_to contain_galera__repo__config('codership') } it { is_expected.not_to contain_galera__repo__config('codership_lib') } @@ -156,7 +156,7 @@ context 'with epel_needed=true should do nothing' do before(:each) do - params.merge!(epel_needed: true) + params.deep_merge!(epel_needed: true) end it { is_expected.not_to contain_class('epel') } end @@ -165,7 +165,7 @@ on_supported_os.each do |os, facts| context "on #{os}" do # rubocop:disable RSpec/EmptyExampleGroup let(:facts) do - facts.merge({}) + facts end case facts[:osfamily] diff --git a/spec/default_facts.yml b/spec/default_facts.yml index 5780949..77c67f5 100644 --- a/spec/default_facts.yml +++ b/spec/default_facts.yml @@ -4,4 +4,5 @@ --- is_pe: false root_home: "/root" +fqdn: localhost diff --git a/spec/fixtures/hiera.yaml b/spec/fixtures/hiera.yaml index 5b327f6..9ef98c5 100644 --- a/spec/fixtures/hiera.yaml +++ b/spec/fixtures/hiera.yaml @@ -4,4 +4,3 @@ :datadir: 'spec/fixtures/hiera' :hierarchy: - common - diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index ce5a374..1923dd8 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -25,7 +25,8 @@ next unless File.exist?(f) && File.readable?(f) && File.size?(f) begin - default_facts.merge!(YAML.safe_load(File.read(f), permitted_classes: [], permitted_symbols: [], aliases: true)) + require 'deep_merge' + default_facts.deep_merge!(YAML.safe_load(File.read(f), permitted_classes: [], permitted_symbols: [], aliases: true)) rescue StandardError => e RSpec.configuration.reporter.message "WARNING: Unable to load #{f}: #{e}" end @@ -33,7 +34,7 @@ # read default_facts and merge them over what is provided by facterdb default_facts.each do |fact, value| - add_custom_fact fact, value + add_custom_fact fact, value, merge_facts: true end RSpec.configure do |c|