puppet 6.0.4-universal-darwin → 6.0.5-universal-darwin
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile.lock +15 -15
- data/Rakefile +3 -1
- data/ext/solaris/smf/svc-puppetd +8 -1
- data/ext/solaris/smf/svc-puppetmasterd +8 -1
- data/lib/puppet/application/device.rb +48 -32
- data/lib/puppet/application/ssl.rb +31 -17
- data/lib/puppet/defaults.rb +2 -1
- data/lib/puppet/face/config.rb +1 -1
- data/lib/puppet/forge.rb +4 -1
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +3 -1
- data/lib/puppet/pops/model/pn_transformer.rb +5 -0
- data/lib/puppet/pops/types/p_timespan_type.rb +2 -2
- data/lib/puppet/pops/types/string_converter.rb +11 -2
- data/lib/puppet/provider/package/dnf.rb +2 -1
- data/lib/puppet/provider/package/windows/exe_package.rb +13 -0
- data/lib/puppet/provider/package/windows/msi_package.rb +8 -0
- data/lib/puppet/provider/package/windows/package.rb +9 -1
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/parsedfile.rb +25 -4
- data/lib/puppet/provider/service/smf.rb +54 -0
- data/lib/puppet/provider/service/systemd.rb +2 -0
- data/lib/puppet/provider/service/upstart.rb +1 -0
- data/lib/puppet/rest/route.rb +1 -1
- data/lib/puppet/ssl/host.rb +23 -11
- data/lib/puppet/transaction.rb +4 -1
- data/lib/puppet/transaction/event_manager.rb +13 -1
- data/lib/puppet/transaction/resource_harness.rb +3 -1
- data/lib/puppet/util/command_line.rb +2 -3
- data/lib/puppet/util/filetype.rb +36 -4
- data/lib/puppet/util/selinux.rb +1 -1
- data/lib/puppet/util/windows/api_types.rb +1 -1
- data/lib/puppet/util/windows/registry.rb +29 -5
- data/lib/puppet/util/windows/service.rb +106 -99
- data/lib/puppet/version.rb +1 -1
- data/locales/ja/puppet.po +232 -183
- data/locales/puppet.pot +145 -117
- data/man/man5/puppet.conf.5 +3 -3
- data/man/man8/puppet-agent.8 +1 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +2 -2
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +23 -19
- 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-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 +6 -3
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/unit/provider/service/smf/svcs_fmri.out +6 -0
- data/spec/fixtures/unit/provider/service/smf/svcs_multiple_fmris.out +13 -0
- data/spec/integration/ssl/key_spec.rb +0 -4
- data/spec/integration/transaction_spec.rb +559 -0
- data/spec/integration/util/windows/registry_spec.rb +39 -0
- data/spec/unit/application/device_spec.rb +10 -7
- data/spec/unit/application/lookup_spec.rb +2 -1
- data/spec/unit/application/ssl_spec.rb +21 -2
- data/spec/unit/forge/forge_spec.rb +4 -2
- data/spec/unit/functions/logging_spec.rb +10 -3
- data/spec/unit/indirector/yaml_spec.rb +1 -1
- data/spec/unit/pops/loaders/loader_spec.rb +6 -7
- data/spec/unit/pops/model/pn_transformer_spec.rb +4 -0
- data/spec/unit/pops/types/p_timespan_type_spec.rb +22 -0
- data/spec/unit/pops/types/p_timestamp_type_spec.rb +19 -0
- data/spec/unit/pops/types/string_converter_spec.rb +20 -0
- data/spec/unit/provider/group/ldap_spec.rb +22 -25
- data/spec/unit/provider/group/pw_spec.rb +7 -10
- data/spec/unit/provider/nameservice/directoryservice_spec.rb +97 -103
- data/spec/unit/provider/package/aix_spec.rb +5 -8
- data/spec/unit/provider/package/apt_spec.rb +3 -6
- data/spec/unit/provider/package/dnf_spec.rb +36 -37
- data/spec/unit/provider/package/dpkg_spec.rb +18 -21
- data/spec/unit/provider/package/freebsd_spec.rb +4 -7
- data/spec/unit/provider/package/gem_spec.rb +41 -41
- data/spec/unit/provider/package/hpux_spec.rb +7 -10
- data/spec/unit/provider/package/macports_spec.rb +13 -15
- data/spec/unit/provider/package/nim_spec.rb +3 -10
- data/spec/unit/provider/package/openbsd_spec.rb +14 -17
- data/spec/unit/provider/package/pip3_spec.rb +3 -6
- data/spec/unit/provider/package/pip_spec.rb +45 -49
- data/spec/unit/provider/package/pkgin_spec.rb +13 -18
- data/spec/unit/provider/package/pkgng_spec.rb +21 -24
- data/spec/unit/provider/package/puppet_gem_spec.rb +6 -9
- data/spec/unit/provider/package/tdnf_spec.rb +9 -12
- data/spec/unit/provider/package/yum_spec.rb +30 -16
- data/spec/unit/provider/package/zypper_spec.rb +17 -19
- data/spec/unit/provider/service/bsd_spec.rb +7 -9
- data/spec/unit/provider/service/daemontools_spec.rb +12 -16
- data/spec/unit/provider/service/debian_spec.rb +6 -10
- data/spec/unit/provider/service/freebsd_spec.rb +2 -2
- data/spec/unit/provider/service/openbsd_spec.rb +13 -17
- data/spec/unit/provider/service/rcng_spec.rb +2 -4
- data/spec/unit/provider/service/redhat_spec.rb +12 -11
- data/spec/unit/provider/service/runit_spec.rb +7 -14
- data/spec/unit/provider/service/smf_spec.rb +77 -13
- data/spec/unit/provider/service/src_spec.rb +11 -16
- data/spec/unit/provider/service/systemd_spec.rb +18 -0
- data/spec/unit/provider/user/hpux_spec.rb +3 -5
- data/spec/unit/provider/user/ldap_spec.rb +29 -32
- data/spec/unit/provider/user/pw_spec.rb +10 -13
- data/spec/unit/rest/route_spec.rb +1 -1
- data/spec/unit/ssl/host_spec.rb +21 -0
- data/spec/unit/ssl/key_spec.rb +2 -4
- data/spec/unit/transaction/event_manager_spec.rb +12 -1
- data/spec/unit/transaction/resource_harness_spec.rb +18 -0
- data/spec/unit/transaction_spec.rb +25 -0
- data/spec/unit/util/filetype_spec.rb +13 -5
- data/spec/unit/util/logging_spec.rb +0 -41
- data/spec/unit/util/monkey_patches_spec.rb +18 -5
- data/spec/unit/util/selinux_spec.rb +4 -0
- metadata +8 -2
@@ -253,5 +253,44 @@ describe Puppet::Util::Windows::Registry do
|
|
253
253
|
end
|
254
254
|
end
|
255
255
|
end
|
256
|
+
|
257
|
+
context "#values_by_name" do
|
258
|
+
let(:hkey) { stub 'hklm' }
|
259
|
+
let(:subkey) { stub 'subkey' }
|
260
|
+
|
261
|
+
before :each do
|
262
|
+
subject.stubs(:root).returns(hkey)
|
263
|
+
end
|
264
|
+
|
265
|
+
context "when reading values" do
|
266
|
+
let (:hklm) { Win32::Registry::HKEY_LOCAL_MACHINE }
|
267
|
+
let (:puppet_key) { "SOFTWARE\\Puppet Labs"}
|
268
|
+
let (:subkey_name) { "PuppetRegistryTest#{SecureRandom.uuid}" }
|
269
|
+
|
270
|
+
before(:each) do
|
271
|
+
hklm.create("#{puppet_key}\\#{subkey_name}", Win32::Registry::KEY_ALL_ACCESS) do |reg|
|
272
|
+
reg.write('valuename1', Win32::Registry::REG_SZ, 'value1')
|
273
|
+
reg.write('valuename2', Win32::Registry::REG_SZ, 'value2')
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
after(:each) do
|
278
|
+
hklm.open(puppet_key, Win32::Registry::KEY_ALL_ACCESS) do |reg|
|
279
|
+
subject.delete_key(reg, subkey_name)
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
it "should return only the values for the names specified" do
|
284
|
+
hklm.open("#{puppet_key}\\#{subkey_name}", Win32::Registry::KEY_ALL_ACCESS) do |reg_key|
|
285
|
+
vals = subject.values_by_name(reg_key, ['valuename1', 'missingname'])
|
286
|
+
|
287
|
+
expect(vals).to have_key('valuename1')
|
288
|
+
expect(vals).to_not have_key('valuename2')
|
289
|
+
expect(vals['valuename1']).to eq('value1')
|
290
|
+
expect(vals['missingname']).to be_nil
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
256
295
|
end
|
257
296
|
end
|
@@ -75,25 +75,25 @@ describe Puppet::Application::Device do
|
|
75
75
|
it "should set waitforcert to 0 with --onetime and if --waitforcert wasn't given" do
|
76
76
|
Puppet[:onetime] = true
|
77
77
|
Puppet::SSL::Host.any_instance.expects(:wait_for_cert).with(0)
|
78
|
-
@device.setup_host
|
78
|
+
@device.setup_host('device.example.com')
|
79
79
|
end
|
80
80
|
|
81
81
|
it "should use supplied waitforcert when --onetime is specified" do
|
82
82
|
Puppet[:onetime] = true
|
83
83
|
@device.handle_waitforcert(60)
|
84
84
|
Puppet::SSL::Host.any_instance.expects(:wait_for_cert).with(60)
|
85
|
-
@device.setup_host
|
85
|
+
@device.setup_host('device.example.com')
|
86
86
|
end
|
87
87
|
|
88
88
|
it "should use a default value for waitforcert when --onetime and --waitforcert are not specified" do
|
89
89
|
Puppet::SSL::Host.any_instance.expects(:wait_for_cert).with(120)
|
90
|
-
@device.setup_host
|
90
|
+
@device.setup_host('device.example.com')
|
91
91
|
end
|
92
92
|
|
93
93
|
it "should use the waitforcert setting when checking for a signed certificate" do
|
94
94
|
Puppet[:waitforcert] = 10
|
95
95
|
Puppet::SSL::Host.any_instance.expects(:wait_for_cert).with(10)
|
96
|
-
@device.setup_host
|
96
|
+
@device.setup_host('device.example.com')
|
97
97
|
end
|
98
98
|
|
99
99
|
it "should set the log destination with --logdest" do
|
@@ -271,14 +271,14 @@ describe Puppet::Application::Device do
|
|
271
271
|
|
272
272
|
it "should create a new ssl host" do
|
273
273
|
Puppet::SSL::Host.expects(:new).returns(@host)
|
274
|
-
@device.setup_host
|
274
|
+
@device.setup_host('device.example.com')
|
275
275
|
end
|
276
276
|
|
277
277
|
it "should wait for a certificate" do
|
278
278
|
@device.options.stubs(:[]).with(:waitforcert).returns(123)
|
279
279
|
@host.expects(:wait_for_cert).with(123)
|
280
280
|
|
281
|
-
@device.setup_host
|
281
|
+
@device.setup_host('device.example.com')
|
282
282
|
end
|
283
283
|
end
|
284
284
|
|
@@ -292,6 +292,7 @@ describe Puppet::Application::Device do
|
|
292
292
|
@device.options.stubs(:[]).with(:facts).returns(false)
|
293
293
|
@device.options.stubs(:[]).with(:resource).returns(false)
|
294
294
|
@device.options.stubs(:[]).with(:to_yaml).returns(false)
|
295
|
+
@device.options.stubs(:[]).with(:libdir).returns(nil)
|
295
296
|
@device.options.stubs(:[]).with(:client)
|
296
297
|
@device.command_line.stubs(:args).returns([])
|
297
298
|
Puppet::Util::NetworkDevice::Config.stubs(:devices).returns({})
|
@@ -497,7 +498,9 @@ describe Puppet::Application::Device do
|
|
497
498
|
expect { @device.main }.to exit_with 1
|
498
499
|
end
|
499
500
|
|
500
|
-
it "should print the device url scheme, host, and port" do
|
501
|
+
it "should retrieve plugins and print the device url scheme, host, and port" do
|
502
|
+
Puppet.stubs(:info)
|
503
|
+
Puppet.expects(:info).with "Retrieving pluginfacts"
|
501
504
|
Puppet.expects(:info).with "starting applying configuration to device1 at ssh://testhost"
|
502
505
|
Puppet.expects(:info).with "starting applying configuration to device2 at https://testhost:443/some/path"
|
503
506
|
expect { @device.main }.to exit_with 1
|
@@ -13,7 +13,8 @@ describe Puppet::Application::Lookup do
|
|
13
13
|
ensure
|
14
14
|
$stdout = saved_stdout
|
15
15
|
end
|
16
|
-
|
16
|
+
# Drop end of line and an optional yaml end of document
|
17
|
+
capture.string.gsub(/\n(\.\.\.\n)?\Z/m, '')
|
17
18
|
end
|
18
19
|
|
19
20
|
context "when running with incorrect command line options" do
|
@@ -5,6 +5,8 @@ require 'openssl'
|
|
5
5
|
require 'puppet/test_ca'
|
6
6
|
|
7
7
|
describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
|
8
|
+
include PuppetSpec::Files
|
9
|
+
|
8
10
|
let(:ssl) do
|
9
11
|
app = Puppet::Application[:ssl]
|
10
12
|
app.options[:verbose] = true
|
@@ -25,6 +27,7 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
|
|
25
27
|
|
26
28
|
Puppet.settings.use(:main)
|
27
29
|
Puppet[:certname] = name
|
30
|
+
Puppet[:vardir] = tmpdir("ssl_testing")
|
28
31
|
|
29
32
|
# Host assumes ca cert and crl are present
|
30
33
|
File.open(Puppet[:localcacert], 'w') { |f| f.write(@ca_cert.to_pem) }
|
@@ -293,9 +296,10 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
|
|
293
296
|
end
|
294
297
|
|
295
298
|
it 'deletes the request' do
|
296
|
-
File.
|
299
|
+
path = File.join(Puppet[:requestdir], "#{Puppet[:certname]}.pem")
|
300
|
+
File.open(path, 'w') { |f| f.write(@host[:csr].to_pem) }
|
297
301
|
|
298
|
-
expects_command_to_pass(%r{Removed certificate request #{
|
302
|
+
expects_command_to_pass(%r{Removed certificate request #{path}})
|
299
303
|
end
|
300
304
|
|
301
305
|
it 'deletes the passfile' do
|
@@ -368,5 +372,20 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
|
|
368
372
|
expects_command_to_pass(%r{Removed certificate .*puppetserver.pem})
|
369
373
|
end
|
370
374
|
end
|
375
|
+
|
376
|
+
context 'when cleaning a device' do
|
377
|
+
before do
|
378
|
+
ssl.command_line.args = ['clean', '--target', 'device.example.com']
|
379
|
+
ssl.parse_options
|
380
|
+
end
|
381
|
+
|
382
|
+
it 'deletes the device certificate' do
|
383
|
+
device_cert_path = File.join(Puppet[:devicedir], 'device.example.com', 'ssl', 'certs')
|
384
|
+
device_cert_file = File.join(device_cert_path, 'device.example.com.pem')
|
385
|
+
FileUtils.mkdir_p(device_cert_path)
|
386
|
+
File.open(device_cert_file, 'w') { |f| f.write('device.example.com') }
|
387
|
+
expects_command_to_pass(%r{Removed certificate #{device_cert_file}})
|
388
|
+
end
|
389
|
+
end
|
371
390
|
end
|
372
391
|
end
|
@@ -59,10 +59,11 @@ describe Puppet::Forge do
|
|
59
59
|
it "includes any defined module_groups, ensuring to only encode them once in the URI" do
|
60
60
|
Puppet[:module_groups] = 'base+pe'
|
61
61
|
module_name = 'puppetlabs-acl'
|
62
|
+
exclusions = "readme%2Cchangelog%2Clicense%2Curi%2Cmodule%2Ctags%2Csupported%2Cfile_size%2Cdownloads%2Ccreated_at%2Cupdated_at%2Cdeleted_at"
|
62
63
|
|
63
64
|
# ignores Puppet::Forge::Repository#read_response, provides response to fetch
|
64
65
|
performs_an_http_request(ok_response) do |http|
|
65
|
-
encoded_uri = "/v3/releases?module=#{module_name}&sort_by=version&module_groups=base%20pe"
|
66
|
+
encoded_uri = "/v3/releases?module=#{module_name}&sort_by=version&exclude_fields=#{exclusions}&module_groups=base%20pe"
|
66
67
|
http.expects(:request).with(responds_with(:path, encoded_uri))
|
67
68
|
end
|
68
69
|
|
@@ -71,10 +72,11 @@ describe Puppet::Forge do
|
|
71
72
|
|
72
73
|
it "single encodes the module name term in the URI" do
|
73
74
|
module_name = "puppetlabs-#{mixed_utf8_query_param}"
|
75
|
+
exclusions = "readme%2Cchangelog%2Clicense%2Curi%2Cmodule%2Ctags%2Csupported%2Cfile_size%2Cdownloads%2Ccreated_at%2Cupdated_at%2Cdeleted_at"
|
74
76
|
|
75
77
|
# ignores Puppet::Forge::Repository#read_response, provides response to fetch
|
76
78
|
performs_an_http_request(ok_response) do |http|
|
77
|
-
encoded_uri = "/v3/releases?module=puppetlabs-#{mixed_utf8_query_param_encoded}&sort_by=version"
|
79
|
+
encoded_uri = "/v3/releases?module=puppetlabs-#{mixed_utf8_query_param_encoded}&sort_by=version&exclude_fields=#{exclusions}"
|
78
80
|
http.expects(:request).with(responds_with(:path, encoded_uri))
|
79
81
|
end
|
80
82
|
|
@@ -18,9 +18,16 @@ describe 'the log function' do
|
|
18
18
|
|
19
19
|
def expect_log(code, log_level, message)
|
20
20
|
logs = collect_logs(code)
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
|
22
|
+
# There's a chance that additional messages could have been
|
23
|
+
# added during code compilation like debug messages from
|
24
|
+
# Facter. This happened on Appveyor when the Appveyor image
|
25
|
+
# failed to resolve the domain fact. Since these messages are
|
26
|
+
# not relevant to our test, and since they can (possibly) be
|
27
|
+
# injected at any location in our logs array, it is good enough
|
28
|
+
# to assert that our desired log _is_ included in the logs array
|
29
|
+
# instead of trying to figure out _where_ it is included.
|
30
|
+
expect(logs).to include(satisfy { |log| log.level == log_level && log.message == message })
|
24
31
|
end
|
25
32
|
|
26
33
|
before(:each) do
|
@@ -141,7 +141,7 @@ describe Puppet::Indirector::Yaml do
|
|
141
141
|
dir_containing_instances([one, two])
|
142
142
|
|
143
143
|
request = indirection.request(:search, "*", nil)
|
144
|
-
expect(terminus.search(request)).to
|
144
|
+
expect(terminus.search(request)).to contain_exactly(one, two)
|
145
145
|
end
|
146
146
|
|
147
147
|
it "should return an array containing a single instance of fact when globbing 'one*'" do
|
@@ -447,8 +447,7 @@ describe 'The Loader' do
|
|
447
447
|
end
|
448
448
|
|
449
449
|
context 'with no explicit dependencies' do
|
450
|
-
|
451
|
-
let(:modules) {
|
450
|
+
let(:modules) do
|
452
451
|
{
|
453
452
|
'a' => {
|
454
453
|
'functions' => a_functions,
|
@@ -468,12 +467,12 @@ describe 'The Loader' do
|
|
468
467
|
'types' => c_types,
|
469
468
|
},
|
470
469
|
}
|
470
|
+
end
|
471
471
|
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
}
|
472
|
+
it 'discover is only called once on dependent loader' do
|
473
|
+
ModuleLoaders::FileBased.any_instance.expects(:discover).times(4).with(:type, nil, Pcore::RUNTIME_NAME_AUTHORITY).returns([])
|
474
|
+
expect(loader.private_loader.discover(:type) { |t| t.name =~ /^.::.*\z/ }).to(contain_exactly())
|
475
|
+
end
|
477
476
|
end
|
478
477
|
end
|
479
478
|
end
|
@@ -42,6 +42,10 @@ describe 'Puppet::Pops::Model::PNTransformer' do
|
|
42
42
|
expect(Puppet::Pops::Model::PNTransformer.transform(x.model)).to eq(
|
43
43
|
call('hash', call('=>', 'a', 1), call('=>', 'b', 2)))
|
44
44
|
end
|
45
|
+
|
46
|
+
it 'replaces empty/nil body with a Nop' do
|
47
|
+
expect(Puppet::Pops::Model::PNTransformer.transform(nil)).to eq(call('nop'))
|
48
|
+
end
|
45
49
|
end
|
46
50
|
|
47
51
|
def lit(value)
|
@@ -68,6 +68,28 @@ describe 'Timespan type' do
|
|
68
68
|
CODE
|
69
69
|
expect(eval_and_collect_notices(code)).to eq(%w(true false))
|
70
70
|
end
|
71
|
+
|
72
|
+
it 'accepts integer values when specifying the range' do
|
73
|
+
code = <<-CODE
|
74
|
+
notice(Timespan(1) =~ Timespan[1, 2])
|
75
|
+
notice(Timespan(3) =~ Timespan[1])
|
76
|
+
notice(Timespan(0) =~ Timespan[default, 2])
|
77
|
+
notice(Timespan(0) =~ Timespan[1, 2])
|
78
|
+
notice(Timespan(3) =~ Timespan[1, 2])
|
79
|
+
CODE
|
80
|
+
expect(eval_and_collect_notices(code)).to eq(%w(true true true false false))
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'accepts float values when specifying the range' do
|
84
|
+
code = <<-CODE
|
85
|
+
notice(Timespan(1.0) =~ Timespan[1.0, 2.0])
|
86
|
+
notice(Timespan(3.0) =~ Timespan[1.0])
|
87
|
+
notice(Timespan(0.0) =~ Timespan[default, 2.0])
|
88
|
+
notice(Timespan(0.0) =~ Timespan[1.0, 2.0])
|
89
|
+
notice(Timespan(3.0) =~ Timespan[1.0, 2.0])
|
90
|
+
CODE
|
91
|
+
expect(eval_and_collect_notices(code)).to eq(%w(true true true false false))
|
92
|
+
end
|
71
93
|
end
|
72
94
|
|
73
95
|
context 'a Timespan instance' do
|
@@ -74,6 +74,25 @@ describe 'Timestamp type' do
|
|
74
74
|
CODE
|
75
75
|
expect(eval_and_collect_notices(code)).to eq(%w(true false))
|
76
76
|
end
|
77
|
+
|
78
|
+
it 'accepts integer values when specifying the range' do
|
79
|
+
code = <<-CODE
|
80
|
+
notice(Timestamp(1) =~ Timestamp[1, 2])
|
81
|
+
notice(Timestamp(3) =~ Timestamp[1])
|
82
|
+
notice(Timestamp(0) =~ Timestamp[default, 2])
|
83
|
+
CODE
|
84
|
+
expect(eval_and_collect_notices(code)).to eq(%w(true true true))
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'accepts float values when specifying the range' do
|
88
|
+
code = <<-CODE
|
89
|
+
notice(Timestamp(1.0) =~ Timestamp[1.0, 2.0])
|
90
|
+
notice(Timestamp(3.0) =~ Timestamp[1.0])
|
91
|
+
notice(Timestamp(0.0) =~ Timestamp[default, 2.0])
|
92
|
+
CODE
|
93
|
+
expect(eval_and_collect_notices(code)).to eq(%w(true true true))
|
94
|
+
end
|
95
|
+
|
77
96
|
end
|
78
97
|
|
79
98
|
context 'a Timestamp instance' do
|
@@ -707,6 +707,15 @@ describe 'The string converter' do
|
|
707
707
|
expect(formatted).to eq(result)
|
708
708
|
end
|
709
709
|
|
710
|
+
it 'applies a short form format' do
|
711
|
+
result = [
|
712
|
+
"[1,",
|
713
|
+
" [2, 3],",
|
714
|
+
" 4]"
|
715
|
+
].join("\n")
|
716
|
+
expect(converter.convert([1, [2,3], 4], '%#a')).to eq(result)
|
717
|
+
end
|
718
|
+
|
710
719
|
it 'treats hashes as nested arrays wrt indentation' do
|
711
720
|
string_formats = { Puppet::Pops::Types::PArrayType::DEFAULT => { 'format' => '%#a', 'separator' =>", " } }
|
712
721
|
# formatting matters here
|
@@ -855,6 +864,17 @@ describe 'The string converter' do
|
|
855
864
|
expect(converter.convert({1 => "hello", 2 => {3=> "world"}}, string_formats)).to eq(result)
|
856
865
|
end
|
857
866
|
|
867
|
+
it 'applies a short form format' do
|
868
|
+
result = [
|
869
|
+
"{",
|
870
|
+
" 1 => {",
|
871
|
+
" 2 => 3",
|
872
|
+
" },",
|
873
|
+
" 4 => 5",
|
874
|
+
"}"].join("\n")
|
875
|
+
expect(converter.convert({1 => {2 => 3}, 4 => 5}, '%#h')).to eq(result)
|
876
|
+
end
|
877
|
+
|
858
878
|
context "containing an array" do
|
859
879
|
it 'the hash and array renders without breaks and indentation by default' do
|
860
880
|
result = "{1 => [1, 2, 3]}"
|
@@ -1,54 +1,51 @@
|
|
1
|
-
#! /usr/bin/env ruby
|
2
1
|
require 'spec_helper'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
describe provider_class do
|
3
|
+
describe Puppet::Type.type(:group).provider(:ldap) do
|
7
4
|
it "should have the Ldap provider class as its baseclass" do
|
8
|
-
expect(
|
5
|
+
expect(described_class.superclass).to equal(Puppet::Provider::Ldap)
|
9
6
|
end
|
10
7
|
|
11
8
|
it "should manage :posixGroup objectclass" do
|
12
|
-
expect(
|
9
|
+
expect(described_class.manager.objectclasses).to eq([:posixGroup])
|
13
10
|
end
|
14
11
|
|
15
12
|
it "should use 'ou=Groups' as its relative base" do
|
16
|
-
expect(
|
13
|
+
expect(described_class.manager.location).to eq("ou=Groups")
|
17
14
|
end
|
18
15
|
|
19
16
|
it "should use :cn as its rdn" do
|
20
|
-
expect(
|
17
|
+
expect(described_class.manager.rdn).to eq(:cn)
|
21
18
|
end
|
22
19
|
|
23
20
|
it "should map :name to 'cn'" do
|
24
|
-
expect(
|
21
|
+
expect(described_class.manager.ldap_name(:name)).to eq('cn')
|
25
22
|
end
|
26
23
|
|
27
24
|
it "should map :gid to 'gidNumber'" do
|
28
|
-
expect(
|
25
|
+
expect(described_class.manager.ldap_name(:gid)).to eq('gidNumber')
|
29
26
|
end
|
30
27
|
|
31
28
|
it "should map :members to 'memberUid', to be used by the user ldap provider" do
|
32
|
-
expect(
|
29
|
+
expect(described_class.manager.ldap_name(:members)).to eq('memberUid')
|
33
30
|
end
|
34
31
|
|
35
32
|
describe "when being created" do
|
36
33
|
before do
|
37
34
|
# So we don't try to actually talk to ldap
|
38
35
|
@connection = mock 'connection'
|
39
|
-
|
36
|
+
described_class.manager.stubs(:connect).yields @connection
|
40
37
|
end
|
41
38
|
|
42
39
|
describe "with no gid specified" do
|
43
40
|
it "should pick the first available GID after the largest existing GID" do
|
44
41
|
low = {:name=>["luke"], :gid=>["600"]}
|
45
42
|
high = {:name=>["testing"], :gid=>["640"]}
|
46
|
-
|
43
|
+
described_class.manager.expects(:search).returns([low, high])
|
47
44
|
|
48
45
|
resource = stub 'resource', :should => %w{whatever}
|
49
46
|
resource.stubs(:should).with(:gid).returns nil
|
50
47
|
resource.stubs(:should).with(:ensure).returns :present
|
51
|
-
instance =
|
48
|
+
instance = described_class.new(:name => "luke", :ensure => :absent)
|
52
49
|
instance.stubs(:resource).returns resource
|
53
50
|
|
54
51
|
@connection.expects(:add).with { |dn, attrs| attrs["gidNumber"] == ["641"] }
|
@@ -58,12 +55,12 @@ describe provider_class do
|
|
58
55
|
end
|
59
56
|
|
60
57
|
it "should pick '501' as its GID if no groups are found" do
|
61
|
-
|
58
|
+
described_class.manager.expects(:search).returns nil
|
62
59
|
|
63
60
|
resource = stub 'resource', :should => %w{whatever}
|
64
61
|
resource.stubs(:should).with(:gid).returns nil
|
65
62
|
resource.stubs(:should).with(:ensure).returns :present
|
66
|
-
instance =
|
63
|
+
instance = described_class.new(:name => "luke", :ensure => :absent)
|
67
64
|
instance.stubs(:resource).returns resource
|
68
65
|
|
69
66
|
@connection.expects(:add).with { |dn, attrs| attrs["gidNumber"] == ["501"] }
|
@@ -75,27 +72,27 @@ describe provider_class do
|
|
75
72
|
end
|
76
73
|
|
77
74
|
it "should have a method for converting group names to GIDs" do
|
78
|
-
expect(
|
75
|
+
expect(described_class).to respond_to(:name2id)
|
79
76
|
end
|
80
77
|
|
81
78
|
describe "when converting from a group name to GID" do
|
82
79
|
it "should use the ldap manager to look up the GID" do
|
83
|
-
|
84
|
-
|
80
|
+
described_class.manager.expects(:search).with("cn=foo")
|
81
|
+
described_class.name2id("foo")
|
85
82
|
end
|
86
83
|
|
87
84
|
it "should return nil if no group is found" do
|
88
|
-
|
89
|
-
expect(
|
90
|
-
|
91
|
-
expect(
|
85
|
+
described_class.manager.expects(:search).with("cn=foo").returns nil
|
86
|
+
expect(described_class.name2id("foo")).to be_nil
|
87
|
+
described_class.manager.expects(:search).with("cn=bar").returns []
|
88
|
+
expect(described_class.name2id("bar")).to be_nil
|
92
89
|
end
|
93
90
|
|
94
91
|
# We shouldn't ever actually have more than one gid, but it doesn't hurt
|
95
92
|
# to test for the possibility.
|
96
93
|
it "should return the first gid from the first returned group" do
|
97
|
-
|
98
|
-
expect(
|
94
|
+
described_class.manager.expects(:search).with("cn=foo").returns [{:name => "foo", :gid => [10, 11]}, {:name => :bar, :gid => [20, 21]}]
|
95
|
+
expect(described_class.name2id("foo")).to eq(10)
|
99
96
|
end
|
100
97
|
end
|
101
98
|
end
|