puppet 5.5.17-x64-mingw32 → 5.5.18-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/CODEOWNERS +1 -1
- data/Gemfile +2 -3
- data/Gemfile.lock +35 -31
- data/ext/build_defaults.yaml +1 -0
- data/ext/cert_inspector +3 -3
- data/ext/puppet-test +2 -2
- data/ext/regexp_nodes/regexp_nodes.rb +4 -4
- data/ext/windows/service/daemon.rb +54 -8
- data/install.rb +6 -6
- data/lib/puppet/application.rb +1 -1
- data/lib/puppet/application/apply.rb +2 -2
- data/lib/puppet/application/describe.rb +3 -9
- data/lib/puppet/application/doc.rb +1 -1
- data/lib/puppet/application/lookup.rb +1 -1
- data/lib/puppet/application/script.rb +2 -2
- data/lib/puppet/configurer.rb +86 -28
- data/lib/puppet/configurer/downloader.rb +2 -6
- data/lib/puppet/defaults.rb +17 -4
- data/lib/puppet/error.rb +9 -1
- data/lib/puppet/external/nagios/base.rb +1 -1
- data/lib/puppet/face/ca.rb +1 -1
- data/lib/puppet/face/module/list.rb +5 -5
- data/lib/puppet/face/module/search.rb +1 -1
- data/lib/puppet/face/module/uninstall.rb +1 -1
- data/lib/puppet/face/module/upgrade.rb +1 -1
- data/lib/puppet/file_serving/http_metadata.rb +1 -1
- data/lib/puppet/file_system.rb +0 -8
- data/lib/puppet/file_system/memory_file.rb +1 -1
- data/lib/puppet/file_system/posix.rb +3 -2
- data/lib/puppet/forge.rb +3 -3
- data/lib/puppet/functions/epp.rb +4 -4
- data/lib/puppet/functions/inline_epp.rb +5 -5
- data/lib/puppet/gettext/module_translations.rb +1 -1
- data/lib/puppet/graph/rb_tree_map.rb +2 -2
- data/lib/puppet/graph/simple_graph.rb +6 -5
- data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
- data/lib/puppet/indirector/hiera.rb +2 -0
- data/lib/puppet/indirector/resource/ral.rb +1 -3
- data/lib/puppet/indirector/resource/validator.rb +1 -1
- data/lib/puppet/interface.rb +2 -1
- data/lib/puppet/loaders.rb +0 -1
- data/lib/puppet/metatype/manager.rb +1 -1
- data/lib/puppet/module.rb +1 -1
- data/lib/puppet/module_tool/applications/builder.rb +1 -1
- data/lib/puppet/module_tool/applications/installer.rb +1 -1
- data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
- data/lib/puppet/module_tool/metadata.rb +1 -1
- data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
- data/lib/puppet/module_tool/tar/mini.rb +1 -1
- data/lib/puppet/network/http/api/indirected_routes.rb +12 -11
- data/lib/puppet/network/http/connection.rb +10 -12
- data/lib/puppet/network/http/pool.rb +2 -0
- data/lib/puppet/network/http/rack/rest.rb +2 -2
- data/lib/puppet/network/http/site.rb +1 -1
- data/lib/puppet/network/resolver.rb +2 -2
- data/lib/puppet/node/environment.rb +4 -2
- data/lib/puppet/parser/ast.rb +1 -1
- data/lib/puppet/parser/ast/resourceparam.rb +1 -1
- data/lib/puppet/parser/functions.rb +1 -1
- data/lib/puppet/parser/functions/epp.rb +3 -3
- data/lib/puppet/parser/functions/inline_epp.rb +5 -5
- data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
- data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
- data/lib/puppet/pops/loaders.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
- data/lib/puppet/pops/merge_strategy.rb +22 -18
- data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
- data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
- data/lib/puppet/pops/parser/locator.rb +1 -1
- data/lib/puppet/pops/parser/pn_parser.rb +17 -16
- data/lib/puppet/pops/puppet_stack.rb +51 -48
- data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
- data/lib/puppet/pops/types/string_converter.rb +10 -10
- data/lib/puppet/pops/types/types.rb +3 -3
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/property/ensure.rb +1 -1
- data/lib/puppet/provider/augeas/augeas.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +1 -1
- data/lib/puppet/provider/exec.rb +6 -2
- data/lib/puppet/provider/mount.rb +1 -1
- data/lib/puppet/provider/mount/parsed.rb +8 -8
- data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
- data/lib/puppet/provider/nameservice/pw.rb +2 -2
- data/lib/puppet/provider/package/dnfmodule.rb +87 -0
- data/lib/puppet/provider/package/dpkg.rb +3 -12
- data/lib/puppet/provider/package/openbsd.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +34 -9
- data/lib/puppet/provider/package/portage.rb +4 -4
- data/lib/puppet/provider/package/rpm.rb +6 -6
- data/lib/puppet/provider/package/windows/package.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/package_targetable.rb +5 -4
- data/lib/puppet/provider/parsedfile.rb +1 -1
- data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +3 -3
- data/lib/puppet/provider/service/daemontools.rb +9 -9
- data/lib/puppet/provider/service/openbsd.rb +1 -1
- data/lib/puppet/provider/service/rcng.rb +2 -2
- data/lib/puppet/provider/service/runit.rb +2 -8
- data/lib/puppet/provider/service/systemd.rb +8 -8
- data/lib/puppet/provider/user/directoryservice.rb +1 -1
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +22 -13
- data/lib/puppet/provider/user/windows_adsi.rb +4 -5
- data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
- data/lib/puppet/reference/indirection.rb +2 -2
- data/lib/puppet/reference/metaparameter.rb +1 -3
- data/lib/puppet/reference/providers.rb +1 -1
- data/lib/puppet/reference/type.rb +3 -9
- data/lib/puppet/reports.rb +1 -1
- data/lib/puppet/resource.rb +1 -1
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/settings.rb +3 -3
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/ssl/certificate_authority/interface.rb +1 -1
- data/lib/puppet/ssl/certificate_factory.rb +2 -2
- data/lib/puppet/ssl/host.rb +3 -3
- data/lib/puppet/ssl/oids.rb +1 -1
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/type.rb +2 -4
- data/lib/puppet/type/cron.rb +1 -1
- data/lib/puppet/type/exec.rb +7 -3
- data/lib/puppet/type/file.rb +1 -2
- data/lib/puppet/type/file/data_sync.rb +5 -1
- data/lib/puppet/type/group.rb +4 -2
- data/lib/puppet/type/interface.rb +1 -1
- data/lib/puppet/type/notify.rb +3 -2
- data/lib/puppet/type/package.rb +2 -2
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/selboolean.rb +17 -3
- data/lib/puppet/type/service.rb +1 -1
- data/lib/puppet/type/user.rb +4 -2
- data/lib/puppet/util.rb +35 -12
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +8 -14
- data/lib/puppet/util/instance_loader.rb +1 -1
- data/lib/puppet/util/log.rb +1 -1
- data/lib/puppet/util/log/destinations.rb +2 -2
- data/lib/puppet/util/logging.rb +30 -18
- data/lib/puppet/util/metric.rb +2 -2
- data/lib/puppet/util/monkey_patches.rb +1 -1
- data/lib/puppet/util/nagios_maker.rb +2 -2
- data/lib/puppet/util/network_device/cisco/device.rb +1 -1
- data/lib/puppet/util/network_device/cisco/interface.rb +2 -2
- data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
- data/lib/puppet/util/provider_features.rb +2 -4
- data/lib/puppet/util/rdoc.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/resource_template.rb +1 -1
- data/lib/puppet/util/selinux.rb +3 -1
- data/lib/puppet/util/windows/adsi.rb +58 -28
- data/lib/puppet/util/windows/registry.rb +7 -5
- data/lib/puppet/vendor.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet_pal.rb +2 -2
- data/locales/puppet.pot +115 -95
- data/man/man5/puppet.conf.5 +21 -5
- data/man/man8/puppet-agent.8 +1 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-ca.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-cert.8 +1 -1
- data/man/man8/puppet-certificate.8 +1 -1
- data/man/man8/puppet-certificate_request.8 +1 -1
- data/man/man8/puppet-certificate_revocation_list.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 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-master.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-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list-installed.txt +11 -0
- data/spec/integration/configurer_spec.rb +52 -0
- data/spec/integration/type/notify_spec.rb +46 -0
- data/spec/unit/configurer_spec.rb +380 -397
- data/spec/unit/forge/forge_spec.rb +1 -3
- data/spec/unit/forge/repository_spec.rb +1 -3
- data/spec/unit/indirector/resource/ral_spec.rb +4 -4
- data/spec/unit/network/http/connection_spec.rb +26 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
- data/spec/unit/provider/exec_spec.rb +209 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +186 -0
- data/spec/unit/provider/package/dpkg_spec.rb +15 -3
- data/spec/unit/provider/package/pip_spec.rb +51 -6
- data/spec/unit/provider/package/portage_spec.rb +4 -4
- data/spec/unit/provider/package_targetable_spec.rb +60 -0
- data/spec/unit/provider/service/daemontools_spec.rb +24 -0
- data/spec/unit/provider/service/runit_spec.rb +24 -0
- data/spec/unit/provider/service/systemd_spec.rb +22 -22
- data/spec/unit/provider/user/hpux_spec.rb +2 -2
- data/spec/unit/provider/user/useradd_spec.rb +46 -0
- data/spec/unit/type/exec_spec.rb +6 -12
- data/spec/unit/type/file/content_spec.rb +9 -3
- data/spec/unit/type/file_spec.rb +9 -4
- data/spec/unit/type/selboolean_spec.rb +4 -6
- data/spec/unit/util/execution_spec.rb +16 -0
- data/spec/unit/util/http_proxy_spec.rb +97 -0
- data/spec/unit/util/log/destinations_spec.rb +7 -3
- data/spec/unit/util/log_spec.rb +0 -138
- data/spec/unit/util/logging_spec.rb +200 -0
- data/spec/unit/util/windows/adsi_spec.rb +51 -0
- data/tasks/manpages.rake +1 -0
- metadata +12 -5
- data/lib/puppet/pops/loader/null_loader.rb +0 -60
- data/locales/ja/puppet.po +0 -12114
| @@ -287,9 +287,21 @@ describe Puppet::Type.type(:package).provider(:dpkg) do | |
| 287 287 | 
             
                provider.purge
         | 
