diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..5b09ea6c --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,95 @@ +This module has grown over time based on a range of contributions from +people using it. If you follow these contributing guidelines your patch +will likely make it into a release a little quicker. + + +## Contributing + +Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms. [Contributor Code of Conduct](https://voxpupuli.org/coc/). + +1. Fork the repo. + +1. Create a separate branch for your change. + +1. Run the tests. We only take pull requests with passing tests, and + documentation. + +1. Add a test for your change. Only refactoring and documentation + changes require no new tests. If you are adding functionality + or fixing a bug, please add a test. + +1. Squash your commits down into logical components. Make sure to rebase + against the current master. + +1. Push the branch to your fork and submit a pull request. + +Please be prepared to repeat some of these steps as our contributors review +your code. + +## Dependencies + +The testing and development tools have a bunch of dependencies, +all managed by [bundler](http://bundler.io/) according to the +[Puppet support matrix](http://docs.puppetlabs.com/guides/platforms.html#ruby-versions). + +By default the tests use a baseline version of Puppet. + +If you have Ruby 2.x or want a specific version of Puppet, +you must set an environment variable such as: + + export PUPPET_VERSION="~> 4.2.0" + +Install the dependencies like so... + + bundle install + +## Syntax and style + +The test suite will run [Puppet Lint](http://puppet-lint.com/) and +[Puppet Syntax](https://github.com/gds-operations/puppet-syntax) to +check various syntax and style things. You can run these locally with: + + bundle exec rake lint + bundle exec rake validate + +## Running the unit tests + +The unit test suite covers most of the code, as mentioned above please +add tests if you're adding new functionality. If you've not used +[rspec-puppet](http://rspec-puppet.com/) before then feel free to ask +about how best to test your new feature. + +To run your all the unit tests + + bundle exec rake spec SPEC_OPTS='--format documentation' + +To run a specific spec test set the `SPEC` variable: + + bundle exec rake spec SPEC=spec/foo_spec.rb + +To run the linter, the syntax checker and the unit tests: + + bundle exec rake test + + +## Integration tests + +The unit tests just check the code runs, not that it does exactly what +we want on a real machine. For that we're using +[beaker](https://github.com/puppetlabs/beaker). + +This fires up a new virtual machine (using vagrant) and runs a series of +simple tests against it after applying the module. You can run this +with: + + bundle exec rake acceptance + +This will run the tests on an Ubuntu 12.04 virtual machine. You can also +run the integration tests against Centos 6.5 with. + + BEAKER_set=centos-64-x64 bundle exec rake acceptances + +If you don't want to have to recreate the virtual machine every time you +can use `BEAKER_DESTROY=no` and `BEAKER_PROVISION=no`. On the first run you will +at least need `BEAKER_PROVISION` set to yes (the default). The Vagrantfile +for the created virtual machines will be in `.vagrant/beaker_vagrant_fies`. diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..9ac4a2b0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,23 @@ + + +### Affected Puppet, Ruby, OS and module versions/distributions + +- Puppet: +- Ruby: +- Distribution: +- Module version: + +### How to reproduce (e.g Puppet code you use) + +### What are you seeing + +### What behaviour did you expect instead + +### Output log + +### Any additional information you'd like to impart diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..79272bf6 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,5 @@ + diff --git a/.msync.yml b/.msync.yml new file mode 100644 index 00000000..efd68b6d --- /dev/null +++ b/.msync.yml @@ -0,0 +1 @@ +modulesync_config_version: '0.9.1' diff --git a/.rubocop.yml b/.rubocop.yml index 364b022f..c834cd20 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -8,22 +8,53 @@ AllCops: - .vendor/**/* - pkg/**/* - spec/fixtures/**/* +Lint/ConditionPosition: + Enabled: true -# Configuration parameters: AllowURI, URISchemes. -Metrics/LineLength: - Max: 328 +Lint/ElseLayout: + Enabled: true -# 'Complexity' is very relative -Metrics/PerceivedComplexity: - Enabled: false +Lint/UnreachableCode: + Enabled: true -# 'Complexity' is very relative -Metrics/CyclomaticComplexity: - Enabled: false +Lint/UselessComparison: + Enabled: true -# 'Complexity' is very relative -Metrics/AbcSize: - Enabled: false +Lint/EnsureReturn: + Enabled: true + +Lint/HandleExceptions: + Enabled: true + +Lint/LiteralInCondition: + Enabled: true + +Lint/ShadowingOuterLocalVariable: + Enabled: true + +Lint/LiteralInInterpolation: + Enabled: true + +Style/HashSyntax: + Enabled: true + +Style/RedundantReturn: + Enabled: true + +Lint/AmbiguousOperator: + Enabled: true + +Lint/AssignmentInCondition: + Enabled: true + +Style/SpaceBeforeComment: + Enabled: true + +Style/AndOr: + Enabled: true + +Style/RedundantSelf: + Enabled: true # Method length is not necessarily an indicator of code quality Metrics/MethodLength: @@ -33,42 +64,437 @@ Metrics/MethodLength: Metrics/ModuleLength: Enabled: false +Style/WhileUntilModifier: + Enabled: true + +Lint/AmbiguousRegexpLiteral: + Enabled: true + +Lint/Eval: + Enabled: true + +Lint/BlockAlignment: + Enabled: true + +Lint/DefEndAlignment: + Enabled: true + +Lint/EndAlignment: + Enabled: true + +Lint/DeprecatedClassMethods: + Enabled: true + +Lint/Loop: + Enabled: true + +Lint/ParenthesesAsGroupedExpression: + Enabled: true + +Lint/RescueException: + Enabled: true + +Lint/StringConversionInInterpolation: + Enabled: true + +Lint/UnusedBlockArgument: + Enabled: true + +Lint/UnusedMethodArgument: + Enabled: true + +Lint/UselessAccessModifier: + Enabled: true + +Lint/UselessAssignment: + Enabled: true + +Lint/Void: + Enabled: true + +Style/AccessModifierIndentation: + Enabled: true + +Style/AccessorMethodName: + Enabled: true + +Style/Alias: + Enabled: true + +Style/AlignArray: + Enabled: true + +Style/AlignHash: + Enabled: true + +Style/AlignParameters: + Enabled: true + +Metrics/BlockNesting: + Enabled: true + +Style/AsciiComments: + Enabled: true + +Style/Attr: + Enabled: true + +Style/BracesAroundHashParameters: + Enabled: true + +Style/CaseEquality: + Enabled: true + +Style/CaseIndentation: + Enabled: true + +Style/CharacterLiteral: + Enabled: true + +Style/ClassAndModuleCamelCase: + Enabled: true + +Style/ClassAndModuleChildren: + Enabled: false + +Style/ClassCheck: + Enabled: true + # Class length is not necessarily an indicator of code quality Metrics/ClassLength: Enabled: false -# dealbreaker: -Style/TrailingCommaInArguments: +Style/ClassMethods: + Enabled: true + +Style/ClassVars: + Enabled: true + +Style/WhenThen: + Enabled: true + +Style/WordArray: + Enabled: true + +Style/UnneededPercentQ: + Enabled: true + +Style/Tab: + Enabled: true + +Style/SpaceBeforeSemicolon: + Enabled: true + +Style/TrailingBlankLines: + Enabled: true + +Style/SpaceInsideBlockBraces: + Enabled: true + +Style/SpaceInsideBrackets: + Enabled: true + +Style/SpaceInsideHashLiteralBraces: + Enabled: true + +Style/SpaceInsideParens: + Enabled: true + +Style/LeadingCommentSpace: + Enabled: true + +Style/SpaceBeforeFirstArg: + Enabled: true + +Style/SpaceAfterColon: + Enabled: true + +Style/SpaceAfterComma: + Enabled: true + +Style/SpaceAfterMethodName: + Enabled: true + +Style/SpaceAfterNot: + Enabled: true + +Style/SpaceAfterSemicolon: + Enabled: true + +Style/SpaceAroundEqualsInParameterDefault: + Enabled: true + +Style/SpaceAroundOperators: + Enabled: true + +Style/SpaceBeforeBlockBraces: + Enabled: true + +Style/SpaceBeforeComma: + Enabled: true + +Style/CollectionMethods: + Enabled: true + +Style/CommentIndentation: + Enabled: true + +Style/ColonMethodCall: + Enabled: true + +Style/CommentAnnotation: + Enabled: true + +# 'Complexity' is very relative +Metrics/CyclomaticComplexity: Enabled: false -Style/TrailingCommaInLiteral: + +Style/ConstantName: + Enabled: true + +Style/Documentation: Enabled: false -Style/ClosingParenthesisIndentation: + +Style/DefWithParentheses: + Enabled: true + +Style/PreferredHashMethods: + Enabled: true + +Style/DotPosition: + EnforcedStyle: trailing + +Style/DoubleNegation: + Enabled: true + +Style/EachWithObject: + Enabled: true + +Style/EmptyLineBetweenDefs: + Enabled: true + +Style/IndentArray: + Enabled: true + +Style/IndentHash: + Enabled: true + +Style/IndentationConsistency: + Enabled: true + +Style/IndentationWidth: + Enabled: true + +Style/EmptyLines: + Enabled: true + +Style/EmptyLinesAroundAccessModifier: + Enabled: true + +Style/EmptyLiteral: + Enabled: true + +# Configuration parameters: AllowURI, URISchemes. +Metrics/LineLength: Enabled: false -Lint/AmbiguousRegexpLiteral: +Style/MethodCallParentheses: + Enabled: true + +Style/MethodDefParentheses: + Enabled: true + +Style/LineEndConcatenation: + Enabled: true + +Style/TrailingWhitespace: + Enabled: true + +Style/StringLiterals: Enabled: true + +Style/TrailingCommaInArguments: + Enabled: true + +Style/TrailingCommaInLiteral: + Enabled: true + +Style/GlobalVars: + Enabled: true + +Style/GuardClause: + Enabled: true + +Style/IfUnlessModifier: + Enabled: true + +Style/MultilineIfThen: + Enabled: true + +Style/NegatedIf: + Enabled: true + +Style/NegatedWhile: + Enabled: true + +Style/Next: + Enabled: true + +Style/SingleLineBlockParams: + Enabled: true + +Style/SingleLineMethods: + Enabled: true + +Style/SpecialGlobalVars: + Enabled: true + +Style/TrivialAccessors: + Enabled: true + +Style/UnlessElse: + Enabled: true + +Style/VariableInterpolation: + Enabled: true + +Style/VariableName: + Enabled: true + +Style/WhileUntilDo: + Enabled: true + +Style/EvenOdd: + Enabled: true + +Style/FileName: + Enabled: true + +Style/For: + Enabled: true + +Style/Lambda: + Enabled: true + +Style/MethodName: + Enabled: true + +Style/MultilineTernaryOperator: + Enabled: true + +Style/NestedTernaryOperator: + Enabled: true + +Style/NilComparison: + Enabled: true + +Style/FormatString: + Enabled: true + +Style/MultilineBlockChain: + Enabled: true + +Style/Semicolon: + Enabled: true + +Style/SignalException: + Enabled: true + +Style/NonNilCheck: + Enabled: true + +Style/Not: + Enabled: true + +Style/NumericLiterals: + Enabled: true + +Style/OneLineConditional: + Enabled: true + +Style/OpMethod: + Enabled: true + +Style/ParenthesesAroundCondition: + Enabled: true + +Style/PercentLiteralDelimiters: + Enabled: true + +Style/PerlBackrefs: + Enabled: true + +Style/PredicateName: + Enabled: true + +Style/RedundantException: + Enabled: true + +Style/SelfAssignment: + Enabled: true + +Style/Proc: + Enabled: true + +Style/RaiseArgs: + Enabled: true + +Style/RedundantBegin: + Enabled: true + +Style/RescueModifier: + Enabled: true + +# based on https://github.com/voxpupuli/modulesync_config/issues/168 Style/RegexpLiteral: + EnforcedStyle: percent_r Enabled: true -Style/WordArray: + +Lint/UnderscorePrefixedVariableName: Enabled: true -# this catches the cases of using `module` for parser functions, types, or -# providers -Style/ClassAndModuleChildren: +Metrics/ParameterLists: Enabled: false -Style/Documentation: - Description: 'Document classes and non-namespace modules.' - Enabled: false +Lint/RequireParentheses: + Enabled: true + +Style/SpaceBeforeFirstArg: + Enabled: true + +Style/ModuleFunction: + Enabled: true + +Lint/Debugger: + Enabled: true + +Style/IfWithSemicolon: + Enabled: true + +Style/Encoding: + Enabled: true -# More comfortable block layouts Style/BlockDelimiters: - Enabled: False + Enabled: true Style/MultilineBlockLayout: + Enabled: true + +# 'Complexity' is very relative +Metrics/AbcSize: + Enabled: False + +# 'Complexity' is very relative +Metrics/PerceivedComplexity: Enabled: False -# Rspec +Lint/UselessAssignment: + Enabled: true + +Style/ClosingParenthesisIndentation: + Enabled: false + +# RSpec # We don't use rspec in this way RSpec/DescribeClass: diff --git a/.travis.yml b/.travis.yml index cc86b12a..5eb58f0c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,6 +25,8 @@ matrix: env: PUPPET_VERSION="~> 4.0" STRICT_VARIABLES="yes" CHECK=test - rvm: 2.2 env: PUPPET_VERSION="~> 4.0" STRICT_VARIABLES="yes" CHECK=test + - rvm: 2.3.1 + env: PUPPET_VERSION="~> 4.0" STRICT_VARIABLES="yes" CHECK=build - rvm: 2.3.1 env: PUPPET_VERSION="~> 4.0" STRICT_VARIABLES="yes" CHECK=rubocop - rvm: 2.3.1 @@ -41,4 +43,4 @@ deploy: # all_branches is required to use tags all_branches: true # Only publish if our main Ruby target builds - rvm: 2.2 + rvm: 2.3.1 diff --git a/Gemfile b/Gemfile index f9ac8648..90188fee 100644 --- a/Gemfile +++ b/Gemfile @@ -15,7 +15,6 @@ group :test do gem 'rspec-puppet', :require => false, :git => 'https://github.com/rodjek/rspec-puppet.git' gem 'rspec-puppet-facts', :require => false gem 'rspec-puppet-utils', :require => false - gem 'puppet-lint', :require => false, :git => 'https://github.com/rodjek/puppet-lint.git' gem 'puppet-lint-absolute_classname-check', :require => false gem 'puppet-lint-leading_zero-check', :require => false gem 'puppet-lint-trailing_comma-check', :require => false @@ -37,7 +36,6 @@ group :development do end group :system_tests do - gem 'beaker', :require => false if beaker_version = ENV['BEAKER_VERSION'] gem 'beaker', *location_for(beaker_version) end diff --git a/spec/classes/unattended_upgrades_spec.rb b/spec/classes/unattended_upgrades_spec.rb index f6e74af1..c3b96736 100644 --- a/spec/classes/unattended_upgrades_spec.rb +++ b/spec/classes/unattended_upgrades_spec.rb @@ -1,48 +1,56 @@ require 'spec_helper' +# rubocop:disable Style/RegexpLiteral describe 'unattended_upgrades' do let(:file_unattended) { '/etc/apt/apt.conf.d/50unattended-upgrades' } let(:file_periodic) { '/etc/apt/apt.conf.d/10periodic' } let(:file_options) { '/etc/apt/apt.conf.d/10options' } - let(:facts) { { - osfamily: 'Debian', - lsbdistid: 'Debian', - lsbdistcodename: 'wheezy', - lsbrelease: '7.0.3', - } } - let(:pre_condition) { + let(:facts) do + { + osfamily: 'Debian', + lsbdistid: 'Debian', + lsbdistcodename: 'wheezy', + lsbrelease: '7.0.3' + } + end + let(:pre_condition) do 'include ::apt' - } + end context 'with defaults on Debian' do - it { should contain_package('unattended-upgrades') } + it do + should contain_package('unattended-upgrades') + should compile.with_all_deps + should contain_class('unattended_upgrades::params') + should contain_class('unattended_upgrades') + end - it { + it do should contain_apt__conf('unattended-upgrades').with( require: 'Package[unattended-upgrades]', - notify_update: false, + notify_update: false ) - } + end - it { + it do should contain_apt__conf('periodic').with( require: 'Package[unattended-upgrades]', - notify_update: false, + notify_update: false ) - } + end - it { + it do should contain_apt__conf('options').with( require: 'Package[unattended-upgrades]', - notify_update: false, + notify_update: false ) - } + end - it { + it do should create_file(file_unattended).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( /Unattended-Upgrade::Origins-Pattern {/ ).with_content( @@ -66,13 +74,13 @@ ).without_content( /Acquire::http::Dl-Limit/ ) - } + end - it { + it do should create_file(file_periodic).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( /APT::Periodic::Enable "1";/ ).with_content( @@ -98,17 +106,18 @@ ).with_content( /APT::Periodic::Verbose "0";/ ) - } + end - it { should contain_apt__conf('auto-upgrades').with( - ensure: 'absent', - ) - } - it { + it do + should contain_apt__conf('auto-upgrades').with( + ensure: 'absent' + ) + end + it do should create_file(file_options).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( /^Dpkg::Options\s{/ ).with_content( @@ -120,21 +129,23 @@ ).without_content( /\"--force-confmiss\";/ ) - } + end end context 'with defaults on Debian 6 Squeeze' do - let(:facts) { { - osfamily: 'Debian', - lsbdistid: 'Debian', - lsbdistcodename: 'squeeze', - lsbdistrelease: '6.0.10', - } } - it { + let(:facts) do + { + osfamily: 'Debian', + lsbdistid: 'Debian', + lsbdistcodename: 'squeeze', + lsbdistrelease: '6.0.10' + } + end + it do should create_file(file_unattended).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( # This section varies for different releases /\Unattended-Upgrade::Allowed-Origins\ {\n @@ -143,21 +154,23 @@ \t"\${distro_id}\ \${distro_codename}-lts";\n };/x ) - } + end end context 'with defaults on Debian 7 Wheezy' do - let(:facts) { { - osfamily: 'Debian', - lsbdistid: 'Debian', - lsbdistcodename: 'wheezy', - lsbdistrelease: '7.1', - } } - it { + let(:facts) do + { + osfamily: 'Debian', + lsbdistid: 'Debian', + lsbdistcodename: 'wheezy', + lsbdistrelease: '7.1' + } + end + it do should create_file(file_unattended).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( # This section varies for different releases /\Unattended-Upgrade::Origins-Pattern\ {\n @@ -165,198 +178,216 @@ \t"origin=Debian,archive=oldstable,label=Debian-Security";\n };/x ) - } + end end context 'with defaults on Debian 8 Jessie' do - let(:facts) { { - osfamily: 'Debian', - lsbdistid: 'Debian', - lsbdistcodename: 'jessie', - lsbdistrelease: '8.2', - } } - it { + let(:facts) do + { + osfamily: 'Debian', + lsbdistid: 'Debian', + lsbdistcodename: 'jessie', + lsbdistrelease: '8.2' + } + end + it do should create_file(file_unattended).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( # This section varies for different releases /\Unattended-Upgrade::Origins-Pattern\ {\n \t"origin=Debian,codename=\${distro_codename},label=Debian-Security";\n };/x ) - } + end end context 'with defaults on Ubuntu 12.04LTS Precise Pangolin' do - let(:facts) { { - osfamily: 'Debian', - lsbdistid: 'Ubuntu', - lsbdistcodename: 'precise', - lsbrelease: '12.04', - lsbdistrelease: '12.04', - } } - it { + let(:facts) do + { + osfamily: 'Debian', + lsbdistid: 'Ubuntu', + lsbdistcodename: 'precise', + lsbrelease: '12.04', + lsbdistrelease: '12.04' + } + end + it do should create_file(file_unattended).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( # This is the only section that's different for Ubuntu compared to Debian /\Unattended-Upgrade::Allowed-Origins\ {\n \t"\${distro_id}\:\${distro_codename}-security";\n };/x ) - } + end end context 'with defaults on Ubuntu 14.04LTS Trusty Tahr' do - let(:facts) { { - osfamily: 'Debian', - lsbdistid: 'Ubuntu', - lsbdistcodename: 'trusty', - lsbrelease: '14.04', - lsbdistrelease: '14.04', - } } - it { + let(:facts) do + { + osfamily: 'Debian', + lsbdistid: 'Ubuntu', + lsbdistcodename: 'trusty', + lsbrelease: '14.04', + lsbdistrelease: '14.04' + } + end + it do should create_file(file_unattended).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( # This is the only section that's different for Ubuntu compared to Debian /\Unattended-Upgrade::Allowed-Origins\ {\n \t"\${distro_id}\:\${distro_codename}-security";\n };/x ) - } + end end context 'with defaults on Ubuntu 15.04 Vivid Vervet' do - let(:facts) { { - osfamily: 'Debian', - lsbdistid: 'Ubuntu', - lsbdistcodename: 'vivid', - lsbrelease: '15.04', - lsbdistrelease: '15.04', - } } - it { + let(:facts) do + { + osfamily: 'Debian', + lsbdistid: 'Ubuntu', + lsbdistcodename: 'vivid', + lsbrelease: '15.04', + lsbdistrelease: '15.04' + } + end + it do should create_file(file_unattended).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( # This is the only section that's different for Ubuntu compared to Debian /\Unattended-Upgrade::Allowed-Origins\ {\n \t"\${distro_id}\:\${distro_codename}-security";\n };/x ) - } + end end context 'with defaults on Ubuntu 15.10 Wily Werewolf' do - let(:facts) { { - osfamily: 'Debian', - lsbdistid: 'Ubuntu', - lsbdistcodename: 'wily', - lsbrelease: '15.10', - lsbdistrelease: '15.10', - } } - it { + let(:facts) do + { + osfamily: 'Debian', + lsbdistid: 'Ubuntu', + lsbdistcodename: 'wily', + lsbrelease: '15.10', + lsbdistrelease: '15.10' + } + end + it do should create_file(file_unattended).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( # This is the only section that's different for Ubuntu compared to Debian /\Unattended-Upgrade::Allowed-Origins\ {\n \t"\${distro_id}\:\${distro_codename}-security";\n };/x ) - } + end end context 'with defaults on Raspbian' do - let(:facts) { { - osfamily: 'Debian', - lsbdistid: 'Raspbian', - lsbdistcodename: 'jessie', - lsbrelease: '8.0', - } } - it { + let(:facts) do + { + osfamily: 'Debian', + lsbdistid: 'Raspbian', + lsbdistcodename: 'jessie', + lsbrelease: '8.0' + } + end + it do should create_file(file_unattended).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ) - } + end end context 'with defaults on Linux Mint 13 Maya' do - let(:facts) { { - osfamily: 'Debian', - lsbdistid: 'LinuxMint', - lsbdistcodename: 'maya', - lsbdistrelease: '13', - lsbmajdistrelease: '13', - } } - it { + let(:facts) do + { + osfamily: 'Debian', + lsbdistid: 'LinuxMint', + lsbdistcodename: 'maya', + lsbdistrelease: '13', + lsbmajdistrelease: '13' + } + end + it do should create_file(file_unattended).with( 'owner' => 'root', 'group' => 'root', - 'mode' => '0644', + 'mode' => '0644' ).with_content( # This is the only section that's different for Ubuntu compared to Debian /\Unattended-Upgrade::Allowed-Origins\ {\n \t"Ubuntu\:precise-security";\n };/x ) - } + end end context 'with defaults on Linux Mint 17.3 Rosa' do - let(:facts) { { - osfamily: 'Debian', - lsbdistid: 'LinuxMint', - lsbdistcodename: 'rosa', - lsbdistrelease: '17.3', - lsbmajdistrelease: '17', - } } - it { + let(:facts) do + { + osfamily: 'Debian', + lsbdistid: 'LinuxMint', + lsbdistcodename: 'rosa', + lsbdistrelease: '17.3', + lsbmajdistrelease: '17' + } + end + it do should create_file(file_unattended).with( 'owner' => 'root', 'group' => 'root', - 'mode' => '0644', + 'mode' => '0644' ).with_content( # This is the only section that's different for Ubuntu compared to Debian /\Unattended-Upgrade::Allowed-Origins\ {\n \t"Ubuntu\:trusty-security";\n };/x ) - } + end end context 'with defaults on Linux Mint 18 Sarah' do - let(:facts) { { - osfamily: 'Debian', - lsbdistid: 'LinuxMint', - lsbdistcodename: 'sarah', - lsbdistrelease: '18', - lsbmajdistrelease: '18', - } } - it { + let(:facts) do + { + osfamily: 'Debian', + lsbdistid: 'LinuxMint', + lsbdistcodename: 'sarah', + lsbdistrelease: '18', + lsbmajdistrelease: '18' + } + end + it do should create_file(file_unattended).with( 'owner' => 'root', 'group' => 'root', - 'mode' => '0644', + 'mode' => '0644' ).with_content( # This is the only section that's different for Ubuntu compared to Debian /\Unattended-Upgrade::Allowed-Origins\ {\n \t"Ubuntu\:xenial-security";\n };/x ) - } + end end context 'set all the things' do @@ -367,7 +398,7 @@ update: 5, upgradeable_packages: { 'download_only' => 5, - 'debdelta' => 5, + 'debdelta' => 5 }, upgrade: 5, auto: { @@ -375,7 +406,7 @@ 'fix_interrupted_dpkg' => false, 'remove' => false, 'reboot' => true, - 'reboot_time' => '03:00', + 'reboot_time' => '03:00' }, verbose: 1, legacy_origin: true, @@ -385,7 +416,7 @@ install_on_shutdown: true, mail: { 'to' => 'root@localhost', - 'only_on_error' => true, + 'only_on_error' => true }, dl_limit: 70, random_sleep: 300, @@ -394,36 +425,38 @@ 'force_confdef' => false, 'force_confold' => false, 'force_confnew' => true, - 'force_confmiss' => true, + 'force_confmiss' => true } } end it { should contain_package('unattended-upgrades') } - it { should contain_apt__conf('unattended-upgrades').with( - require: 'Package[unattended-upgrades]', - notify_update: true, + it do + should contain_apt__conf('unattended-upgrades').with( + require: 'Package[unattended-upgrades]', + notify_update: true ) - } + end - it { should contain_apt__conf('periodic').with( - require: 'Package[unattended-upgrades]', - notify_update: true, + it do + should contain_apt__conf('periodic').with( + require: 'Package[unattended-upgrades]', + notify_update: true ) - } + end - it { + it do should contain_apt__conf('options').with( require: 'Package[unattended-upgrades]', - notify_update: true, + notify_update: true ) - } + end - it { + it do should create_file(file_unattended).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( /Unattended-Upgrade::Allowed-Origins {\n\t"bananas";\n};/ ).with_content( @@ -447,13 +480,13 @@ ).with_content( /Acquire::http::Dl-Limit "70";/ ) - } + end - it { + it do should create_file(file_periodic).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( /APT::Periodic::Enable "1";/ ).with_content( @@ -481,13 +514,13 @@ ).with_content( /APT::Periodic::RandomSleep "300";/ ) - } + end - it { + it do should create_file(file_options).with( owner: 'root', group: 'root', - mode: '0644', + mode: '0644' ).with_content( /^Dpkg::Options\s{/ ).without_content( @@ -499,217 +532,217 @@ ).with_content( /^\s+"--force-confmiss";/ ) - } - it { + end + it do should contain_apt__conf('auto-upgrades').with( - ensure: 'absent', + ensure: 'absent' ) - } + end end describe 'validation tests' do context 'bad install_on_shutdown' do let :params do { - install_on_shutdown: 'foo', + install_on_shutdown: 'foo' } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a boolean/) + end.to raise_error(Puppet::Error, /not a boolean/) end end context 'bad legacy_origin' do let :params do { - legacy_origin: 'foo', + legacy_origin: 'foo' } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a boolean/) + end.to raise_error(Puppet::Error, /not a boolean/) end end context 'bad minimal_steps' do let :params do { - minimal_steps: 'foo', + minimal_steps: 'foo' } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a boolean/) + end.to raise_error(Puppet::Error, /not a boolean/) end end context 'bad blacklist' do let :params do { - blacklist: 'foo', + blacklist: 'foo' } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not an Array/) + end.to raise_error(Puppet::Error, /not an Array/) end end context 'bad origins' do let :params do { - origins: 'foo', + origins: 'foo' } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not an Array/) + end.to raise_error(Puppet::Error, /not an Array/) end end context 'bad auto' do let :params do { - auto: 'foo', + auto: 'foo' } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a Hash/) + end.to raise_error(Puppet::Error, /not a Hash/) end end context 'bad mail' do let :params do { - mail: 'foo', + mail: 'foo' } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a Hash/) + end.to raise_error(Puppet::Error, /not a Hash/) end end context 'bad backup' do let :params do { - backup: 'foo', + backup: 'foo' } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a Hash/) + end.to raise_error(Puppet::Error, /not a Hash/) end end context 'bad age' do let :params do { - age: 'foo', + age: 'foo' } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a Hash/) + end.to raise_error(Puppet::Error, /not a Hash/) end end context 'bad size' do let :params do { - size: 'foo', + size: 'foo' } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /to be an Integer/) + end.to raise_error(Puppet::Error, /to be an Integer/) end end context 'bad upgradeable_packages' do let :params do { - upgradeable_packages: 'foo', + upgradeable_packages: 'foo' } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a Hash/) + end.to raise_error(Puppet::Error, /not a Hash/) end end context 'bad mail[\'only_on_error\']' do let :params do { - mail: { 'only_on_error' => 'foo' }, + mail: { 'only_on_error' => 'foo' } } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a boolean/) + end.to raise_error(Puppet::Error, /not a boolean/) end end context 'bad options[\'force_confdef\']' do let :params do { - options: { 'force_confdef' => 'foo' }, + options: { 'force_confdef' => 'foo' } } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a boolean/) + end.to raise_error(Puppet::Error, /not a boolean/) end end context 'bad options[\'force_confold\']' do let :params do { - options: { 'force_confold' => 'foo' }, + options: { 'force_confold' => 'foo' } } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a boolean/) + end.to raise_error(Puppet::Error, /not a boolean/) end end context 'bad options[\'force_confnew\']' do let :params do { - options: { 'force_confnew' => 'foo' }, + options: { 'force_confnew' => 'foo' } } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a boolean/) + end.to raise_error(Puppet::Error, /not a boolean/) end end context 'bad options[\'force_confmiss\']' do let :params do { - options: { 'force_confmiss' => 'foo' }, + options: { 'force_confmiss' => 'foo' } } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /not a boolean/) + end.to raise_error(Puppet::Error, /not a boolean/) end end context 'bad options[\'invalid_key\']' do let :params do { - options: { 'invalid_key' => true }, + options: { 'invalid_key' => true } } end it do - expect { + expect do subject.call - }.to raise_error(Puppet::Error, /invalid_key not a valid key/) + end.to raise_error(Puppet::Error, /invalid_key not a valid key/) end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 0f53c4ed..047b1268 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,4 +1,17 @@ require 'puppetlabs_spec_helper/module_spec_helper' require 'rspec-puppet-facts' include RspecPuppetFacts + +RSpec.configure do |c| + c.default_facts = { + concat_basedir: '/tmp', + is_pe: false, + selinux_config_mode: 'disabled', + puppetversion: Puppet.version, + facterversion: Facter.version, + ipaddress: '172.16.254.254', + macaddress: 'AA:AA:AA:AA:AA:AA' + } +end + # vim: syntax=ruby