puppet 6.17.0-x64-mingw32 → 6.18.0-x64-mingw32
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.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile.lock +6 -5
- data/lib/puppet/application/apply.rb +18 -20
- data/lib/puppet/application/lookup.rb +16 -4
- data/lib/puppet/configurer/downloader.rb +31 -10
- data/lib/puppet/confine.rb +1 -1
- data/lib/puppet/confine/any.rb +1 -1
- data/lib/puppet/defaults.rb +21 -3
- data/lib/puppet/feature/base.rb +1 -1
- data/lib/puppet/file_serving/mount/locales.rb +1 -2
- data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
- data/lib/puppet/file_serving/mount/plugins.rb +1 -2
- data/lib/puppet/file_system/file_impl.rb +3 -3
- data/lib/puppet/functions/lstrip.rb +4 -4
- data/lib/puppet/functions/reverse_each.rb +1 -1
- data/lib/puppet/functions/rstrip.rb +4 -4
- data/lib/puppet/functions/step.rb +1 -1
- data/lib/puppet/functions/strip.rb +4 -4
- data/lib/puppet/gettext/config.rb +5 -5
- data/lib/puppet/gettext/module_translations.rb +4 -4
- data/lib/puppet/indirector/exec.rb +1 -1
- data/lib/puppet/indirector/facts/facter.rb +3 -3
- data/lib/puppet/indirector/file_metadata/http.rb +1 -0
- data/lib/puppet/indirector/hiera.rb +4 -0
- data/lib/puppet/indirector/indirection.rb +1 -1
- data/lib/puppet/indirector/report/processor.rb +2 -2
- data/lib/puppet/module.rb +1 -2
- data/lib/puppet/network/format_support.rb +2 -2
- data/lib/puppet/network/http/route.rb +2 -2
- data/lib/puppet/node/environment.rb +12 -5
- data/lib/puppet/pal/pal_impl.rb +27 -3
- data/lib/puppet/parameter.rb +1 -1
- data/lib/puppet/parser/functions.rb +21 -17
- data/lib/puppet/parser/functions/create_resources.rb +11 -7
- data/lib/puppet/parser/type_loader.rb +2 -2
- data/lib/puppet/pops/adaptable.rb +7 -13
- data/lib/puppet/pops/adapters.rb +8 -4
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
- data/lib/puppet/pops/loaders.rb +18 -11
- data/lib/puppet/pops/lookup/context.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
- data/lib/puppet/pops/types/iterable.rb +34 -8
- data/lib/puppet/pops/validation/checker4_0.rb +19 -15
- data/lib/puppet/provider/file/windows.rb +1 -1
- data/lib/puppet/provider/package/apt.rb +34 -0
- data/lib/puppet/provider/package/gem.rb +4 -2
- data/lib/puppet/provider/package/puppet_gem.rb +5 -0
- data/lib/puppet/provider/package/zypper.rb +3 -0
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/windows_adsi.rb +18 -1
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/test/test_helper.rb +10 -3
- data/lib/puppet/transaction.rb +2 -2
- data/lib/puppet/transaction/persistence.rb +1 -1
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/trusted_external.rb +2 -2
- data/lib/puppet/type.rb +4 -3
- data/lib/puppet/type/file.rb +2 -2
- data/lib/puppet/type/file/source.rb +27 -7
- data/lib/puppet/type/notify.rb +2 -2
- data/lib/puppet/type/service.rb +4 -0
- data/lib/puppet/type/user.rb +18 -3
- data/lib/puppet/util.rb +26 -12
- data/lib/puppet/util/autoload.rb +9 -7
- data/lib/puppet/util/character_encoding.rb +9 -5
- data/lib/puppet/util/execution.rb +2 -2
- data/lib/puppet/util/windows.rb +1 -0
- data/lib/puppet/util/windows/api_types.rb +15 -1
- data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
- data/lib/puppet/util/windows/security.rb +4 -4
- data/lib/puppet/util/windows/user.rb +219 -0
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +78 -69
- data/man/man5/puppet.conf.5 +22 -3
- data/man/man8/puppet-agent.8 +1 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +2 -2
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
- data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
- data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
- data/spec/integration/application/agent_spec.rb +29 -37
- data/spec/integration/application/apply_spec.rb +149 -149
- data/spec/integration/application/config_spec.rb +74 -0
- data/spec/integration/application/doc_spec.rb +16 -6
- data/spec/integration/application/filebucket_spec.rb +65 -16
- data/spec/integration/application/help_spec.rb +42 -0
- data/spec/integration/application/lookup_spec.rb +13 -0
- data/spec/integration/application/module_spec.rb +68 -0
- data/spec/integration/application/plugin_spec.rb +50 -0
- data/spec/integration/data_binding_spec.rb +82 -0
- data/spec/integration/directory_environments_spec.rb +17 -17
- data/spec/integration/indirector/facts/facter_spec.rb +8 -6
- data/spec/integration/node/environment_spec.rb +1 -1
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
- data/spec/integration/util/windows/process_spec.rb +26 -32
- data/spec/integration/util/windows/user_spec.rb +7 -0
- data/spec/integration/util_spec.rb +7 -33
- data/spec/lib/puppet_spec/matchers.rb +0 -80
- data/spec/lib/puppet_spec/puppetserver.rb +8 -0
- data/spec/unit/application/agent_spec.rb +3 -4
- data/spec/unit/application/face_base_spec.rb +6 -4
- data/spec/unit/application/facts_spec.rb +39 -10
- data/spec/unit/application/man_spec.rb +52 -0
- data/spec/unit/application/resource_spec.rb +3 -1
- data/spec/unit/application/ssl_spec.rb +15 -2
- data/spec/unit/configurer/downloader_spec.rb +10 -0
- data/spec/unit/configurer_spec.rb +47 -31
- data/spec/unit/confine_spec.rb +2 -1
- data/spec/unit/face/config_spec.rb +3 -1
- data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
- data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
- data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
- data/spec/unit/file_system/uniquefile_spec.rb +18 -0
- data/spec/unit/http/client_spec.rb +0 -1
- data/spec/unit/http/resolver_spec.rb +0 -1
- data/spec/unit/http/service/ca_spec.rb +0 -1
- data/spec/unit/http/service/compiler_spec.rb +0 -1
- data/spec/unit/http/service/file_server_spec.rb +0 -1
- data/spec/unit/http/service/report_spec.rb +0 -1
- data/spec/unit/http/service_spec.rb +0 -1
- data/spec/unit/http/session_spec.rb +0 -1
- data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
- data/spec/unit/network/format_support_spec.rb +3 -2
- data/spec/unit/node/environment_spec.rb +18 -1
- data/spec/unit/pops/loaders/loaders_spec.rb +70 -0
- data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
- data/spec/unit/provider/package/apt_spec.rb +77 -0
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
- data/spec/unit/provider/package/zypper_spec.rb +14 -0
- data/spec/unit/provider/service/init_spec.rb +41 -0
- data/spec/unit/provider/service/systemd_spec.rb +1 -6
- data/spec/unit/provider/service/windows_spec.rb +28 -0
- data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
- data/spec/unit/puppet_pal_2pec.rb +40 -0
- data/spec/unit/reports/store_spec.rb +17 -13
- data/spec/unit/transaction/persistence_spec.rb +15 -0
- data/spec/unit/type/service_spec.rb +35 -2
- data/spec/unit/type/user_spec.rb +31 -2
- data/spec/unit/util/character_encoding_spec.rb +4 -4
- data/spec/unit/util/command_line_spec.rb +11 -6
- metadata +21 -44
- data/spec/integration/faces/config_spec.rb +0 -91
- data/spec/integration/faces/documentation_spec.rb +0 -57
- data/spec/integration/file_bucket/file_spec.rb +0 -50
- data/spec/integration/file_serving/content_spec.rb +0 -7
- data/spec/integration/file_serving/fileset_spec.rb +0 -12
- data/spec/integration/file_serving/metadata_spec.rb +0 -8
- data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
- data/spec/integration/file_system/uniquefile_spec.rb +0 -26
- data/spec/integration/module_tool/forge_spec.rb +0 -51
- data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
- data/spec/integration/provider/service/init_spec.rb +0 -48
- data/spec/integration/provider/service/systemd_spec.rb +0 -25
- data/spec/integration/provider/service/windows_spec.rb +0 -50
- data/spec/integration/reference/providers_spec.rb +0 -21
- data/spec/integration/reports_spec.rb +0 -13
- data/spec/integration/ssl/certificate_request_spec.rb +0 -44
- data/spec/integration/ssl/host_spec.rb +0 -72
- data/spec/integration/ssl/key_spec.rb +0 -99
- data/spec/shared_behaviours/file_serving_model.rb +0 -51
- data/spec/unit/face/man_spec.rb +0 -25
- data/spec/unit/man_spec.rb +0 -31
| @@ -2,21 +2,50 @@ require 'spec_helper' | |
| 2 2 | 
             
            require 'puppet/application/facts'
         | 