| 288 288 | 
             
              end
         | 
| 289 289 |  | 
| 290 | 
            -
               | 
| 291 | 
            -
                 | 
| 292 | 
            -
             | 
| 290 | 
            +
              context "package_not_installed?" do
         | 
| 291 | 
            +
                it "returns true if package is not found" do
         | 
| 292 | 
            +
                  expect(provider).to receive(:dpkgquery).with("-W", "--showformat", "'${Status} ${Package} ${Version}\\n'", resource_name).and_raise(Puppet::ExecutionFailure.new("eh"))
         | 
| 293 | 
            +
                  expect(provider.package_not_installed?).to eq(true)
         | 
| 294 | 
            +
                end
         | 
| 295 | 
            +
             | 
| 296 | 
            +
                it "returns true if package is not installed" do
         | 
| 297 | 
            +
                  expect(provider).to receive(:dpkgquery).with("-W", "--showformat", "'${Status} ${Package} ${Version}\\n'", resource_name).and_return("unknown ok not-installed #{resource_name}")
         | 
| 298 | 
            +
                  expect(provider.package_not_installed?).to eq(true)
         | 
| 299 | 
            +
                end
         | 
| 300 | 
            +
             | 
| 301 | 
            +
                it "returns false if package is installed" do
         | 
| 302 | 
            +
                  expect(provider).to receive(:dpkgquery).with("-W", "--showformat", "'${Status} ${Package} ${Version}\\n'", resource_name).and_return("install ok installed resource_name 1.2.3")
         | 
