puppet 4.0.0 → 4.1.0
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/ext/build_defaults.yaml +8 -35
- data/ext/debian/puppet.default +0 -5
- data/ext/debian/puppet.init +1 -15
- data/lib/hiera/puppet_function.rb +15 -4
- data/lib/puppet/application/agent.rb +5 -0
- data/lib/puppet/application/apply.rb +23 -2
- data/lib/puppet/application/device.rb +8 -3
- data/lib/puppet/application/master.rb +16 -5
- data/lib/puppet/configurer.rb +7 -5
- data/lib/puppet/defaults.rb +18 -0
- data/lib/puppet/environments.rb +1 -1
- data/lib/puppet/error.rb +27 -1
- data/lib/puppet/file_serving/metadata.rb +13 -8
- data/lib/puppet/file_serving/terminus_helper.rb +7 -8
- data/lib/puppet/file_system.rb +13 -0
- data/lib/puppet/file_system/file_impl.rb +4 -0
- data/lib/puppet/file_system/memory_impl.rb +4 -0
- data/lib/puppet/file_system/windows.rb +8 -0
- data/lib/puppet/functions.rb +33 -3
- data/lib/puppet/functions/defined.rb +130 -0
- data/lib/puppet/functions/regsubst.rb +1 -1
- data/lib/puppet/functions/split.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +1 -1
- data/lib/puppet/indirector/facts/facter.rb +11 -0
- data/lib/puppet/loaders.rb +1 -0
- data/lib/puppet/node.rb +17 -1
- data/lib/puppet/node/environment.rb +4 -0
- data/lib/puppet/parser/ast/pops_bridge.rb +4 -0
- data/lib/puppet/parser/compiler.rb +9 -0
- data/lib/puppet/parser/functions/defined.rb +25 -1
- data/lib/puppet/parser/functions/file.rb +3 -1
- data/lib/puppet/parser/scope.rb +11 -2
- data/lib/puppet/parser/templatewrapper.rb +2 -1
- data/lib/puppet/pops.rb +4 -0
- data/lib/puppet/pops/evaluator/access_operator.rb +25 -5
- data/lib/puppet/pops/evaluator/closure.rb +28 -2
- data/lib/puppet/pops/evaluator/collector_transformer.rb +1 -11
- data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +4 -0
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +4 -0
- data/lib/puppet/pops/evaluator/compare_operator.rb +43 -0
- data/lib/puppet/pops/evaluator/epp_evaluator.rb +7 -2
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +48 -14
- data/lib/puppet/pops/evaluator/runtime3_support.rb +10 -5
- data/lib/puppet/pops/functions/dispatch.rb +6 -1
- data/lib/puppet/pops/functions/dispatcher.rb +7 -1
- data/lib/puppet/pops/issue_reporter.rb +42 -16
- data/lib/puppet/pops/issues.rb +116 -2
- data/lib/puppet/pops/loader/loader.rb +11 -0
- data/lib/puppet/pops/loader/loader_paths.rb +67 -6
- data/lib/puppet/pops/loader/module_loaders.rb +19 -8
- data/lib/puppet/pops/loader/puppet_function_instantiator.rb +78 -0
- data/lib/puppet/pops/loaders.rb +6 -4
- data/lib/puppet/pops/migration/migration_checker.rb +54 -0
- data/lib/puppet/pops/model/factory.rb +5 -1
- data/lib/puppet/pops/model/model_label_provider.rb +2 -0
- data/lib/puppet/pops/model/model_meta.rb +5 -1
- data/lib/puppet/pops/parser/egrammar.ra +9 -10
- data/lib/puppet/pops/parser/eparser.rb +1061 -1047
- data/lib/puppet/pops/parser/epp_support.rb +18 -9
- data/lib/puppet/pops/parser/evaluating_parser.rb +7 -1
- data/lib/puppet/pops/parser/heredoc_support.rb +12 -11
- data/lib/puppet/pops/parser/interpolation_support.rb +7 -1
- data/lib/puppet/pops/parser/lexer2.rb +29 -12
- data/lib/puppet/pops/parser/lexer_support.rb +52 -23
- data/lib/puppet/pops/parser/parser_support.rb +11 -14
- data/lib/puppet/pops/parser/slurp_support.rb +22 -6
- data/lib/puppet/pops/types/type_calculator.rb +156 -55
- data/lib/puppet/pops/types/type_factory.rb +66 -13
- data/lib/puppet/pops/types/type_parser.rb +22 -13
- data/lib/puppet/pops/types/types.rb +23 -4
- data/lib/puppet/pops/types/types_meta.rb +13 -2
- data/lib/puppet/pops/validation.rb +25 -2
- data/lib/puppet/pops/validation/checker4_0.rb +63 -31
- data/lib/puppet/provider/group/windows_adsi.rb +8 -4
- data/lib/puppet/provider/mount/parsed.rb +145 -2
- data/lib/puppet/provider/package/apt.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +11 -2
- data/lib/puppet/provider/package/pkgng.rb +134 -0
- data/lib/puppet/provider/package/portage.rb +1 -1
- data/lib/puppet/provider/package/ports.rb +0 -3
- data/lib/puppet/provider/package/windows/exe_package.rb +0 -1
- data/lib/puppet/provider/package/windows/msi_package.rb +0 -1
- data/lib/puppet/provider/package/zypper.rb +50 -15
- data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +32 -7
- data/lib/puppet/provider/service/debian.rb +1 -1
- data/lib/puppet/provider/service/init.rb +7 -0
- data/lib/puppet/provider/user/openbsd.rb +1 -0
- data/lib/puppet/provider/user/windows_adsi.rb +45 -2
- data/lib/puppet/reference/indirection.rb +1 -1
- data/lib/puppet/resource.rb +1 -1
- data/lib/puppet/resource/catalog.rb +0 -4
- data/lib/puppet/settings.rb +19 -0
- data/lib/puppet/type/file.rb +1 -0
- data/lib/puppet/type/file/ensure.rb +1 -1
- data/lib/puppet/type/mount.rb +9 -1
- data/lib/puppet/type/scheduled_task.rb +13 -0
- data/lib/puppet/type/tidy.rb +3 -1
- data/lib/puppet/type/user.rb +32 -0
- data/lib/puppet/type/yumrepo.rb +5 -5
- data/lib/puppet/util/log.rb +50 -8
- data/lib/puppet/util/log/destinations.rb +23 -2
- data/lib/puppet/util/logging.rb +37 -1
- data/lib/puppet/util/run_mode.rb +1 -14
- data/lib/puppet/util/windows/adsi.rb +130 -58
- data/lib/puppet/version.rb +1 -1
- data/man/man5/puppet.conf.5 +48 -6
- data/man/man8/extlookup2hiera.8 +1 -1
- data/man/man8/puppet-agent.8 +4 -1
- data/man/man8/puppet-apply.8 +4 -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 +6 -3
- 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-file.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-inspect.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-master.8 +4 -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-resource_type.8 +1 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +1 -1
- data/spec/fixtures/unit/data_providers/environments/production/lib/puppet/functions/environment/data.rb +3 -1
- data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/functions/data.pp +6 -0
- data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/lib/puppet/bindings/xyz/default.rb +9 -0
- data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/manifests/init.pp +9 -0
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcalled.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcaller.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcaller4.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/lib/puppet/functions/user/callingpuppet.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/functions/hello.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/manifests/init.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/metadata.json +10 -0
- data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/functions/hello.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/functions/subspace/hello.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/metadata.json +1 -10
- data/spec/fixtures/unit/provider/mount/parsed/aix.filesystems +93 -85
- data/spec/fixtures/unit/provider/mount/parsed/aix.mount +11 -7
- data/spec/fixtures/unit/provider/package/pkgng/pkg.info +8 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.query +1 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.query_absent +1 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.version +3 -0
- data/spec/fixtures/unit/provider/package/zypper/zypper-list-updates-empty.out +3 -0
- data/spec/integration/application/apply_spec.rb +49 -0
- data/spec/integration/faces/plugin_spec.rb +0 -4
- data/spec/integration/indirector/facts/facter_spec.rb +59 -0
- data/spec/integration/parser/compiler_spec.rb +850 -0
- data/spec/integration/parser/resource_expressions_spec.rb +3 -0
- data/spec/integration/parser/scope_spec.rb +26 -5
- data/spec/integration/transaction_spec.rb +1 -1
- data/spec/integration/type/file_spec.rb +318 -41
- data/spec/integration/util/windows/security_spec.rb +14 -5
- data/spec/lib/matchers/resource.rb +22 -1
- data/spec/lib/puppet_spec/matchers.rb +6 -4
- data/spec/unit/application/master_spec.rb +33 -7
- data/spec/unit/data_providers/function_data_provider_spec.rb +10 -1
- data/spec/unit/file_serving/metadata_spec.rb +1 -1
- data/spec/unit/file_serving/terminus_helper_spec.rb +2 -3
- data/spec/unit/file_system_spec.rb +38 -0
- data/spec/unit/functions/defined_spec.rb +289 -0
- data/spec/unit/functions/hiera_spec.rb +8 -6
- data/spec/unit/functions/regsubst_spec.rb +4 -0
- data/spec/unit/functions/split_spec.rb +8 -0
- data/spec/unit/functions4_spec.rb +97 -2
- data/spec/unit/indirector/facts/facter_spec.rb +7 -0
- data/spec/unit/node_spec.rb +6 -0
- data/spec/unit/parser/functions/file_spec.rb +7 -1
- data/spec/unit/parser/functions/template_spec.rb +1 -1
- data/spec/unit/parser/scope_spec.rb +2 -2
- data/spec/unit/parser/templatewrapper_spec.rb +1 -1
- data/spec/unit/pops/evaluator/access_ops_spec.rb +19 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +84 -18
- data/spec/unit/pops/evaluator/variables_spec.rb +1 -1
- data/spec/unit/pops/issues_spec.rb +16 -16
- data/spec/unit/pops/loaders/loaders_spec.rb +106 -48
- data/spec/unit/pops/migration_spec.rb +53 -0
- data/spec/unit/pops/parser/lexer2_spec.rb +142 -1
- data/spec/unit/pops/parser/parse_heredoc_spec.rb +26 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +205 -12
- data/spec/unit/pops/validation_spec.rb +66 -0
- data/spec/unit/pops/validator/validator_spec.rb +1 -1
- data/spec/unit/provider/group/windows_adsi_spec.rb +57 -9
- data/spec/unit/provider/mount/parsed_spec.rb +31 -5
- data/spec/unit/provider/package/apt_spec.rb +5 -0
- data/spec/unit/provider/package/pip_spec.rb +9 -0
- data/spec/unit/provider/package/pkgng_spec.rb +172 -0
- data/spec/unit/provider/package/windows/exe_package_spec.rb +0 -1
- data/spec/unit/provider/package/windows/msi_package_spec.rb +0 -1
- data/spec/unit/provider/package/zypper_spec.rb +50 -19
- data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +312 -70
- data/spec/unit/provider/service/base_spec.rb +38 -27
- data/spec/unit/provider/service/debian_spec.rb +8 -0
- data/spec/unit/provider/service/freebsd_spec.rb +1 -0
- data/spec/unit/provider/service/gentoo_spec.rb +1 -0
- data/spec/unit/provider/service/init_spec.rb +18 -0
- data/spec/unit/provider/service/openbsd_spec.rb +1 -0
- data/spec/unit/provider/service/redhat_spec.rb +1 -0
- data/spec/unit/provider/user/windows_adsi_spec.rb +134 -5
- data/spec/unit/settings_spec.rb +11 -0
- data/spec/unit/util/log_spec.rb +113 -0
- data/spec/unit/util/windows/adsi_spec.rb +135 -41
- data/spec/unit/util/windows/sid_spec.rb +0 -10
- metadata +48 -2
@@ -15,7 +15,6 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
|
|
15
15
|
@sids = {
|
16
16
|
:current_user => Puppet::Util::Windows::SID.name_to_sid(Puppet::Util::Windows::ADSI::User.current_user_name),
|
17
17
|
:system => Win32::Security::SID::LocalSystem,
|
18
|
-
:admin => Puppet::Util::Windows::SID.name_to_sid("Administrator"),
|
19
18
|
:administrators => Win32::Security::SID::BuiltinAdministrators,
|
20
19
|
:guest => Puppet::Util::Windows::SID.name_to_sid("Guest"),
|
21
20
|
:users => Win32::Security::SID::BuiltinUsers,
|
@@ -387,9 +386,14 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
|
|
387
386
|
end
|
388
387
|
|
389
388
|
describe "#owner=" do
|
389
|
+
it "should accept the guest sid" do
|
390
|
+
winsec.set_owner(sids[:guest], path)
|
391
|
+
expect(winsec.get_owner(path)).to eq(sids[:guest])
|
392
|
+
end
|
393
|
+
|
390
394
|
it "should accept a user sid" do
|
391
|
-
winsec.set_owner(sids[:
|
392
|
-
expect(winsec.get_owner(path)).to eq(sids[:
|
395
|
+
winsec.set_owner(sids[:current_user], path)
|
396
|
+
expect(winsec.get_owner(path)).to eq(sids[:current_user])
|
393
397
|
end
|
394
398
|
|
395
399
|
it "should accept a group sid" do
|
@@ -407,14 +411,19 @@ describe "Puppet::Util::Windows::Security", :if => Puppet.features.microsoft_win
|
|
407
411
|
end
|
408
412
|
|
409
413
|
describe "#group=" do
|
414
|
+
it "should accept the test group" do
|
415
|
+
winsec.set_group(sids[:guest], path)
|
416
|
+
expect(winsec.get_group(path)).to eq(sids[:guest])
|
417
|
+
end
|
418
|
+
|
410
419
|
it "should accept a group sid" do
|
411
420
|
winsec.set_group(sids[:power_users], path)
|
412
421
|
expect(winsec.get_group(path)).to eq(sids[:power_users])
|
413
422
|
end
|
414
423
|
|
415
424
|
it "should accept a user sid" do
|
416
|
-
winsec.set_group(sids[:
|
417
|
-
expect(winsec.get_group(path)).to eq(sids[:
|
425
|
+
winsec.set_group(sids[:current_user], path)
|
426
|
+
expect(winsec.get_group(path)).to eq(sids[:current_user])
|
418
427
|
end
|
419
428
|
|
420
429
|
it "should combine owner and group rights when they are the same sid" do
|
@@ -36,7 +36,7 @@ module Matchers; module Resource
|
|
36
36
|
if resource = actual_catalog.resource(expected_resource)
|
37
37
|
resource_match(expected_resource, resource)
|
38
38
|
else
|
39
|
-
@mismatch = "expected #{@actual.to_dot} to include #{
|
39
|
+
@mismatch = "expected #{@actual.to_dot} to include #{expected_resource}"
|
40
40
|
false
|
41
41
|
end
|
42
42
|
end
|
@@ -50,4 +50,25 @@ module Matchers; module Resource
|
|
50
50
|
@mismatch
|
51
51
|
end
|
52
52
|
end
|
53
|
+
|
54
|
+
|
55
|
+
matcher :be_resource do |expected_resource|
|
56
|
+
def resource_match(expected_resource, actual_resource)
|
57
|
+
if actual_resource.ref == expected_resource
|
58
|
+
true
|
59
|
+
else
|
60
|
+
@mismatch = "expected #{expected_resource} but was #{actual_resource.ref}"
|
61
|
+
false
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
match do |actual_resource|
|
66
|
+
resource_match(expected_resource, actual_resource)
|
67
|
+
end
|
68
|
+
|
69
|
+
def failure_message
|
70
|
+
@mismatch
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
53
74
|
end; end
|
@@ -58,10 +58,10 @@ end
|
|
58
58
|
RSpec::Matchers.define :have_printed do |expected|
|
59
59
|
|
60
60
|
case expected
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
61
|
+
when String, Regexp, Proc
|
62
|
+
expected = expected
|
63
|
+
else
|
64
|
+
expected = expected.to_s
|
65
65
|
end
|
66
66
|
|
67
67
|
chain :and_exit_with do |code|
|
@@ -79,6 +79,8 @@ RSpec::Matchers.define :have_printed do |expected|
|
|
79
79
|
actual.include?(expected)
|
80
80
|
when Regexp
|
81
81
|
expected.match(actual)
|
82
|
+
when Proc
|
83
|
+
expected.call(actual)
|
82
84
|
else
|
83
85
|
raise ArgumentError, "No idea how to match a #{actual.class.name}"
|
84
86
|
end
|
@@ -314,10 +314,32 @@ describe Puppet::Application::Master, :unless => Puppet.features.microsoft_windo
|
|
314
314
|
@master.main
|
315
315
|
end
|
316
316
|
|
317
|
-
|
318
|
-
|
317
|
+
def a_user_type_for(username)
|
318
|
+
user = mock 'user'
|
319
|
+
Puppet::Type.type(:user).expects(:new).with { |args| args[:name] == username }.returns user
|
320
|
+
user
|
321
|
+
end
|
322
|
+
|
323
|
+
context "user privileges" do
|
324
|
+
it "should drop privileges if running as root and the puppet user exists" do
|
325
|
+
Puppet.features.stubs(:root?).returns true
|
326
|
+
a_user_type_for("puppet").expects(:exists?).returns true
|
327
|
+
|
328
|
+
Puppet::Util.expects(:chuser)
|
329
|
+
|
330
|
+
@master.main
|
331
|
+
end
|
332
|
+
|
333
|
+
it "should exit and log an error if running as root and the puppet user does not exist" do
|
334
|
+
Puppet.features.stubs(:root?).returns true
|
335
|
+
a_user_type_for("puppet").expects(:exists?).returns false
|
336
|
+
|
337
|
+
expect { @master.main }.to raise_error(Puppet::Error, /Could not change user to puppet\. User does not exist and is required to continue\./)
|
338
|
+
end
|
339
|
+
end
|
319
340
|
|
320
|
-
|
341
|
+
it "should log a deprecation notice when running a WEBrick server" do
|
342
|
+
Puppet.expects(:deprecation_warning).with("The WEBrick Puppet master server is deprecated and will be removed in a future release. Please use Puppet Server instead. See http://links.puppetlabs.com/deprecate-rack-webrick-servers for more information.")
|
321
343
|
|
322
344
|
@master.main
|
323
345
|
end
|
@@ -340,22 +362,26 @@ describe Puppet::Application::Master, :unless => Puppet.features.microsoft_windo
|
|
340
362
|
before do
|
341
363
|
require 'puppet/network/http/rack'
|
342
364
|
Puppet::Network::HTTP::Rack.stubs(:new).returns(@app)
|
343
|
-
end
|
344
365
|
|
345
|
-
it "it should not start a daemon" do
|
346
366
|
@master.options.stubs(:[]).with(:rack).returns(:true)
|
367
|
+
end
|
347
368
|
|
369
|
+
it "it should not start a daemon" do
|
348
370
|
@daemon.expects(:start).never
|
349
371
|
|
350
372
|
@master.main
|
351
373
|
end
|
352
374
|
|
353
375
|
it "it should return the app" do
|
354
|
-
@master.options.stubs(:[]).with(:rack).returns(:true)
|
355
|
-
|
356
376
|
app = @master.main
|
357
377
|
expect(app).to equal(@app)
|
358
378
|
end
|
379
|
+
|
380
|
+
it "should log a deprecation notice" do
|
381
|
+
Puppet.expects(:deprecation_warning).with("The Rack Puppet master server is deprecated and will be removed in a future release. Please use Puppet Server instead. See http://links.puppetlabs.com/deprecate-rack-webrick-servers for more information.")
|
382
|
+
|
383
|
+
@master.main
|
384
|
+
end
|
359
385
|
end
|
360
386
|
end
|
361
387
|
end
|
@@ -38,7 +38,7 @@ describe "when using function data provider" do
|
|
38
38
|
# The result should be that the data set in the environment wins over those set in the
|
39
39
|
# module.
|
40
40
|
#
|
41
|
-
it '
|
41
|
+
it 'gets data from module and environment functions and combines them with env having higher precedence' do
|
42
42
|
Puppet[:code] = 'include abc'
|
43
43
|
node = Puppet::Node.new("testnode", :facts => Puppet::Node::Facts.new("facts", {}), :environment => 'production')
|
44
44
|
compiler = Puppet::Parser::Compiler.new(node)
|
@@ -47,6 +47,15 @@ describe "when using function data provider" do
|
|
47
47
|
expect(resources_in(catalog)).to include(*resources_created_in_fixture)
|
48
48
|
end
|
49
49
|
|
50
|
+
it 'gets data from module having a puppet function delivering module data' do
|
51
|
+
Puppet[:code] = 'include xyz'
|
52
|
+
node = Puppet::Node.new("testnode", :facts => Puppet::Node::Facts.new("facts", {}), :environment => 'production')
|
53
|
+
compiler = Puppet::Parser::Compiler.new(node)
|
54
|
+
catalog = compiler.compile()
|
55
|
+
resources_created_in_fixture = ["Notify[env_test1]", "Notify[env_test2]", "Notify[module_test3]"]
|
56
|
+
expect(resources_in(catalog)).to include(*resources_created_in_fixture)
|
57
|
+
end
|
58
|
+
|
50
59
|
it 'raises an error if the environment data function does not return a hash' do
|
51
60
|
Puppet[:code] = 'include abc'
|
52
61
|
# find the loaders to patch with faulty function
|
@@ -179,7 +179,7 @@ describe Puppet::FileServing::Metadata, :uses_checksums => true do
|
|
179
179
|
|
180
180
|
stat = Puppet::FileSystem.stat(path)
|
181
181
|
|
182
|
-
win_stat = Puppet::FileServing::Metadata::WindowsStat.new(stat, path)
|
182
|
+
win_stat = Puppet::FileServing::Metadata::WindowsStat.new(stat, path, :ignore)
|
183
183
|
|
184
184
|
expect(win_stat.owner).to eq('S-1-5-32-544')
|
185
185
|
expect(win_stat.group).to eq('S-1-0-0')
|
@@ -26,12 +26,11 @@ describe Puppet::FileServing::TerminusHelper do
|
|
26
26
|
|
27
27
|
it "should pass through links, checksum_type, and source_permissions" do
|
28
28
|
file = stub 'file', :checksum_type= => nil, :links= => nil, :collect => nil
|
29
|
-
[[:checksum_type, :sha256], [:links, true]].each {|k, v|
|
29
|
+
[[:checksum_type, :sha256], [:links, true], [:source_permissions, :use]].each {|k, v|
|
30
30
|
file.expects(k.to_s+'=').with(v)
|
31
31
|
@request.options[k] = v
|
32
32
|
}
|
33
|
-
|
34
|
-
file.expects(:collect).with(:yes)
|
33
|
+
file.expects(:collect)
|
35
34
|
@model.expects(:new).with("/my/file", {:relative_path => :file}).returns(file)
|
36
35
|
@helper.path2instance(@request, "/my/file", {:relative_path => :file})
|
37
36
|
end
|
@@ -5,6 +5,18 @@ require 'puppet/util/platform'
|
|
5
5
|
describe "Puppet::FileSystem" do
|
6
6
|
include PuppetSpec::Files
|
7
7
|
|
8
|
+
def with_file_content(content)
|
9
|
+
path = tmpfile('file-system')
|
10
|
+
file = File.new(path, 'wb')
|
11
|
+
file.sync = true
|
12
|
+
file.print content
|
13
|
+
|
14
|
+
yield path
|
15
|
+
|
16
|
+
ensure
|
17
|
+
file.close
|
18
|
+
end
|
19
|
+
|
8
20
|
context "#exclusive_open" do
|
9
21
|
it "opens ands allows updating of an existing file" do
|
10
22
|
file = file_containing("file_to_update", "the contents")
|
@@ -96,6 +108,32 @@ describe "Puppet::FileSystem" do
|
|
96
108
|
end
|
97
109
|
end
|
98
110
|
|
111
|
+
context "read_preserve_line_endings" do
|
112
|
+
it "should read a file with line feed" do
|
113
|
+
with_file_content("file content \n") do |file|
|
114
|
+
expect(Puppet::FileSystem.read_preserve_line_endings(file)).to eq("file content \n")
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should read a file with carriage return line feed" do
|
119
|
+
with_file_content("file content \r\n") do |file|
|
120
|
+
expect(Puppet::FileSystem.read_preserve_line_endings(file)).to eq("file content \r\n")
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should read a mixed file using only the first line newline when lf" do
|
125
|
+
with_file_content("file content \nsecond line \r\n") do |file|
|
126
|
+
expect(Puppet::FileSystem.read_preserve_line_endings(file)).to eq("file content \nsecond line \r\n")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should read a mixed file using only the first line newline when crlf" do
|
131
|
+
with_file_content("file content \r\nsecond line \n") do |file|
|
132
|
+
expect(Puppet::FileSystem.read_preserve_line_endings(file)).to eq("file content \r\nsecond line \n")
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
99
137
|
describe "symlink",
|
100
138
|
:if => ! Puppet.features.manages_symlinks? &&
|
101
139
|
Puppet.features.microsoft_windows? do
|
@@ -0,0 +1,289 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'puppet/pops'
|
4
|
+
require 'puppet/loaders'
|
5
|
+
|
6
|
+
describe "the 'defined' function" do
|
7
|
+
after(:all) { Puppet::Pops::Loaders.clear }
|
8
|
+
|
9
|
+
# This loads the function once and makes it easy to call it
|
10
|
+
# It does not matter that it is not bound to the env used later since the function
|
11
|
+
# looks up everything via the scope that is given to it.
|
12
|
+
# The individual tests needs to have a fresh env/catalog set up
|
13
|
+
#
|
14
|
+
let(:loaders) { Puppet::Pops::Loaders.new(Puppet::Node::Environment.create(:testing, [])) }
|
15
|
+
let(:func) { loaders.puppet_system_loader.load(:function, 'defined') }
|
16
|
+
|
17
|
+
before :each do
|
18
|
+
# A fresh environment is needed for each test since tests creates types and resources
|
19
|
+
environment = Puppet::Node::Environment.create(:testing, [])
|
20
|
+
@node = Puppet::Node.new('yaynode', :environment => environment)
|
21
|
+
@known_resource_types = environment.known_resource_types
|
22
|
+
@compiler = Puppet::Parser::Compiler.new(@node)
|
23
|
+
@scope = Puppet::Parser::Scope.new(@compiler)
|
24
|
+
end
|
25
|
+
|
26
|
+
def newclass(name)
|
27
|
+
@known_resource_types.add Puppet::Resource::Type.new(:hostclass, name)
|
28
|
+
end
|
29
|
+
|
30
|
+
def newdefine(name)
|
31
|
+
@known_resource_types.add Puppet::Resource::Type.new(:definition, name)
|
32
|
+
end
|
33
|
+
|
34
|
+
def newresource(type, title)
|
35
|
+
resource = Puppet::Resource.new(type, title)
|
36
|
+
@compiler.add_resource(@scope, resource)
|
37
|
+
resource
|
38
|
+
end
|
39
|
+
|
40
|
+
#--- CLASS
|
41
|
+
#
|
42
|
+
context 'can determine if a class' do
|
43
|
+
context 'is defined' do
|
44
|
+
|
45
|
+
it 'by using the class name in string form' do
|
46
|
+
newclass 'yayness'
|
47
|
+
expect(func.call(@scope, 'yayness')).to be_truthy
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'by using a Type[Class[name]] type reference' do
|
51
|
+
name = 'yayness'
|
52
|
+
newclass name
|
53
|
+
class_type = Puppet::Pops::Types::TypeFactory.host_class(name)
|
54
|
+
type_type = Puppet::Pops::Types::TypeFactory.type_type(class_type)
|
55
|
+
expect(func.call(@scope, type_type)).to be_truthy
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'is not defined' do
|
60
|
+
it 'by using the class name in string form' do
|
61
|
+
expect(func.call(@scope, 'yayness')).to be_falsey
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'even if there is a define, by using a Type[Class[name]] type reference' do
|
65
|
+
name = 'yayness'
|
66
|
+
newdefine name
|
67
|
+
class_type = Puppet::Pops::Types::TypeFactory.host_class(name)
|
68
|
+
type_type = Puppet::Pops::Types::TypeFactory.type_type(class_type)
|
69
|
+
expect(func.call(@scope, type_type)).to be_falsey
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'is defined and realized' do
|
74
|
+
it 'by using a Class[name] reference' do
|
75
|
+
name = 'cowabunga'
|
76
|
+
newclass name
|
77
|
+
newresource(:class, name)
|
78
|
+
class_type = Puppet::Pops::Types::TypeFactory.host_class(name)
|
79
|
+
expect(func.call(@scope, class_type)).to be_truthy
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'is not realized' do
|
84
|
+
it '(although defined) by using a Class[name] reference' do
|
85
|
+
name = 'cowabunga'
|
86
|
+
newclass name
|
87
|
+
class_type = Puppet::Pops::Types::TypeFactory.host_class(name)
|
88
|
+
expect(func.call(@scope, class_type)).to be_falsey
|
89
|
+
end
|
90
|
+
|
91
|
+
it '(and not defined) by using a Class[name] reference' do
|
92
|
+
name = 'cowabunga'
|
93
|
+
class_type = Puppet::Pops::Types::TypeFactory.host_class(name)
|
94
|
+
expect(func.call(@scope, class_type)).to be_falsey
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
#---RESOURCE TYPE
|
100
|
+
#
|
101
|
+
context 'can determine if a resource type' do
|
102
|
+
context 'is defined' do
|
103
|
+
|
104
|
+
it 'by using the type name (of a built in type) in string form' do
|
105
|
+
expect(func.call(@scope, 'file')).to be_truthy
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'by using the type name (of a resource type) in string form' do
|
109
|
+
newdefine 'yayness'
|
110
|
+
expect(func.call(@scope, 'yayness')).to be_truthy
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'by using a File type reference (built in type)' do
|
114
|
+
resource_type = Puppet::Pops::Types::TypeFactory.resource('file')
|
115
|
+
type_type = Puppet::Pops::Types::TypeFactory.type_type(resource_type)
|
116
|
+
expect(func.call(@scope, type_type)).to be_truthy
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'by using a Type[File] type reference' do
|
120
|
+
resource_type = Puppet::Pops::Types::TypeFactory.resource('file')
|
121
|
+
type_type = Puppet::Pops::Types::TypeFactory.type_type(resource_type)
|
122
|
+
expect(func.call(@scope, type_type)).to be_truthy
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'by using a Resource[T] type reference (defined type)' do
|
126
|
+
name = 'yayness'
|
127
|
+
newdefine name
|
128
|
+
resource_type = Puppet::Pops::Types::TypeFactory.resource(name)
|
129
|
+
expect(func.call(@scope, resource_type)).to be_truthy
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'by using a Type[Resource[T]] type reference (defined type)' do
|
133
|
+
name = 'yayness'
|
134
|
+
newdefine name
|
135
|
+
resource_type = Puppet::Pops::Types::TypeFactory.resource(name)
|
136
|
+
type_type = Puppet::Pops::Types::TypeFactory.type_type(resource_type)
|
137
|
+
expect(func.call(@scope, type_type)).to be_truthy
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'is not defined' do
|
142
|
+
it 'by using the resource name in string form' do
|
143
|
+
expect(func.call(@scope, 'notatype')).to be_falsey
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'even if there is a class with the same name, by using a Type[Resource[T]] type reference' do
|
147
|
+
name = 'yayness'
|
148
|
+
newclass name
|
149
|
+
resource_type = Puppet::Pops::Types::TypeFactory.resource(name)
|
150
|
+
type_type = Puppet::Pops::Types::TypeFactory.type_type(resource_type)
|
151
|
+
expect(func.call(@scope, type_type)).to be_falsey
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'is defined and instance realized' do
|
156
|
+
it 'by using a Resource[T, title] reference for a built in type' do
|
157
|
+
type_name = 'file'
|
158
|
+
title = '/tmp/myfile'
|
159
|
+
newdefine type_name
|
160
|
+
newresource(type_name, title)
|
161
|
+
class_type = Puppet::Pops::Types::TypeFactory.resource(type_name, title)
|
162
|
+
expect(func.call(@scope, class_type)).to be_truthy
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'by using a Resource[T, title] reference for a defined type' do
|
166
|
+
type_name = 'meme'
|
167
|
+
title = 'cowabunga'
|
168
|
+
newdefine type_name
|
169
|
+
newresource(type_name, title)
|
170
|
+
class_type = Puppet::Pops::Types::TypeFactory.resource(type_name, title)
|
171
|
+
expect(func.call(@scope, class_type)).to be_truthy
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
context 'is not realized' do
|
176
|
+
it '(although defined) by using a Resource[T, title] reference or Type[Resource[T, title]] reference' do
|
177
|
+
type_name = 'meme'
|
178
|
+
title = 'cowabunga'
|
179
|
+
newdefine type_name
|
180
|
+
resource_type = Puppet::Pops::Types::TypeFactory.resource(type_name, title)
|
181
|
+
expect(func.call(@scope, resource_type)).to be_falsey
|
182
|
+
|
183
|
+
type_type = Puppet::Pops::Types::TypeFactory.type_type(resource_type)
|
184
|
+
expect(func.call(@scope, type_type)).to be_falsey
|
185
|
+
end
|
186
|
+
|
187
|
+
it '(and not defined) by using a Resource[T, title] reference or Type[Resource[T, title]] reference' do
|
188
|
+
type_name = 'meme'
|
189
|
+
title = 'cowabunga'
|
190
|
+
resource_type = Puppet::Pops::Types::TypeFactory.resource(type_name, title)
|
191
|
+
expect(func.call(@scope, resource_type)).to be_falsey
|
192
|
+
|
193
|
+
type_type = Puppet::Pops::Types::TypeFactory.type_type(resource_type)
|
194
|
+
expect(func.call(@scope, type_type)).to be_falsey
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
#---VARIABLES
|
200
|
+
#
|
201
|
+
context 'can determine if a variable' do
|
202
|
+
context 'is defined' do
|
203
|
+
it 'by giving the variable in string form' do
|
204
|
+
@scope['x'] = 'something'
|
205
|
+
expect(func.call(@scope, '$x')).to be_truthy
|
206
|
+
end
|
207
|
+
|
208
|
+
it 'by giving a :: prefixed variable in string form' do
|
209
|
+
@compiler.topscope['x'] = 'something'
|
210
|
+
expect(func.call(@scope, '$::x')).to be_truthy
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'by giving a numeric variable in string form (when there is a match scope)' do
|
214
|
+
# with no match scope, there are no numeric variables defined
|
215
|
+
expect(func.call(@scope, '$0')).to be_falsey
|
216
|
+
expect(func.call(@scope, '$42')).to be_falsey
|
217
|
+
pattern = Regexp.new('.*')
|
218
|
+
@scope.new_match_scope(pattern.match('anything'))
|
219
|
+
|
220
|
+
# with a match scope, all numeric variables are set (the match defines if they have a value or not, but they are defined)
|
221
|
+
# even if their value is undef.
|
222
|
+
expect(func.call(@scope, '$0')).to be_truthy
|
223
|
+
expect(func.call(@scope, '$42')).to be_truthy
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
context 'is undefined' do
|
228
|
+
it 'by giving a :: prefixed or regular variable in string form' do
|
229
|
+
expect(func.call(@scope, '$x')).to be_falsey
|
230
|
+
expect(func.call(@scope, '$::x')).to be_falsey
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
context 'has any? semantics when given multiple arguments' do
|
236
|
+
it 'and one of the names is a defined user defined type' do
|
237
|
+
newdefine 'yayness'
|
238
|
+
expect(func.call(@scope, 'meh', 'yayness', 'booness')).to be_truthy
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'and one of the names is a built type' do
|
242
|
+
expect(func.call(@scope, 'meh', 'file', 'booness')).to be_truthy
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'and one of the names is a defined class' do
|
246
|
+
newclass 'yayness'
|
247
|
+
expect(func.call(@scope, 'meh', 'yayness', 'booness')).to be_truthy
|
248
|
+
end
|
249
|
+
|
250
|
+
it 'is true when at least one variable exists in scope' do
|
251
|
+
@scope['x'] = 'something'
|
252
|
+
expect(func.call(@scope, '$y', '$x', '$z')).to be_truthy
|
253
|
+
end
|
254
|
+
|
255
|
+
it 'is false when none of the names are defined' do
|
256
|
+
expect(func.call(@scope, 'meh', 'yayness', 'booness')).to be_falsey
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'raises an argument error when asking if Resource type is defined' do
|
261
|
+
resource_type = Puppet::Pops::Types::TypeFactory.resource
|
262
|
+
expect { func.call(@scope, resource_type)}.to raise_error(ArgumentError, /reference to all.*type/)
|
263
|
+
end
|
264
|
+
|
265
|
+
it 'raises an argument error if you ask if Class is defined' do
|
266
|
+
class_type = Puppet::Pops::Types::TypeFactory.host_class
|
267
|
+
expect { func.call(@scope, class_type) }.to raise_error(ArgumentError, /reference to all.*class/)
|
268
|
+
end
|
269
|
+
|
270
|
+
it 'raises error if referencing undef' do
|
271
|
+
expect{func.call(@scope, nil)}.to raise_error(ArgumentError, /mis-matched arguments/)
|
272
|
+
end
|
273
|
+
|
274
|
+
it 'raises error if referencing a number' do
|
275
|
+
expect{func.call(@scope, 42)}.to raise_error(ArgumentError, /mis-matched arguments/)
|
276
|
+
end
|
277
|
+
|
278
|
+
it 'is false if referencing empty string' do
|
279
|
+
expect(func.call(@scope, '')).to be_falsey
|
280
|
+
end
|
281
|
+
|
282
|
+
it "is true if referencing 'main'" do
|
283
|
+
# mimic what compiler does with "main" in intial import
|
284
|
+
newclass ''
|
285
|
+
newresource :class, ''
|
286
|
+
expect(func.call(@scope, 'main')).to be_truthy
|
287
|
+
end
|
288
|
+
|
289
|
+
end
|