| 3 3 |  | 
| 4 4 | 
             
            describe Puppet::Application::Facts do
         | 
| 5 | 
            +
              let(:app) { Puppet::Application[:facts] }
         | 
| 6 | 
            +
              let(:values) { {"filesystems" => "apfs,autofs,devfs"} }
         | 
| 7 | 
            +
             | 
| 5 8 | 
             
              before :each do
         | 
| 6 | 
            -
                 | 
| 9 | 
            +
                Puppet::Node::Facts.indirection.terminus_class = :memory
         | 
| 7 10 | 
             
              end
         | 
| 8 11 |  | 
| 9 | 
            -
              it " | 
| 10 | 
            -
                Puppet::Node::Facts. | 
| 11 | 
            -
                 | 
| 12 | 
            -
             | 
| 12 | 
            +
              it "returns facts for a given node" do
         | 
| 13 | 
            +
                facts = Puppet::Node::Facts.new('whatever', values)
         | 
| 14 | 
            +
                Puppet::Node::Facts.indirection.save(facts)
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                app.command_line.args = %w{find whatever --render-as yaml}
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                # due to PUP-10105 we emit the class tag when we shouldn't
         | 
| 19 | 
            +
                expected = Regexp.new(<<~END)
         | 
| 20 | 
            +
                  --- !ruby/object:Puppet::Node::Facts
         | 