| 303 | 
            +
                  expect(provider.package_not_installed?).to eq(false)
         | 
| 304 | 
            +
                end
         | 
| 293 305 | 
             
              end
         | 
| 294 306 | 
             
            end
         | 
| 295 307 |  | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 | 
            -
            osfamilies = { 'windows' => ['pip.exe'], 'other' => ['pip', 'pip-python'] }
         | 
| 3 | 
            +
            osfamilies = { 'windows' => ['pip.exe'], 'other' => ['pip', 'pip-python', 'pip2', 'pip-2'] }
         | 
| 4 4 |  | 
| 5 5 | 
             
            describe Puppet::Type.type(:package).provider(:pip) do
         | 
| 6 6 |  | 
| @@ -197,6 +197,13 @@ describe Puppet::Type.type(:package).provider(:pip) do | |
| 197 197 | 
             
                    @resource[:name] = "fake_package"
         | 
| 198 198 | 
             
                    expect(@provider.latest).to eq(nil)
         | 
| 199 199 | 
             
                  end
         | 
| 200 | 
            +
             | 
| 201 | 
            +
                  it "should use 'install_options' when specified" do
         | 
| 202 | 
            +
                    expect(Puppet::Util::Execution).to receive(:execpipe).with(array_including([["--index=https://fake.example.com"]])).once
         | 
| 203 | 
            +
                    @resource[:name] = "fake_package"
         | 
| 204 | 
            +
                    @resource[:install_options] = ['--index' => 'https://fake.example.com']
         | 
| 205 | 
            +
                    expect(@provider.latest).to eq(nil)
         | 
| 206 | 
            +
                  end
         | 
| 200 207 | 
             
                end
         | 
| 201 208 |  | 
| 202 209 | 
             
                context "with pip version >= 1.5.4" do
         | 
| @@ -251,6 +258,13 @@ describe Puppet::Type.type(:package).provider(:pip) do | |
| 251 258 | 
             
                    latest = @provider.latest
         | 
| 252 259 | 
             
                    expect(latest).to eq('15.0.2')
         | 
| 253 260 | 
             
                  end
         | 
| 261 | 
            +
             | 
| 262 | 
            +
                  it "should use 'install_options' when specified" do
         | 
| 263 | 
            +
                    expect(Puppet::Util::Execution).to receive(:execpipe).with(array_including([["--index=https://fake.example.com"]])).once
         | 
| 264 | 
            +
                    @resource[:name] = "fake_package"
         | 
| 265 | 
            +
                    @resource[:install_options] = ['--index' => 'https://fake.example.com']
         | 
| 266 | 
            +
                    expect(@provider.latest).to eq(nil)
         | 
| 267 | 
            +
                  end
         | 
| 254 268 | 
             
                end
         | 
| 255 269 | 
             
              end
         | 
| 256 270 |  | 
| @@ -341,12 +355,43 @@ describe Puppet::Type.type(:package).provider(:pip) do | |
| 341 355 | 
             
              end
         | 
| 342 356 |  | 
| 343 357 | 
             
              context "pip_version" do
         | 
| 358 | 
            +
                let(:pip) { '/fake/bin/pip' }
         | 
| 359 | 
            +
             | 
| 344 360 | 
             
                it "should look up version if pip is present" do
         | 
