puppet 7.10.0-x64-mingw32 → 7.13.1-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.
- checksums.yaml +4 -4
- data/Gemfile +3 -3
- data/Gemfile.lock +20 -15
- data/ext/project_data.yaml +1 -1
- data/lib/puppet/application/agent.rb +4 -0
- data/lib/puppet/application/apply.rb +20 -2
- data/lib/puppet/application/lookup.rb +72 -24
- data/lib/puppet/application/resource.rb +15 -13
- data/lib/puppet/concurrent/thread_local_singleton.rb +6 -3
- data/lib/puppet/configurer.rb +98 -29
- data/lib/puppet/confine/variable.rb +1 -1
- data/lib/puppet/defaults.rb +17 -3
- data/lib/puppet/facter_impl.rb +96 -0
- data/lib/puppet/file_serving/metadata.rb +3 -0
- data/lib/puppet/file_serving/mount/file.rb +4 -4
- data/lib/puppet/file_system/file_impl.rb +10 -8
- data/lib/puppet/file_system/jruby.rb +1 -1
- data/lib/puppet/file_system/path_pattern.rb +10 -15
- data/lib/puppet/file_system/uniquefile.rb +1 -1
- data/lib/puppet/file_system/windows.rb +4 -4
- data/lib/puppet/file_system.rb +3 -2
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/functions/versioncmp.rb +6 -2
- data/lib/puppet/graph/simple_graph.rb +2 -1
- data/lib/puppet/http/client.rb +1 -1
- data/lib/puppet/http/redirector.rb +5 -0
- data/lib/puppet/indirector/catalog/compiler.rb +3 -3
- data/lib/puppet/indirector/facts/facter.rb +6 -6
- data/lib/puppet/indirector/indirection.rb +1 -1
- data/lib/puppet/module_tool/applications/uninstaller.rb +1 -1
- data/lib/puppet/module_tool/applications/upgrader.rb +1 -1
- data/lib/puppet/pal/pal_impl.rb +1 -1
- data/lib/puppet/parser/resource.rb +1 -1
- data/lib/puppet/parser/scope.rb +8 -7
- data/lib/puppet/parser/templatewrapper.rb +1 -0
- data/lib/puppet/pops/evaluator/closure.rb +7 -5
- data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -0
- data/lib/puppet/pops/lookup/lookup_adapter.rb +3 -2
- data/lib/puppet/pops/model/ast.rb +1 -0
- data/lib/puppet/pops/model/factory.rb +14 -13
- data/lib/puppet/pops/parser/code_merger.rb +4 -4
- data/lib/puppet/pops/parser/egrammar.ra +4 -2
- data/lib/puppet/pops/parser/eparser.rb +909 -894
- data/lib/puppet/pops/parser/lexer2.rb +69 -68
- data/lib/puppet/pops/parser/slurp_support.rb +1 -0
- data/lib/puppet/pops/serialization/to_data_converter.rb +6 -18
- data/lib/puppet/pops/serialization/to_stringified_converter.rb +1 -1
- data/lib/puppet/pops/types/type_formatter.rb +7 -6
- data/lib/puppet/pops/types/types.rb +1 -1
- data/lib/puppet/pops/validation/checker4_0.rb +7 -2
- data/lib/puppet/provider/aix_object.rb +1 -1
- data/lib/puppet/provider/group/groupadd.rb +5 -2
- data/lib/puppet/provider/package/pkg.rb +11 -1
- data/lib/puppet/provider/package/puppet_gem.rb +1 -1
- data/lib/puppet/provider/package/puppetserver_gem.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/service/base.rb +1 -1
- data/lib/puppet/provider/service/init.rb +10 -9
- data/lib/puppet/provider/service/launchd.rb +1 -1
- data/lib/puppet/provider/service/redhat.rb +1 -1
- data/lib/puppet/provider/service/smf.rb +3 -3
- data/lib/puppet/provider/service/systemd.rb +1 -1
- data/lib/puppet/provider/service/upstart.rb +5 -5
- data/lib/puppet/provider/user/aix.rb +44 -1
- data/lib/puppet/provider/user/directoryservice.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +30 -7
- data/lib/puppet/provider.rb +1 -1
- data/lib/puppet/reference/providers.rb +2 -2
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/resource/type_collection.rb +2 -1
- data/lib/puppet/resource.rb +38 -5
- data/lib/puppet/runtime.rb +11 -1
- data/lib/puppet/settings/file_setting.rb +3 -8
- data/lib/puppet/settings.rb +2 -2
- data/lib/puppet/ssl/verifier.rb +3 -1
- data/lib/puppet/test/test_helper.rb +4 -1
- data/lib/puppet/transaction/persistence.rb +22 -12
- data/lib/puppet/type/exec.rb +9 -1
- data/lib/puppet/type/file/data_sync.rb +1 -1
- data/lib/puppet/type/file/group.rb +8 -1
- data/lib/puppet/type/file/owner.rb +8 -1
- data/lib/puppet/type/group.rb +0 -1
- data/lib/puppet/type/resources.rb +1 -1
- data/lib/puppet/type/service.rb +8 -3
- data/lib/puppet/type/user.rb +40 -39
- data/lib/puppet/util/autoload.rb +1 -1
- data/lib/puppet/util/command_line.rb +1 -1
- data/lib/puppet/util/filetype.rb +2 -2
- data/lib/puppet/util/json.rb +20 -0
- data/lib/puppet/util/log.rb +8 -4
- data/lib/puppet/util/logging.rb +1 -25
- data/lib/puppet/util/monkey_patches.rb +26 -2
- data/lib/puppet/util/package.rb +25 -16
- data/lib/puppet/util/pidlock.rb +1 -1
- data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
- data/lib/puppet/util/suidmanager.rb +1 -2
- data/lib/puppet/util/tagging.rb +1 -0
- data/lib/puppet/util/windows/service.rb +0 -5
- data/lib/puppet/util/windows/user.rb +0 -1
- data/lib/puppet/util/windows.rb +3 -0
- data/lib/puppet/util/yaml.rb +11 -0
- data/lib/puppet/util.rb +4 -3
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet.rb +3 -6
- data/locales/puppet.pot +265 -239
- data/man/man5/puppet.conf.5 +18 -2
- data/man/man8/puppet-agent.8 +4 -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-lookup.8 +9 -6
- 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.8 +2 -2
- data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +2 -1
- data/spec/fixtures/unit/forge/bacula.json +1 -1
- data/spec/integration/application/agent_spec.rb +44 -0
- data/spec/integration/application/lookup_spec.rb +29 -6
- data/spec/integration/configurer_spec.rb +1 -1
- data/spec/integration/indirector/facts/facter_spec.rb +3 -3
- data/spec/integration/parser/pcore_resource_spec.rb +20 -0
- data/spec/integration/transaction/report_spec.rb +1 -1
- data/spec/integration/type/file_spec.rb +2 -2
- data/spec/integration/type/package_spec.rb +6 -6
- data/spec/integration/util/rdoc/parser_spec.rb +1 -1
- data/spec/integration/util/windows/process_spec.rb +1 -9
- data/spec/shared_contexts/l10n.rb +5 -0
- data/spec/unit/application/apply_spec.rb +76 -56
- data/spec/unit/application/lookup_spec.rb +131 -10
- data/spec/unit/application/resource_spec.rb +29 -0
- data/spec/unit/concurrent/thread_local_singleton_spec.rb +39 -0
- data/spec/unit/configurer_spec.rb +113 -28
- data/spec/unit/facter_impl_spec.rb +31 -0
- data/spec/unit/file_bucket/dipper_spec.rb +2 -2
- data/spec/unit/file_system/uniquefile_spec.rb +7 -1
- data/spec/unit/file_system_spec.rb +41 -4
- data/spec/unit/forge/module_release_spec.rb +3 -3
- data/spec/unit/functions/lookup_spec.rb +64 -0
- data/spec/unit/functions/versioncmp_spec.rb +40 -4
- data/spec/unit/http/client_spec.rb +58 -1
- data/spec/unit/indirector/indirection_spec.rb +10 -3
- data/spec/unit/network/formats_spec.rb +6 -0
- data/spec/unit/pops/parser/parse_containers_spec.rb +2 -2
- data/spec/unit/pops/serialization/to_from_hr_spec.rb +0 -58
- data/spec/unit/pops/serialization/to_stringified_spec.rb +5 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +6 -0
- data/spec/unit/pops/validator/validator_spec.rb +5 -0
- data/spec/unit/provider/package/gem_spec.rb +1 -1
- data/spec/unit/provider/package/pip2_spec.rb +1 -1
- data/spec/unit/provider/package/pip3_spec.rb +1 -1
- data/spec/unit/provider/package/pip_spec.rb +1 -1
- data/spec/unit/provider/package/pkg_spec.rb +15 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +1 -1
- data/spec/unit/provider/package/puppetserver_gem_spec.rb +1 -1
- data/spec/unit/provider/service/gentoo_spec.rb +6 -5
- data/spec/unit/provider/service/init_spec.rb +15 -9
- data/spec/unit/provider/service/openwrt_spec.rb +21 -29
- data/spec/unit/provider/service/redhat_spec.rb +3 -2
- data/spec/unit/provider/user/aix_spec.rb +100 -0
- data/spec/unit/provider/user/directoryservice_spec.rb +1 -1
- data/spec/unit/provider/user/useradd_spec.rb +40 -0
- data/spec/unit/provider_spec.rb +4 -4
- data/spec/unit/puppet_spec.rb +12 -4
- data/spec/unit/resource/catalog_spec.rb +14 -1
- data/spec/unit/resource_spec.rb +58 -2
- data/spec/unit/settings/file_setting_spec.rb +10 -7
- data/spec/unit/transaction/persistence_spec.rb +51 -0
- data/spec/unit/type/file/group_spec.rb +7 -0
- data/spec/unit/type/file/owner_spec.rb +7 -0
- data/spec/unit/type/service_spec.rb +27 -0
- data/spec/unit/type/user_spec.rb +0 -45
- data/spec/unit/type_spec.rb +2 -2
- data/spec/unit/util/autoload_spec.rb +25 -8
- data/spec/unit/util/json_spec.rb +126 -0
- data/spec/unit/util/logging_spec.rb +2 -0
- data/spec/unit/util/yaml_spec.rb +37 -13
- data/tasks/parallel.rake +3 -3
- metadata +17 -4
@@ -368,6 +368,12 @@ describe "Puppet Network Format" do
|
|
368
368
|
expect(json.render_multiple(instances)).to eq([{"string" => "foo"}].to_json)
|
369
369
|
end
|
370
370
|
|
371
|
+
it "should render multiple instances as a JSON array of hashes when multi_json is not present" do
|
372
|
+
hide_const("MultiJson") if defined?(MultiJson)
|
373
|
+
instances = [FormatsTest.new("foo")]
|
374
|
+
expect(json.render_multiple(instances)).to eq([{"string" => "foo"}].to_json)
|
375
|
+
end
|
376
|
+
|
371
377
|
it "should intern an instance from a JSON hash" do
|
372
378
|
text = Puppet::Util::Json.dump({"string" => "parsed_json"})
|
373
379
|
instance = json.intern(FormatsTest, text)
|
@@ -106,7 +106,7 @@ describe "egrammar parsing containers" do
|
|
106
106
|
|
107
107
|
context 'it should allow keywords as attribute names' do
|
108
108
|
['and', 'case', 'class', 'default', 'define', 'else', 'elsif', 'if', 'in', 'inherits', 'node', 'or',
|
109
|
-
'undef', 'unless', 'type', 'attr', 'function', 'private'].each do |keyword|
|
109
|
+
'undef', 'unless', 'type', 'attr', 'function', 'private', 'plan', 'apply'].each do |keyword|
|
110
110
|
it "such as #{keyword}" do
|
111
111
|
expect { parse("class x ($#{keyword}){} class { x: #{keyword} => 1 }") }.to_not raise_error
|
112
112
|
end
|
@@ -178,7 +178,7 @@ describe "egrammar parsing containers" do
|
|
178
178
|
|
179
179
|
context 'it should allow keywords as attribute names' do
|
180
180
|
['and', 'case', 'class', 'default', 'define', 'else', 'elsif', 'if', 'in', 'inherits', 'node', 'or',
|
181
|
-
'undef', 'unless', 'type', 'attr', 'function', 'private'].each do |keyword|
|
181
|
+
'undef', 'unless', 'type', 'attr', 'function', 'private', 'plan', 'apply'].each do |keyword|
|
182
182
|
it "such as #{keyword}" do
|
183
183
|
expect {parse("define x ($#{keyword}){} x { y: #{keyword} => 1 }")}.to_not raise_error
|
184
184
|
end
|
@@ -559,29 +559,6 @@ module Serialization
|
|
559
559
|
expect(warnings).to eql(["['key'] contains the special value default. It will be converted to the String 'default'"])
|
560
560
|
end
|
561
561
|
end
|
562
|
-
context 'and force_symbol set to true' do
|
563
|
-
let(:to_converter) { ToDataConverter.new(:rich_data => false, :force_symbol => true) }
|
564
|
-
|
565
|
-
it 'A Hash with Symbol values is converted to hash with Symbol values' do
|
566
|
-
val = { 'one' => :one, 'two' => :two }
|
567
|
-
Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
|
568
|
-
|
569
|
-
# write and read methods does not work here as we cannot force Symbols in Json.
|
570
|
-
# and a hash with symbol values cannot be an instance of Types::TypeFactory.data.
|
571
|
-
# Using YAML for this instead
|
572
|
-
io.reopen
|
573
|
-
value = to_converter.convert(val)
|
574
|
-
io << [value].to_yaml
|
575
|
-
io.rewind
|
576
|
-
|
577
|
-
val2 = from_converter.convert(YAML::load(io.read)[0])
|
578
|
-
|
579
|
-
expect(val2).to be_a(Hash)
|
580
|
-
expect(val2).to eql({ 'one' => :one, 'two' => :two })
|
581
|
-
end
|
582
|
-
expect(warnings).to be_empty
|
583
|
-
end
|
584
|
-
end
|
585
562
|
end
|
586
563
|
|
587
564
|
context 'with rich_data is set to true' do
|
@@ -655,41 +632,6 @@ module Serialization
|
|
655
632
|
end.to raise_error(/Cannot create a Pcore::TimestampType from a Integer/)
|
656
633
|
end
|
657
634
|
end
|
658
|
-
|
659
|
-
context 'when data is unknown' do
|
660
|
-
let(:to_converter) { ToDataConverter.new(:message_prefix => 'Test Hash') }
|
661
|
-
let(:logs) { [] }
|
662
|
-
let(:warnings) { logs.select { |log| log.level == :warning }.map { |log| log.message } }
|
663
|
-
let(:val) { Class.new }
|
664
|
-
|
665
|
-
context 'and :silence_warnings undefined or set to false' do
|
666
|
-
it 'convert the unknown data to string with warnings' do
|
667
|
-
Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
|
668
|
-
write(val)
|
669
|
-
val2 = read
|
670
|
-
expect(val2).to be_a(String)
|
671
|
-
expect(val2).to match(/Class/)
|
672
|
-
end
|
673
|
-
expect(warnings).to eql([
|
674
|
-
"Test Hash contains a #{val.class} value. It will be converted to the String '#{val.to_s}'"])
|
675
|
-
end
|
676
|
-
end
|
677
|
-
|
678
|
-
context 'and :silence_warnings undefined or set to true' do
|
679
|
-
let(:to_converter) { ToDataConverter.new(:message_prefix => 'Test Hash', :silence_warnings => true) }
|
680
|
-
|
681
|
-
it 'convert the unknown data to string without warnings if silence_warnings set to true' do
|
682
|
-
val = Class.new
|
683
|
-
Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
|
684
|
-
write(val)
|
685
|
-
val2 = read
|
686
|
-
expect(val2).to be_a(String)
|
687
|
-
expect(val2).to match(/Class/)
|
688
|
-
end
|
689
|
-
expect(warnings).to be_empty
|
690
|
-
end
|
691
|
-
end
|
692
|
-
end
|
693
635
|
end
|
694
636
|
end
|
695
637
|
end
|
@@ -154,4 +154,9 @@ describe 'ToStringifiedConverter' do
|
|
154
154
|
unassigned = [243, 176, 128, 128].pack("C*").force_encoding(Encoding::UTF_8)
|
155
155
|
expect(transform(unassigned)).to eq("")
|
156
156
|
end
|
157
|
+
|
158
|
+
it 'converts ProcessOutput objects to string' do
|
159
|
+
object = Puppet::Util::Execution::ProcessOutput.new('object', 0)
|
160
|
+
expect(transform(object)).to be_instance_of(String)
|
161
|
+
end
|
157
162
|
end
|
@@ -1980,6 +1980,12 @@ describe 'The type calculator' do
|
|
1980
1980
|
expect(calculator.instance?(tuple, [1, 'a', 1])).to eq(false)
|
1981
1981
|
end
|
1982
1982
|
|
1983
|
+
it 'should not consider ProcessOutput objects as instanceof PScalarDataType' do
|
1984
|
+
object = Puppet::Util::Execution::ProcessOutput.new('object', 0)
|
1985
|
+
|
1986
|
+
expect(calculator.instance?(PScalarDataType::DEFAULT, object)).to eq(false)
|
1987
|
+
end
|
1988
|
+
|
1983
1989
|
context 'and t is Struct' do
|
1984
1990
|
it 'should consider hash[cont] as instance of Struct[cont-t]' do
|
1985
1991
|
struct = struct_t({'a'=>Integer, 'b'=>String, 'c'=>Float})
|
@@ -414,6 +414,11 @@ describe "validating 4x" do
|
|
414
414
|
expect(acceptor.error_count).to eql(0)
|
415
415
|
end
|
416
416
|
|
417
|
+
it 'allows apply to be used as a resource attribute name' do
|
418
|
+
acceptor = validate(parse('apply("foo.example.com") { sometype { "resourcetitle": apply => "applyvalue" } }'))
|
419
|
+
expect(acceptor.error_count).to eql(0)
|
420
|
+
end
|
421
|
+
|
417
422
|
it 'accepts multiple arguments' do
|
418
423
|
acceptor = validate(parse('apply(["foo.example.com"], { "other" => "args" }) { }'))
|
419
424
|
expect(acceptor.error_count).to eql(0)
|
@@ -476,7 +476,7 @@ context Puppet::Type.type(:package).provider(:gem) do
|
|
476
476
|
end
|
477
477
|
|
478
478
|
context 'when is defaultfor' do
|
479
|
-
let(:os) {
|
479
|
+
let(:os) { Puppet.runtime[:facter].value(:operatingsystem) }
|
480
480
|
subject do
|
481
481
|
described_class.defaultfor(operatingsystem: os)
|
482
482
|
described_class.specificity
|
@@ -26,7 +26,7 @@ describe Puppet::Type.type(:package).provider(:pip2) do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
context 'when is defaultfor' do
|
29
|
-
let(:os) {
|
29
|
+
let(:os) { Puppet.runtime[:facter].value(:operatingsystem) }
|
30
30
|
subject do
|
31
31
|
described_class.defaultfor(operatingsystem: os)
|
32
32
|
described_class.specificity
|
@@ -26,7 +26,7 @@ describe Puppet::Type.type(:package).provider(:pip3) do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
context 'when is defaultfor' do
|
29
|
-
let(:os) {
|
29
|
+
let(:os) { Puppet.runtime[:facter].value(:operatingsystem) }
|
30
30
|
subject do
|
31
31
|
described_class.defaultfor(operatingsystem: os)
|
32
32
|
described_class.specificity
|
@@ -493,7 +493,7 @@ describe Puppet::Type.type(:package).provider(:pip) do
|
|
493
493
|
end
|
494
494
|
|
495
495
|
context 'when is defaultfor' do
|
496
|
-
let(:os) {
|
496
|
+
let(:os) { Puppet.runtime[:facter].value(:operatingsystem) }
|
497
497
|
subject do
|
498
498
|
described_class.defaultfor(operatingsystem: os)
|
499
499
|
described_class.specificity
|
@@ -414,6 +414,21 @@ describe Puppet::Type.type(:package).provider(:pkg), unless: Puppet::Util::Platf
|
|
414
414
|
.and_return(Puppet::Util::Execution::ProcessOutput.new('', 0))
|
415
415
|
provider.insync?(is)
|
416
416
|
end
|
417
|
+
|
418
|
+
it "should try 5 times to install and fail when all tries failed" do
|
419
|
+
allow_any_instance_of(Kernel).to receive(:sleep)
|
420
|
+
|
421
|
+
expect(provider).to receive(:query).and_return({:ensure => :absent})
|
422
|
+
expect(provider).to receive(:properties).and_return({:mark => :hold})
|
423
|
+
expect(provider).to receive(:unhold)
|
424
|
+
expect(Puppet::Util::Execution).to receive(:execute)
|
425
|
+
.with(['/bin/pkg', 'install', *hash[:flags], 'dummy'], {:failonfail => false, :combine => true})
|
426
|
+
.and_return(Puppet::Util::Execution::ProcessOutput.new('', 7))
|
427
|
+
.exactly(5).times
|
428
|
+
expect {
|
429
|
+
provider.update
|
430
|
+
}.to raise_error(Puppet::Error, /Pkg could not install dummy after 5 tries. Aborting run/)
|
431
|
+
end
|
417
432
|
end
|
418
433
|
end
|
419
434
|
end
|
@@ -118,7 +118,7 @@ describe Puppet::Type.type(:package).provider(:puppet_gem) do
|
|
118
118
|
end
|
119
119
|
|
120
120
|
context 'when is defaultfor' do
|
121
|
-
let(:os) {
|
121
|
+
let(:os) { Puppet.runtime[:facter].value(:operatingsystem) }
|
122
122
|
subject do
|
123
123
|
described_class.defaultfor(operatingsystem: os)
|
124
124
|
described_class.specificity
|
@@ -127,7 +127,7 @@ describe Puppet::Type.type(:package).provider(:puppetserver_gem) do
|
|
127
127
|
end
|
128
128
|
|
129
129
|
context 'when is defaultfor' do
|
130
|
-
let(:os) {
|
130
|
+
let(:os) { Puppet.runtime[:facter].value(:operatingsystem) }
|
131
131
|
subject do
|
132
132
|
described_class.defaultfor(operatingsystem: os)
|
133
133
|
described_class.specificity
|
@@ -6,8 +6,8 @@ describe 'Puppet::Type::Service::Provider::Gentoo',
|
|
6
6
|
|
7
7
|
before :each do
|
8
8
|
allow(Puppet::Type.type(:service)).to receive(:defaultprovider).and_return(provider_class)
|
9
|
-
allow(
|
10
|
-
allow(
|
9
|
+
allow(Puppet::FileSystem).to receive(:file?).with('/sbin/rc-update').and_return(true)
|
10
|
+
allow(Puppet::FileSystem).to receive(:executable?).with('/sbin/rc-update').and_return(true)
|
11
11
|
allow(Facter).to receive(:value).with(:operatingsystem).and_return('Gentoo')
|
12
12
|
allow(Facter).to receive(:value).with(:osfamily).and_return('Gentoo')
|
13
13
|
|
@@ -52,13 +52,14 @@ describe 'Puppet::Type::Service::Provider::Gentoo',
|
|
52
52
|
end
|
53
53
|
|
54
54
|
it "should get a list of services from /etc/init.d but exclude helper scripts" do
|
55
|
-
|
55
|
+
allow(Puppet::FileSystem).to receive(:directory?).and_call_original
|
56
|
+
allow(Puppet::FileSystem).to receive(:directory?).with('/etc/init.d').and_return(true)
|
56
57
|
expect(Dir).to receive(:entries).with('/etc/init.d').and_return(initscripts)
|
57
58
|
(initscripts - helperscripts).each do |script|
|
58
|
-
expect(
|
59
|
+
expect(Puppet::FileSystem).to receive(:executable?).with("/etc/init.d/#{script}").and_return(true)
|
59
60
|
end
|
60
61
|
helperscripts.each do |script|
|
61
|
-
expect(
|
62
|
+
expect(Puppet::FileSystem).not_to receive(:executable?).with("/etc/init.d/#{script}")
|
62
63
|
end
|
63
64
|
|
64
65
|
allow(Puppet::FileSystem).to receive(:symlink?).and_return(false)
|
@@ -85,14 +85,20 @@ describe 'Puppet::Type::Service::Provider::Init',
|
|
85
85
|
@services = ['one', 'two', 'three', 'four', 'umountfs']
|
86
86
|
allow(Dir).to receive(:entries).and_call_original
|
87
87
|
allow(Dir).to receive(:entries).with('tmp').and_return(@services)
|
88
|
-
|
89
|
-
allow(
|
88
|
+
allow(Puppet::FileSystem).to receive(:directory?).and_call_original
|
89
|
+
allow(Puppet::FileSystem).to receive(:directory?).with('tmp').and_return(true)
|
90
|
+
allow(Puppet::FileSystem).to receive(:executable?).and_return(true)
|
90
91
|
end
|
91
92
|
|
92
93
|
it "should return instances for all services" do
|
93
94
|
expect(provider_class.instances.map(&:name)).to eq(@services)
|
94
95
|
end
|
95
96
|
|
97
|
+
it "should omit directories from the service list" do
|
98
|
+
expect(Puppet::FileSystem).to receive(:directory?).with('tmp/four').and_return(true)
|
99
|
+
expect(provider_class.instances.map(&:name)).to eq(@services - ['four'])
|
100
|
+
end
|
101
|
+
|
96
102
|
it "should omit an array of services from exclude list" do
|
97
103
|
exclude = ['two', 'four']
|
98
104
|
expect(provider_class.get_services(provider_class.defpath, exclude).map(&:name)).to eq(@services - exclude)
|
@@ -140,9 +146,9 @@ describe 'Puppet::Type::Service::Provider::Init',
|
|
140
146
|
|
141
147
|
describe "when checking valid paths" do
|
142
148
|
it "should discard paths that do not exist" do
|
143
|
-
expect(
|
149
|
+
expect(Puppet::FileSystem).to receive(:directory?).with(paths[0]).and_return(false)
|
144
150
|
expect(Puppet::FileSystem).to receive(:exist?).with(paths[0]).and_return(false)
|
145
|
-
expect(
|
151
|
+
expect(Puppet::FileSystem).to receive(:directory?).with(paths[1]).and_return(true)
|
146
152
|
|
147
153
|
expect(provider.paths).to eq([paths[1]])
|
148
154
|
end
|
@@ -150,7 +156,7 @@ describe 'Puppet::Type::Service::Provider::Init',
|
|
150
156
|
it "should discard paths that are not directories" do
|
151
157
|
paths.each do |path|
|
152
158
|
expect(Puppet::FileSystem).to receive(:exist?).with(path).and_return(true)
|
153
|
-
expect(
|
159
|
+
expect(Puppet::FileSystem).to receive(:directory?).with(path).and_return(false)
|
154
160
|
end
|
155
161
|
expect(provider.paths).to be_empty
|
156
162
|
end
|
@@ -158,7 +164,7 @@ describe 'Puppet::Type::Service::Provider::Init',
|
|
158
164
|
|
159
165
|
describe "when searching for the init script" do
|
160
166
|
before :each do
|
161
|
-
paths.each {|path| expect(
|
167
|
+
paths.each {|path| expect(Puppet::FileSystem).to receive(:directory?).with(path).and_return(true) }
|
162
168
|
end
|
163
169
|
|
164
170
|
it "should be able to find the init script in the service path" do
|
@@ -191,9 +197,9 @@ describe 'Puppet::Type::Service::Provider::Init',
|
|
191
197
|
|
192
198
|
describe "if the init script is present" do
|
193
199
|
before :each do
|
194
|
-
allow(
|
195
|
-
allow(
|
196
|
-
allow(
|
200
|
+
allow(Puppet::FileSystem).to receive(:directory?).and_call_original
|
201
|
+
allow(Puppet::FileSystem).to receive(:directory?).with("/service/path").and_return(true)
|
202
|
+
allow(Puppet::FileSystem).to receive(:directory?).with("/alt/service/path").and_return(true)
|
197
203
|
allow(Puppet::FileSystem).to receive(:exist?).with("/service/path/myservice").and_return(true)
|
198
204
|
end
|
199
205
|
|
@@ -2,63 +2,56 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe 'Puppet::Type::Service::Provider::Openwrt',
|
4
4
|
unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
|
5
|
+
|
5
6
|
let(:provider_class) { Puppet::Type.type(:service).provider(:openwrt) }
|
6
7
|
|
7
8
|
let(:resource) do
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
resource
|
9
|
+
Puppet::Type.type(:service).new(
|
10
|
+
:name => 'myservice',
|
11
|
+
:path => '/etc/init.d',
|
12
|
+
:hasrestart => true,
|
13
|
+
)
|
14
14
|
end
|
15
15
|
|
16
16
|
let(:provider) do
|
17
17
|
provider = provider_class.new
|
18
|
-
|
19
|
-
|
18
|
+
provider.resource = resource
|
20
19
|
provider
|
21
20
|
end
|
22
21
|
|
23
22
|
before :each do
|
24
|
-
|
25
|
-
provider.resource = resource
|
26
|
-
|
27
|
-
allow(FileTest).to receive(:file?).with('/etc/rc.common').and_return(true)
|
28
|
-
allow(FileTest).to receive(:executable?).with('/etc/rc.common').and_return(true)
|
23
|
+
resource.provider = provider
|
29
24
|
|
30
25
|
# All OpenWrt tests operate on the init script directly. It must exist.
|
31
|
-
allow(
|
32
|
-
allow(
|
26
|
+
allow(Puppet::FileSystem).to receive(:directory?).and_call_original
|
27
|
+
allow(Puppet::FileSystem).to receive(:directory?).with('/etc/init.d').and_return(true)
|
33
28
|
|
34
29
|
allow(Puppet::FileSystem).to receive(:exist?).with('/etc/init.d/myservice').and_return(true)
|
35
|
-
allow(
|
36
|
-
allow(
|
37
|
-
allow(
|
30
|
+
allow(Puppet::FileSystem).to receive(:file?).and_call_original
|
31
|
+
allow(Puppet::FileSystem).to receive(:file?).with('/etc/init.d/myservice').and_return(true)
|
32
|
+
allow(Puppet::FileSystem).to receive(:executable?).with('/etc/init.d/myservice').and_return(true)
|
38
33
|
end
|
39
34
|
|
40
|
-
|
41
|
-
|
42
|
-
expect(Facter).to receive(:value).with(:operatingsystem).and_return(operatingsystem)
|
35
|
+
it "should be the default provider on 'openwrt'" do
|
36
|
+
expect(Facter).to receive(:value).with(:operatingsystem).and_return('openwrt')
|
43
37
|
expect(provider_class.default?).to be_truthy
|
44
38
|
end
|
45
39
|
|
46
40
|
# test self.instances
|
47
41
|
describe "when getting all service instances" do
|
48
|
-
let(:services) {['dnsmasq', 'dropbear', 'firewall', 'led', 'puppet', 'uhttpd' ]}
|
42
|
+
let(:services) { ['dnsmasq', 'dropbear', 'firewall', 'led', 'puppet', 'uhttpd' ] }
|
49
43
|
|
50
44
|
before :each do
|
51
45
|
allow(Dir).to receive(:entries).and_call_original
|
52
46
|
allow(Dir).to receive(:entries).with('/etc/init.d').and_return(services)
|
53
|
-
allow(
|
54
|
-
allow(FileTest).to receive(:executable?).and_return(true)
|
47
|
+
allow(Puppet::FileSystem).to receive(:executable?).and_return(true)
|
55
48
|
end
|
56
49
|
|
57
50
|
it "should return instances for all services" do
|
58
51
|
services.each do |inst|
|
59
52
|
expect(provider_class).to receive(:new).with(hash_including(:name => inst, :path => '/etc/init.d')).and_return("#{inst}_instance")
|
60
53
|
end
|
61
|
-
results = services.collect {|x| "#{x}_instance"}
|
54
|
+
results = services.collect { |x| "#{x}_instance"}
|
62
55
|
expect(provider_class.instances).to eq(results)
|
63
56
|
end
|
64
57
|
end
|
@@ -82,14 +75,13 @@ describe 'Puppet::Type::Service::Provider::Openwrt',
|
|
82
75
|
|
83
76
|
describe "when running #{method}" do
|
84
77
|
it "should use any provided explicit command" do
|
85
|
-
|
86
|
-
expect(provider).to receive(:execute).with([
|
78
|
+
resource[method] = '/user/specified/command'
|
79
|
+
expect(provider).to receive(:execute).with(['/user/specified/command'], any_args)
|
87
80
|
provider.send(method)
|
88
81
|
end
|
89
82
|
|
90
83
|
it "should execute the init script with #{method} when no explicit command is provided" do
|
91
|
-
|
92
|
-
expect(provider).to receive(:execute).with(['/etc/init.d/myservice', method ], any_args)
|
84
|
+
expect(provider).to receive(:execute).with(['/etc/init.d/myservice', method], any_args)
|
93
85
|
provider.send(method)
|
94
86
|
end
|
95
87
|
end
|
@@ -41,8 +41,9 @@ describe 'Puppet::Type::Service::Provider::Redhat',
|
|
41
41
|
@services = ['one', 'two', 'three', 'four', 'kudzu', 'functions', 'halt', 'killall', 'single', 'linuxconf', 'boot', 'reboot']
|
42
42
|
@not_services = ['functions', 'halt', 'killall', 'single', 'linuxconf', 'reboot', 'boot']
|
43
43
|
allow(Dir).to receive(:entries).and_return(@services)
|
44
|
-
allow(
|
45
|
-
allow(
|
44
|
+
allow(Puppet::FileSystem).to receive(:directory?).and_call_original
|
45
|
+
allow(Puppet::FileSystem).to receive(:directory?).with('/etc/init.d').and_return(true)
|
46
|
+
allow(Puppet::FileSystem).to receive(:executable?).and_return(true)
|
46
47
|
end
|
47
48
|
|
48
49
|
it "should return instances for all services" do
|
@@ -217,4 +217,104 @@ describe 'Puppet::Type::User::Provider::Aix' do
|
|
217
217
|
provider.create
|
218
218
|
end
|
219
219
|
end
|
220
|
+
|
221
|
+
describe '#list_all_homes' do
|
222
|
+
it "should return empty array and output debug on failure" do
|
223
|
+
allow(Puppet::Util::Execution).to receive(:execute).and_raise(Puppet::ExecutionFailure, 'Execution failed')
|
224
|
+
expect(Puppet).to receive(:debug).with('Could not list home of all users: Execution failed')
|
225
|
+
expect(provider.list_all_homes).to eql({})
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
describe '#delete' do
|
230
|
+
before(:each) do
|
231
|
+
allow(File).to receive(:realpath).and_call_original
|
232
|
+
allow(FileUtils).to receive(:remove_entry_secure).and_call_original
|
233
|
+
|
234
|
+
allow(provider.resource).to receive(:should).with(anything).and_return(nil)
|
235
|
+
allow(provider).to receive(:home).and_return(Dir.tmpdir)
|
236
|
+
allow(provider).to receive(:execute).and_return(nil)
|
237
|
+
allow(provider).to receive(:object_info).and_return(nil)
|
238
|
+
allow(FileUtils).to receive(:remove_entry_secure).with(Dir.tmpdir, true).and_return(nil)
|
239
|
+
end
|
240
|
+
|
241
|
+
context 'with managehome true' do
|
242
|
+
before(:each) do
|
243
|
+
allow(provider.resource).to receive(:managehome?).and_return(true)
|
244
|
+
allow(provider).to receive(:list_all_homes).and_return([])
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'should delete the user without error' do
|
248
|
+
expect{ provider.delete }.not_to raise_error
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should not remove home when relative" do
|
252
|
+
allow(provider).to receive(:home).and_return('relative_path')
|
253
|
+
|
254
|
+
expect(Puppet).to receive(:debug).with(/Please make sure the path is not relative, symlink or '\/'./)
|
255
|
+
provider.delete
|
256
|
+
end
|
257
|
+
|
258
|
+
it "should not remove home when '/'" do
|
259
|
+
allow(provider).to receive(:home).and_return('/')
|
260
|
+
|
261
|
+
expect(Puppet).to receive(:debug).with(/Please make sure the path is not relative, symlink or '\/'./)
|
262
|
+
provider.delete
|
263
|
+
end
|
264
|
+
|
265
|
+
it "should not remove home when symlink" do
|
266
|
+
allow(Puppet::FileSystem).to receive(:symlink?).with(Dir.tmpdir).and_return(true)
|
267
|
+
|
268
|
+
expect(Puppet).to receive(:debug).with(/Please make sure the path is not relative, symlink or '\/'./)
|
269
|
+
provider.delete
|
270
|
+
end
|
271
|
+
|
272
|
+
it "should not remove home when other users would be affected" do
|
273
|
+
allow(provider).to receive(:home).and_return('/special')
|
274
|
+
allow(File).to receive(:realpath).with('/special').and_return('/special')
|
275
|
+
allow(Puppet::Util).to receive(:absolute_path?).with('/special').and_return(true)
|
276
|
+
allow(provider).to receive(:list_all_homes).and_return([{:name => 'other_user', :home => '/special/other_user'}])
|
277
|
+
|
278
|
+
expect(Puppet).to receive(:debug).with(/it would remove the home directory '\/special\/other_user' of user 'other_user' also./)
|
279
|
+
provider.delete
|
280
|
+
end
|
281
|
+
|
282
|
+
it 'should remove homedir' do
|
283
|
+
expect(FileUtils).to receive(:remove_entry_secure).with(Dir.tmpdir, true)
|
284
|
+
provider.delete
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
context 'with managehome false' do
|
289
|
+
before(:each) do
|
290
|
+
allow(provider.resource).to receive(:managehome?).and_return(false)
|
291
|
+
end
|
292
|
+
|
293
|
+
it 'should delete the user without error' do
|
294
|
+
expect{ provider.delete }.not_to raise_error
|
295
|
+
end
|
296
|
+
|
297
|
+
it 'should not remove homedir' do
|
298
|
+
expect(FileUtils).not_to receive(:remove_entry_secure).with(Dir.tmpdir, true)
|
299
|
+
end
|
300
|
+
|
301
|
+
it 'should not print manage home debug messages' do
|
302
|
+
expect(Puppet).not_to receive(:debug).with(/Please make sure the path is not relative, symlink or '\/'./)
|
303
|
+
expect(Puppet).not_to receive(:debug).with(/it would remove the home directory '\/special\/other_user' of user 'other_user' also./)
|
304
|
+
|
305
|
+
provider.delete
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
describe '#deletecmd' do
|
311
|
+
it 'uses the -p flag when removing the user' do
|
312
|
+
allow(provider.class).to receive(:command).with(:delete).and_return('delete')
|
313
|
+
allow(provider).to receive(:ia_module_args).and_return(['ia_module_args'])
|
314
|
+
|
315
|
+
expect(provider.deletecmd).to eql(
|
316
|
+
['delete', '-p', 'ia_module_args', provider.resource.name]
|
317
|
+
)
|
318
|
+
end
|
319
|
+
end
|
220
320
|
end
|
@@ -1142,7 +1142,7 @@ end
|
|
1142
1142
|
provider.class.instance_variable_set(:@os_version, nil) if provider.class.instance_variable_defined? :@os_version
|
1143
1143
|
end
|
1144
1144
|
|
1145
|
-
it 'should call
|
1145
|
+
it 'should call Puppet.runtime[:facter].value(:macosx_productversion_major) ONLY ONCE no matter how ' +
|
1146
1146
|
'many times get_os_version() is called' do
|
1147
1147
|
expect(Facter).to receive(:value).with(:macosx_productversion_major).once.and_return('10.8')
|
1148
1148
|
expect(provider.class.get_os_version).to eq('10.8')
|
@@ -352,6 +352,46 @@ describe Puppet::Type.type(:user).provider(:useradd) do
|
|
352
352
|
end
|
353
353
|
end
|
354
354
|
|
355
|
+
describe "#shell" do
|
356
|
+
before { described_class.has_feature :manages_local_users_and_groups }
|
357
|
+
|
358
|
+
let(:content) { "myuser:x:x:x:x:x:/bin/local_shell" }
|
359
|
+
|
360
|
+
it "should return the local shell string when forcelocal is true" do
|
361
|
+
resource[:forcelocal] = true
|
362
|
+
allow(Puppet::FileSystem).to receive(:exist?).with('/etc/passwd').and_return(true)
|
363
|
+
allow(Puppet::FileSystem).to receive(:each_line).with('/etc/passwd').and_yield(content)
|
364
|
+
expect(provider.shell).to eq('/bin/local_shell')
|
365
|
+
end
|
366
|
+
|
367
|
+
it "should fall back to nameservice shell string when forcelocal is false" do
|
368
|
+
resource[:forcelocal] = false
|
369
|
+
allow(provider).to receive(:get).with(:shell).and_return('/bin/remote_shell')
|
370
|
+
expect(provider).not_to receive(:localshell)
|
371
|
+
expect(provider.shell).to eq('/bin/remote_shell')
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
describe "#home" do
|
376
|
+
before { described_class.has_feature :manages_local_users_and_groups }
|
377
|
+
|
378
|
+
let(:content) { "myuser:x:x:x:x:/opt/local_home:x" }
|
379
|
+
|
380
|
+
it "should return the local home string when forcelocal is true" do
|
381
|
+
resource[:forcelocal] = true
|
382
|
+
allow(Puppet::FileSystem).to receive(:exist?).with('/etc/passwd').and_return(true)
|
383
|
+
allow(Puppet::FileSystem).to receive(:each_line).with('/etc/passwd').and_yield(content)
|
384
|
+
expect(provider.home).to eq('/opt/local_home')
|
385
|
+
end
|
386
|
+
|
387
|
+
it "should fall back to nameservice home string when forcelocal is false" do
|
388
|
+
resource[:forcelocal] = false
|
389
|
+
allow(provider).to receive(:get).with(:home).and_return('/opt/remote_home')
|
390
|
+
expect(provider).not_to receive(:localhome)
|
391
|
+
expect(provider.home).to eq('/opt/remote_home')
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
355
395
|
describe "#gid" do
|
356
396
|
before { described_class.has_feature :manages_local_users_and_groups }
|
357
397
|
|
data/spec/unit/provider_spec.rb
CHANGED
@@ -222,18 +222,18 @@ describe Puppet::Provider do
|
|
222
222
|
{ :true => false } => false,
|
223
223
|
{ :false => false } => true,
|
224
224
|
{ :false => true } => false,
|
225
|
-
{ :operatingsystem =>
|
225
|
+
{ :operatingsystem => Puppet.runtime[:facter].value(:operatingsystem) } => true,
|
226
226
|
{ :operatingsystem => :yayness } => false,
|
227
227
|
{ :nothing => :yayness } => false,
|
228
228
|
{ :exists => Puppet::Util.which(existing_command) } => true,
|
229
229
|
{ :exists => "/this/file/does/not/exist" } => false,
|
230
230
|
{ :true => true, :exists => Puppet::Util.which(existing_command) } => true,
|
231
231
|
{ :true => true, :exists => "/this/file/does/not/exist" } => false,
|
232
|
-
{ :operatingsystem =>
|
232
|
+
{ :operatingsystem => Puppet.runtime[:facter].value(:operatingsystem),
|
233
233
|
:exists => Puppet::Util.which(existing_command) } => true,
|
234
234
|
{ :operatingsystem => :yayness,
|
235
235
|
:exists => Puppet::Util.which(existing_command) } => false,
|
236
|
-
{ :operatingsystem =>
|
236
|
+
{ :operatingsystem => Puppet.runtime[:facter].value(:operatingsystem),
|
237
237
|
:exists => "/this/file/does/not/exist" } => false,
|
238
238
|
{ :operatingsystem => :yayness,
|
239
239
|
:exists => "/this/file/does/not/exist" } => false,
|
@@ -269,7 +269,7 @@ describe Puppet::Provider do
|
|
269
269
|
end
|
270
270
|
|
271
271
|
context "default providers" do
|
272
|
-
let :os do
|
272
|
+
let :os do Puppet.runtime[:facter].value(:operatingsystem) end
|
273
273
|
|
274
274
|
it { is_expected.to respond_to :specificity }
|
275
275
|
|