| 21 | 
            +
                  name: whatever
         | 
| 22 | 
            +
                  values:
         | 
| 23 | 
            +
                    filesystems: apfs,autofs,devfs
         | 
| 24 | 
            +
                END
         | 
| 13 25 |  | 
| 14 26 | 
             
                expect {
         | 
| 15 | 
            -
                   | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 27 | 
            +
                  app.run
         | 
| 28 | 
            +
                }.to exit_with(0)
         | 
| 29 | 
            +
                 .and output(expected).to_stdout
         | 
| 30 | 
            +
              end
         | 
| 19 31 |  | 
| 20 | 
            -
             | 
| 32 | 
            +
              it "returns facts for the current node when the name is omitted" do
         | 
| 33 | 
            +
                facts = Puppet::Node::Facts.new(Puppet[:certname], values)
         | 
| 34 | 
            +
                Puppet::Node::Facts.indirection.save(facts)
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                app.command_line.args = %w{find --render-as yaml}
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                # due to PUP-10105 we emit the class tag when we shouldn't
         | 
| 39 | 
            +
                expected = Regexp.new(<<~END)
         | 
| 40 | 
            +
                  --- !ruby/object:Puppet::Node::Facts
         | 
| 41 | 
            +
                  name: #{Puppet[:certname]}
         | 
| 42 | 
            +
                  values:
         | 
| 43 | 
            +
                    filesystems: apfs,autofs,devfs
         | 
| 44 | 
            +
                END
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                expect {
         | 
| 47 | 
            +
                  app.run
         | 
| 48 | 
            +
                }.to exit_with(0)
         | 
| 49 | 
            +
                 .and output(expected).to_stdout
         | 
| 21 50 | 
             
              end
         | 
| 22 51 | 
             
            end
         | 
| @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'puppet/face'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe Puppet::Face[:man, :current] do
         | 
| 5 | 
            +
              let(:pager) { '/path/to/our/pager' }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              around do |example|
         | 
| 8 | 
            +
                Puppet::Util.withenv('MANPAGER' => pager) do
         | 
| 9 | 
            +
                  example.run
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              it 'is deprecated' do
         | 
| 14 | 
            +
                expect(subject).to be_deprecated
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              it 'has a man action' do
         | 
| 18 | 
            +
                expect(subject).to be_action(:man)
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              it 'accepts a call with no arguments' do
         | 
| 22 | 
            +
                expect { subject.man }.to output(/USAGE: puppet man <action>/).to_stdout
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              it 'raises an ArgumentError when given too many arguments' do
         | 
| 26 | 
            +
                expect {
         | 
| 27 | 
            +
                  subject.man(:man, 'agent', 'extra')
         | 
| 28 | 
            +
                }.to raise_error(ArgumentError)
         | 
| 29 | 
            +
                 .and output(/USAGE: puppet man <action>/).to_stdout
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              it "exits with 0 when generating man documentation for each available application" do
         | 
| 33 | 
            +
                # turn off deprecation warning
         | 
| 34 | 
            +
                Puppet[:disable_warnings] = ['deprecations']
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                allow(Puppet::Util).to receive(:which).with('ronn').and_return(nil)
         | 
| 37 | 
            +
                allow(Puppet::Util).to receive(:which).with(pager).and_return(pager)
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                Puppet::Application.available_application_names.each do |name|
         | 
| 40 | 
            +
                  next if %w{man face_base indirection_base}.include? name
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  app = Puppet::Application[:man]
         | 