| 345 | 
            -
                  allow(described_class).to receive(:pip_cmd).and_return( | 
| 346 | 
            -
                   | 
| 347 | 
            -
                   | 
| 348 | 
            -
             | 
| 349 | 
            -
                  expect(described_class.pip_version( | 
| 361 | 
            +
                  allow(described_class).to receive(:pip_cmd).and_return(pip)
         | 
| 362 | 
            +
                  process = ['pip 8.0.2 from /usr/local/lib/python2.7/dist-packages (python 2.7)']
         | 
| 363 | 
            +
                  allow(described_class).to receive(:execpipe).with([pip, '--version']).and_yield(process)
         | 
| 364 | 
            +
             | 
| 365 | 
            +
                  expect(described_class.pip_version(pip)).to eq('8.0.2')
         | 
| 366 | 
            +
                end
         | 
| 367 | 
            +
             | 
| 368 | 
            +
                it "parses multiple lines of output" do
         | 
| 369 | 
            +
                  allow(described_class).to receive(:pip_cmd).and_return(pip)
         | 
| 370 | 
            +
                  process = [
         | 
| 371 | 
            +
                    "/usr/local/lib/python2.7/dist-packages/urllib3/contrib/socks.py:37: DependencyWarning: SOCKS support in urllib3 requires the installation of optional dependencies: specifically, PySocks. For more information, see https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies",
         | 
| 372 | 
            +
                    "  DependencyWarning",
         | 
| 373 | 
            +
                    "pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7)"
         | 
| 374 | 
            +
                  ]
         | 
| 375 | 
            +
                  allow(described_class).to receive(:execpipe).with([pip, '--version']).and_yield(process)
         | 
| 376 | 
            +
             | 
| 377 | 
            +
                  expect(described_class.pip_version(pip)).to eq('1.5.6')
         | 
| 378 | 
            +
                end
         | 
| 379 | 
            +
             | 
| 380 | 
            +
                it "raises if there isn't a version string" do
         | 
| 381 | 
            +
                  allow(described_class).to receive(:pip_cmd).and_return(pip)
         | 
| 382 | 
            +
                  allow(described_class).to receive(:execpipe).with([pip, '--version']).and_yield([""])
         | 
| 383 | 
            +
                  expect {
         | 
| 384 | 
            +
                    described_class.pip_version(pip)
         | 
| 385 | 
            +
                  }.to raise_error(Puppet::Error, 'Cannot resolve pip version')
         | 
| 386 | 
            +
                end
         | 
| 387 | 
            +
             | 
| 388 | 
            +
                it "quotes commands with spaces" do
         | 
| 389 | 
            +
                  pip = 'C:\Program Files\Python27\Scripts\pip.exe'
         | 
| 390 | 
            +
                  allow(described_class).to receive(:pip_cmd).and_return(pip)
         | 
| 391 | 
            +
                  process = ["pip 18.1 from c:\program files\python27\lib\site-packages\pip (python 2.7)\r\n"]
         | 
| 392 | 
            +
                  allow(described_class).to receive(:execpipe).with(["\"#{pip}\"", '--version']).and_yield(process)
         | 
| 393 | 
            +
             | 
| 394 | 
            +
                  expect(described_class.pip_version(pip)).to eq('18.1')
         | 
| 350 395 | 
             
                end
         | 
| 351 396 | 
             
              end
         | 
| 352 397 |  | 
| @@ -42,13 +42,13 @@ describe Puppet::Type.type(:package).provider(:portage) do | |
| 42 42 | 
             
                allow(@unslotted_provider).to receive(:qatom).and_return({:category=>"dev-lang", :pn=>"ruby", :pv=>nil, :pr=>nil, :slot=>nil, :pfx=>nil, :sfx=>nil})
         | 
| 43 43 | 
             
                allow(@unslotted_provider.class).to receive(:emerge).with('--list-sets').and_return(package_sets)
         | 
| 44 44 | 
             
                @slotted_provider = described_class.new(@slotted_resource)
         | 
| 45 | 
            -
                allow(@slotted_provider).to receive(:qatom).and_return({:category=>"dev-lang", :pn=>"ruby", :pv=>nil, :pr=>nil, :slot=>" | 
| 45 | 
            +
                allow(@slotted_provider).to receive(:qatom).and_return({:category=>"dev-lang", :pn=>"ruby", :pv=>nil, :pr=>nil, :slot=>"2.1", :pfx=>nil, :sfx=>nil})
         | 
| 46 46 | 
             
                allow(@slotted_provider.class).to receive(:emerge).with('--list-sets').and_return(package_sets)
         | 
| 47 47 | 
             
                @versioned_provider = described_class.new(@versioned_resource)
         | 
| 48 48 | 
             
                allow(@versioned_provider).to receive(:qatom).and_return({:category=>"dev-lang", :pn=>"ruby", :pv=>"1.9.3", :pr=>nil, :slot=>nil, :pfx=>nil, :sfx=>nil})
         | 
| 49 49 | 
             
                allow(@versioned_provider.class).to receive(:emerge).with('--list-sets').and_return(package_sets)
         | 
| 50 50 | 
             
                @versioned_slotted_provider = described_class.new(@versioned_slotted_resource)
         | 
| 51 | 
            -
                allow(@versioned_slotted_provider).to receive(:qatom).and_return({:category=>"dev-lang", :pn=>"ruby", :pv=>"1.9.3", :pr=>nil, :slot=>" | 
| 51 | 
            +
                allow(@versioned_slotted_provider).to receive(:qatom).and_return({:category=>"dev-lang", :pn=>"ruby", :pv=>"1.9.3", :pr=>nil, :slot=>"1.9", :pfx=>"=", :sfx=>nil})
         | 
| 52 52 | 
             
                allow(@versioned_slotted_provider.class).to receive(:emerge).with('--list-sets').and_return(package_sets)
         | 
| 53 53 | 
             
                @set_provider = described_class.new(@set_resource)
         | 
| 54 54 | 
             
                allow(@set_provider).to receive(:qatom).and_return({:category=>nil, :pn=>"@system", :pv=>nil, :pr=>nil, :slot=>nil, :pfx=>nil, :sfx=>nil})
         | 
| @@ -166,7 +166,7 @@ describe Puppet::Type.type(:package).provider(:portage) do | |
| 166 166 | 
             
              end
         | 
| 167 167 |  | 
| 168 168 | 
             
              it "can extract the slot from the package name" do
         | 
| 169 | 
            -
                expect(@slotted_provider.qatom[:slot]).to eq(' | 
| 169 | 
            +
                expect(@slotted_provider.qatom[:slot]).to eq('2.1')
         | 
| 170 170 | 
             
              end
         | 
| 171 171 |  | 
| 172 172 | 
             
              it "returns nil for as the slot when no slot is specified" do
         | 
| @@ -182,7 +182,7 @@ describe Puppet::Type.type(:package).provider(:portage) do | |
| 182 182 | 
             
                expect(@versioned_slotted_provider.qatom[:category]).to eq('dev-lang')
         | 
| 183 183 | 
             
                expect(@versioned_slotted_provider.qatom[:pn]).to eq('ruby')
         | 
| 184 184 | 
             
                expect(@versioned_slotted_provider.qatom[:pv]).to eq('1.9.3')
         | 
| 185 | 
            -
                expect(@versioned_slotted_provider.qatom[:slot]).to eq(' | 
| 185 | 
            +
                expect(@versioned_slotted_provider.qatom[:slot]).to eq('1.9')
         | 
| 186 186 | 
             
              end
         | 
| 187 187 |  | 
| 188 188 | 
             
              it "can handle search output with slots for unslotted packages" do
         | 
| @@ -0,0 +1,60 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'puppet'
         | 
| 3 | 
            +
            require 'puppet/provider/package_targetable'
         | 
| 4 | 
            +
            require 'puppet/provider/package/gem'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            describe Puppet::Provider::Package::Targetable do
         | 
| 7 | 
            +
              let(:provider) { Puppet::Type.type(:package).provider(:gem) }
         | 
| 8 | 
            +
              let(:command)  { '/opt/bin/gem' }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              describe "when prefetching" do
         | 
| 11 | 
            +
                context "with a package without a command attribute" do
         | 
| 12 | 
            +
                  let(:resource) { Puppet::Type.type(:package).new(:name => 'noo', :provider => 'gem', :ensure => :present) }
         | 
| 13 | 
            +
                  let(:catalog)  { Puppet::Resource::Catalog.new }
         | 
| 14 | 
            +
                  let(:instance) { provider.new(resource) }
         | 
| 15 | 
            +
                  let(:packages) { { 'noo' => resource } }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  it "should pass a command to the instances method of the provider" do
         | 
| 18 | 
            +
                    catalog.add_resource(resource)
         | 
| 19 | 
            +
                    expect(provider).to receive(:instances).with(nil).and_return([instance])
         | 
| 20 | 
            +
                    expect(provider.prefetch(packages)).to eq([nil]) # prefetch arbitrarily returns the array of commands for a provider in the catalog
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                context "with a package with a command attribute" do
         | 
| 25 | 
            +
                  let(:resource) { Puppet::Type.type(:package).new(:name => 'noo', :provider => 'gem', :ensure => :present) }
         | 
| 26 | 
            +
                  let(:resource_targeted) { Puppet::Type.type(:package).new(:name => 'yes', :provider => 'gem', :command => command, :ensure => :present) }
         | 
| 27 | 
            +
                  let(:catalog)  { Puppet::Resource::Catalog.new }
         | 
| 28 | 
            +
                  let(:instance) { provider.new(resource) }
         | 
| 29 | 
            +
                  let(:instance_targeted) { provider.new(resource_targeted) }
         | 
| 30 | 
            +
                  let(:packages) { { 'noo' => resource, 'yes' => resource_targeted } }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  it "should pass the command to the instances method of the provider" do
         | 
| 33 | 
            +
                    catalog.add_resource(resource)
         | 
| 34 | 
            +
                    catalog.add_resource(resource_targeted)
         | 
| 35 | 
            +
                    expect(provider).to receive(:instances).with(nil).and_return([instance])
         | 
| 36 | 
            +
                    expect(provider).to receive(:instances).with(command).and_return([instance_targeted]).once
         | 
| 37 | 
            +
                    expect(provider.prefetch(packages)).to eq([nil, command]) # prefetch arbitrarily returns the array of commands for a provider in the catalog
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              describe "when validating a command" do
         | 
| 43 | 
            +
                context "with no command" do
         | 
| 44 | 
            +
                  it "report not functional" do
         | 
| 45 | 
            +
                    expect { provider.validate_command(nil) }.to raise_error(Puppet::Error, "Provider gem package command is not functional on this host")
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
                context "with a missing command" do
         | 
| 49 | 
            +
                  it "report does not exist" do
         | 
| 50 | 
            +
                    expect { provider.validate_command(command) }.to raise_error(Puppet::Error, "Provider gem package command '#{command}' does not exist on this host")
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
                context "with an existing command" do
         | 
| 54 | 
            +
                  it "validates" do
         | 
| 55 | 
            +
                    allow(File).to receive(:file?).with(command).and_return(true)
         | 
| 56 | 
            +
                    expect { provider.validate_command(command) }.not_to raise_error
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
            end
         | 
| @@ -160,4 +160,28 @@ describe Puppet::Type.type(:service).provider(:daemontools) do | |
| 160 160 | 
             
                  expect(@provider.status).to  eq(:stopped)
         | 
| 161 161 | 
             
                end
         | 
| 162 162 | 
             
              end
         | 
| 163 | 
            +
             | 
| 164 | 
            +
              context '.instances' do
         | 
| 165 | 
            +
                before do
         | 
| 166 | 
            +
                  allow(described_class).to receive(:defpath).and_return(path)
         | 
| 167 | 
            +
                end
         | 
| 168 | 
            +
             | 
| 169 | 
            +
                context 'when defpath is nil' do
         | 
| 170 | 
            +
                  let(:path) { nil }
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                  it 'returns info message' do
         | 
| 173 | 
            +
                    expect(Puppet).to receive(:info).with(/daemontools is unsuitable because service directory is nil/)
         | 
| 174 | 
            +
                    described_class.instances
         | 
| 175 | 
            +
                  end
         | 
| 176 | 
            +
                end
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                context 'when defpath does not exist' do
         | 
| 179 | 
            +
                  let(:path) { '/inexistent_path' }
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                  it 'returns notice about missing path' do
         | 
| 182 | 
            +
                    expect(Puppet).to receive(:notice).with(/Service path #{path} does not exist/)
         | 
| 183 | 
            +
                    described_class.instances
         | 
| 184 | 
            +
                  end
         | 
| 185 | 
            +
                end
         | 
| 186 | 
            +
              end
         | 
| 163 187 | 
             
            end
         | 
| @@ -134,4 +134,28 @@ describe Puppet::Type.type(:service).provider(:runit) do | |
| 134 134 | 
             
                  expect(@provider.status).to eq(:stopped)
         | 
| 135 135 | 
             
                end
         | 
| 136 136 | 
             
              end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
              context '.instances' do
         | 
| 139 | 
            +
                before do
         | 
| 140 | 
            +
                  allow(described_class).to receive(:defpath).and_return(path)
         | 
| 141 | 
            +
                end
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                context 'when defpath is nil' do
         | 
| 144 | 
            +
                  let(:path) { nil }
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                  it 'returns info message' do
         | 
| 147 | 
            +
                    expect(Puppet).to receive(:info).with(/runit is unsuitable because service directory is nil/)
         | 
| 148 | 
            +
                    described_class.instances
         | 
| 149 | 
            +
                  end
         | 
| 150 | 
            +
                end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                context 'when defpath does not exist' do
         | 
| 153 | 
            +
                  let(:path) { '/inexistent_path' }
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                  it 'returns notice about missing path' do
         | 
| 156 | 
            +
                    expect(Puppet).to receive(:notice).with(/Service path #{path} does not exist/)
         | 
| 157 | 
            +
                    described_class.instances
         | 
| 158 | 
            +
                  end
         | 
| 159 | 
            +
                end
         | 
| 160 | 
            +
              end
         | 
| 137 161 | 
             
            end
         | 
| @@ -164,15 +164,15 @@ describe Puppet::Type.type(:service).provider(:systemd) do | |
| 164 164 |  | 
| 165 165 | 
             
                it "should start the service with systemctl start otherwise" do
         | 
| 166 166 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 167 | 
            -
                  expect(provider).to receive(:systemctl).with(:unmask, 'sshd.service')
         | 
| 168 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','start','sshd.service'], {:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
         | 
| 167 | 
            +
                  expect(provider).to receive(:systemctl).with(:unmask, '--', 'sshd.service')
         | 
| 168 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','start', '--', 'sshd.service'], {:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
         | 
| 169 169 | 
             
                  provider.start
         | 
| 170 170 | 
             
                end
         | 
| 171 171 |  | 
| 172 172 | 
             
                it "should show journald logs on failure" do
         | 
| 173 173 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 174 | 
            -
                  expect(provider).to receive(:systemctl).with(:unmask, 'sshd.service')
         | 
| 175 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','start','sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
         | 
| 174 | 
            +
                  expect(provider).to receive(:systemctl).with(:unmask, '--', 'sshd.service')
         | 
| 175 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','start', '--', 'sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
         | 
| 176 176 | 
             
                    .and_raise(Puppet::ExecutionFailure, "Failed to start sshd.service: Unit sshd.service failed to load: Invalid argument. See system logs and 'systemctl status sshd.service' for details.")
         | 
| 177 177 | 
             
                  journalctl_logs = <<-EOS
         | 
| 178 178 | 
             
            -- Logs begin at Tue 2016-06-14 11:59:21 UTC, end at Tue 2016-06-14 21:45:02 UTC. --
         | 
| @@ -194,13 +194,13 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a | |
| 194 194 |  | 
| 195 195 | 
             
                it "should stop the service with systemctl stop otherwise" do
         | 
| 196 196 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 197 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','stop','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
         | 
| 197 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','stop', '--', 'sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
         | 
| 198 198 | 
             
                  provider.stop
         | 
| 199 199 | 
             
                end
         | 
| 200 200 |  | 
| 201 201 | 
             
                it "should show journald logs on failure" do
         | 
| 202 202 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 203 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','stop','sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
         | 
| 203 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','stop', '--', 'sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
         | 
| 204 204 | 
             
                    .and_raise(Puppet::ExecutionFailure, "Failed to stop sshd.service: Unit sshd.service failed to load: Invalid argument. See system logs and 'systemctl status sshd.service' for details.")
         | 
| 205 205 | 
             
                  journalctl_logs = <<-EOS
         | 
| 206 206 | 
             
            -- Logs begin at Tue 2016-06-14 11:59:21 UTC, end at Tue 2016-06-14 21:45:02 UTC. --
         | 
| @@ -216,42 +216,42 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a | |
| 216 216 | 
             
              describe "#enabled?" do
         | 
| 217 217 | 
             
                it "should return :true if the service is enabled" do
         | 
| 218 218 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 219 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).and_return("enabled\n")
         | 
| 219 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).and_return("enabled\n")
         | 
| 220 220 | 
             
                  allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
         | 
| 221 221 | 
             
                  expect(provider.enabled?).to eq(:true)
         | 
| 222 222 | 
             
                end
         | 
| 223 223 |  | 
| 224 224 | 
             
                it "should return :true if the service is static" do
         | 
| 225 225 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 226 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).and_return("static\n")
         | 
| 226 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','--', 'sshd.service'], :failonfail => false).and_return("static\n")
         | 
| 227 227 | 
             
                  allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
         | 
| 228 228 | 
             
                  expect(provider.enabled?).to eq(:true)
         | 
| 229 229 | 
             
                end
         | 
| 230 230 |  | 
| 231 231 | 
             
                it "should return :false if the service is disabled" do
         | 
| 232 232 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 233 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).and_return("disabled\n")
         | 
| 233 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).and_return("disabled\n")
         | 
| 234 234 | 
             
                  allow($CHILD_STATUS).to receive(:exitstatus).and_return(1)
         | 
| 235 235 | 
             
                  expect(provider.enabled?).to eq(:false)
         | 
| 236 236 | 
             
                end
         | 
| 237 237 |  | 
| 238 238 | 
             
                it "should return :false if the service is indirect" do
         | 
| 239 239 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 240 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).and_return("indirect\n")
         | 
| 240 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).and_return("indirect\n")
         | 
| 241 241 | 
             
                  allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
         | 
| 242 242 | 
             
                  expect(provider.enabled?).to eq(:false)
         | 
| 243 243 | 
             
                end
         | 
| 244 244 |  | 
| 245 245 | 
             
                it "should return :false if the service is masked and the resource is attempting to be disabled" do
         | 
| 246 246 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => false))
         | 
| 247 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).and_return("masked\n")
         | 
| 247 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).and_return("masked\n")
         | 
