puppet 4.4.2 → 4.5.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.
- data/CONTRIBUTING.md +5 -5
- data/Gemfile +2 -2
- data/LICENSE +2 -2
- data/README.md +5 -0
- data/ext/project_data.yaml +2 -0
- data/lib/hiera_puppet.rb +6 -14
- data/lib/puppet/application/agent.rb +2 -3
- data/lib/puppet/data_providers/hiera_config.rb +2 -4
- data/lib/puppet/data_providers/hiera_interpolate.rb +12 -154
- data/lib/puppet/data_providers/json_data_provider_factory.rb +0 -7
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -8
- data/lib/puppet/defaults.rb +70 -7
- data/lib/puppet/functions.rb +69 -0
- data/lib/puppet/functions/dig.rb +39 -0
- data/lib/puppet/functions/lest.rb +53 -0
- data/lib/puppet/functions/lookup.rb +40 -27
- data/lib/puppet/functions/new.rb +502 -0
- data/lib/puppet/functions/regsubst.rb +11 -10
- data/lib/puppet/functions/then.rb +74 -0
- data/lib/puppet/functions/type.rb +4 -4
- data/lib/puppet/functions/with.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +2 -0
- data/lib/puppet/indirector/resource_type/parser.rb +5 -0
- data/lib/puppet/indirector/rest.rb +5 -1
- data/lib/puppet/loaders.rb +2 -0
- data/lib/puppet/metatype/manager.rb +19 -2
- data/lib/puppet/module_tool/applications/application.rb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +6 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
- data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +0 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +6 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +20 -3
- data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +24 -2
- data/lib/puppet/parser/e4_parser_adapter.rb +13 -12
- data/lib/puppet/parser/environment_compiler.rb +2 -2
- data/lib/puppet/parser/resource.rb +14 -5
- data/lib/puppet/parser/scope.rb +18 -15
- data/lib/puppet/plugins/data_providers/data_provider.rb +19 -8
- data/lib/puppet/pops.rb +6 -0
- data/lib/puppet/pops/adapters.rb +5 -1
- data/lib/puppet/pops/evaluator/access_operator.rb +52 -14
- data/lib/puppet/pops/evaluator/compare_operator.rb +34 -4
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +75 -22
- data/lib/puppet/pops/evaluator/literal_evaluator.rb +7 -6
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +13 -1
- data/lib/puppet/pops/evaluator/runtime3_support.rb +14 -4
- data/lib/puppet/pops/functions/dispatcher.rb +1 -1
- data/lib/puppet/pops/issues.rb +18 -2
- data/lib/puppet/pops/loader/base_loader.rb +48 -7
- data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
- data/lib/puppet/pops/loader/loader.rb +12 -0
- data/lib/puppet/pops/loader/predefined_loader.rb +29 -0
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +57 -0
- data/lib/puppet/pops/loader/static_loader.rb +92 -5
- data/lib/puppet/pops/loader/type_definition_instantiator.rb +25 -3
- data/lib/puppet/pops/loaders.rb +84 -14
- data/lib/puppet/pops/lookup/explainer.rb +38 -1
- data/lib/puppet/pops/lookup/interpolation.rb +115 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +86 -0
- data/lib/puppet/pops/model/ast_transformer.rb +8 -1
- data/lib/puppet/pops/model/factory.rb +31 -8
- data/lib/puppet/pops/model/model.rb +8 -0
- data/lib/puppet/pops/model/model_label_provider.rb +1 -0
- data/lib/puppet/pops/model/model_meta.rb +7 -1
- data/lib/puppet/pops/model/model_tree_dumper.rb +4 -0
- data/lib/puppet/pops/parser/egrammar.ra +24 -7
- data/lib/puppet/pops/parser/eparser.rb +863 -798
- data/lib/puppet/pops/parser/evaluating_parser.rb +4 -0
- data/lib/puppet/pops/parser/locator.rb +8 -4
- data/lib/puppet/pops/pcore.rb +30 -0
- data/lib/puppet/pops/types/class_loader.rb +2 -4
- data/lib/puppet/pops/types/implementation_registry.rb +146 -0
- data/lib/puppet/pops/types/iterable.rb +4 -4
- data/lib/puppet/pops/types/p_object_type.rb +846 -0
- data/lib/puppet/pops/types/p_runtime_type.rb +102 -0
- data/lib/puppet/pops/types/p_sem_ver_range_type.rb +164 -0
- data/lib/puppet/pops/types/p_sem_ver_type.rb +113 -0
- data/lib/puppet/pops/types/puppet_object.rb +21 -0
- data/lib/puppet/pops/types/ruby_generator.rb +258 -0
- data/lib/puppet/pops/types/string_converter.rb +922 -0
- data/lib/puppet/pops/types/type_calculator.rb +29 -5
- data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
- data/lib/puppet/pops/types/type_factory.rb +49 -16
- data/lib/puppet/pops/types/type_formatter.rb +335 -112
- data/lib/puppet/pops/types/type_mismatch_describer.rb +110 -29
- data/lib/puppet/pops/types/type_parser.rb +205 -197
- data/lib/puppet/pops/types/types.rb +481 -103
- data/lib/puppet/pops/validation.rb +1 -1
- data/lib/puppet/pops/validation/checker4_0.rb +66 -4
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- data/lib/puppet/pops/visitor.rb +3 -1
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/provider/augeas/augeas.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +64 -20
- data/lib/puppet/provider/package/rpm.rb +112 -0
- data/lib/puppet/provider/package/yum.rb +7 -68
- data/lib/puppet/provider/service/daemontools.rb +3 -3
- data/lib/puppet/provider/service/init.rb +4 -2
- data/lib/puppet/provider/service/runit.rb +3 -3
- data/lib/puppet/provider/service/smf.rb +6 -3
- data/lib/puppet/provider/service/systemd.rb +59 -73
- data/lib/puppet/reference/providers.rb +1 -2
- data/lib/puppet/resource.rb +54 -37
- data/lib/puppet/resource/catalog.rb +31 -29
- data/lib/puppet/resource/type_collection.rb +23 -8
- data/lib/puppet/settings.rb +4 -2
- data/lib/puppet/settings/base_setting.rb +9 -3
- data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
- data/lib/puppet/test/test_helper.rb +0 -1
- data/lib/puppet/type.rb +9 -3
- data/lib/puppet/type/exec.rb +17 -17
- data/lib/puppet/type/file.rb +12 -0
- data/lib/puppet/type/file/content.rb +6 -6
- data/lib/puppet/type/file/ensure.rb +4 -4
- data/lib/puppet/type/file/source.rb +4 -4
- data/lib/puppet/type/file/target.rb +2 -2
- data/lib/puppet/type/mount.rb +18 -1
- data/lib/puppet/type/package.rb +3 -3
- data/lib/puppet/type/schedule.rb +4 -4
- data/lib/puppet/type/service.rb +15 -0
- data/lib/puppet/type/sshkey.rb +5 -3
- data/lib/puppet/type/tidy.rb +3 -3
- data/lib/puppet/type/zone.rb +5 -5
- data/lib/puppet/util/feature.rb +1 -1
- data/lib/puppet/util/monkey_patches.rb +8 -0
- data/lib/puppet/util/network_device/cisco/device.rb +16 -6
- data/lib/puppet/util/network_device/cisco/interface.rb +5 -6
- data/lib/puppet/util/plist.rb +3 -3
- data/lib/puppet/version.rb +1 -1
- data/spec/fixtures/unit/application/environments/production/data/common.yaml +13 -0
- data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +2 -1
- data/spec/fixtures/unit/data_providers/environments/production/modules/abc/manifests/init.pp +2 -1
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/data/empty_key.json +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/type/usee_type.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +6 -0
- data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
- data/spec/integration/module_tool/tar/mini_spec.rb +27 -27
- data/spec/integration/parser/catalog_spec.rb +14 -2
- data/spec/integration/parser/compiler_spec.rb +94 -3
- data/spec/integration/parser/resource_expressions_spec.rb +1 -1
- data/spec/integration/resource/type_collection_spec.rb +8 -0
- data/spec/lib/puppet_spec/compiler.rb +11 -4
- data/spec/shared_contexts/types_setup.rb +4 -0
- data/spec/unit/application/lookup_spec.rb +91 -9
- data/spec/unit/appmgmt_spec.rb +44 -35
- data/spec/unit/capability_spec.rb +33 -53
- data/spec/unit/data_providers/function_data_provider_spec.rb +19 -1
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +1 -1
- data/spec/unit/defaults_spec.rb +18 -0
- data/spec/unit/functions/assert_type_spec.rb +1 -1
- data/spec/unit/functions/dig_spec.rb +58 -0
- data/spec/unit/functions/lest_spec.rb +34 -0
- data/spec/unit/functions/lookup_spec.rb +108 -2
- data/spec/unit/functions/new_spec.rb +543 -0
- data/spec/unit/functions/regsubst_spec.rb +8 -0
- data/spec/unit/functions/then_spec.rb +40 -0
- data/spec/unit/functions4_spec.rb +78 -10
- data/spec/unit/hiera_puppet_spec.rb +49 -8
- data/spec/unit/indirector/resource_type/parser_spec.rb +5 -0
- data/spec/unit/indirector/rest_spec.rb +12 -0
- data/spec/unit/network/http/api/master/v3/environment_spec.rb +60 -0
- data/spec/unit/node/environment_spec.rb +10 -0
- data/spec/unit/parser/compiler_spec.rb +20 -1
- data/spec/unit/parser/functions/create_resources_spec.rb +2 -2
- data/spec/unit/parser/functions/shared.rb +1 -1
- data/spec/unit/parser/resource_spec.rb +8 -1
- data/spec/unit/parser/scope_spec.rb +45 -0
- data/spec/unit/pops/evaluator/access_ops_spec.rb +14 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +13 -5
- data/spec/unit/pops/loaders/static_loader_spec.rb +92 -1
- data/spec/unit/{data_providers/hiera_interpolation_spec.rb → pops/lookup/interpolation_spec.rb} +7 -5
- data/spec/unit/pops/parser/lexer2_spec.rb +2 -9
- data/spec/unit/pops/parser/parse_application_spec.rb +3 -8
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +19 -0
- data/spec/unit/pops/parser/parse_capabilities_spec.rb +3 -10
- data/spec/unit/pops/parser/parse_site_spec.rb +19 -10
- data/spec/unit/pops/parser/parser_rspec_helper.rb +0 -4
- data/spec/unit/pops/types/enumeration_spec.rb +13 -12
- data/spec/unit/pops/types/iterable_spec.rb +2 -2
- data/spec/unit/pops/types/p_object_type_spec.rb +1060 -0
- data/spec/unit/pops/types/p_sem_ver_type_spec.rb +285 -0
- data/spec/unit/pops/types/recursion_guard_spec.rb +19 -17
- data/spec/unit/pops/types/ruby_generator_spec.rb +261 -0
- data/spec/unit/pops/types/string_converter_spec.rb +904 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +430 -406
- data/spec/unit/pops/types/type_factory_spec.rb +119 -104
- data/spec/unit/pops/types/type_formatter_spec.rb +73 -6
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
- data/spec/unit/pops/types/type_parser_spec.rb +54 -15
- data/spec/unit/pops/types/types_spec.rb +113 -8
- data/spec/unit/pops/validator/validator_spec.rb +84 -10
- data/spec/unit/provider/package/pip3_spec.rb +9 -270
- data/spec/unit/provider/package/pip_spec.rb +85 -30
- data/spec/unit/provider/package/rpm_spec.rb +160 -3
- data/spec/unit/provider/package/yum_spec.rb +23 -134
- data/spec/unit/provider/service/smf_spec.rb +14 -2
- data/spec/unit/provider/service/systemd_spec.rb +33 -41
- data/spec/unit/resource/capability_finder_spec.rb +10 -2
- data/spec/unit/settings/file_setting_spec.rb +6 -0
- data/spec/unit/transaction/additional_resource_generator_spec.rb +80 -65
- data/spec/unit/type/mount_spec.rb +51 -10
- data/spec/unit/type/service_spec.rb +16 -0
- data/spec/unit/type_spec.rb +14 -0
- data/spec/unit/util/feature_spec.rb +1 -1
- data/spec/unit/util/monkey_patches_spec.rb +60 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +1 -1
- metadata +63 -11
- data/lib/puppet/pops/types/types_meta.rb +0 -0
- data/spec/integration/provider/package_spec.rb +0 -35
@@ -44,6 +44,10 @@ describe 'the regsubst function' do
|
|
44
44
|
it 'should handle case insensitive flag' do
|
45
45
|
expect(regsubst('the monkey breaks baNAna trees', 'b[an]+a', 'coconut', 'I')).to eql('the monkey breaks coconut trees')
|
46
46
|
end
|
47
|
+
|
48
|
+
it 'should allow hash as replacement' do
|
49
|
+
expect(regsubst('tuto', '[uo]', { 'u' => 'o', 'o' => 'u' }, 'G')).to eql('totu')
|
50
|
+
end
|
47
51
|
end
|
48
52
|
|
49
53
|
context 'when using a regexp pattern' do
|
@@ -70,6 +74,10 @@ describe 'the regsubst function' do
|
|
70
74
|
it 'should treat Regexp as Regexp[//]' do
|
71
75
|
expect(regsubst('abc', type_parser.parse("Regexp"), '_', 'G')).to eql('_a_b_c_')
|
72
76
|
end
|
77
|
+
|
78
|
+
it 'should allow hash as replacement' do
|
79
|
+
expect(regsubst('tuto', /[uo]/, { 'u' => 'o', 'o' => 'u' }, 'G')).to eql('totu')
|
80
|
+
end
|
73
81
|
end
|
74
82
|
|
75
83
|
context 'when using an array target' do
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'puppet_spec/compiler'
|
4
|
+
require 'matchers/resource'
|
5
|
+
|
6
|
+
describe 'the then function' do
|
7
|
+
include PuppetSpec::Compiler
|
8
|
+
include Matchers::Resource
|
9
|
+
|
10
|
+
it 'calls a lambda passing one argument' do
|
11
|
+
expect(compile_to_catalog("then(testing) |$x| { notify { $x: } }")).to have_resource('Notify[testing]')
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'produces what lambda returns if value is not undef' do
|
15
|
+
expect(compile_to_catalog("notify{ then(1) |$x| { testing }: }")).to have_resource('Notify[testing]')
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'does not call lambda if argument is undef' do
|
19
|
+
expect(compile_to_catalog('then(undef) |$x| { notify { "failed": } }')).to_not have_resource('Notify[failed]')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'produces undef if given value is undef' do
|
23
|
+
expect(compile_to_catalog(<<-SOURCE)).to have_resource('Notify[test-Undef-ing]')
|
24
|
+
notify{ "test-${type(then(undef) |$x| { testing })}-ing": }
|
25
|
+
SOURCE
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'errors when lambda wants too many args' do
|
29
|
+
expect do
|
30
|
+
compile_to_catalog('then(1) |$x, $y| { }')
|
31
|
+
end.to raise_error(/'then' block expects 1 argument, got 2/m)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'errors when lambda wants too few args' do
|
35
|
+
expect do
|
36
|
+
compile_to_catalog('then(1) || { }')
|
37
|
+
end.to raise_error(/'then' block expects 1 argument, got none/m)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -14,15 +14,15 @@ module FunctionAPISpecModule
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def add_function(name, function)
|
17
|
-
|
18
|
-
entry = Puppet::Pops::Loader::Loader::NamedEntry.new(typed_name, function, __FILE__)
|
19
|
-
@constants[typed_name] = entry
|
17
|
+
set_entry(Puppet::Pops::Loader::Loader::TypedName.new(:function, name), function, __FILE__)
|
20
18
|
end
|
21
19
|
|
22
20
|
def add_type(name, type)
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
set_entry(Puppet::Pops::Loader::Loader::TypedName.new(:type, name), type, __FILE__)
|
22
|
+
end
|
23
|
+
|
24
|
+
def set_entry(typed_name, value, origin = nil)
|
25
|
+
@constants[typed_name] = Puppet::Pops::Loader::Loader::NamedEntry.new(typed_name, value, origin)
|
26
26
|
end
|
27
27
|
|
28
28
|
# override StaticLoader
|
@@ -472,10 +472,10 @@ describe 'the 4x function api' do
|
|
472
472
|
end
|
473
473
|
end
|
474
474
|
|
475
|
-
context 'can use a loader when parsing types in function dispatch' do
|
475
|
+
context 'can use a loader when parsing types in function dispatch, and' do
|
476
476
|
let(:parser) { Puppet::Pops::Parser::EvaluatingParser.new }
|
477
477
|
|
478
|
-
it '
|
478
|
+
it 'resolve a referenced Type alias' do
|
479
479
|
the_loader = loader()
|
480
480
|
the_loader.add_type('myalias', type_alias_t('MyAlias', 'Integer'))
|
481
481
|
here = get_binding(the_loader)
|
@@ -495,7 +495,7 @@ describe 'the 4x function api' do
|
|
495
495
|
expect(parser.evaluate({}, program)).to eql(10)
|
496
496
|
end
|
497
497
|
|
498
|
-
it '
|
498
|
+
it 'reports a reference to an unresolved type' do
|
499
499
|
the_loader = loader()
|
500
500
|
here = get_binding(the_loader)
|
501
501
|
fc = eval(<<-CODE, here)
|
@@ -511,11 +511,79 @@ describe 'the 4x function api' do
|
|
511
511
|
the_loader.add_function('testing::test', fc.new({}, the_loader))
|
512
512
|
program = parser.parse_string('testing::test(10)', __FILE__)
|
513
513
|
Puppet::Pops::Adapters::LoaderAdapter.adapt(program.model).loader = the_loader
|
514
|
-
expect { parser.evaluate({}, program) }.to raise_error(Puppet::Error, /parameter 'x'
|
514
|
+
expect { parser.evaluate({}, program) }.to raise_error(Puppet::Error, /parameter 'x' references an unresolved type 'MyAlias'/)
|
515
|
+
end
|
516
|
+
|
517
|
+
it 'create local Type aliases' do
|
518
|
+
the_loader = loader()
|
519
|
+
here = get_binding(the_loader)
|
520
|
+
fc = eval(<<-CODE, here)
|
521
|
+
Puppet::Functions.create_function('testing::test') do
|
522
|
+
local_types do
|
523
|
+
type 'MyType = Array[Integer]'
|
524
|
+
end
|
525
|
+
dispatch :test do
|
526
|
+
param 'MyType', :x
|
527
|
+
end
|
528
|
+
def test(x)
|
529
|
+
x
|
530
|
+
end
|
531
|
+
end
|
532
|
+
CODE
|
533
|
+
the_loader.add_function('testing::test', fc.new({}, the_loader))
|
534
|
+
program = parser.parse_string('testing::test([10,20])', __FILE__)
|
535
|
+
Puppet::Pops::Adapters::LoaderAdapter.adapt(program.model).loader = the_loader
|
536
|
+
expect(parser.evaluate({}, program)).to eq([10,20])
|
537
|
+
end
|
538
|
+
|
539
|
+
it 'create nested local Type aliases' do
|
540
|
+
the_loader = loader()
|
541
|
+
here = get_binding(the_loader)
|
542
|
+
fc = eval(<<-CODE, here)
|
543
|
+
Puppet::Functions.create_function('testing::test') do
|
544
|
+
local_types do
|
545
|
+
type 'InnerType = Array[Integer]'
|
546
|
+
type 'OuterType = Hash[String,InnerType]'
|
547
|
+
end
|
548
|
+
dispatch :test do
|
549
|
+
param 'OuterType', :x
|
550
|
+
end
|
551
|
+
def test(x)
|
552
|
+
x
|
553
|
+
end
|
554
|
+
end
|
555
|
+
CODE
|
556
|
+
the_loader.add_function('testing::test', fc.new({}, the_loader))
|
557
|
+
program = parser.parse_string("testing::test({'x' => [10,20]})", __FILE__)
|
558
|
+
Puppet::Pops::Adapters::LoaderAdapter.adapt(program.model).loader = the_loader
|
559
|
+
expect(parser.evaluate({}, program)).to eq({'x' => [10,20]})
|
560
|
+
end
|
561
|
+
|
562
|
+
it 'create self referencing local Type aliases' do
|
563
|
+
the_loader = loader()
|
564
|
+
here = get_binding(the_loader)
|
565
|
+
fc = eval(<<-CODE, here)
|
566
|
+
Puppet::Functions.create_function('testing::test') do
|
567
|
+
local_types do
|
568
|
+
type 'Tree = Hash[String,Variant[String,Tree]]'
|
569
|
+
end
|
570
|
+
dispatch :test do
|
571
|
+
param 'Tree', :x
|
572
|
+
end
|
573
|
+
def test(x)
|
574
|
+
x
|
575
|
+
end
|
576
|
+
end
|
577
|
+
CODE
|
578
|
+
the_loader.add_function('testing::test', fc.new({}, the_loader))
|
579
|
+
program = parser.parse_string("testing::test({'x' => {'y' => 'n'}})", __FILE__)
|
580
|
+
Puppet::Pops::Adapters::LoaderAdapter.adapt(program.model).loader = the_loader
|
581
|
+
expect(parser.evaluate({}, program)).to eq({'x' => {'y' => 'n'}})
|
515
582
|
end
|
516
583
|
end
|
517
584
|
end
|
518
585
|
|
586
|
+
|
519
587
|
def create_noargs_function_class
|
520
588
|
f = Puppet::Functions.create_function('test') do
|
521
589
|
def test()
|
@@ -63,17 +63,58 @@ describe 'HieraPuppet' do
|
|
63
63
|
expect(HieraPuppet.send(:hiera_config_file)).to eq(Puppet[:hiera_config])
|
64
64
|
end
|
65
65
|
|
66
|
-
|
67
|
-
|
66
|
+
context 'when hiera_config is not set' do
|
67
|
+
let(:code_hiera_config) { File.join(Puppet[:codedir], 'hiera.yaml') }
|
68
|
+
let(:conf_hiera_config) { File.join(Puppet[:confdir], 'hiera.yaml') }
|
69
|
+
|
70
|
+
before(:each) do
|
71
|
+
Puppet.settings.setting(:hiera_config).send(:remove_instance_variable, :@evaluated_default)
|
68
72
|
Puppet.settings[:hiera_config] = nil
|
69
|
-
|
70
|
-
|
73
|
+
Puppet.settings[:codedir] = '/dev/null/puppetlabs/code'
|
74
|
+
Puppet.settings[:confdir] = '/dev/null/puppetlabs/puppet'
|
71
75
|
end
|
72
|
-
Puppet.settings[:codedir] = "/dev/null/puppet"
|
73
|
-
hiera_config = File.join(Puppet[:codedir], 'hiera.yaml')
|
74
|
-
Puppet::FileSystem.stubs(:exist?).with(hiera_config).returns(true)
|
75
76
|
|
76
|
-
|
77
|
+
it "should use Puppet.settings[:codedir]/hiera.yaml when '$codedir/hiera.yaml' exists and '$confdir/hiera.yaml' does not exist" do
|
78
|
+
Puppet::FileSystem.stubs(:exist?).with(code_hiera_config).returns(true)
|
79
|
+
Puppet::FileSystem.stubs(:exist?).with(conf_hiera_config).returns(false)
|
80
|
+
|
81
|
+
expect(HieraPuppet.send(:hiera_config_file)).to eq(code_hiera_config)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should use Puppet.settings[:confdir]/hiera.yaml when '$codedir/hiera.yaml' does not exist and '$confdir/hiera.yaml' exists" do
|
85
|
+
Puppet::FileSystem.stubs(:exist?).with(code_hiera_config).returns(false)
|
86
|
+
Puppet::FileSystem.stubs(:exist?).with(conf_hiera_config).returns(true)
|
87
|
+
|
88
|
+
expect(HieraPuppet.send(:hiera_config_file)).to eq(conf_hiera_config)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should use Puppet.settings[:codedir]/hiera.yaml when '$codedir/hiera.yaml' exists and '$confdir/hiera.yaml' exists" do
|
92
|
+
Puppet::FileSystem.stubs(:exist?).with(code_hiera_config).returns(true)
|
93
|
+
Puppet::FileSystem.stubs(:exist?).with(conf_hiera_config).returns(true)
|
94
|
+
|
95
|
+
expect(HieraPuppet.send(:hiera_config_file)).to eq(code_hiera_config)
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should return nil when neither '$codedir/hiera.yaml' nor '$confdir/hiera.yaml' exists" do
|
99
|
+
Puppet::FileSystem.stubs(:exist?).with(code_hiera_config).returns(false)
|
100
|
+
Puppet::FileSystem.stubs(:exist?).with(conf_hiera_config).returns(false)
|
101
|
+
|
102
|
+
expect(HieraPuppet.send(:hiera_config_file)).to eq(nil)
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should return explicitly set option even if both '$codedir/hiera.yaml' and '$confdir/hiera.yaml' exists" do
|
106
|
+
if Puppet::Util::Platform.windows?
|
107
|
+
explicit_hiera_config = 'C:/an/explicit/hiera.yaml'
|
108
|
+
else
|
109
|
+
explicit_hiera_config = '/an/explicit/hiera.yaml'
|
110
|
+
end
|
111
|
+
Puppet.settings[:hiera_config] = explicit_hiera_config
|
112
|
+
Puppet::FileSystem.stubs(:exist?).with(explicit_hiera_config).returns(true)
|
113
|
+
Puppet::FileSystem.stubs(:exist?).with(code_hiera_config).returns(true)
|
114
|
+
Puppet::FileSystem.stubs(:exist?).with(conf_hiera_config).returns(true)
|
115
|
+
|
116
|
+
expect(HieraPuppet.send(:hiera_config_file)).to eq(explicit_hiera_config)
|
117
|
+
end
|
77
118
|
end
|
78
119
|
end
|
79
120
|
|
@@ -21,6 +21,11 @@ describe Puppet::Indirector::ResourceType::Parser do
|
|
21
21
|
expect(Puppet::Indirector::Terminus.terminus_class(:resource_type, :parser)).to equal(Puppet::Indirector::ResourceType::Parser)
|
22
22
|
end
|
23
23
|
|
24
|
+
it "is deprecated on the network, but still allows requests" do
|
25
|
+
Puppet.expects(:deprecation_warning)
|
26
|
+
expect(Puppet::Indirector::ResourceType::Parser.new.allow_remote_requests?).to eq(true)
|
27
|
+
end
|
28
|
+
|
24
29
|
describe "when finding" do
|
25
30
|
it "should return any found type from the request's environment" do
|
26
31
|
type = Puppet::Resource::Type.new(:hostclass, "foo")
|
@@ -190,6 +190,18 @@ describe Puppet::Indirector::REST do
|
|
190
190
|
expect(Puppet::Indirector::REST.srv_service).to eq(:puppet)
|
191
191
|
end
|
192
192
|
|
193
|
+
it 'excludes yaml from the Accept header' do
|
194
|
+
model.expects(:supported_formats).returns([:pson, :yaml, :binary])
|
195
|
+
|
196
|
+
expect(terminus.headers['Accept']).to eq('pson, binary')
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'excludes b64_zlib_yaml from the Accept header' do
|
200
|
+
model.expects(:supported_formats).returns([:pson, :b64_zlib_yaml])
|
201
|
+
|
202
|
+
expect(terminus.headers['Accept']).to eq('pson')
|
203
|
+
end
|
204
|
+
|
193
205
|
describe "when creating an HTTP client" do
|
194
206
|
it "should use the class's server and port if the indirection request provides neither" do
|
195
207
|
@request = stub 'request', :key => "foo", :server => nil, :port => nil
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'puppet/network/http'
|
4
|
+
|
5
|
+
describe Puppet::Network::HTTP::API::Master::V3::Environment do
|
6
|
+
let(:response) { Puppet::Network::HTTP::MemoryResponse.new }
|
7
|
+
|
8
|
+
around :each do |example|
|
9
|
+
environment = Puppet::Node::Environment.create(:production, [], '/manifests')
|
10
|
+
loader = Puppet::Environments::Static.new(environment)
|
11
|
+
Puppet.override(:environments => loader) do
|
12
|
+
example.run
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns the environment catalog" do
|
17
|
+
request = Puppet::Network::HTTP::Request.from_hash(:headers => { 'accept' => 'application/json' }, :routing_path => "environment/production")
|
18
|
+
|
19
|
+
subject.call(request, response)
|
20
|
+
|
21
|
+
expect(response.code).to eq(200)
|
22
|
+
|
23
|
+
catalog = JSON.parse(response.body)
|
24
|
+
expect(catalog['environment']).to eq('production')
|
25
|
+
expect(catalog['applications']).to eq({})
|
26
|
+
end
|
27
|
+
|
28
|
+
it "returns 404 if the environment doesn't exist" do
|
29
|
+
request = Puppet::Network::HTTP::Request.from_hash(:routing_path => "environment/development")
|
30
|
+
|
31
|
+
expect { subject.call(request, response) }.to raise_error(Puppet::Network::HTTP::Error::HTTPNotFoundError, /development is not a known environment/)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "omits code_id if unspecified" do
|
35
|
+
request = Puppet::Network::HTTP::Request.from_hash(:routing_path => "environment/production")
|
36
|
+
|
37
|
+
subject.call(request, response)
|
38
|
+
|
39
|
+
expect(JSON.parse(response.body)['code_id']).to be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it "includes code_id if specified" do
|
43
|
+
request = Puppet::Network::HTTP::Request.from_hash(:params => {:code_id => '12345'}, :routing_path => "environment/production")
|
44
|
+
|
45
|
+
subject.call(request, response)
|
46
|
+
|
47
|
+
expect(JSON.parse(response.body)['code_id']).to eq('12345')
|
48
|
+
end
|
49
|
+
|
50
|
+
it "uses code_id from the catalog if it differs from the request" do
|
51
|
+
request = Puppet::Network::HTTP::Request.from_hash(:params => {:code_id => '12345'}, :routing_path => "environment/production")
|
52
|
+
|
53
|
+
Puppet::Resource::Catalog.any_instance.stubs(:code_id).returns('67890')
|
54
|
+
|
55
|
+
subject.call(request, response)
|
56
|
+
|
57
|
+
expect(JSON.parse(response.body)['code_id']).to eq('67890')
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
@@ -428,6 +428,16 @@ describe Puppet::Node::Environment do
|
|
428
428
|
end
|
429
429
|
|
430
430
|
describe "when performing initial import" do
|
431
|
+
let(:loaders) { Puppet::Pops::Loaders.new(env) }
|
432
|
+
|
433
|
+
around :each do |example|
|
434
|
+
Puppet::Parser::Compiler.any_instance.stubs(:loaders).returns(loaders)
|
435
|
+
Puppet.override(:loaders => loaders, :current_environment => env) do
|
436
|
+
example.run
|
437
|
+
Puppet::Pops::Loaders.clear
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
431
441
|
it "loads from Puppet[:code]" do
|
432
442
|
Puppet[:code] = "define foo {}"
|
433
443
|
krt = env.known_resource_types
|
@@ -258,7 +258,7 @@ describe Puppet::Parser::Compiler do
|
|
258
258
|
expect(@compiler.topscope['c']).to eq("d")
|
259
259
|
end
|
260
260
|
|
261
|
-
it "should set node parameters
|
261
|
+
it "should set node parameters that are of Symbol type as String variables in the top scope" do
|
262
262
|
params = {"a" => :b}
|
263
263
|
@node.stubs(:parameters).returns(params)
|
264
264
|
compile_stub(:set_node_parameters)
|
@@ -838,6 +838,24 @@ describe Puppet::Parser::Compiler do
|
|
838
838
|
end
|
839
839
|
end
|
840
840
|
|
841
|
+
describe 'when using meta parameters to form relationships' do
|
842
|
+
include PuppetSpec::Compiler
|
843
|
+
[:before, :subscribe, :notify, :require].each do | meta_p |
|
844
|
+
it "an entry consisting of nested empty arrays is flattened for parameter #{meta_p}" do
|
845
|
+
expect {
|
846
|
+
node = Puppet::Node.new('someone')
|
847
|
+
manifest = <<-"MANIFEST"
|
848
|
+
notify{hello_kitty: message => meow, #{meta_p} => [[],[]]}
|
849
|
+
notify{hello_kitty2: message => meow, #{meta_p} => [[],[[]],[]]}
|
850
|
+
MANIFEST
|
851
|
+
|
852
|
+
catalog = compile_to_catalog(manifest, node)
|
853
|
+
catalog.to_ral
|
854
|
+
}.not_to raise_error
|
855
|
+
end
|
856
|
+
end
|
857
|
+
end
|
858
|
+
|
841
859
|
describe "when evaluating node classes" do
|
842
860
|
include PuppetSpec::Compiler
|
843
861
|
|
@@ -951,6 +969,7 @@ describe Puppet::Parser::Compiler do
|
|
951
969
|
end
|
952
970
|
end
|
953
971
|
|
972
|
+
|
954
973
|
describe "when managing resource overrides" do
|
955
974
|
|
956
975
|
before do
|
@@ -103,7 +103,7 @@ describe 'function for dynamically creating resources' do
|
|
103
103
|
|
104
104
|
create_resources('foocreateresource', {'blah'=>{}})
|
105
105
|
MANIFEST
|
106
|
-
}.to raise_error(Puppet::Error, /Foocreateresource\[blah\]: expects a value for parameter 'one' on node
|
106
|
+
}.to raise_error(Puppet::Error, /Foocreateresource\[blah\]: expects a value for parameter 'one' on node test/)
|
107
107
|
end
|
108
108
|
|
109
109
|
it 'should be able to add multiple defines' do
|
@@ -169,7 +169,7 @@ describe 'function for dynamically creating resources' do
|
|
169
169
|
compile_to_catalog(<<-MANIFEST)
|
170
170
|
create_resources('class', {'blah'=>{'one'=>'two'}})
|
171
171
|
MANIFEST
|
172
|
-
end.to raise_error(/Could not find declared class blah at line 1:11 on node
|
172
|
+
end.to raise_error(/Could not find declared class blah at line 1:11 on node test/)
|
173
173
|
end
|
174
174
|
|
175
175
|
it 'should be able to add edges' do
|
@@ -24,7 +24,7 @@ shared_examples_for 'all functions transforming relative to absolute names' do |
|
|
24
24
|
it 'raises and error for Resource that is not of class type' do
|
25
25
|
expect {
|
26
26
|
@scope.send(func_method, [Puppet::Pops::Types::TypeFactory.resource('file')])
|
27
|
-
}.to raise_error(ArgumentError, /Cannot use a Resource\[
|
27
|
+
}.to raise_error(ArgumentError, /Cannot use a Resource\[File\] where a Resource\['class', name\] is expected/)
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'raises and error for Resource that is unspecific' do
|
@@ -193,6 +193,13 @@ describe Puppet::Parser::Resource do
|
|
193
193
|
expect(@compiler.catalog).to be_edge(foo_stage, resource)
|
194
194
|
end
|
195
195
|
|
196
|
+
it 'should allow a resource reference to be undef' do
|
197
|
+
Puppet[:code] = "notify { 'hello': message=>'yo', notify => undef }"
|
198
|
+
catalog = Puppet::Parser::Compiler.compile(Puppet::Node.new 'anyone')
|
199
|
+
edges = catalog.edges.map {|e| [e.source.ref, e.target.ref]}
|
200
|
+
expect(edges).to include(['Class[main]', 'Notify[hello]'])
|
201
|
+
end
|
202
|
+
|
196
203
|
it "should allow edges to propagate multiple levels down the scope hierarchy" do
|
197
204
|
Puppet[:code] = <<-MANIFEST
|
198
205
|
stage { before: before => Stage[main] }
|
@@ -556,7 +563,7 @@ describe Puppet::Parser::Resource do
|
|
556
563
|
|
557
564
|
# part of #629 -- the undef keyword. Make sure 'undef' params get skipped.
|
558
565
|
it "should not include 'undef' parameters when converting itself to a hash" do
|
559
|
-
resource = Puppet::Parser::Resource.new "file", "/tmp/testing", :source => mock("source"), :scope =>
|
566
|
+
resource = Puppet::Parser::Resource.new "file", "/tmp/testing", :source => mock("source"), :scope => @scope
|
560
567
|
resource[:owner] = :undef
|
561
568
|
resource[:mode] = "755"
|
562
569
|
expect(resource.to_hash[:owner]).to be_nil
|