| 43 | 
            +
                  app.command_line.args << 'man' << name
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  expect {
         | 
| 46 | 
            +
                    allow(IO).to receive(:popen).with(pager, 'w:UTF-8').and_yield($stdout)
         | 
| 47 | 
            +
                    app.run
         | 
| 48 | 
            +
                  }.to exit_with(0)
         | 
| 49 | 
            +
                   .and output(/puppet-#{name}/m).to_stdout
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
            end
         | 
| @@ -51,7 +51,9 @@ describe Puppet::Application::Resource do | |
| 51 51 | 
             
                  # provider is a parameter that should always be available
         | 
| 52 52 | 
             
                  @resource_app.extra_params = [ :provider ]
         | 
| 53 53 |  | 
| 54 | 
            -
                  expect { | 
| 54 | 
            +
                  expect {
         | 
| 55 | 
            +
                    @resource_app.main
         | 
| 56 | 
            +
                  }.to output(/provider\s+=>/).to_stdout
         | 
| 55 57 | 
             
                end
         | 
| 56 58 | 
             
              end
         | 
| 57 59 |  | 
| @@ -38,7 +38,7 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do | |
| 38 38 | 
             
              def expects_command_to_pass(expected_output = nil)
         | 
| 39 39 | 
             
                expect {
         | 
| 40 40 | 
             
                  ssl.run_command
         | 
| 41 | 
            -
                }.to  | 
| 41 | 
            +
                }.to output(expected_output).to_stdout
         | 
| 42 42 | 
             
              end
         | 
| 43 43 |  | 
| 44 44 | 
             
              def expects_command_to_fail(message)
         | 
| @@ -46,7 +46,7 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do | |
| 46 46 | 
             
                  expect {
         | 
| 47 47 | 
             
                    ssl.run_command
         | 
| 48 48 | 
             
                  }.to raise_error(Puppet::Error, message)
         | 
| 49 | 
            -
                }.to  | 
| 49 | 
            +
                }.to output(/.*/).to_stdout
         | 
| 50 50 | 
             
              end
         | 
| 51 51 |  | 
| 52 52 | 
             
              shared_examples_for 'an ssl action' do
         | 
| @@ -266,6 +266,19 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do | |
| 266 266 | 
             
                  FileUtils.cp(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'encrypted-key.pem'), Puppet[:hostprivkey])
         | 
| 267 267 | 
             
                  FileUtils.cp(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'signed.pem'), Puppet[:hostcert])
         | 
| 268 268 |  | 
| 269 | 
            +
                  # To verify the client cert we need the root and intermediate certs and crls.
         | 
| 270 | 
            +
                  # We don't need to do this with `ssl-client` cert above, because it is issued
         | 
| 271 | 
            +
                  # directly from the generated TestCa above.
         | 
| 272 | 
            +
                  File.open(Puppet[:localcacert], 'w') do |f|
         | 
| 273 | 
            +
                    f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'ca.pem')))
         | 
| 274 | 
            +
                    f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'intermediate.pem')))
         | 
| 275 | 
            +
                  end
         | 
| 276 | 
            +
             | 
| 277 | 
            +
                  File.open(Puppet[:hostcrl], 'w') do |f|
         | 
| 278 | 
            +
                    f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'crl.pem')))
         | 
| 279 | 
            +
                    f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'intermediate-crl.pem')))
         | 
| 280 | 
            +
                  end
         | 
| 281 | 
            +
             | 
| 269 282 | 
             
                  Puppet[:passfile] = file_containing('passfile', '74695716c8b6')
         | 
| 270 283 |  | 
| 271 284 | 
             
                  expects_command_to_pass(%r{Verified client certificate 'CN=signed' fingerprint})
         | 
| @@ -228,5 +228,15 @@ describe Puppet::Configurer::Downloader do | |
| 228 228 |  | 
| 229 229 | 
             
                  expect { @dler.evaluate }.not_to raise_error
         | 
| 230 230 | 
             
                end
         | 
| 231 | 
            +
             | 
| 232 | 
            +
                it "raises an exception if catalog application fails" do
         | 
| 233 | 
            +
                  Puppet[:ignore_plugin_errors] = false
         | 
| 234 | 
            +
             | 
| 235 | 
            +
                  expect(@dler.file).to receive(:retrieve).and_raise(Puppet::Error, "testing")
         | 
| 236 | 
            +
             | 
| 237 | 
            +
                  expect {
         | 
| 238 | 
            +
                    @dler.evaluate
         | 
| 239 | 
            +
                  }.to raise_error(Puppet::Error, /testing/)
         | 