| 248 248 | 
             
                  allow($CHILD_STATUS).to receive(:exitstatus).and_return(1)
         | 
| 249 249 | 
             
                  expect(provider.enabled?).to eq(:false)
         | 
| 250 250 | 
             
                end
         | 
| 251 251 |  | 
| 252 252 | 
             
                it "should return :mask if the service is masked and the resource is attempting to be masked" do
         | 
| 253 253 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => 'mask'))
         | 
| 254 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','sshd.service'], :failonfail => false).and_return("masked\n")
         | 
| 254 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).and_return("masked\n")
         | 
| 255 255 | 
             
                  allow($CHILD_STATUS).to receive(:exitstatus).and_return(1)
         | 
| 256 256 | 
             
                  expect(provider.enabled?).to eq(:mask)
         | 
| 257 257 | 
             
                end
         | 
| @@ -260,8 +260,8 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a | |
| 260 260 | 
             
              describe "#enable" do
         | 
| 261 261 | 
             
                it "should run systemctl enable to enable a service" do
         | 
| 262 262 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 263 | 
            -
                  expect(provider).to receive(:systemctl).with(:unmask, 'sshd.service')
         | 
| 264 | 
            -
                  expect(provider).to receive(:systemctl).with(:enable, 'sshd.service')
         | 
| 263 | 
            +
                  expect(provider).to receive(:systemctl).with(:unmask, '--', 'sshd.service')
         | 
| 264 | 
            +
                  expect(provider).to receive(:systemctl).with(:enable, '--', 'sshd.service')
         | 
| 265 265 | 
             
                  provider.enable
         | 
| 266 266 | 
             
                end
         | 
| 267 267 | 
             
              end
         | 
| @@ -269,7 +269,7 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a | |
| 269 269 | 
             
              describe "#disable" do
         | 
| 270 270 | 
             
                it "should run systemctl disable to disable a service" do
         | 
| 271 271 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 272 | 
            -
                  expect(provider).to receive(:systemctl).with(:disable, 'sshd.service')
         | 
| 272 | 
            +
                  expect(provider).to receive(:systemctl).with(:disable, '--', 'sshd.service')
         | 
| 273 273 | 
             
                  provider.disable
         | 
| 274 274 | 
             
                end
         | 
| 275 275 | 
             
              end
         | 
| @@ -280,8 +280,8 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a | |
| 280 280 | 
             
                  # :disable is the only call in the provider that uses a symbol instead of
         | 
| 281 281 | 
             
                  # a string.
         | 
| 282 282 | 
             
                  # This should be made consistent in the future and all tests updated.
         | 