| 240 | 
            +
                end
         | 
| 231 241 | 
             
              end
         | 
| 232 242 | 
             
            end
         | 
| @@ -1,6 +1,5 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 | 
             
            require 'puppet/configurer'
         | 
| 3 | 
            -
            require 'webmock/rspec'
         | 
| 4 3 |  | 
| 5 4 | 
             
            describe Puppet::Configurer do
         | 
| 6 5 | 
             
              before do
         | 
| @@ -85,6 +84,26 @@ describe Puppet::Configurer do | |
| 85 84 | 
             
                  expect(configurer.run).to eq(0)
         | 
| 86 85 | 
             
                end
         | 
| 87 86 |  | 
| 87 | 
            +
                it "fails the run if pluginsync fails when usecacheonfailure is false" do
         | 
| 88 | 
            +
                  Puppet[:ignore_plugin_errors] = false
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                  # --test implies these, set them so we don't fall back to a cached catalog
         | 
| 91 | 
            +
                  Puppet[:use_cached_catalog] = false
         | 
| 92 | 
            +
                  Puppet[:usecacheonfailure] = false
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  body = "{\"message\":\"Not Found: Could not find environment 'fasdfad'\",\"issue_kind\":\"RUNTIME_ERROR\"}"
         | 
| 95 | 
            +
                  stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(
         | 
| 96 | 
            +
                    status: 404, body: body, headers: {'Content-Type' => 'application/json'}
         | 
| 97 | 
            +
                  )
         | 