| 283 | 
            -
                  expect(provider).to receive(:systemctl).with(:disable, 'sshd.service')
         | 
| 284 | 
            -
                  expect(provider).to receive(:systemctl).with(:mask, 'sshd.service')
         | 
| 283 | 
            +
                  expect(provider).to receive(:systemctl).with(:disable, '--', 'sshd.service')
         | 
| 284 | 
            +
                  expect(provider).to receive(:systemctl).with(:mask, '--', 'sshd.service')
         | 
| 285 285 | 
             
                  provider.mask
         | 
| 286 286 | 
             
                end
         | 
| 287 287 | 
             
              end
         | 
| @@ -291,7 +291,7 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a | |
| 291 291 | 
             
              describe "#status" do
         | 
| 292 292 | 
             
                it "should return running if if the command returns 0" do
         | 
| 293 293 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 294 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-active','sshd.service'], :failonfail => false, :override_locale => false, :squelch => false, :combine => true).and_return("active\n")
         | 
| 294 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-active','--','sshd.service'], :failonfail => false, :override_locale => false, :squelch => false, :combine => true).and_return("active\n")
         | 
| 295 295 | 
             
                  allow($CHILD_STATUS).to receive(:exitstatus).and_return(0)
         | 
| 296 296 | 
             
                  expect(provider.status).to eq(:running)
         | 
| 297 297 | 
             
                end
         | 
| @@ -299,7 +299,7 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a | |
| 299 299 | 
             
                [-10,-1,3,10].each { |ec|
         | 
| 300 300 | 
             
                  it "should return stopped if the command returns something non-0" do
         | 
| 301 301 | 
             
                    provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 302 | 
            -
                    expect(provider).to receive(:execute).with(['/bin/systemctl','is-active','sshd.service'], :failonfail => false, :override_locale => false, :squelch => false, :combine => true).and_return("inactive\n")
         | 
| 302 | 
            +
                    expect(provider).to receive(:execute).with(['/bin/systemctl','is-active','--','sshd.service'], :failonfail => false, :override_locale => false, :squelch => false, :combine => true).and_return("inactive\n")
         | 
| 303 303 | 
             
                    allow($CHILD_STATUS).to receive(:exitstatus).and_return(ec)
         | 
| 304 304 | 
             
                    expect(provider.status).to eq(:stopped)
         | 
| 305 305 | 
             
                  end
         | 
| @@ -317,20 +317,20 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a | |
| 317 317 | 
             
              describe "#restart" do
         | 
| 318 318 | 
             
                it "should use the supplied restart command if specified" do
         | 
| 319 319 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd', :restart => '/bin/foo'))
         | 
| 320 | 
            -
                  expect(provider).not_to receive(:execute).with(['/bin/systemctl','restart','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
         | 
| 320 | 
            +
                  expect(provider).not_to receive(:execute).with(['/bin/systemctl','restart','--','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
         | 
| 321 321 | 
             
                  expect(provider).to receive(:execute).with(['/bin/foo'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
         | 
| 322 322 | 
             
                  provider.restart
         | 
| 323 323 | 
             
                end
         | 
| 324 324 |  | 
| 325 325 | 
             
                it "should restart the service with systemctl restart" do
         | 
| 326 326 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 327 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','restart','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
         | 
| 327 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','restart','--','sshd.service'], :failonfail => true, :override_locale => false, :squelch => false, :combine => true)
         | 
| 328 328 | 
             
                  provider.restart
         | 
| 329 329 | 
             
                end
         | 
| 330 330 |  | 
| 331 331 | 
             
                it "should show journald logs on failure" do
         | 
| 332 332 | 
             
                  provider = described_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 333 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','restart','sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
         | 
| 333 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','restart', '--', 'sshd.service'],{:failonfail => true, :override_locale => false, :squelch => false, :combine => true})
         | 
| 334 334 | 
             
                    .and_raise(Puppet::ExecutionFailure, "Failed to restart sshd.service: Unit sshd.service failed to load: Invalid argument. See system logs and 'systemctl status sshd.service' for details.")
         | 
| 335 335 | 
             
                  journalctl_logs = <<-EOS
         | 
| 336 336 | 
             
            -- Logs begin at Tue 2016-06-14 11:59:21 UTC, end at Tue 2016-06-14 21:45:02 UTC. --
         | 
| @@ -56,14 +56,14 @@ describe Puppet::Type.type(:user).provider(:hpuxuseradd), :unless => Puppet.feat | |
| 56 56 | 
             
                it "should add modprpw to modifycmd if Trusted System" do
         | 
| 57 57 | 
             
                  allow(resource).to receive(:allowdupe?).and_return(true)
         | 
| 58 58 | 
             
                  expect(provider).to receive(:exec_getprpw).with('root','-m uid').and_return('uid=0')
         | 
| 59 | 
            -
                  expect(provider).to receive(:execute).with(['/usr/sam/lbin/usermod.sam', '-u', 1000, '-o', 'testuser', ' | 
| 59 | 
            +
                  expect(provider).to receive(:execute).with(['/usr/sam/lbin/usermod.sam', '-F', '-u', 1000, '-o', 'testuser', ';', '/usr/lbin/modprpw', '-v', '-l', 'testuser'], hash_including(custom_environment: {}))
         | 
| 60 60 | 
             
                  provider.uid = 1000
         | 
| 61 61 | 
             
                end
         | 
| 62 62 |  | 
| 63 63 | 
             
                it "should not add modprpw if not Trusted System" do
         | 
| 64 64 | 
             
                  allow(resource).to receive(:allowdupe?).and_return(true)
         | 
| 65 65 | 
             
                  expect(provider).to receive(:exec_getprpw).with('root','-m uid').and_return('System is not trusted')
         | 
| 66 | 
            -
                  expect(provider).to receive(:execute).with(['/usr/sam/lbin/usermod.sam', '-u', 1000, '-o', 'testuser' | 
| 66 | 
            +
                  expect(provider).to receive(:execute).with(['/usr/sam/lbin/usermod.sam', '-F', '-u', 1000, '-o', 'testuser'], hash_including(custom_environment: {}))
         | 
| 67 67 | 
             
                  provider.uid = 1000
         | 
| 68 68 | 
             
                end
         | 
| 69 69 | 
             
              end
         | 
| @@ -317,6 +317,52 @@ describe Puppet::Type.type(:user).provider(:useradd) do | |
| 317 317 | 
             
                end
         | 
| 318 318 | 
             
              end
         | 
| 319 319 |  | 
| 320 | 
            +
              describe "#comment" do
         | 
| 321 | 
            +
                before { described_class.has_feature :libuser }
         | 
| 322 | 
            +
             | 
| 323 | 
            +
                let(:content) { "myuser:x:x:x:local comment:x:x" }
         | 
| 324 | 
            +
             | 
| 325 | 
            +
                it "should return the local comment string when forcelocal is true" do
         | 
| 326 | 
            +
                  resource[:forcelocal] = true
         | 
| 327 | 
            +
                  allow(File).to receive(:open).with('/etc/passwd').and_yield(content)
         | 
| 328 | 
            +
                  expect(provider.comment).to eq('local comment')
         | 
| 329 | 
            +
                end
         | 
| 330 | 
            +
             | 
| 331 | 
            +
                it "should fall back to nameservice comment string when forcelocal is false" do
         | 
| 332 | 
            +
                  resource[:forcelocal] = false
         | 
| 333 | 
            +
                  allow(provider).to receive(:get).with(:comment).and_return('remote comment')
         | 
| 334 | 
            +
                  expect(provider).not_to receive(:localcomment)
         | 
| 335 | 
            +
                  expect(provider.comment).to eq('remote comment')
         | 
| 336 | 
            +
                end
         | 
| 337 | 
            +
              end
         | 
| 338 | 
            +
             | 
| 339 | 
            +
              describe "#finduser" do
         | 
| 340 | 
            +
                before { allow(File).to receive(:open).with('/etc/passwd').and_yield(content) }
         | 
| 341 | 
            +
             | 
| 342 | 
            +
                let(:content) { "sample_account:sample_password:sample_uid:sample_gid:sample_gecos:sample_directory:sample_shell" }
         | 
| 343 | 
            +
                let(:output) do
         | 
| 344 | 
            +
                  {
         | 
| 345 | 
            +
                    account: 'sample_account',
         | 
| 346 | 
            +
                    password: 'sample_password',
         | 
| 347 | 
            +
                    uid: 'sample_uid',
         | 
| 348 | 
            +
                    gid: 'sample_gid',
         | 
| 349 | 
            +
                    gecos: 'sample_gecos',
         | 
| 350 | 
            +
                    directory: 'sample_directory',
         | 
| 351 | 
            +
                    shell: 'sample_shell',
         | 
| 352 | 
            +
                  }
         | 
| 353 | 
            +
                end
         | 
| 354 | 
            +
             | 
| 355 | 
            +
                [:account, :password, :uid, :gid, :gecos, :directory, :shell].each do |key|
         | 
| 356 | 
            +
                  it "finds an user by #{key} when asked" do
         | 
| 357 | 
            +
                    expect(provider.finduser(key, "sample_#{key}")).to eq(output)
         | 
| 358 | 
            +
                  end
         | 
| 359 | 
            +
                end
         | 
| 360 | 
            +
             | 
| 361 | 
            +
                it "returns false when specified key/value pair is not found" do
         | 
| 362 | 
            +
                  expect(provider.finduser(:account, 'invalid_account')).to eq(false)
         | 
| 363 | 
            +
                end
         | 
| 364 | 
            +
              end
         | 
| 365 | 
            +
             | 
| 320 366 | 
             
              describe "#check_allow_dup" do
         | 
| 321 367 | 
             
                it "should return an array with a flag if dup is allowed" do
         | 
| 322 368 | 
             
                  resource[:allowdupe] = :true
         |