| 98 | 
            +
                  stub_request(:get, %r{/puppet/v3/file_metadata/pluginfacts}).to_return(
         | 
| 99 | 
            +
                    status: 404, body: body, headers: {'Content-Type' => 'application/json'}
         | 
| 100 | 
            +
                  )
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                  configurer.run(pluginsync: true)
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                  expect(@logs).to include(an_object_having_attributes(level: :err, message: %r{Failed to apply catalog: Failed to retrieve pluginfacts: Could not retrieve information from environment production source\(s\) puppet:///pluginfacts}))
         | 
| 105 | 
            +
                end
         | 
| 106 | 
            +
             | 
| 88 107 | 
             
                it "applies a cached catalog when it can't connect to the master" do
         | 
| 89 108 | 
             
                  error = Errno::ECONNREFUSED.new('Connection refused - connect(2)')
         | 
| 90 109 |  | 
| @@ -96,7 +115,8 @@ describe Puppet::Configurer do | |
| 96 115 | 
             
                end
         | 
| 97 116 |  | 
| 98 117 | 
             
                it "should initialize a transaction report if one is not provided" do
         | 
| 99 | 
            -
                   | 
| 118 | 
            +
                  # host and settings catalogs each create a report...
         | 
| 119 | 
            +
                  expect(Puppet::Transaction::Report).to receive(:new).and_return(report).twice
         | 
| 100 120 |  | 
| 101 121 | 
             
                  configurer.run
         | 
| 102 122 | 
             
                end
         | 
| @@ -192,22 +212,21 @@ describe Puppet::Configurer do | |
| 192 212 | 
             
                end
         | 
| 193 213 |  | 
| 194 214 | 
             
                it "should remove the report as a log destination when the run is finished" do
         | 
| 195 | 
            -
                   | 
| 196 | 
            -
             | 
| 197 | 
            -
                  configurer.run
         | 
| 215 | 
            +
                  configurer.run(report: report)
         | 
| 198 216 |  | 
| 199 217 | 
             
                  expect(Puppet::Util::Log.destinations).not_to include(report)
         | 
| 200 218 | 
             
                end
         | 
| 201 219 |  | 
| 202 | 
            -
                it "should return  | 
| 203 | 
            -
                   | 
| 204 | 
            -
                   | 
| 220 | 
            +
                it "should return an exit status of 2 due to the notify resource 'changing'" do
         | 
| 221 | 
            +
                  cat = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
         | 
| 222 | 
            +
                  cat.add_resource(Puppet::Type.type(:notify).new(:name => 'something changed'))
         | 
| 205 223 |  | 
| 206 | 
            -
                  expect(configurer.run).to eq( | 
| 224 | 
            +
                  expect(configurer.run(catalog: cat, report: report)).to eq(2)
         | 
| 207 225 | 
             
                end
         | 
| 208 226 |  | 
| 209 227 | 
             
                it "should return nil if catalog application fails" do
         | 
| 210 | 
            -
                   | 
| 228 | 
            +
                  expect(catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
         | 
| 229 | 
            +
             | 
| 211 230 | 
             
                  expect(configurer.run(catalog: catalog, report: report)).to be_nil
         | 
| 212 231 | 
             
                end
         | 
| 213 232 |  | 
| @@ -222,34 +241,28 @@ describe Puppet::Configurer do | |
| 222 241 | 
             
                end
         | 
| 223 242 |  | 
| 224 243 | 
             
                it "should include the pre-run command failure in the report" do
         | 
| 225 | 
            -
                  expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
         | 
| 226 | 
            -
             | 
| 227 244 | 
             
                  Puppet.settings[:prerun_command] = "/my/command"
         | 
| 228 245 | 
             
                  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
         | 
| 229 246 |  | 
| 230 | 
            -
                  expect(configurer.run).to be_nil
         | 
| 247 | 
            +
                  expect(configurer.run(report: report)).to be_nil
         | 
| 231 248 | 
             
                  expect(report.logs.find { |x| x.message =~ /Could not run command from prerun_command/ }).to be
         | 
| 232 249 | 
             
                end
         | 
| 233 250 |  | 
| 234 251 | 
             
                it "should send the transaction report even if the post-run command fails" do
         | 
| 235 | 
            -
                  expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
         | 
| 236 | 
            -
             | 
| 237 252 | 
             
                  Puppet.settings[:postrun_command] = "/my/command"
         | 
| 238 253 | 
             
                  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
         | 
| 239 254 | 
             
                  expect(configurer).to receive(:send_report).with(report)
         | 
| 240 255 |  | 
| 241 | 
            -
                  expect(configurer.run).to be_nil
         | 
| 256 | 
            +
                  expect(configurer.run(report: report)).to be_nil
         | 
| 242 257 | 
             
                end
         | 
| 243 258 |  | 
| 244 259 | 
             
                it "should include the post-run command failure in the report" do
         | 
| 245 | 
            -
                  expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
         | 
| 246 | 
            -
             | 
| 247 260 | 
             
                  Puppet.settings[:postrun_command] = "/my/command"
         | 
| 248 261 | 
             
                  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
         | 
| 249 262 |  | 
| 250 263 | 
             
                  expect(report).to receive(:<<) { |log, _| expect(log.message).to match(/Could not run command from postrun_command/) }.at_least(:once)
         | 
| 251 264 |  | 
| 252 | 
            -
                  expect(configurer.run).to be_nil
         | 
| 265 | 
            +
                  expect(configurer.run(report: report)).to be_nil
         | 
| 253 266 | 
             
                end
         | 
| 254 267 |  | 
| 255 268 | 
             
                it "should execute post-run command even if the pre-run command fails" do
         | 
| @@ -262,34 +275,28 @@ describe Puppet::Configurer do | |
| 262 275 | 
             
                end
         | 
| 263 276 |  | 
| 264 277 | 
             
                it "should finalize the report" do
         | 
| 265 | 
            -
                  expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
         | 
| 266 | 
            -
             | 
| 267 278 | 
             
                  expect(report).to receive(:finalize_report)
         | 
| 268 | 
            -
                  configurer.run
         | 
| 279 | 
            +
                  configurer.run(report: report)
         | 
| 269 280 | 
             
                end
         | 
| 270 281 |  | 
| 271 282 | 
             
                it "should not apply the catalog if the pre-run command fails" do
         | 
| 272 | 
            -
                  expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
         | 
| 273 | 
            -
             | 
| 274 283 | 
             
                  Puppet.settings[:prerun_command] = "/my/command"
         | 
| 275 284 | 
             
                  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
         | 
| 276 285 |  | 
| 277 286 | 
             
                  expect_any_instance_of(Puppet::Resource::Catalog).not_to receive(:apply)
         | 
| 278 287 | 
             
                  expect(configurer).to receive(:send_report)
         | 
| 279 288 |  | 
| 280 | 
            -
                  expect(configurer.run).to be_nil
         | 
| 289 | 
            +
                  expect(configurer.run(report: report)).to be_nil
         | 
| 281 290 | 
             
                end
         | 
| 282 291 |  | 
| 283 292 | 
             
                it "should apply the catalog, send the report, and return nil if the post-run command fails" do
         | 
| 284 | 
            -
                  expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
         | 
| 285 | 
            -
             | 
| 286 293 | 
             
                  Puppet.settings[:postrun_command] = "/my/command"
         | 
| 287 294 | 
             
                  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
         | 
| 288 295 |  | 
| 289 296 | 
             
                  expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply)
         | 
| 290 297 | 
             
                  expect(configurer).to receive(:send_report)
         | 
| 291 298 |  | 
| 292 | 
            -
                  expect(configurer.run).to be_nil
         | 
| 299 | 
            +
                  expect(configurer.run(report: report)).to be_nil
         | 
| 293 300 | 
             
                end
         | 
| 294 301 |  | 
| 295 302 | 
             
                it 'includes total time metrics in the report after successfully applying the catalog' do
         | 
| @@ -546,6 +553,15 @@ describe Puppet::Configurer do | |
| 546 553 | 
             
                end
         | 
| 547 554 | 
             
              end
         | 
| 548 555 |  | 
| 556 | 
            +
              def expects_pluginsync
         | 
| 557 | 
            +
                metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":420,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
         | 
| 558 | 
            +
                stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
         | 
| 559 | 
            +
             | 
| 560 | 
            +
                # response retains owner/group/mode due to source_permissions => use
         | 
| 561 | 
            +
                facts_metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":500,\"group\":500,\"mode\":493,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
         | 
| 562 | 
            +
                stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(status: 200, body: facts_metadata, headers: {'Content-Type' => 'application/json'})
         | 
| 563 | 
            +
              end
         | 
| 564 | 
            +
             | 
| 549 565 | 
             
              def expects_new_catalog_only(catalog)
         | 
| 550 566 | 
             
                expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
         | 
| 551 567 | 
             
                expect(Puppet::Resource::Catalog.indirection).not_to receive(:find).with(anything, hash_including(ignore_terminus: true))
         | 
| @@ -562,6 +578,7 @@ describe Puppet::Configurer do | |
| 562 578 | 
             
              end
         | 
| 563 579 |  | 
| 564 580 | 
             
              def expects_fallback_to_new_catalog(catalog)
         | 
| 581 | 
            +
                expects_pluginsync
         | 
| 565 582 | 
             
                expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(nil)
         | 
| 566 583 | 
             
                expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
         | 
| 567 584 | 
             
              end
         | 
| @@ -598,7 +615,6 @@ describe Puppet::Configurer do | |
| 598 615 | 
             
                  it "should make a node request and pluginsync when a cached catalog cannot be retrieved" do
         | 
| 599 616 | 
             
                    expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
         | 
| 600 617 | 
             
                    expects_fallback_to_new_catalog(catalog)
         | 
| 601 | 
            -
                    expect(configurer).to receive(:download_plugins)
         | 
| 602 618 |  | 
| 603 619 | 
             
                    configurer.run
         | 
| 604 620 | 
             
                  end
         | 
| @@ -636,6 +652,7 @@ describe Puppet::Configurer do | |
| 636 652 | 
             
                  it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
         | 
| 637 653 | 
             
                    expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
         | 
| 638 654 | 
             
                    expects_neither_new_or_cached_catalog
         | 
| 655 | 
            +
                    expects_pluginsync
         | 
| 639 656 |  | 
| 640 657 | 
             
                    # after failing to use a cached catalog, we'll need to pluginsync before getting
         | 
| 641 658 | 
             
                    # a new catalog, which also fails.
         | 
| @@ -656,8 +673,7 @@ describe Puppet::Configurer do | |
| 656 673 | 
             
                  end
         | 
| 657 674 |  | 
| 658 675 | 
             
                  it "applies the catalog passed as options when the catalog cache terminus is not set" do
         | 
| 659 | 
            -
                     | 
| 660 | 
            -
                    stub_request(:get, %r{/puppet/v3/file_metadatas?/pluginfacts}).to_return(:status => 404)
         | 
| 676 | 
            +
                    expects_pluginsync
         | 
| 661 677 |  | 
| 662 678 | 
             
                    catalog.add_resource(Puppet::Resource.new('notify', 'from apply'))
         | 
| 663 679 | 
             
                    configurer.run(catalog: catalog.to_ral)
         | 
    
        data/spec/unit/confine_spec.rb
    CHANGED
    
    | @@ -54,10 +54,11 @@ describe Puppet::Confine do | |
| 54 54 | 
             
                end
         | 
| 55 55 |  | 
| 56 56 | 
             
                it "should log failing confines with the label and message" do
         | 
| 57 | 
            +
                  Puppet[:log_level] = 'debug'
         | 
| 57 58 | 
             
                  allow(@confine).to receive(:pass?).and_return(false)
         | 
| 58 59 | 
             
                  expect(@confine).to receive(:message).and_return("My message")
         | 
| 59 60 | 
             
                  expect(@confine).to receive(:label).and_return("Mylabel")
         | 
| 60 | 
            -
                  expect(Puppet).to receive(:debug). | 
| 61 | 
            +
                  expect(Puppet).to receive(:debug) { |&b| expect(b.call).to eq("Mylabel: My message") }
         | 
| 61 62 | 
             
                  @confine.valid?
         | 
| 62 63 | 
             
                end
         | 
| 63 64 | 
             
              end
         | 
| @@ -234,7 +234,9 @@ trace = true | |
| 234 234 | 
             
                  allow(Puppet::Settings::IniFile::Manipulator).to receive(:new).and_return(manipulator)
         | 
| 235 235 |  | 
| 236 236 | 
             
                  expect(manipulator).to receive(:delete).with('main', 'setting').and_return('    setting=value')
         | 
| 237 | 
            -
                  expect { | 
| 237 | 
            +
                  expect {
         | 
| 238 | 
            +
                    subject.delete('setting', {:section => 'main'})
         | 
| 239 | 
            +
                  }.to output("Deleted setting from 'main': 'setting=value'\n").to_stdout
         | 
| 238 240 | 
             
                end
         | 
| 239 241 |  | 
| 240 242 | 
             
                it 'prints a warning when a setting is not found to delete' do
         | 
| @@ -52,13 +52,13 @@ describe Puppet::FileServing::Mount::Locales do | |
| 52 52 | 
             
                  expect(@mount.search("foo/bar", @request)).to eq(["/"])
         | 
| 53 53 | 
             
                end
         | 
| 54 54 |  | 
| 55 | 
            -
                it "should return  | 
| 55 | 
            +
                it "should return the default search module path if no modules can be found that have locales and modulepath is invalid" do
         | 
| 56 56 | 
             
                  mod = double('module')
         | 
| 57 57 | 
             
                  allow(mod).to receive(:locales?).and_return(false)
         | 
| 58 58 |  | 
| 59 59 | 
             
                  allow(@environment).to receive(:modules).and_return([])
         | 
| 60 60 | 
             
                  allow(@environment).to receive(:modulepath).and_return([])
         | 
| 61 | 
            -
                  expect(@mount.search("foo/bar", @request)).to  | 
| 61 | 
            +
                  expect(@mount.search("foo/bar", @request)).to eq([Puppet[:codedir]])
         | 
| 62 62 | 
             
                end
         | 
| 63 63 |  | 
| 64 64 | 
             
                it "should return the locale paths for each module that has locales" do
         | 
| @@ -52,13 +52,13 @@ describe Puppet::FileServing::Mount::PluginFacts do | |
| 52 52 | 
             
                  expect(@mount.search("foo/bar", @request)).to eq(["/"])
         | 
| 53 53 | 
             
                end
         | 
| 54 54 |  | 
| 55 | 
            -
                it "should return  | 
| 55 | 
            +
                it "should return the default search module path if no modules can be found that have plugins and modulepath is invalid" do
         | 
| 56 56 | 
             
                  mod = double('module')
         | 
| 57 57 | 
             
                  allow(mod).to receive(:pluginfacts?).and_return(false)
         | 
| 58 58 |  | 
| 59 59 | 
             
                  allow(@environment).to receive(:modules).and_return([])
         | 
| 60 60 | 
             
                  allow(@environment).to receive(:modulepath).and_return([])
         | 
| 61 | 
            -
                  expect(@mount.search("foo/bar", @request)).to  | 
| 61 | 
            +
                  expect(@mount.search("foo/bar", @request)).to eq([Puppet[:codedir]])
         | 
| 62 62 | 
             
                end
         | 
| 63 63 |  | 
| 64 64 | 
             
                it "should return the plugin paths for each module that has plugins" do
         | 
| @@ -52,13 +52,13 @@ describe Puppet::FileServing::Mount::Plugins do | |
| 52 52 | 
             
                  expect(@mount.search("foo/bar", @request)).to eq(["/"])
         | 
| 53 53 | 
             
                end
         | 
| 54 54 |  | 
| 55 | 
            -
                it "should return  | 
| 55 | 
            +
                it "should return the default search module path if no modules can be found that have plugins and modulepath is invalid" do
         | 
| 56 56 | 
             
                  mod = double('module')
         | 
| 57 57 | 
             
                  allow(mod).to receive(:plugins?).and_return(false)
         | 
| 58 58 |  | 
| 59 59 | 
             
                  allow(@environment).to receive(:modules).and_return([])
         | 
| 60 60 | 
             
                  allow(@environment).to receive(:modulepath).and_return([])
         | 
| 61 | 
            -
                  expect(@mount.search("foo/bar", @request)).to  | 
| 61 | 
            +
                  expect(@mount.search("foo/bar", @request)).to eq([Puppet[:codedir]])
         | 
| 62 62 | 
             
                end
         | 
| 63 63 |  | 
| 64 64 | 
             
                it "should return the plugin paths for each module that has plugins" do
         |