puppet 4.1.0 → 4.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/COMMITTERS.md +2 -2
- data/CONTRIBUTING.md +34 -10
- data/Gemfile +26 -9
- data/LICENSE +3 -3
- data/MAINTAINERS +71 -0
- data/README.md +9 -11
- data/Rakefile +35 -0
- data/conf/auth.conf +2 -2
- data/conf/puppet.conf +1 -1
- data/ext/README.environment +1 -1
- data/ext/build_defaults.yaml +2 -2
- data/ext/debian/README.source +1 -1
- data/ext/debian/control +3 -5
- data/ext/debian/copyright +4 -4
- data/ext/debian/puppet.init +0 -1
- data/ext/debian/puppet.logrotate +14 -5
- data/ext/debian/puppetmaster.README.debian +11 -9
- data/ext/emacs/puppet-mode.el +1 -1
- data/ext/envpuppet +2 -2
- data/ext/ips/puppetagent.xml +1 -1
- data/ext/ips/puppetmaster.xml +1 -1
- data/ext/osx/puppet.plist +30 -0
- data/ext/project_data.yaml +31 -15
- data/ext/puppet-test +3 -3
- data/ext/rack/example-passenger-vhost.conf +1 -1
- data/ext/redhat/client.init +67 -17
- data/ext/redhat/client.sysconfig +1 -10
- data/ext/redhat/logrotate +15 -3
- data/ext/redhat/puppet.spec.erb +6 -11
- data/ext/redhat/server.init +1 -1
- data/ext/regexp_nodes/regexp_nodes.rb +1 -1
- data/ext/solaris/pkginfo +1 -1
- data/ext/solaris/smf/puppet +44 -0
- data/ext/solaris/smf/puppet.xml +44 -0
- data/ext/suse/client.init +30 -33
- data/ext/suse/puppet.spec +2 -2
- data/ext/suse/server.init +2 -2
- data/ext/systemd/puppet.service +13 -1
- data/ext/upload_facts.rb +1 -1
- data/ext/windows/puppet_interactive.bat +6 -0
- data/ext/windows/puppet_shell.bat +9 -0
- data/ext/windows/run_puppet_interactive.bat +9 -0
- data/ext/windows/service/daemon.rb +2 -1
- data/ext/yaml_nodes.rb +1 -1
- data/install.rb +98 -65
- data/lib/hiera/puppet_function.rb +17 -18
- data/lib/hiera/scope.rb +12 -14
- data/lib/hiera_puppet.rb +6 -14
- data/lib/puppet/agent/locker.rb +11 -2
- data/lib/puppet/agent.rb +12 -27
- data/lib/puppet/application/agent.rb +35 -19
- data/lib/puppet/application/apply.rb +46 -14
- data/lib/puppet/application/ca.rb +1 -0
- data/lib/puppet/application/cert.rb +52 -3
- data/lib/puppet/application/device.rb +2 -2
- data/lib/puppet/application/face_base.rb +4 -0
- data/lib/puppet/application/filebucket.rb +79 -5
- data/lib/puppet/application/generate.rb +5 -0
- data/lib/puppet/application/inspect.rb +5 -2
- data/lib/puppet/application/lookup.rb +344 -0
- data/lib/puppet/application/master.rb +7 -3
- data/lib/puppet/application/resource.rb +2 -6
- data/lib/puppet/application.rb +20 -4
- data/lib/puppet/application_support.rb +1 -1
- data/lib/puppet/compilable_resource_type.rb +15 -0
- data/lib/puppet/configurer/plugin_handler.rb +7 -5
- data/lib/puppet/configurer.rb +177 -37
- data/lib/puppet/context/trusted_information.rb +21 -1
- data/lib/puppet/context.rb +16 -1
- data/lib/puppet/daemon.rb +17 -13
- data/lib/puppet/data_binding.rb +4 -2
- data/lib/puppet/data_providers/data_adapter.rb +14 -68
- data/lib/puppet/data_providers/data_function_support.rb +13 -26
- data/lib/puppet/data_providers/function_env_data_provider.rb +7 -9
- data/lib/puppet/data_providers/function_module_data_provider.rb +7 -22
- data/lib/puppet/data_providers/hiera_config.rb +151 -0
- data/lib/puppet/data_providers/hiera_env_data_provider.rb +25 -0
- data/lib/puppet/data_providers/hiera_interpolate.rb +21 -0
- data/lib/puppet/data_providers/hiera_module_data_provider.rb +30 -0
- data/lib/puppet/data_providers/hiera_support.rb +42 -0
- data/lib/puppet/data_providers/json_data_provider_factory.rb +38 -0
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +40 -0
- data/lib/puppet/data_providers.rb +17 -14
- data/lib/puppet/defaults.rb +273 -59
- data/lib/puppet/environments.rb +104 -9
- data/lib/puppet/error.rb +4 -0
- data/lib/puppet/etc.rb +125 -0
- data/lib/puppet/external/dot.rb +1 -1
- data/lib/puppet/face/ca.rb +6 -1
- data/lib/puppet/face/catalog.rb +1 -1
- data/lib/puppet/face/certificate.rb +7 -1
- data/lib/puppet/face/certificate_request.rb +2 -0
- data/lib/puppet/face/certificate_revocation_list.rb +2 -0
- data/lib/puppet/face/config.rb +2 -2
- data/lib/puppet/face/epp.rb +63 -17
- data/lib/puppet/face/file.rb +3 -0
- data/lib/puppet/face/generate.rb +64 -0
- data/lib/puppet/face/help/face.erb +3 -0
- data/lib/puppet/face/help/man.erb +1 -1
- data/lib/puppet/face/help.rb +35 -27
- data/lib/puppet/face/key.rb +1 -0
- data/lib/puppet/face/man.rb +5 -3
- data/lib/puppet/face/module/changes.rb +2 -1
- data/lib/puppet/face/module/generate.rb +1 -1
- data/lib/puppet/face/module/install.rb +6 -6
- data/lib/puppet/face/parser.rb +12 -9
- data/lib/puppet/face/plugin.rb +7 -14
- data/lib/puppet/face/status.rb +4 -1
- data/lib/puppet/feature/base.rb +9 -2
- data/lib/puppet/feature/cfacter.rb +1 -0
- data/lib/puppet/feature/cfpropertylist.rb +3 -0
- data/lib/puppet/feature/external_facts.rb +1 -1
- data/lib/puppet/feature/hiera_eyaml.rb +3 -0
- data/lib/puppet/feature/hocon.rb +3 -0
- data/lib/puppet/feature/telnet.rb +9 -0
- data/lib/puppet/file_bucket/dipper.rb +58 -2
- data/lib/puppet/file_serving/http_metadata.rb +46 -0
- data/lib/puppet/file_serving/metadata.rb +18 -2
- data/lib/puppet/file_serving/terminus_selector.rb +2 -0
- data/lib/puppet/file_system/file_impl.rb +7 -2
- data/lib/puppet/file_system/memory_impl.rb +5 -1
- data/lib/puppet/file_system/path_pattern.rb +1 -0
- data/lib/puppet/file_system/uniquefile.rb +3 -3
- data/lib/puppet/file_system/windows.rb +28 -13
- data/lib/puppet/file_system.rb +33 -5
- data/lib/puppet/forge/repository.rb +3 -35
- data/lib/puppet/forge.rb +7 -7
- data/lib/puppet/functions/alert.rb +14 -0
- data/lib/puppet/functions/assert_type.rb +53 -19
- data/lib/puppet/functions/binary_file.rb +19 -0
- data/lib/puppet/functions/break.rb +22 -0
- data/lib/puppet/functions/contain.rb +33 -0
- data/lib/puppet/functions/crit.rb +14 -0
- data/lib/puppet/functions/debug.rb +14 -0
- data/lib/puppet/functions/defined.rb +88 -58
- data/lib/puppet/functions/dig.rb +23 -0
- data/lib/puppet/functions/each.rb +89 -39
- data/lib/puppet/functions/emerg.rb +14 -0
- data/lib/puppet/functions/epp.rb +29 -37
- data/lib/puppet/functions/err.rb +14 -0
- data/lib/puppet/functions/eyaml_lookup_key.rb +90 -0
- data/lib/puppet/functions/filter.rb +64 -38
- data/lib/puppet/functions/find_file.rb +31 -0
- data/lib/puppet/functions/hiera.rb +76 -3
- data/lib/puppet/functions/hiera_array.rb +66 -4
- data/lib/puppet/functions/hiera_hash.rb +74 -2
- data/lib/puppet/functions/hiera_include.rb +78 -5
- data/lib/puppet/functions/hocon_data.rb +35 -0
- data/lib/puppet/functions/include.rb +21 -0
- data/lib/puppet/functions/info.rb +14 -0
- data/lib/puppet/functions/inline_epp.rb +44 -71
- data/lib/puppet/functions/json_data.rb +29 -0
- data/lib/puppet/functions/lest.rb +17 -0
- data/lib/puppet/functions/lookup.rb +172 -184
- data/lib/puppet/functions/map.rb +60 -33
- data/lib/puppet/functions/match.rb +30 -12
- data/lib/puppet/functions/new.rb +31 -0
- data/lib/puppet/functions/next.rb +23 -0
- data/lib/puppet/functions/notice.rb +14 -0
- data/lib/puppet/functions/reduce.rb +99 -70
- data/lib/puppet/functions/regsubst.rb +22 -25
- data/lib/puppet/functions/require.rb +37 -0
- data/lib/puppet/functions/return.rb +22 -0
- data/lib/puppet/functions/reverse_each.rb +25 -0
- data/lib/puppet/functions/scanf.rb +15 -18
- data/lib/puppet/functions/slice.rb +22 -36
- data/lib/puppet/functions/split.rb +2 -2
- data/lib/puppet/functions/step.rb +26 -0
- data/lib/puppet/functions/strftime.rb +35 -0
- data/lib/puppet/functions/then.rb +14 -0
- data/lib/puppet/functions/type.rb +31 -0
- data/lib/puppet/functions/unwrap.rb +40 -0
- data/lib/puppet/functions/versioncmp.rb +36 -0
- data/lib/puppet/functions/warning.rb +14 -0
- data/lib/puppet/functions/with.rb +15 -7
- data/lib/puppet/functions/yaml_data.rb +38 -0
- data/lib/puppet/functions.rb +180 -32
- data/lib/puppet/generate/models/type/property.rb +70 -0
- data/lib/puppet/generate/models/type/type.rb +61 -0
- data/lib/puppet/generate/templates/type/pcore.erb +42 -0
- data/lib/puppet/generate/type.rb +239 -0
- data/lib/puppet/graph/rb_tree_map.rb +1 -1
- data/lib/puppet/graph/simple_graph.rb +6 -8
- data/lib/puppet/indirector/catalog/compiler.rb +195 -8
- data/lib/puppet/indirector/catalog/static_compiler.rb +50 -31
- data/lib/puppet/indirector/data_binding/none.rb +4 -1
- data/lib/puppet/indirector/face.rb +6 -1
- data/lib/puppet/indirector/facts/facter.rb +3 -6
- data/lib/puppet/indirector/file_bucket_file/file.rb +137 -25
- data/lib/puppet/indirector/file_content/http.rb +15 -0
- data/lib/puppet/indirector/file_metadata/http.rb +27 -0
- data/lib/puppet/indirector/generic_http.rb +16 -0
- data/lib/puppet/indirector/hiera.rb +7 -1
- data/lib/puppet/indirector/indirection.rb +12 -3
- data/lib/puppet/indirector/json.rb +3 -3
- data/lib/puppet/indirector/key/ca.rb +2 -2
- data/lib/puppet/indirector/key/file.rb +2 -1
- data/lib/puppet/indirector/msgpack.rb +2 -2
- data/lib/puppet/indirector/node/exec.rb +1 -1
- data/lib/puppet/indirector/node/ldap.rb +1 -1
- data/lib/puppet/indirector/request.rb +36 -12
- data/lib/puppet/indirector/resource_type/parser.rb +10 -3
- data/lib/puppet/indirector/rest.rb +80 -5
- data/lib/puppet/indirector/ssl_file.rb +24 -3
- data/lib/puppet/indirector/terminus.rb +4 -4
- data/lib/puppet/info_service/class_information_service.rb +111 -0
- data/lib/puppet/info_service.rb +7 -0
- data/lib/puppet/interface/documentation.rb +1 -1
- data/lib/puppet/interface/face_collection.rb +1 -1
- data/lib/puppet/interface.rb +14 -2
- data/lib/puppet/loaders.rb +5 -0
- data/lib/puppet/metatype/manager.rb +25 -8
- data/lib/puppet/module.rb +65 -31
- data/lib/puppet/module_tool/applications/application.rb +1 -1
- data/lib/puppet/module_tool/applications/builder.rb +5 -4
- data/lib/puppet/module_tool/applications/installer.rb +14 -14
- data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
- data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
- data/lib/puppet/module_tool/checksums.rb +1 -1
- data/lib/puppet/module_tool/errors/installer.rb +2 -2
- data/lib/puppet/module_tool/installed_modules.rb +7 -7
- data/lib/puppet/module_tool/local_tarball.rb +3 -3
- data/lib/puppet/module_tool/metadata.rb +34 -11
- data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +14 -3
- data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
- data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
- data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +2 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +25 -18
- data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -2
- data/lib/puppet/module_tool/tar/mini.rb +3 -3
- data/lib/puppet/module_tool.rb +5 -5
- data/lib/puppet/network/auth_config_parser.rb +1 -1
- data/lib/puppet/network/authconfig.rb +21 -1
- data/lib/puppet/network/authorization.rb +8 -1
- data/lib/puppet/network/http/api/indirected_routes.rb +23 -34
- data/lib/puppet/network/http/api/master/v3/environment.rb +63 -0
- data/lib/puppet/network/http/api/master/v3.rb +7 -1
- data/lib/puppet/network/http/compression.rb +2 -1
- data/lib/puppet/network/http/connection.rb +2 -0
- data/lib/puppet/network/http/error.rb +1 -1
- data/lib/puppet/network/http/factory.rb +8 -4
- data/lib/puppet/network/http/handler.rb +3 -2
- data/lib/puppet/network/http/pool.rb +9 -0
- data/lib/puppet/network/http/rack/rest.rb +25 -2
- data/lib/puppet/network/http/webrick.rb +2 -1
- data/lib/puppet/network/rights.rb +1 -11
- data/lib/puppet/node/environment.rb +49 -14
- data/lib/puppet/node/facts.rb +1 -1
- data/lib/puppet/node.rb +22 -7
- data/lib/puppet/parameter/boolean.rb +1 -1
- data/lib/puppet/parameter/value.rb +1 -1
- data/lib/puppet/parameter.rb +23 -3
- data/lib/puppet/parser/ast/pops_bridge.rb +97 -27
- data/lib/puppet/parser/ast/resource.rb +5 -0
- data/lib/puppet/parser/ast/resource_instance.rb +5 -1
- data/lib/puppet/parser/ast/resourceparam.rb +5 -0
- data/lib/puppet/parser/ast.rb +5 -0
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
- data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +60 -0
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
- data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
- data/lib/puppet/parser/compiler.rb +325 -42
- data/lib/puppet/parser/e4_parser_adapter.rb +13 -12
- data/lib/puppet/parser/environment_compiler.rb +201 -0
- data/lib/puppet/parser/functions/assert_type.rb +47 -17
- data/lib/puppet/parser/functions/binary_file.rb +24 -0
- data/lib/puppet/parser/functions/break.rb +39 -0
- data/lib/puppet/parser/functions/contain.rb +7 -15
- data/lib/puppet/parser/functions/create_resources.rb +39 -23
- data/lib/puppet/parser/functions/defined.rb +106 -93
- data/lib/puppet/parser/functions/dig.rb +29 -0
- data/lib/puppet/parser/functions/each.rb +86 -28
- data/lib/puppet/parser/functions/epp.rb +30 -38
- data/lib/puppet/parser/functions/filter.rb +60 -24
- data/lib/puppet/parser/functions/find_file.rb +28 -0
- data/lib/puppet/parser/functions/fqdn_rand.rb +3 -3
- data/lib/puppet/parser/functions/hiera.rb +98 -28
- data/lib/puppet/parser/functions/hiera_array.rb +86 -29
- data/lib/puppet/parser/functions/hiera_hash.rb +96 -31
- data/lib/puppet/parser/functions/hiera_include.rb +96 -41
- data/lib/puppet/parser/functions/include.rb +4 -8
- data/lib/puppet/parser/functions/inline_epp.rb +36 -61
- data/lib/puppet/parser/functions/inline_template.rb +2 -2
- data/lib/puppet/parser/functions/lest.rb +49 -0
- data/lib/puppet/parser/functions/lookup.rb +129 -151
- data/lib/puppet/parser/functions/map.rb +56 -21
- data/lib/puppet/parser/functions/match.rb +29 -13
- data/lib/puppet/parser/functions/new.rb +926 -0
- data/lib/puppet/parser/functions/next.rb +38 -0
- data/lib/puppet/parser/functions/reduce.rb +98 -61
- data/lib/puppet/parser/functions/regsubst.rb +4 -2
- data/lib/puppet/parser/functions/require.rb +4 -27
- data/lib/puppet/parser/functions/return.rb +71 -0
- data/lib/puppet/parser/functions/reverse_each.rb +83 -0
- data/lib/puppet/parser/functions/scanf.rb +25 -31
- data/lib/puppet/parser/functions/slice.rb +18 -25
- data/lib/puppet/parser/functions/split.rb +2 -2
- data/lib/puppet/parser/functions/step.rb +84 -0
- data/lib/puppet/parser/functions/strftime.rb +185 -0
- data/lib/puppet/parser/functions/then.rb +73 -0
- data/lib/puppet/parser/functions/type.rb +53 -0
- data/lib/puppet/parser/functions/with.rb +17 -9
- data/lib/puppet/parser/functions.rb +34 -16
- data/lib/puppet/parser/resource.rb +149 -35
- data/lib/puppet/parser/scope.rb +344 -88
- data/lib/puppet/parser/type_loader.rb +1 -1
- data/lib/puppet/parser.rb +3 -1
- data/lib/puppet/plugins/configuration.rb +11 -2
- data/lib/puppet/plugins/data_providers/data_provider.rb +406 -0
- data/lib/puppet/plugins/data_providers/registry.rb +51 -0
- data/lib/puppet/plugins/data_providers.rb +15 -60
- data/lib/puppet/pops/adaptable.rb +4 -4
- data/lib/puppet/pops/adapters.rb +114 -31
- data/lib/puppet/pops/binder/binder.rb +21 -17
- data/lib/puppet/pops/binder/binder_issues.rb +8 -6
- data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
- data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
- data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
- data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
- data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
- data/lib/puppet/pops/binder/bindings_model.rb +49 -47
- data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
- data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
- data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
- data/lib/puppet/pops/binder/injector.rb +55 -50
- data/lib/puppet/pops/binder/key_factory.rb +10 -12
- data/lib/puppet/pops/binder/producers.rb +70 -65
- data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
- data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
- data/lib/puppet/pops/evaluator/access_operator.rb +246 -147
- data/lib/puppet/pops/evaluator/callable_signature.rb +7 -0
- data/lib/puppet/pops/evaluator/closure.rb +231 -115
- data/lib/puppet/pops/evaluator/collector_transformer.rb +44 -15
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -2
- data/lib/puppet/pops/evaluator/compare_operator.rb +69 -12
- data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +194 -106
- data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
- data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +84 -0
- data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
- data/lib/puppet/pops/evaluator/relationship_operator.rb +18 -11
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +60 -51
- data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
- data/lib/puppet/pops/evaluator/runtime3_support.rb +111 -79
- data/lib/puppet/pops/functions/dispatch.rb +27 -7
- data/lib/puppet/pops/functions/dispatcher.rb +15 -20
- data/lib/puppet/pops/functions/function.rb +30 -4
- data/lib/puppet/pops/issue_reporter.rb +7 -5
- data/lib/puppet/pops/issues.rb +177 -17
- data/lib/puppet/pops/label_provider.rb +18 -4
- data/lib/puppet/pops/loader/base_loader.rb +74 -20
- data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
- data/lib/puppet/pops/loader/loader.rb +43 -49
- data/lib/puppet/pops/loader/loader_paths.rb +48 -2
- data/lib/puppet/pops/loader/module_loaders.rb +53 -20
- data/lib/puppet/pops/loader/null_loader.rb +17 -1
- data/lib/puppet/pops/loader/predefined_loader.rb +29 -0
- data/lib/puppet/pops/loader/puppet_function_instantiator.rb +26 -20
- data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
- data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -4
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +96 -0
- data/lib/puppet/pops/loader/static_loader.rb +139 -38
- data/lib/puppet/pops/loader/type_definition_instantiator.rb +93 -0
- data/lib/puppet/pops/loader/typed_name.rb +48 -0
- data/lib/puppet/pops/loaders.rb +204 -26
- data/lib/puppet/pops/lookup/configured_data_provider.rb +93 -0
- data/lib/puppet/pops/lookup/context.rb +200 -0
- data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
- data/lib/puppet/pops/lookup/data_dig_function_provider.rb +145 -0
- data/lib/puppet/pops/lookup/data_hash_function_provider.rb +126 -0
- data/lib/puppet/pops/lookup/data_provider.rb +107 -0
- data/lib/puppet/pops/lookup/environment_data_provider.rb +35 -0
- data/lib/puppet/pops/lookup/explainer.rb +594 -0
- data/lib/puppet/pops/lookup/function_provider.rb +110 -0
- data/lib/puppet/pops/lookup/global_data_provider.rb +78 -0
- data/lib/puppet/pops/lookup/hiera_config.rb +782 -0
- data/lib/puppet/pops/lookup/interpolation.rb +153 -0
- data/lib/puppet/pops/lookup/invocation.rb +251 -0
- data/lib/puppet/pops/lookup/location_resolver.rb +99 -0
- data/lib/puppet/pops/lookup/lookup_adapter.rb +510 -0
- data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
- data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +92 -0
- data/lib/puppet/pops/lookup/module_data_provider.rb +81 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +90 -0
- data/lib/puppet/pops/lookup.rb +47 -49
- data/lib/puppet/pops/merge_strategy.rb +183 -47
- data/lib/puppet/pops/migration/migration_checker.rb +4 -0
- data/lib/puppet/pops/model/ast_transformer.rb +8 -1
- data/lib/puppet/pops/model/factory.rb +254 -162
- data/lib/puppet/pops/model/model.rb +25 -8
- data/lib/puppet/pops/model/model_label_provider.rb +28 -6
- data/lib/puppet/pops/model/model_meta.rb +45 -2
- data/lib/puppet/pops/model/model_tree_dumper.rb +44 -0
- data/lib/puppet/pops/parser/code_merger.rb +13 -1
- data/lib/puppet/pops/parser/egrammar.ra +150 -32
- data/lib/puppet/pops/parser/eparser.rb +1887 -1321
- data/lib/puppet/pops/parser/epp_support.rb +15 -9
- data/lib/puppet/pops/parser/evaluating_parser.rb +21 -13
- data/lib/puppet/pops/parser/heredoc_support.rb +16 -13
- data/lib/puppet/pops/parser/interpolation_support.rb +7 -0
- data/lib/puppet/pops/parser/lexer2.rb +465 -396
- data/lib/puppet/pops/parser/lexer_support.rb +85 -7
- data/lib/puppet/pops/parser/locator.rb +63 -9
- data/lib/puppet/pops/parser/parser_support.rb +40 -28
- data/lib/puppet/pops/parser/slurp_support.rb +23 -14
- data/lib/puppet/pops/patterns.rb +16 -1
- data/lib/puppet/pops/pcore.rb +96 -0
- data/lib/puppet/pops/puppet_stack.rb +43 -0
- data/lib/puppet/pops/resource/param.rb +55 -0
- data/lib/puppet/pops/resource/resource_type_impl.rb +314 -0
- data/lib/puppet/pops/resource/resource_type_set.pcore +22 -0
- data/lib/puppet/pops/serialization/abstract_reader.rb +176 -0
- data/lib/puppet/pops/serialization/abstract_writer.rb +207 -0
- data/lib/puppet/pops/serialization/deserializer.rb +77 -0
- data/lib/puppet/pops/serialization/extension.rb +157 -0
- data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
- data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
- data/lib/puppet/pops/serialization/json.rb +297 -0
- data/lib/puppet/pops/serialization/object.rb +71 -0
- data/lib/puppet/pops/serialization/rgen.rb +152 -0
- data/lib/puppet/pops/serialization/serializer.rb +118 -0
- data/lib/puppet/pops/serialization/time_factory.rb +67 -0
- data/lib/puppet/pops/serialization.rb +17 -0
- data/lib/puppet/pops/time/timespan.rb +718 -0
- data/lib/puppet/pops/time/timestamp.rb +148 -0
- data/lib/puppet/pops/types/annotatable.rb +36 -0
- data/lib/puppet/pops/types/class_loader.rb +25 -23
- data/lib/puppet/pops/types/enumeration.rb +9 -27
- data/lib/puppet/pops/types/implementation_registry.rb +141 -0
- data/lib/puppet/pops/types/iterable.rb +308 -0
- data/lib/puppet/pops/types/p_binary_type.rb +220 -0
- data/lib/puppet/pops/types/p_meta_type.rb +83 -0
- data/lib/puppet/pops/types/p_object_type.rb +886 -0
- data/lib/puppet/pops/types/p_runtime_type.rb +115 -0
- data/lib/puppet/pops/types/p_sem_ver_range_type.rb +187 -0
- data/lib/puppet/pops/types/p_sem_ver_type.rb +141 -0
- data/lib/puppet/pops/types/p_sensitive_type.rb +73 -0
- data/lib/puppet/pops/types/p_timespan_type.rb +141 -0
- data/lib/puppet/pops/types/p_timestamp_type.rb +69 -0
- data/lib/puppet/pops/types/p_type_set_type.rb +352 -0
- data/lib/puppet/pops/types/puppet_object.rb +16 -0
- data/lib/puppet/pops/types/recursion_guard.rb +136 -0
- data/lib/puppet/pops/types/ruby_generator.rb +275 -0
- data/lib/puppet/pops/types/string_converter.rb +1033 -0
- data/lib/puppet/pops/types/type_acceptor.rb +25 -0
- data/lib/puppet/pops/types/type_asserter.rb +21 -19
- data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
- data/lib/puppet/pops/types/type_calculator.rb +244 -1287
- data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
- data/lib/puppet/pops/types/type_factory.rb +222 -169
- data/lib/puppet/pops/types/type_formatter.rb +686 -0
- data/lib/puppet/pops/types/type_mismatch_describer.rb +1105 -0
- data/lib/puppet/pops/types/type_parser.rb +364 -281
- data/lib/puppet/pops/types/type_set_reference.rb +59 -0
- data/lib/puppet/pops/types/types.rb +3286 -307
- data/lib/puppet/pops/utils.rb +11 -10
- data/lib/puppet/pops/validation/checker4_0.rb +238 -56
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +13 -5
- data/lib/puppet/pops/validation.rb +31 -16
- data/lib/puppet/pops/visitor.rb +9 -6
- data/lib/puppet/pops.rb +40 -25
- data/lib/puppet/property/ensure.rb +1 -1
- data/lib/puppet/property.rb +67 -7
- data/lib/puppet/provider/aixobject.rb +4 -4
- data/lib/puppet/provider/augeas/augeas.rb +57 -2
- data/lib/puppet/provider/cron/crontab.rb +1 -1
- data/lib/puppet/provider/exec/windows.rb +1 -1
- data/lib/puppet/provider/exec.rb +10 -3
- data/lib/puppet/provider/group/aix.rb +4 -4
- data/lib/puppet/provider/group/directoryservice.rb +10 -0
- data/lib/puppet/provider/group/pw.rb +1 -0
- data/lib/puppet/provider/group/windows_adsi.rb +15 -3
- data/lib/puppet/provider/macauthorization/macauthorization.rb +11 -10
- data/lib/puppet/provider/mailalias/aliases.rb +1 -1
- data/lib/puppet/provider/mcx/mcxcontent.rb +5 -4
- data/lib/puppet/provider/mount/parsed.rb +16 -2
- data/lib/puppet/provider/nameservice/directoryservice.rb +55 -62
- data/lib/puppet/provider/nameservice.rb +23 -8
- data/lib/puppet/provider/package/appdmg.rb +7 -6
- data/lib/puppet/provider/package/apple.rb +1 -1
- data/lib/puppet/provider/package/dnf.rb +46 -0
- data/lib/puppet/provider/package/gem.rb +29 -3
- data/lib/puppet/provider/package/nim.rb +2 -2
- data/lib/puppet/provider/package/openbsd.rb +7 -7
- data/lib/puppet/provider/package/pacman.rb +11 -10
- data/lib/puppet/provider/package/pip.rb +72 -20
- data/lib/puppet/provider/package/pip3.rb +20 -0
- data/lib/puppet/provider/package/pkg.rb +12 -8
- data/lib/puppet/provider/package/pkgdmg.rb +11 -8
- data/lib/puppet/provider/package/pkgin.rb +4 -4
- data/lib/puppet/provider/package/pkgng.rb +15 -6
- data/lib/puppet/provider/package/pkgutil.rb +1 -1
- data/lib/puppet/provider/package/portage.rb +48 -8
- data/lib/puppet/provider/package/puppet_gem.rb +0 -0
- data/lib/puppet/provider/package/rpm.rb +123 -17
- data/lib/puppet/provider/package/sun.rb +1 -1
- data/lib/puppet/provider/package/tdnf.rb +28 -0
- data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
- data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
- data/lib/puppet/provider/package/windows/package.rb +9 -1
- data/lib/puppet/provider/package/windows.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +62 -83
- data/lib/puppet/provider/package/zypper.rb +19 -0
- data/lib/puppet/provider/package.rb +6 -2
- data/lib/puppet/provider/parsedfile.rb +2 -2
- data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +7 -0
- data/lib/puppet/provider/selmodule/semodule.rb +20 -16
- data/lib/puppet/provider/service/base.rb +4 -3
- data/lib/puppet/provider/service/bsd.rb +9 -9
- data/lib/puppet/provider/service/daemontools.rb +5 -5
- data/lib/puppet/provider/service/debian.rb +14 -5
- data/lib/puppet/provider/service/freebsd.rb +1 -1
- data/lib/puppet/provider/service/init.rb +20 -3
- data/lib/puppet/provider/service/launchd.rb +57 -19
- data/lib/puppet/provider/service/rcng.rb +51 -0
- data/lib/puppet/provider/service/redhat.rb +2 -1
- data/lib/puppet/provider/service/runit.rb +4 -4
- data/lib/puppet/provider/service/smf.rb +59 -8
- data/lib/puppet/provider/service/src.rb +66 -39
- data/lib/puppet/provider/service/systemd.rb +141 -22
- data/lib/puppet/provider/service/upstart.rb +1 -1
- data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
- data/lib/puppet/provider/sshkey/parsed.rb +20 -10
- data/lib/puppet/provider/user/aix.rb +11 -5
- data/lib/puppet/provider/user/directoryservice.rb +43 -66
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/pw.rb +1 -0
- data/lib/puppet/provider/user/user_role_add.rb +19 -2
- data/lib/puppet/provider/user/windows_adsi.rb +11 -5
- data/lib/puppet/provider/yumrepo/inifile.rb +9 -6
- data/lib/puppet/provider/zfs/zfs.rb +2 -2
- data/lib/puppet/provider/zone/solaris.rb +6 -3
- data/lib/puppet/provider/zpool/zpool.rb +2 -2
- data/lib/puppet/provider.rb +9 -7
- data/lib/puppet/reference/configuration.rb +13 -5
- data/lib/puppet/reference/indirection.rb +1 -1
- data/lib/puppet/reference/providers.rb +2 -3
- data/lib/puppet/reference/report.rb +9 -12
- data/lib/puppet/reference/type.rb +1 -1
- data/lib/puppet/reports.rb +5 -1
- data/lib/puppet/resource/capability_finder.rb +128 -0
- data/lib/puppet/resource/catalog.rb +167 -36
- data/lib/puppet/resource/status.rb +30 -5
- data/lib/puppet/resource/type.rb +247 -50
- data/lib/puppet/resource/type_collection.rb +83 -10
- data/lib/puppet/resource.rb +211 -145
- data/lib/puppet/settings/base_setting.rb +9 -3
- data/lib/puppet/settings/config_file.rb +3 -2
- data/lib/puppet/settings/directory_setting.rb +6 -0
- data/lib/puppet/settings/environment_conf.rb +26 -6
- data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
- data/lib/puppet/settings/file_setting.rb +20 -9
- data/lib/puppet/settings/ini_file.rb +2 -2
- data/lib/puppet/settings/server_list_setting.rb +20 -0
- data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
- data/lib/puppet/settings.rb +98 -45
- data/lib/puppet/ssl/base.rb +14 -1
- data/lib/puppet/ssl/certificate.rb +1 -1
- data/lib/puppet/ssl/certificate_authority/interface.rb +166 -26
- data/lib/puppet/ssl/certificate_authority.rb +49 -13
- data/lib/puppet/ssl/certificate_factory.rb +3 -3
- data/lib/puppet/ssl/certificate_request.rb +5 -5
- data/lib/puppet/ssl/certificate_signer.rb +1 -1
- data/lib/puppet/ssl/configuration.rb +4 -1
- data/lib/puppet/ssl/host.rb +26 -4
- data/lib/puppet/ssl/inventory.rb +10 -3
- data/lib/puppet/ssl/key.rb +7 -3
- data/lib/puppet/ssl/oids.rb +43 -3
- data/lib/puppet/ssl/validator/default_validator.rb +3 -3
- data/lib/puppet/syntax_checkers/base64.rb +41 -0
- data/lib/puppet/syntax_checkers/json.rb +0 -2
- data/lib/puppet/test/test_helper.rb +21 -7
- data/lib/puppet/transaction/additional_resource_generator.rb +101 -8
- data/lib/puppet/transaction/event.rb +29 -2
- data/lib/puppet/transaction/event_manager.rb +1 -1
- data/lib/puppet/transaction/persistence.rb +84 -0
- data/lib/puppet/transaction/report.rb +86 -4
- data/lib/puppet/transaction/resource_harness.rb +95 -35
- data/lib/puppet/transaction.rb +64 -36
- data/lib/puppet/type/augeas.rb +13 -4
- data/lib/puppet/type/component.rb +11 -0
- data/lib/puppet/type/cron.rb +13 -13
- data/lib/puppet/type/exec.rb +43 -19
- data/lib/puppet/type/file/checksum.rb +1 -0
- data/lib/puppet/type/file/checksum_value.rb +53 -0
- data/lib/puppet/type/file/content.rb +36 -121
- data/lib/puppet/type/file/data_sync.rb +92 -0
- data/lib/puppet/type/file/ensure.rb +21 -18
- data/lib/puppet/type/file/selcontext.rb +1 -1
- data/lib/puppet/type/file/source.rb +121 -34
- data/lib/puppet/type/file/target.rb +2 -2
- data/lib/puppet/type/file.rb +145 -46
- data/lib/puppet/type/filebucket.rb +1 -1
- data/lib/puppet/type/group.rb +26 -8
- data/lib/puppet/type/host.rb +1 -1
- data/lib/puppet/type/interface.rb +8 -3
- data/lib/puppet/type/macauthorization.rb +1 -1
- data/lib/puppet/type/mount.rb +16 -1
- data/lib/puppet/type/notify.rb +1 -1
- data/lib/puppet/type/package.rb +32 -12
- data/lib/puppet/type/resources.rb +1 -1
- data/lib/puppet/type/schedule.rb +5 -5
- data/lib/puppet/type/scheduled_task.rb +1 -1
- data/lib/puppet/type/service.rb +24 -0
- data/lib/puppet/type/ssh_authorized_key.rb +17 -11
- data/lib/puppet/type/sshkey.rb +5 -3
- data/lib/puppet/type/stage.rb +1 -1
- data/lib/puppet/type/tidy.rb +7 -4
- data/lib/puppet/type/user.rb +51 -26
- data/lib/puppet/type/yumrepo.rb +23 -3
- data/lib/puppet/type/zone.rb +6 -6
- data/lib/puppet/type.rb +175 -41
- data/lib/puppet/util/autoload.rb +16 -11
- data/lib/puppet/util/character_encoding.rb +95 -0
- data/lib/puppet/util/checksums.rb +74 -31
- data/lib/puppet/util/classgen.rb +1 -1
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/command_line.rb +10 -2
- data/lib/puppet/util/execution.rb +35 -16
- data/lib/puppet/util/feature.rb +1 -1
- data/lib/puppet/util/filetype.rb +11 -5
- data/lib/puppet/util/http_proxy.rb +132 -0
- data/lib/puppet/util/inifile.rb +1 -1
- data/lib/puppet/util/instance_loader.rb +1 -1
- data/lib/puppet/util/log.rb +28 -1
- data/lib/puppet/util/logging.rb +46 -3
- data/lib/puppet/util/monkey_patches.rb +20 -7
- data/lib/puppet/util/multi_match.rb +51 -0
- data/lib/puppet/util/network_device/cisco/device.rb +24 -6
- data/lib/puppet/util/network_device/cisco/interface.rb +21 -9
- data/lib/puppet/util/network_device/config.rb +1 -1
- data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
- data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
- data/lib/puppet/util/plist.rb +151 -0
- data/lib/puppet/util/profiler/aggregate.rb +1 -1
- data/lib/puppet/util/profiler/around_profiler.rb +1 -1
- data/lib/puppet/util/profiler.rb +1 -1
- data/lib/puppet/util/psych_support.rb +1 -1
- data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
- data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
- data/lib/puppet/util/rdoc.rb +2 -2
- data/lib/puppet/util/reference.rb +4 -2
- data/lib/puppet/util/resource_template.rb +1 -1
- data/lib/puppet/util/rubygems.rb +1 -1
- data/lib/puppet/util/run_mode.rb +2 -2
- data/lib/puppet/util/skip_tags.rb +9 -0
- data/lib/puppet/util/splayer.rb +18 -0
- data/lib/puppet/util/tagging.rb +8 -2
- data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
- data/lib/puppet/util/windows/access_control_entry.rb +2 -2
- data/lib/puppet/util/windows/access_control_list.rb +3 -3
- data/lib/puppet/util/windows/adsi.rb +97 -32
- data/lib/puppet/util/windows/api_types.rb +24 -18
- data/lib/puppet/util/windows/com.rb +3 -3
- data/lib/puppet/util/windows/error.rb +1 -1
- data/lib/puppet/util/windows/file.rb +112 -19
- data/lib/puppet/util/windows/principal.rb +190 -0
- data/lib/puppet/util/windows/process.rb +88 -11
- data/lib/puppet/util/windows/registry.rb +22 -16
- data/lib/puppet/util/windows/root_certs.rb +5 -5
- data/lib/puppet/util/windows/security.rb +38 -37
- data/lib/puppet/util/windows/security_descriptor.rb +1 -1
- data/lib/puppet/util/windows/sid.rb +84 -15
- data/lib/puppet/util/windows/taskscheduler.rb +99 -43
- data/lib/puppet/util/windows/user.rb +32 -14
- data/lib/puppet/util/windows.rb +5 -0
- data/lib/puppet/util/yaml.rb +15 -3
- data/lib/puppet/util.rb +125 -23
- data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
- data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
- data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
- data/lib/puppet/vendor/pathspec/LICENSE +2 -2
- data/lib/puppet/vendor/pathspec/README.md +1 -1
- data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
- data/lib/puppet/vendor/require_vendored.rb +0 -1
- data/lib/puppet/vendor/rgen/README.rdoc +1 -1
- data/lib/puppet/vendor/rgen_patch.rb +1 -1
- data/lib/puppet/vendor/semantic/lib/semantic.rb +4 -6
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/module_release.rb +17 -5
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
- data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
- data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
- data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
- data/lib/puppet/version.rb +7 -3
- data/lib/puppet.rb +86 -2
- data/lib/puppet_x.rb +7 -1
- data/lib/semver.rb +36 -13
- data/locales/config.yaml +29 -0
- data/locales/puppet.pot +93 -0
- data/man/man5/puppet.conf.5 +13 -13
- data/man/man8/extlookup2hiera.8 +1 -1
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +2 -2
- data/man/man8/puppet-ca.8 +2 -2
- data/man/man8/puppet-catalog.8 +2 -2
- data/man/man8/puppet-cert.8 +2 -2
- data/man/man8/puppet-certificate.8 +2 -2
- data/man/man8/puppet-certificate_request.8 +2 -2
- data/man/man8/puppet-certificate_revocation_list.8 +2 -2
- data/man/man8/puppet-config.8 +3 -3
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +2 -2
- data/man/man8/puppet-facts.8 +2 -2
- data/man/man8/puppet-file.8 +2 -2
- data/man/man8/puppet-filebucket.8 +2 -2
- data/man/man8/puppet-help.8 +2 -2
- data/man/man8/puppet-inspect.8 +2 -2
- data/man/man8/puppet-key.8 +2 -2
- data/man/man8/puppet-man.8 +2 -2
- data/man/man8/puppet-master.8 +2 -2
- data/man/man8/puppet-module.8 +9 -9
- data/man/man8/puppet-node.8 +2 -2
- data/man/man8/puppet-parser.8 +2 -2
- data/man/man8/puppet-plugin.8 +2 -2
- data/man/man8/puppet-report.8 +2 -2
- data/man/man8/puppet-resource.8 +2 -2
- data/man/man8/puppet-resource_type.8 +2 -2
- data/man/man8/puppet-status.8 +3 -3
- data/man/man8/puppet.8 +1 -1
- data/spec/fixtures/module.tar.gz +0 -0
- data/spec/fixtures/unit/application/environments/production/data/common.yaml +22 -0
- data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
- data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
- data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
- data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/environment/data.pp +10 -0
- data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/third_utf8.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/utf8.yaml +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +22 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +48 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/server1.yaml +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/server2.yaml +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +20 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -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/data_providers/environments/sample/modules/backend/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet/bindings/backend/default.rb +9 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet_x/backend/special_data_provider_factory.rb +23 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +2 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/manifests/init.pp +1 -1
- data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
- data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/bad_data/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/data/empty.json +0 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/data/empty_key.json +1 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/data/empty.yaml +2 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/data/first.json +4 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/hiera.yaml +8 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/manifests/init.pp +3 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/manifests/init.pp +3 -0
- data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/metadata.json +9 -0
- data/spec/fixtures/unit/module/trailing-comma.json +1 -1
- data/spec/fixtures/unit/parser/lexer/subclass_name_duplication.pp +0 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -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/usee/manifests/init.pp +8 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +87 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
- data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +0 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-obsoletes.txt +195 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
- data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
- data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
- data/spec/integration/agent/logging_spec.rb +15 -14
- data/spec/integration/application/apply_spec.rb +383 -29
- data/spec/integration/application/doc_spec.rb +0 -0
- data/spec/integration/application/lookup_spec.rb +155 -0
- data/spec/integration/configurer_spec.rb +0 -0
- data/spec/integration/data_binding_spec.rb +195 -0
- data/spec/integration/defaults_spec.rb +27 -2
- data/spec/integration/directory_environments_spec.rb +16 -0
- data/spec/integration/environments/default_manifest_spec.rb +16 -16
- data/spec/integration/environments/setting_hooks_spec.rb +1 -1
- data/spec/integration/environments/settings_spec.rb +32 -4
- data/spec/integration/faces/ca_spec.rb +0 -0
- data/spec/integration/faces/config_spec.rb +80 -0
- data/spec/integration/faces/documentation_spec.rb +1 -1
- data/spec/integration/file_bucket/file_spec.rb +2 -2
- data/spec/integration/file_serving/fileset_spec.rb +0 -0
- data/spec/integration/file_serving/terminus_helper_spec.rb +0 -0
- data/spec/integration/file_system/uniquefile_spec.rb +29 -0
- data/spec/integration/indirector/catalog/compiler_spec.rb +0 -0
- data/spec/integration/indirector/direct_file_server_spec.rb +0 -0
- data/spec/integration/indirector/facts/facter_spec.rb +38 -0
- data/spec/integration/indirector/file_content/file_server_spec.rb +0 -0
- data/spec/integration/indirector/file_metadata/file_server_spec.rb +0 -0
- data/spec/integration/indirector/node/ldap_spec.rb +0 -0
- data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
- data/spec/integration/network/formats_spec.rb +0 -0
- data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
- data/spec/integration/node/environment_spec.rb +34 -0
- data/spec/integration/node/facts_spec.rb +0 -0
- data/spec/integration/node_spec.rb +0 -0
- data/spec/integration/parser/catalog_spec.rb +14 -2
- data/spec/integration/parser/collection_spec.rb +18 -0
- data/spec/integration/parser/compiler_spec.rb +225 -864
- data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
- data/spec/integration/parser/parameter_defaults_spec.rb +358 -0
- data/spec/integration/parser/pcore_resource_spec.rb +245 -0
- data/spec/integration/parser/resource_expressions_spec.rb +9 -7
- data/spec/integration/parser/scope_spec.rb +20 -2
- data/spec/integration/parser/undef_param_spec.rb +9 -1
- data/spec/integration/provider/mailalias/aliases_spec.rb +0 -0
- data/spec/integration/provider/mount_spec.rb +23 -36
- data/spec/integration/provider/service/init_spec.rb +0 -0
- data/spec/integration/provider/service/windows_spec.rb +3 -2
- data/spec/integration/provider/ssh_authorized_key_spec.rb +0 -0
- data/spec/integration/provider/yumrepo_spec.rb +4 -1
- data/spec/integration/reference/providers_spec.rb +0 -0
- data/spec/integration/reports_spec.rb +0 -0
- data/spec/integration/resource/catalog_spec.rb +1 -1
- data/spec/integration/resource/type_collection_spec.rb +8 -0
- data/spec/integration/ssl/autosign_spec.rb +18 -3
- data/spec/integration/ssl/certificate_authority_spec.rb +0 -1
- data/spec/integration/ssl/certificate_request_spec.rb +0 -1
- data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -1
- data/spec/integration/ssl/host_spec.rb +0 -1
- data/spec/integration/ssl/key_spec.rb +104 -0
- data/spec/integration/test/test_helper_spec.rb +32 -0
- data/spec/integration/transaction/report_spec.rb +682 -0
- data/spec/integration/transaction_spec.rb +125 -1
- data/spec/integration/type/exec_spec.rb +0 -0
- data/spec/integration/type/file_spec.rb +237 -12
- data/spec/integration/type/package_spec.rb +72 -1
- data/spec/integration/type/tidy_spec.rb +21 -9
- data/spec/integration/type/user_spec.rb +13 -6
- data/spec/integration/type_spec.rb +0 -0
- data/spec/integration/util/autoload_spec.rb +0 -0
- data/spec/integration/util/execution_spec.rb +30 -0
- data/spec/integration/util/rdoc/parser_spec.rb +1 -1
- data/spec/integration/util/settings_spec.rb +26 -0
- data/spec/integration/util/windows/adsi_spec.rb +99 -0
- data/spec/integration/util/windows/principal_spec.rb +250 -0
- data/spec/integration/util/windows/process_spec.rb +35 -2
- data/spec/{unit → integration}/util/windows/registry_spec.rb +92 -2
- data/spec/integration/util/windows/security_spec.rb +61 -16
- data/spec/integration/util/windows/user_spec.rb +27 -5
- data/spec/integration/util_spec.rb +49 -27
- data/spec/lib/matchers/include_in_order.rb +2 -3
- data/spec/lib/puppet/face/1.0.0/huzzah.rb +0 -0
- data/spec/lib/puppet/face/basetest.rb +0 -0
- data/spec/lib/puppet/face/huzzah.rb +0 -0
- data/spec/lib/puppet_spec/compiler.rb +32 -3
- data/spec/lib/puppet_spec/files.rb +16 -2
- data/spec/lib/puppet_spec/fixtures.rb +0 -0
- data/spec/lib/puppet_spec/language.rb +3 -1
- data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
- data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
- data/spec/lib/puppet_spec/network.rb +12 -8
- data/spec/lib/puppet_spec/pops.rb +13 -0
- data/spec/lib/puppet_spec/unindent.rb +5 -0
- data/spec/lib/puppet_spec/verbose.rb +0 -0
- data/spec/shared_behaviours/all_parsedfile_providers.rb +0 -0
- data/spec/shared_behaviours/file_server_terminus.rb +0 -0
- data/spec/shared_behaviours/file_serving.rb +0 -0
- data/spec/shared_behaviours/iterative_functions.rb +9 -9
- data/spec/shared_behaviours/memory_terminus.rb +0 -0
- data/spec/shared_behaviours/path_parameters.rb +0 -0
- data/spec/shared_behaviours/things_that_declare_options.rb +0 -0
- data/spec/shared_contexts/types_setup.rb +106 -0
- data/spec/shared_examples/rhel_package_provider.rb +357 -0
- data/spec/spec_helper.rb +23 -2
- data/spec/unit/agent/locker_spec.rb +4 -4
- data/spec/unit/agent_spec.rb +12 -46
- data/spec/unit/application/agent_spec.rb +15 -0
- data/spec/unit/application/apply_spec.rb +31 -1
- data/spec/unit/application/cert_spec.rb +20 -0
- data/spec/unit/application/certificate_spec.rb +0 -0
- data/spec/unit/application/config_spec.rb +0 -0
- data/spec/unit/application/describe_spec.rb +0 -0
- data/spec/unit/application/device_spec.rb +0 -0
- data/spec/unit/application/doc_spec.rb +0 -0
- data/spec/unit/application/face_base_spec.rb +16 -0
- data/spec/unit/application/facts_spec.rb +0 -0
- data/spec/unit/application/filebucket_spec.rb +88 -2
- data/spec/unit/application/indirection_base_spec.rb +0 -0
- data/spec/unit/application/inspect_spec.rb +28 -10
- data/spec/unit/application/lookup_spec.rb +532 -0
- data/spec/unit/application/master_spec.rb +2 -2
- data/spec/unit/application/resource_spec.rb +0 -0
- data/spec/unit/application_spec.rb +3 -3
- data/spec/unit/capability_spec.rb +416 -0
- data/spec/unit/configurer/downloader_factory_spec.rb +0 -0
- data/spec/unit/configurer/downloader_spec.rb +5 -5
- data/spec/unit/configurer/fact_handler_spec.rb +0 -0
- data/spec/unit/configurer/plugin_handler_spec.rb +18 -15
- data/spec/unit/configurer_spec.rb +336 -39
- data/spec/unit/confine/exists_spec.rb +0 -0
- data/spec/unit/confine/false_spec.rb +0 -0
- data/spec/unit/confine/feature_spec.rb +0 -0
- data/spec/unit/confine/true_spec.rb +0 -0
- data/spec/unit/confine/variable_spec.rb +0 -0
- data/spec/unit/confine_collection_spec.rb +0 -0
- data/spec/unit/confine_spec.rb +0 -0
- data/spec/unit/confiner_spec.rb +0 -0
- data/spec/unit/context/trusted_information_spec.rb +24 -1
- data/spec/unit/daemon_spec.rb +18 -8
- data/spec/unit/data_providers/{sample_data_provider_spec.rb → custom_data_provider_spec.rb} +14 -16
- data/spec/unit/data_providers/function_data_provider_spec.rb +21 -3
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +361 -0
- data/spec/unit/defaults_spec.rb +47 -0
- data/spec/unit/environments_spec.rb +26 -4
- data/spec/unit/etc_spec.rb +234 -0
- data/spec/unit/external/pson_spec.rb +0 -0
- data/spec/unit/face/ca_spec.rb +10 -0
- data/spec/unit/face/catalog_spec.rb +0 -0
- data/spec/unit/face/certificate_request_spec.rb +10 -0
- data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
- data/spec/unit/face/certificate_spec.rb +10 -2
- data/spec/unit/face/config_spec.rb +47 -0
- data/spec/unit/face/epp_face_spec.rb +24 -5
- data/spec/unit/face/facts_spec.rb +0 -0
- data/spec/unit/face/file_spec.rb +4 -0
- data/spec/unit/face/generate_spec.rb +230 -0
- data/spec/unit/face/help_spec.rb +70 -0
- data/spec/unit/face/key_spec.rb +10 -0
- data/spec/unit/face/module/search_spec.rb +1 -1
- data/spec/unit/face/node_spec.rb +1 -1
- data/spec/unit/face/parser_spec.rb +49 -2
- data/spec/unit/face/plugin_spec.rb +29 -4
- data/spec/unit/face/status_spec.rb +10 -0
- data/spec/unit/face_spec.rb +0 -0
- data/spec/unit/file_bucket/dipper_spec.rb +210 -1
- data/spec/unit/file_bucket/file_spec.rb +0 -0
- data/spec/unit/file_serving/base_spec.rb +0 -0
- data/spec/unit/file_serving/configuration/parser_spec.rb +25 -30
- data/spec/unit/file_serving/configuration_spec.rb +1 -1
- data/spec/unit/file_serving/content_spec.rb +0 -0
- data/spec/unit/file_serving/fileset_spec.rb +0 -0
- data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
- data/spec/unit/file_serving/metadata_spec.rb +50 -0
- data/spec/unit/file_serving/mount/file_spec.rb +0 -0
- data/spec/unit/file_serving/mount/modules_spec.rb +0 -0
- data/spec/unit/file_serving/mount/pluginfacts_spec.rb +0 -0
- data/spec/unit/file_serving/mount/plugins_spec.rb +0 -0
- data/spec/unit/file_serving/mount_spec.rb +0 -0
- data/spec/unit/file_serving/terminus_helper_spec.rb +0 -0
- data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
- data/spec/unit/file_system/uniquefile_spec.rb +20 -0
- data/spec/unit/file_system_spec.rb +335 -6
- data/spec/unit/forge/repository_spec.rb +27 -0
- data/spec/unit/functions/assert_type_spec.rb +48 -8
- data/spec/unit/functions/binary_file_spec.rb +46 -0
- data/spec/unit/functions/break_spec.rb +89 -0
- data/spec/unit/{parser/functions → functions}/contain_spec.rb +68 -3
- data/spec/unit/functions/defined_spec.rb +2 -2
- data/spec/unit/functions/dig_spec.rb +58 -0
- data/spec/unit/functions/epp_spec.rb +17 -9
- data/spec/unit/functions/filter_spec.rb +18 -0
- data/spec/unit/functions/find_file_spec.rb +69 -0
- data/spec/unit/functions/hiera_spec.rb +447 -47
- data/spec/unit/functions/include_spec.rb +175 -0
- data/spec/unit/functions/inline_epp_spec.rb +4 -4
- data/spec/unit/functions/lest_spec.rb +34 -0
- data/spec/unit/functions/logging_spec.rb +54 -0
- data/spec/unit/functions/lookup_fixture_spec.rb +693 -0
- data/spec/unit/functions/lookup_spec.rb +2904 -265
- data/spec/unit/functions/match_spec.rb +2 -2
- data/spec/unit/functions/new_spec.rb +694 -0
- data/spec/unit/functions/next_spec.rb +93 -0
- data/spec/unit/functions/regsubst_spec.rb +26 -9
- data/spec/unit/functions/require_spec.rb +83 -0
- data/spec/unit/functions/return_spec.rb +105 -0
- data/spec/unit/functions/reverse_each_spec.rb +108 -0
- data/spec/unit/functions/scanf_spec.rb +1 -1
- data/spec/unit/{parser/functions → functions}/shared.rb +15 -12
- data/spec/unit/functions/split_spec.rb +3 -3
- data/spec/unit/functions/step_spec.rb +113 -0
- data/spec/unit/functions/strftime_spec.rb +152 -0
- data/spec/unit/functions/then_spec.rb +40 -0
- data/spec/unit/functions/type_spec.rb +35 -0
- data/spec/unit/functions/unwrap_spec.rb +29 -0
- data/spec/unit/functions/versioncmp_spec.rb +36 -0
- data/spec/unit/functions4_spec.rb +270 -79
- data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
- data/spec/unit/graph/relationship_graph_spec.rb +0 -0
- data/spec/unit/graph/sequential_prioritizer_spec.rb +1 -1
- data/spec/unit/graph/simple_graph_spec.rb +1 -1
- data/spec/unit/hiera/scope_spec.rb +6 -3
- data/spec/unit/hiera_puppet_spec.rb +49 -8
- data/spec/unit/indirector/catalog/compiler_spec.rb +752 -8
- data/spec/unit/indirector/catalog/json_spec.rb +0 -0
- data/spec/unit/indirector/catalog/msgpack_spec.rb +0 -0
- data/spec/unit/indirector/catalog/rest_spec.rb +0 -0
- data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
- data/spec/unit/indirector/catalog/store_configs_spec.rb +0 -0
- data/spec/unit/indirector/catalog/yaml_spec.rb +0 -0
- data/spec/unit/indirector/certificate/ca_spec.rb +0 -0
- data/spec/unit/indirector/certificate/disabled_ca_spec.rb +0 -0
- data/spec/unit/indirector/certificate/file_spec.rb +0 -0
- data/spec/unit/indirector/certificate/rest_spec.rb +0 -0
- data/spec/unit/indirector/certificate_request/ca_spec.rb +0 -0
- data/spec/unit/indirector/certificate_request/disabled_ca_spec.rb +0 -0
- data/spec/unit/indirector/certificate_request/file_spec.rb +0 -0
- data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -0
- data/spec/unit/indirector/certificate_revocation_list/ca_spec.rb +0 -0
- data/spec/unit/indirector/certificate_revocation_list/disabled_ca_spec.rb +0 -0
- data/spec/unit/indirector/certificate_revocation_list/file_spec.rb +0 -0
- data/spec/unit/indirector/certificate_revocation_list/rest_spec.rb +0 -0
- data/spec/unit/indirector/certificate_status/file_spec.rb +0 -0
- data/spec/unit/indirector/certificate_status/rest_spec.rb +0 -0
- data/spec/unit/indirector/code_spec.rb +0 -0
- data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
- data/spec/unit/indirector/direct_file_server_spec.rb +0 -0
- data/spec/unit/indirector/envelope_spec.rb +0 -0
- data/spec/unit/indirector/exec_spec.rb +0 -0
- data/spec/unit/indirector/face_spec.rb +10 -2
- data/spec/unit/indirector/facts/facter_spec.rb +3 -10
- data/spec/unit/indirector/facts/network_device_spec.rb +0 -0
- data/spec/unit/indirector/facts/store_configs_spec.rb +0 -0
- data/spec/unit/indirector/facts/yaml_spec.rb +0 -0
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +86 -4
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +0 -0
- data/spec/unit/indirector/file_content/file_server_spec.rb +0 -0
- data/spec/unit/indirector/file_content/file_spec.rb +0 -0
- data/spec/unit/indirector/file_content/rest_spec.rb +0 -0
- data/spec/unit/indirector/file_metadata/file_server_spec.rb +0 -0
- data/spec/unit/indirector/file_metadata/file_spec.rb +0 -0
- data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -0
- data/spec/unit/indirector/file_server_spec.rb +0 -0
- data/spec/unit/indirector/indirection_spec.rb +13 -2
- data/spec/unit/indirector/json_spec.rb +1 -1
- data/spec/unit/indirector/key/ca_spec.rb +0 -0
- data/spec/unit/indirector/key/disabled_ca_spec.rb +0 -0
- data/spec/unit/indirector/key/file_spec.rb +1 -1
- data/spec/unit/indirector/ldap_spec.rb +0 -0
- data/spec/unit/indirector/memory_spec.rb +0 -0
- data/spec/unit/indirector/msgpack_spec.rb +11 -1
- data/spec/unit/indirector/node/exec_spec.rb +0 -0
- data/spec/unit/indirector/node/ldap_spec.rb +0 -0
- data/spec/unit/indirector/node/memory_spec.rb +0 -0
- data/spec/unit/indirector/node/msgpack_spec.rb +0 -0
- data/spec/unit/indirector/node/plain_spec.rb +0 -0
- data/spec/unit/indirector/node/rest_spec.rb +0 -0
- data/spec/unit/indirector/node/store_configs_spec.rb +0 -0
- data/spec/unit/indirector/node/yaml_spec.rb +0 -0
- data/spec/unit/indirector/plain_spec.rb +0 -0
- data/spec/unit/indirector/report/msgpack_spec.rb +0 -0
- data/spec/unit/indirector/report/processor_spec.rb +0 -0
- data/spec/unit/indirector/report/rest_spec.rb +0 -0
- data/spec/unit/indirector/report/yaml_spec.rb +0 -0
- data/spec/unit/indirector/request_spec.rb +17 -8
- data/spec/unit/indirector/resource/ral_spec.rb +0 -0
- data/spec/unit/indirector/resource/store_configs_spec.rb +0 -0
- data/spec/unit/indirector/resource_type/parser_spec.rb +5 -0
- data/spec/unit/indirector/resource_type/rest_spec.rb +0 -0
- data/spec/unit/indirector/rest_spec.rb +107 -9
- data/spec/unit/indirector/ssl_file_spec.rb +4 -4
- data/spec/unit/indirector/status/rest_spec.rb +0 -0
- data/spec/unit/indirector/store_configs_spec.rb +0 -0
- data/spec/unit/indirector/terminus_spec.rb +0 -0
- data/spec/unit/indirector/yaml_spec.rb +1 -1
- data/spec/unit/indirector_spec.rb +0 -0
- data/spec/unit/info_service_spec.rb +298 -0
- data/spec/unit/interface/action_builder_spec.rb +0 -0
- data/spec/unit/interface/action_manager_spec.rb +0 -0
- data/spec/unit/interface/action_spec.rb +0 -0
- data/spec/unit/interface/documentation_spec.rb +0 -0
- data/spec/unit/interface/face_collection_spec.rb +0 -0
- data/spec/unit/interface/option_builder_spec.rb +0 -0
- data/spec/unit/interface/option_spec.rb +0 -0
- data/spec/unit/interface_spec.rb +27 -0
- data/spec/unit/man_spec.rb +1 -1
- data/spec/unit/module_spec.rb +118 -74
- data/spec/unit/module_tool/application_spec.rb +1 -1
- data/spec/unit/module_tool/applications/builder_spec.rb +44 -9
- data/spec/unit/module_tool/applications/installer_spec.rb +11 -2
- data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
- data/spec/unit/module_tool/applications/upgrader_spec.rb +9 -1
- data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
- data/spec/unit/module_tool/metadata_spec.rb +31 -2
- data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
- data/spec/unit/module_tool_spec.rb +3 -3
- data/spec/unit/network/auth_config_parser_spec.rb +16 -0
- data/spec/unit/network/authconfig_spec.rb +62 -32
- data/spec/unit/network/authorization_spec.rb +30 -2
- data/spec/unit/network/authstore_spec.rb +2 -2
- data/spec/unit/network/format_handler_spec.rb +0 -0
- data/spec/unit/network/format_spec.rb +0 -0
- data/spec/unit/network/formats_spec.rb +0 -0
- data/spec/unit/network/http/api/indirected_routes_spec.rb +70 -71
- data/spec/unit/network/http/api/master/v3/environment_spec.rb +60 -0
- data/spec/unit/network/http/api/master/v3_spec.rb +22 -4
- data/spec/unit/network/http/compression_spec.rb +40 -9
- data/spec/unit/network/http/connection_spec.rb +25 -19
- data/spec/unit/network/http/error_spec.rb +2 -1
- data/spec/unit/network/http/factory_spec.rb +18 -0
- data/spec/unit/network/http/handler_spec.rb +11 -8
- data/spec/unit/network/http/nocache_pool_spec.rb +0 -0
- data/spec/unit/network/http/pool_spec.rb +30 -0
- data/spec/unit/network/http/rack/rest_spec.rb +7 -0
- data/spec/unit/network/http/rack_spec.rb +0 -0
- data/spec/unit/network/http/session_spec.rb +0 -0
- data/spec/unit/network/http/site_spec.rb +0 -0
- data/spec/unit/network/http/webrick/rest_spec.rb +0 -0
- data/spec/unit/network/http/webrick_spec.rb +1 -1
- data/spec/unit/network/http_pool_spec.rb +0 -0
- data/spec/unit/network/http_spec.rb +0 -0
- data/spec/unit/network/resolver_spec.rb +0 -0
- data/spec/unit/network/rights_spec.rb +4 -4
- data/spec/unit/network/server_spec.rb +0 -0
- data/spec/unit/node/environment_spec.rb +10 -0
- data/spec/unit/node/facts_spec.rb +0 -0
- data/spec/unit/node_spec.rb +35 -0
- data/spec/unit/other/selinux_spec.rb +0 -0
- data/spec/unit/parameter/path_spec.rb +0 -0
- data/spec/unit/parameter/value_collection_spec.rb +0 -0
- data/spec/unit/parameter/value_spec.rb +0 -0
- data/spec/unit/parameter_spec.rb +11 -0
- data/spec/unit/parser/ast/leaf_spec.rb +1 -1
- data/spec/unit/parser/compiler_spec.rb +134 -33
- data/spec/unit/parser/environment_compiler_spec.rb +688 -0
- data/spec/unit/parser/files_spec.rb +0 -0
- data/spec/unit/parser/functions/create_resources_spec.rb +86 -5
- data/spec/unit/parser/functions/digest_spec.rb +0 -0
- data/spec/unit/parser/functions/fail_spec.rb +0 -0
- data/spec/unit/parser/functions/file_spec.rb +0 -0
- data/spec/unit/parser/functions/fqdn_rand_spec.rb +6 -2
- data/spec/unit/parser/functions/generate_spec.rb +3 -12
- data/spec/unit/parser/functions/hiera_array_spec.rb +1 -1
- data/spec/unit/parser/functions/hiera_hash_spec.rb +1 -1
- data/spec/unit/parser/functions/hiera_include_spec.rb +1 -1
- data/spec/unit/parser/functions/hiera_spec.rb +1 -1
- data/spec/unit/parser/functions/inline_template_spec.rb +0 -0
- data/spec/unit/parser/functions/lookup_spec.rb +1 -1
- data/spec/unit/parser/functions/realize_spec.rb +0 -0
- data/spec/unit/parser/functions/regsubst_spec.rb +1 -1
- data/spec/unit/parser/functions/scanf_spec.rb +0 -0
- data/spec/unit/parser/functions/shellquote_spec.rb +0 -0
- data/spec/unit/parser/functions/split_spec.rb +1 -1
- data/spec/unit/parser/functions/sprintf_spec.rb +0 -0
- data/spec/unit/parser/functions/tag_spec.rb +0 -0
- data/spec/unit/parser/functions/template_spec.rb +0 -0
- data/spec/unit/parser/functions/versioncmp_spec.rb +0 -0
- data/spec/unit/parser/functions_spec.rb +0 -0
- data/spec/unit/parser/relationship_spec.rb +0 -0
- data/spec/unit/parser/resource/param_spec.rb +0 -0
- data/spec/unit/parser/resource_spec.rb +31 -32
- data/spec/unit/parser/scope_spec.rb +83 -16
- data/spec/unit/parser/templatewrapper_spec.rb +0 -0
- data/spec/unit/parser/type_loader_spec.rb +0 -0
- data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
- data/spec/unit/pops/binder/injector_spec.rb +3 -3
- data/spec/unit/pops/evaluator/access_ops_spec.rb +115 -19
- data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +170 -0
- data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
- data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +76 -23
- data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +29 -25
- data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
- data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
- data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +133 -0
- data/spec/unit/pops/evaluator/variables_spec.rb +1 -1
- data/spec/unit/pops/label_provider_spec.rb +5 -1
- data/spec/unit/pops/loaders/dependency_loader_spec.rb +66 -1
- data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
- data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
- data/spec/unit/pops/loaders/loaders_spec.rb +323 -27
- data/spec/unit/pops/loaders/module_loaders_spec.rb +63 -2
- data/spec/unit/pops/loaders/static_loader_spec.rb +83 -18
- data/spec/unit/pops/lookup/context_spec.rb +334 -0
- data/spec/unit/pops/lookup/interpolation_spec.rb +333 -0
- data/spec/unit/pops/lookup/lookup_spec.rb +262 -0
- data/spec/unit/pops/merge_strategy_spec.rb +18 -0
- data/spec/unit/pops/parser/lexer2_spec.rb +236 -10
- data/spec/unit/pops/parser/parse_application_spec.rb +35 -0
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +31 -0
- data/spec/unit/pops/parser/parse_calls_spec.rb +25 -0
- data/spec/unit/pops/parser/parse_capabilities_spec.rb +40 -0
- data/spec/unit/pops/parser/parse_functions_spec.rb +19 -0
- data/spec/unit/pops/parser/parse_lambda_spec.rb +19 -0
- data/spec/unit/pops/parser/parse_site_spec.rb +51 -0
- data/spec/unit/pops/parser/parser_rspec_helper.rb +6 -0
- data/spec/unit/pops/parser/parser_spec.rb +28 -0
- data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
- data/spec/unit/pops/puppet_stack_spec.rb +79 -0
- data/spec/unit/pops/resource/resource_type_impl_spec.rb +111 -0
- data/spec/unit/pops/serialization/packer_spec.rb +154 -0
- data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
- data/spec/unit/pops/serialization/serialization_spec.rb +314 -0
- data/spec/unit/pops/time/timespan_spec.rb +121 -0
- data/spec/unit/pops/types/enumeration_spec.rb +13 -12
- data/spec/unit/pops/types/iterable_spec.rb +262 -0
- data/spec/unit/pops/types/p_binary_type_spec.rb +243 -0
- data/spec/unit/pops/types/p_object_type_spec.rb +1167 -0
- data/spec/unit/pops/types/p_sem_ver_type_spec.rb +327 -0
- data/spec/unit/pops/types/p_sensitive_type_spec.rb +169 -0
- data/spec/unit/pops/types/p_timespan_type_spec.rb +273 -0
- data/spec/unit/pops/types/p_timestamp_type_spec.rb +311 -0
- data/spec/unit/pops/types/p_type_set_type_spec.rb +453 -0
- data/spec/unit/pops/types/recursion_guard_spec.rb +93 -0
- data/spec/unit/pops/types/ruby_generator_spec.rb +625 -0
- data/spec/unit/pops/types/string_converter_spec.rb +1029 -0
- data/spec/unit/pops/types/type_acceptor_spec.rb +106 -0
- data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +965 -934
- data/spec/unit/pops/types/type_factory_spec.rb +132 -91
- data/spec/unit/pops/types/type_formatter_spec.rb +396 -0
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +228 -0
- data/spec/unit/pops/types/type_parser_spec.rb +203 -36
- data/spec/unit/pops/types/types_spec.rb +599 -0
- data/spec/unit/pops/validator/validator_spec.rb +400 -18
- data/spec/unit/property/ensure_spec.rb +0 -0
- data/spec/unit/property/keyvalue_spec.rb +0 -0
- data/spec/unit/property/list_spec.rb +0 -0
- data/spec/unit/property/ordered_list_spec.rb +0 -0
- data/spec/unit/property_spec.rb +49 -12
- data/spec/unit/provider/augeas/augeas_spec.rb +59 -0
- data/spec/unit/provider/cisco_spec.rb +0 -0
- data/spec/unit/provider/command_spec.rb +0 -0
- data/spec/unit/provider/cron/crontab_spec.rb +0 -0
- data/spec/unit/provider/cron/parsed_spec.rb +1 -0
- data/spec/unit/provider/exec/posix_spec.rb +0 -0
- data/spec/unit/provider/exec/shell_spec.rb +0 -0
- data/spec/unit/provider/exec/windows_spec.rb +0 -0
- data/spec/unit/provider/exec_spec.rb +0 -0
- data/spec/unit/provider/file/posix_spec.rb +0 -0
- data/spec/unit/provider/file/windows_spec.rb +0 -0
- data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
- data/spec/unit/provider/group/groupadd_spec.rb +0 -0
- data/spec/unit/provider/group/ldap_spec.rb +0 -0
- data/spec/unit/provider/group/pw_spec.rb +0 -0
- data/spec/unit/provider/group/windows_adsi_spec.rb +31 -9
- data/spec/unit/provider/host/parsed_spec.rb +0 -0
- data/spec/unit/provider/interface/cisco_spec.rb +0 -0
- data/spec/unit/provider/ldap_spec.rb +0 -0
- data/spec/unit/provider/macauthorization_spec.rb +5 -2
- data/spec/unit/provider/mcx/mcxcontent_spec.rb +0 -0
- data/spec/unit/provider/mount/parsed_spec.rb +0 -0
- data/spec/unit/provider/mount_spec.rb +0 -0
- data/spec/unit/provider/naginator_spec.rb +0 -0
- data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
- data/spec/unit/provider/nameservice_spec.rb +54 -12
- data/spec/unit/provider/network_device_spec.rb +0 -0
- data/spec/unit/provider/package/aix_spec.rb +0 -0
- data/spec/unit/provider/package/appdmg_spec.rb +3 -3
- data/spec/unit/provider/package/apt_spec.rb +0 -0
- data/spec/unit/provider/package/aptitude_spec.rb +0 -0
- data/spec/unit/provider/package/aptrpm_spec.rb +3 -3
- data/spec/unit/provider/package/base_spec.rb +18 -0
- data/spec/unit/provider/package/dnf_spec.rb +30 -0
- data/spec/unit/provider/package/dpkg_spec.rb +0 -0
- data/spec/unit/provider/package/freebsd_spec.rb +0 -0
- data/spec/unit/provider/package/gem_spec.rb +77 -0
- data/spec/unit/provider/package/hpux_spec.rb +0 -0
- data/spec/unit/provider/package/macports_spec.rb +0 -0
- data/spec/unit/provider/package/nim_spec.rb +6 -6
- data/spec/unit/provider/package/openbsd_spec.rb +0 -0
- data/spec/unit/provider/package/opkg_spec.rb +0 -0
- data/spec/unit/provider/package/pacman_spec.rb +55 -0
- data/spec/unit/provider/package/pip3_spec.rb +22 -0
- data/spec/unit/provider/package/pip_spec.rb +164 -46
- data/spec/unit/provider/package/pkg_spec.rb +139 -99
- data/spec/unit/provider/package/pkgdmg_spec.rb +32 -8
- data/spec/unit/provider/package/pkgin_spec.rb +23 -13
- data/spec/unit/provider/package/pkgng_spec.rb +16 -2
- data/spec/unit/provider/package/pkgutil_spec.rb +0 -0
- data/spec/unit/provider/package/portage_spec.rb +64 -8
- data/spec/unit/provider/package/puppet_gem_spec.rb +0 -0
- data/spec/unit/provider/package/rpm_spec.rb +170 -12
- data/spec/unit/provider/package/sun_spec.rb +0 -0
- data/spec/unit/provider/package/tdnf_spec.rb +18 -0
- data/spec/unit/provider/package/windows/package_spec.rb +45 -1
- data/spec/unit/provider/package/windows_spec.rb +8 -2
- data/spec/unit/provider/package/yum_spec.rb +29 -466
- data/spec/unit/provider/package/zypper_spec.rb +14 -0
- data/spec/unit/provider/parsedfile_spec.rb +0 -0
- data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +211 -0
- data/spec/unit/provider/selboolean_spec.rb +0 -0
- data/spec/unit/provider/selmodule_spec.rb +0 -0
- data/spec/unit/provider/service/base_spec.rb +6 -0
- data/spec/unit/provider/service/bsd_spec.rb +130 -0
- data/spec/unit/provider/service/daemontools_spec.rb +0 -0
- data/spec/unit/provider/service/debian_spec.rb +34 -4
- data/spec/unit/provider/service/freebsd_spec.rb +16 -0
- data/spec/unit/provider/service/gentoo_spec.rb +7 -0
- data/spec/unit/provider/service/init_spec.rb +24 -1
- data/spec/unit/provider/service/launchd_spec.rb +124 -25
- data/spec/unit/provider/service/openbsd_spec.rb +0 -0
- data/spec/unit/provider/service/openrc_spec.rb +7 -0
- data/spec/unit/provider/service/openwrt_spec.rb +0 -0
- data/spec/unit/provider/service/rcng_spec.rb +41 -0
- data/spec/unit/provider/service/redhat_spec.rb +8 -1
- data/spec/unit/provider/service/runit_spec.rb +0 -0
- data/spec/unit/provider/service/smf_spec.rb +77 -13
- data/spec/unit/provider/service/src_spec.rb +31 -4
- data/spec/unit/provider/service/systemd_spec.rb +228 -39
- data/spec/unit/provider/service/upstart_spec.rb +64 -0
- data/spec/unit/provider/service/windows_spec.rb +0 -0
- data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +2 -1
- data/spec/unit/provider/sshkey/parsed_spec.rb +42 -18
- data/spec/unit/provider/user/aix_spec.rb +7 -0
- data/spec/unit/provider/user/directoryservice_spec.rb +164 -83
- data/spec/unit/provider/user/hpux_spec.rb +0 -0
- data/spec/unit/provider/user/ldap_spec.rb +0 -0
- data/spec/unit/provider/user/openbsd_spec.rb +0 -0
- data/spec/unit/provider/user/pw_spec.rb +0 -0
- data/spec/unit/provider/user/user_role_add_spec.rb +0 -0
- data/spec/unit/provider/user/useradd_spec.rb +1 -0
- data/spec/unit/provider/user/windows_adsi_spec.rb +30 -6
- data/spec/unit/provider/vlan/cisco_spec.rb +0 -0
- data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
- data/spec/unit/provider/zfs/zfs_spec.rb +0 -0
- data/spec/unit/provider/zone/solaris_spec.rb +64 -12
- data/spec/unit/provider/zpool/zpool_spec.rb +0 -0
- data/spec/unit/provider_spec.rb +0 -0
- data/spec/unit/puppet_spec.rb +15 -1
- data/spec/unit/relationship_spec.rb +0 -0
- data/spec/unit/reports/http_spec.rb +0 -0
- data/spec/unit/reports/store_spec.rb +0 -0
- data/spec/unit/reports_spec.rb +10 -0
- data/spec/unit/resource/capability_finder_spec.rb +147 -0
- data/spec/unit/resource/catalog_spec.rb +235 -10
- data/spec/unit/resource/status_spec.rb +0 -0
- data/spec/unit/resource/type_collection_spec.rb +23 -2
- data/spec/unit/resource/type_spec.rb +169 -12
- data/spec/unit/resource_spec.rb +137 -48
- data/spec/unit/semver_spec.rb +241 -0
- data/spec/unit/settings/directory_setting_spec.rb +0 -0
- data/spec/unit/settings/duration_setting_spec.rb +0 -0
- data/spec/unit/settings/environment_conf_spec.rb +18 -1
- data/spec/unit/settings/file_setting_spec.rb +37 -0
- data/spec/unit/settings/ini_file_spec.rb +58 -1
- data/spec/unit/settings/path_setting_spec.rb +0 -0
- data/spec/unit/settings/priority_setting_spec.rb +0 -0
- data/spec/unit/settings_spec.rb +105 -3
- data/spec/unit/ssl/base_spec.rb +9 -0
- data/spec/unit/ssl/certificate_authority/interface_spec.rb +180 -13
- data/spec/unit/ssl/certificate_authority_spec.rb +82 -28
- data/spec/unit/ssl/certificate_factory_spec.rb +2 -2
- data/spec/unit/ssl/certificate_request_attributes_spec.rb +6 -0
- data/spec/unit/ssl/certificate_request_spec.rb +4 -5
- data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
- data/spec/unit/ssl/certificate_spec.rb +1 -1
- data/spec/unit/ssl/configuration_spec.rb +11 -2
- data/spec/unit/ssl/host_spec.rb +3 -3
- data/spec/unit/ssl/inventory_spec.rb +27 -3
- data/spec/unit/ssl/key_spec.rb +7 -7
- data/spec/unit/ssl/oids_spec.rb +24 -13
- data/spec/unit/status_spec.rb +0 -0
- data/spec/unit/transaction/additional_resource_generator_spec.rb +160 -31
- data/spec/unit/transaction/event_manager_spec.rb +0 -0
- data/spec/unit/transaction/event_spec.rb +3 -1
- data/spec/unit/transaction/persistence_spec.rb +178 -0
- data/spec/unit/transaction/report_spec.rb +138 -2
- data/spec/unit/transaction/resource_harness_spec.rb +81 -37
- data/spec/unit/transaction_spec.rb +50 -0
- data/spec/unit/type/augeas_spec.rb +0 -0
- data/spec/unit/type/component_spec.rb +0 -0
- data/spec/unit/type/computer_spec.rb +0 -0
- data/spec/unit/type/cron_spec.rb +0 -0
- data/spec/unit/type/exec_spec.rb +57 -12
- data/spec/unit/type/file/checksum_spec.rb +6 -0
- data/spec/unit/type/file/checksum_value_spec.rb +286 -0
- data/spec/unit/type/file/content_spec.rb +59 -208
- data/spec/unit/type/file/ctime_spec.rb +0 -0
- data/spec/unit/type/file/ensure_spec.rb +0 -0
- data/spec/unit/type/file/group_spec.rb +0 -0
- data/spec/unit/type/file/mode_spec.rb +0 -0
- data/spec/unit/type/file/mtime_spec.rb +0 -0
- data/spec/unit/type/file/owner_spec.rb +0 -0
- data/spec/unit/type/file/selinux_spec.rb +0 -0
- data/spec/unit/type/file/source_spec.rb +211 -119
- data/spec/unit/type/file/type_spec.rb +0 -0
- data/spec/unit/type/file_spec.rb +165 -35
- data/spec/unit/type/filebucket_spec.rb +0 -0
- data/spec/unit/type/group_spec.rb +0 -0
- data/spec/unit/type/host_spec.rb +4 -4
- data/spec/unit/type/interface_spec.rb +32 -0
- data/spec/unit/type/k5login_spec.rb +0 -0
- data/spec/unit/type/macauthorization_spec.rb +4 -1
- data/spec/unit/type/mailalias_spec.rb +0 -0
- data/spec/unit/type/maillist_spec.rb +0 -0
- data/spec/unit/type/mcx_spec.rb +0 -0
- data/spec/unit/type/mount_spec.rb +50 -8
- data/spec/unit/type/nagios_spec.rb +0 -0
- data/spec/unit/type/noop_metaparam_spec.rb +0 -0
- data/spec/unit/type/package/package_settings_spec.rb +0 -0
- data/spec/unit/type/package_spec.rb +1 -0
- data/spec/unit/type/resources_spec.rb +0 -0
- data/spec/unit/type/schedule_spec.rb +0 -0
- data/spec/unit/type/selboolean_spec.rb +0 -0
- data/spec/unit/type/selmodule_spec.rb +0 -0
- data/spec/unit/type/service_spec.rb +21 -0
- data/spec/unit/type/ssh_authorized_key_spec.rb +0 -0
- data/spec/unit/type/sshkey_spec.rb +0 -0
- data/spec/unit/type/stage_spec.rb +0 -0
- data/spec/unit/type/tidy_spec.rb +4 -4
- data/spec/unit/type/user_spec.rb +40 -7
- data/spec/unit/type/vlan_spec.rb +1 -1
- data/spec/unit/type/whit_spec.rb +0 -0
- data/spec/unit/type/yumrepo_spec.rb +3 -7
- data/spec/unit/type/zfs_spec.rb +0 -0
- data/spec/unit/type/zone_spec.rb +0 -0
- data/spec/unit/type/zpool_spec.rb +0 -0
- data/spec/unit/type_spec.rb +119 -1
- data/spec/unit/util/autoload_spec.rb +0 -0
- data/spec/unit/util/backups_spec.rb +0 -0
- data/spec/unit/util/character_encoding_spec.rb +88 -0
- data/spec/unit/util/checksums_spec.rb +0 -0
- data/spec/unit/util/colors_spec.rb +0 -0
- data/spec/unit/util/command_line_spec.rb +11 -0
- data/spec/unit/util/constant_inflector_spec.rb +0 -0
- data/spec/unit/util/diff_spec.rb +0 -0
- data/spec/unit/util/errors_spec.rb +0 -0
- data/spec/unit/util/execution_spec.rb +13 -1
- data/spec/unit/util/execution_stub_spec.rb +0 -0
- data/spec/unit/util/feature_spec.rb +1 -1
- data/spec/unit/util/filetype_spec.rb +4 -4
- data/spec/unit/util/http_proxy_spec.rb +91 -0
- data/spec/unit/util/ldap/connection_spec.rb +0 -0
- data/spec/unit/util/ldap/generator_spec.rb +1 -1
- data/spec/unit/util/ldap/manager_spec.rb +0 -0
- data/spec/unit/util/log/destinations_spec.rb +0 -2
- data/spec/unit/util/log_spec.rb +12 -1
- data/spec/unit/util/logging_spec.rb +69 -0
- data/spec/unit/util/metric_spec.rb +0 -0
- data/spec/unit/util/monkey_patches_spec.rb +95 -3
- data/spec/unit/util/multi_match_spec.rb +39 -0
- data/spec/unit/util/nagios_maker_spec.rb +0 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
- data/spec/unit/util/network_device/cisco/facts_spec.rb +0 -0
- data/spec/unit/util/network_device/cisco/interface_spec.rb +0 -0
- data/spec/unit/util/network_device/config_spec.rb +0 -0
- data/spec/unit/util/network_device/ipcalc_spec.rb +0 -0
- data/spec/unit/util/network_device/transport/base_spec.rb +0 -0
- data/spec/unit/util/network_device/transport/ssh_spec.rb +1 -1
- data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
- data/spec/unit/util/network_device_spec.rb +1 -1
- data/spec/unit/util/package_spec.rb +0 -0
- data/spec/unit/util/plist_spec.rb +135 -0
- data/spec/unit/util/posix_spec.rb +0 -0
- data/spec/unit/util/rdoc_spec.rb +0 -0
- data/spec/unit/util/resource_template_spec.rb +2 -2
- data/spec/unit/util/retry_action_spec.rb +0 -0
- data/spec/unit/util/run_mode_spec.rb +27 -3
- data/spec/unit/util/selinux_spec.rb +0 -0
- data/spec/unit/util/splayer_spec.rb +45 -0
- data/spec/unit/util/storage_spec.rb +8 -1
- data/spec/unit/util/suidmanager_spec.rb +0 -0
- data/spec/unit/util/symbolic_file_mode_spec.rb +0 -0
- data/spec/unit/util/tagging_spec.rb +4 -0
- data/spec/unit/util/user_attr_spec.rb +0 -0
- data/spec/unit/util/warnings_spec.rb +0 -0
- data/spec/unit/util/windows/adsi_spec.rb +82 -40
- data/spec/unit/util/windows/api_types_spec.rb +42 -0
- data/spec/unit/util/windows/file_spec.rb +89 -0
- data/spec/unit/util/windows/root_certs_spec.rb +0 -0
- data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
- data/spec/unit/util/windows/sid_spec.rb +76 -14
- data/spec/unit/util/yaml_spec.rb +13 -1
- data/spec/unit/util_spec.rb +219 -15
- data/spec/unit/version_spec.rb +19 -0
- data/spec/watchr.rb +0 -0
- data/tasks/cfpropertylist.rake +15 -0
- metadata +724 -115
- data/ext/puppet-nm-dispatcher +0 -13
- data/ext/puppetlisten/puppetlisten.rb +0 -77
- data/ext/puppetlisten/puppetrun.rb +0 -38
- data/ext/systemd/puppetmaster.service +0 -11
- data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
- data/lib/puppet/pops/types/types_meta.rb +0 -234
- data/lib/puppet/resource/type_collection_helper.rb +0 -7
- data/lib/puppet/vendor/load_plist.rb +0 -1
- data/lib/puppet/vendor/plist/CHANGELOG +0 -82
- data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
- data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
- data/lib/puppet/vendor/plist/README +0 -36
- data/lib/puppet/vendor/plist/Rakefile +0 -144
- data/lib/puppet/vendor/plist/docs/USAGE +0 -104
- data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
- data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
- data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
- data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
- data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
- data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
- data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
- data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
- data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
- data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
- data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
- data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
- data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
- data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
- data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
- data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
- data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
- data/lib/puppet/vendor/semantic/Gemfile +0 -20
- data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
- data/lib/puppet/vendor/semantic/Rakefile +0 -69
- data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
- data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
- data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
- data/spec/fixtures/unit/data_providers/environments/sample/manifests/site.pp +0 -6
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -3
- data/spec/integration/data_binding.rb +0 -104
- data/spec/integration/parser/functions/require_spec.rb +0 -43
- data/spec/integration/provider/package_spec.rb +0 -33
- data/spec/unit/parser/functions/defined_spec.rb +0 -120
- data/spec/unit/parser/functions/include_spec.rb +0 -55
- data/spec/unit/parser/functions/require_spec.rb +0 -68
- data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
- /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
- /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
- /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -0
- /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
- /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
- /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -0
- /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -0
- /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
- /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
- /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
- /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
- /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
|
@@ -1,364 +1,3003 @@
|
|
|
1
1
|
#! /usr/bin/env ruby
|
|
2
2
|
require 'spec_helper'
|
|
3
3
|
require 'puppet_spec/compiler'
|
|
4
|
+
require 'puppet_spec/files'
|
|
4
5
|
require 'puppet/pops'
|
|
6
|
+
require 'deep_merge/core'
|
|
5
7
|
|
|
6
|
-
describe "
|
|
8
|
+
describe "The lookup function" do
|
|
7
9
|
include PuppetSpec::Compiler
|
|
10
|
+
include PuppetSpec::Files
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
# - Compile the code into a catalog
|
|
24
|
-
# - Return the name of all Notify resources in that catalog
|
|
25
|
-
#
|
|
26
|
-
# @param fmt [String] The puppet interpolated string used when creating the notify title
|
|
27
|
-
# @param *args [String] splat of args that will be concatenated to form the puppet args sent to lookup
|
|
28
|
-
# @return [Array<String>] List of names of Notify resources in the resulting catalog
|
|
29
|
-
#
|
|
30
|
-
def assemble_and_compile(fmt, *lookup_args)
|
|
31
|
-
assemble_and_compile_with_block(fmt, "'no_block_present'", *lookup_args)
|
|
12
|
+
let(:env_name) { 'spec' }
|
|
13
|
+
let(:code_dir_files) { {} }
|
|
14
|
+
let(:code_dir) { tmpdir('code') }
|
|
15
|
+
let(:ruby_dir) { tmpdir('ruby') }
|
|
16
|
+
let(:env_modules) { {} }
|
|
17
|
+
let(:env_hiera_yaml) do
|
|
18
|
+
<<-YAML.unindent
|
|
19
|
+
---
|
|
20
|
+
version: 5
|
|
21
|
+
hierarchy:
|
|
22
|
+
- name: "Common"
|
|
23
|
+
data_hash: yaml_data
|
|
24
|
+
path: "common.yaml"
|
|
25
|
+
YAML
|
|
32
26
|
end
|
|
33
27
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
28
|
+
let(:env_data) { {} }
|
|
29
|
+
|
|
30
|
+
let(:environment_files) do
|
|
31
|
+
{
|
|
32
|
+
env_name => {
|
|
33
|
+
'modules' => env_modules,
|
|
34
|
+
'hiera.yaml' => env_hiera_yaml,
|
|
35
|
+
'data' => env_data
|
|
36
|
+
}
|
|
37
|
+
}
|
|
43
38
|
end
|
|
44
39
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
let(:
|
|
40
|
+
let(:ruby_dir_files) { {} }
|
|
41
|
+
|
|
42
|
+
let(:logs) { [] }
|
|
43
|
+
let(:scope_additions ) { {} }
|
|
44
|
+
let(:notices) { logs.select { |log| log.level == :notice }.map { |log| log.message } }
|
|
45
|
+
let(:warnings) { logs.select { |log| log.level == :warning }.map { |log| log.message } }
|
|
46
|
+
let(:debugs) { logs.select { |log| log.level == :debug }.map { |log| log.message } }
|
|
47
|
+
let(:env) { Puppet::Node::Environment.create(env_name.to_sym, [File.join(populated_env_dir, env_name, 'modules')]) }
|
|
48
|
+
let(:environments) { Puppet::Environments::Directories.new(populated_env_dir, []) }
|
|
49
|
+
let(:node) { Puppet::Node.new('test_lookup', :environment => env) }
|
|
48
50
|
let(:compiler) { Puppet::Parser::Compiler.new(node) }
|
|
51
|
+
let(:lookup_func) { Puppet.lookup(:loaders).puppet_system_loader.load(:function, 'lookup') }
|
|
52
|
+
let(:invocation_with_explain) { Puppet::Pops::Lookup::Invocation.new(compiler.topscope, {}, {}, true) }
|
|
53
|
+
let(:explanation) { invocation_with_explain.explainer.explain }
|
|
49
54
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
Puppet.settings.initialize_global_settings
|
|
54
|
-
|
|
55
|
-
# Initialize loaders based on the environmentpath. It does not work to
|
|
56
|
-
# just set the setting environmentpath for some reason - this achieves the same:
|
|
57
|
-
# - first a loader is created, loading directory environments from the fixture (there is
|
|
58
|
-
# one environment, 'sample', which will be loaded since the node references this
|
|
59
|
-
# environment by name).
|
|
60
|
-
# - secondly, the created env loader is set as 'environments' in the puppet context.
|
|
61
|
-
#
|
|
62
|
-
environments = Puppet::Environments::Directories.new(environmentpath, [])
|
|
63
|
-
Puppet.override(:environments => environments) do
|
|
64
|
-
example.run
|
|
65
|
-
end
|
|
55
|
+
let(:populated_code_dir) do
|
|
56
|
+
dir_contained_in(code_dir, code_dir_files)
|
|
57
|
+
code_dir
|
|
66
58
|
end
|
|
67
59
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
end
|
|
60
|
+
let(:populated_ruby_dir) do
|
|
61
|
+
dir_contained_in(ruby_dir, ruby_dir_files)
|
|
62
|
+
ruby_dir
|
|
63
|
+
end
|
|
73
64
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
65
|
+
let(:env_dir) do
|
|
66
|
+
d = File.join(populated_code_dir, 'environments')
|
|
67
|
+
Dir.mkdir(d)
|
|
68
|
+
d
|
|
69
|
+
end
|
|
78
70
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
end
|
|
71
|
+
let(:populated_env_dir) do
|
|
72
|
+
dir_contained_in(env_dir, environment_files)
|
|
73
|
+
env_dir
|
|
74
|
+
end
|
|
84
75
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
76
|
+
before(:each) do
|
|
77
|
+
Puppet.settings[:codedir] = code_dir
|
|
78
|
+
Puppet.push_context(:environments => environments, :current_environment => env)
|
|
79
|
+
end
|
|
89
80
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
81
|
+
after(:each) do
|
|
82
|
+
Puppet.pop_context
|
|
83
|
+
if Object.const_defined?(:Hiera)
|
|
84
|
+
Hiera.send(:remove_instance_variable, :@config) if Hiera.instance_variable_defined?(:@config)
|
|
85
|
+
Hiera.send(:remove_instance_variable, :@logger) if Hiera.instance_variable_defined?(:@logger)
|
|
86
|
+
if Hiera.const_defined?(:Config)
|
|
87
|
+
Hiera::Config.send(:remove_instance_variable, :@config) if Hiera::Config.instance_variable_defined?(:@config)
|
|
88
|
+
end
|
|
89
|
+
if Hiera.const_defined?(:Backend) && Hiera::Backend.respond_to?(:clear!)
|
|
90
|
+
Hiera::Backend.clear!
|
|
91
|
+
end
|
|
93
92
|
end
|
|
93
|
+
end
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
def collect_notices(code, explain = false, &block)
|
|
96
|
+
Puppet[:code] = code
|
|
97
|
+
Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
|
|
98
|
+
scope = compiler.topscope
|
|
99
|
+
scope['environment'] = env_name
|
|
100
|
+
scope['domain'] = 'example.com'
|
|
101
|
+
scope_additions.each_pair { |k, v| scope[k] = v }
|
|
102
|
+
if explain
|
|
103
|
+
begin
|
|
104
|
+
invocation_with_explain.lookup('dummy', nil) do
|
|
105
|
+
if block_given?
|
|
106
|
+
compiler.compile { |catalog| block.call(compiler.topscope); catalog }
|
|
107
|
+
else
|
|
108
|
+
compiler.compile
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
rescue RuntimeError => e
|
|
112
|
+
invocation_with_explain.report_text { e.message }
|
|
113
|
+
end
|
|
114
|
+
else
|
|
115
|
+
if block_given?
|
|
116
|
+
compiler.compile { |catalog| block.call(compiler.topscope); catalog }
|
|
117
|
+
else
|
|
118
|
+
compiler.compile
|
|
119
|
+
end
|
|
120
|
+
end
|
|
98
121
|
end
|
|
122
|
+
nil
|
|
123
|
+
end
|
|
99
124
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
125
|
+
def lookup(key, options = {}, explain = false)
|
|
126
|
+
nc_opts = options.empty? ? '' : ", #{Puppet::Pops::Types::TypeFormatter.string(options)}"
|
|
127
|
+
keys = key.is_a?(Array) ? key : [key]
|
|
128
|
+
collect_notices(keys.map { |k| "notice(String(lookup('#{k}'#{nc_opts}), '%p'))" }.join("\n"), explain)
|
|
129
|
+
if explain
|
|
130
|
+
explanation
|
|
131
|
+
else
|
|
132
|
+
result = notices.map { |n| Puppet::Pops::Types::TypeParser.singleton.parse_literal(n) }
|
|
133
|
+
key.is_a?(Array) ? result : result[0]
|
|
103
134
|
end
|
|
135
|
+
end
|
|
104
136
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
137
|
+
def explain(key, options = {})
|
|
138
|
+
lookup(key, options, true)[1]
|
|
139
|
+
explanation
|
|
140
|
+
end
|
|
109
141
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
142
|
+
context 'with faulty hiera.yaml configuration' do
|
|
143
|
+
context 'in global layer' do
|
|
144
|
+
let(:global_data) do
|
|
145
|
+
{
|
|
146
|
+
'common.yaml' => <<-YAML.unindent
|
|
147
|
+
a: value a (from global)
|
|
148
|
+
YAML
|
|
149
|
+
}
|
|
150
|
+
end
|
|
115
151
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
152
|
+
let(:code_dir_files) do
|
|
153
|
+
{
|
|
154
|
+
'hiera.yaml' => hiera_yaml,
|
|
155
|
+
'data' => global_data
|
|
156
|
+
}
|
|
157
|
+
end
|
|
120
158
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
159
|
+
before(:each) do
|
|
160
|
+
# Need to set here since spec_helper defines these settings in its "before each"
|
|
161
|
+
Puppet.settings[:codedir] = populated_code_dir
|
|
162
|
+
Puppet.settings[:hiera_config] = File.join(code_dir, 'hiera.yaml')
|
|
163
|
+
end
|
|
125
164
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
165
|
+
context 'using a not yet supported hiera version' do
|
|
166
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
167
|
+
version: 6
|
|
168
|
+
YAML
|
|
130
169
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
end
|
|
135
|
-
end
|
|
170
|
+
it 'fails and reports error' do
|
|
171
|
+
expect { lookup('a') }.to raise_error("This runtime does not support hiera.yaml version 6 in #{code_dir}/hiera.yaml")
|
|
172
|
+
end
|
|
173
|
+
end
|
|
136
174
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
175
|
+
context 'with multiply defined backend using hiera version 3' do
|
|
176
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
177
|
+
:version: 3
|
|
178
|
+
:backends:
|
|
179
|
+
- yaml
|
|
180
|
+
- json
|
|
181
|
+
- yaml
|
|
182
|
+
YAML
|
|
142
183
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
184
|
+
it 'fails and reports error' do
|
|
185
|
+
expect { lookup('a') }.to raise_error(
|
|
186
|
+
"Backend 'yaml' is defined more than once. First defined at line 3 at #{code_dir}/hiera.yaml:5")
|
|
187
|
+
end
|
|
188
|
+
end
|
|
147
189
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
190
|
+
context 'using hiera version 4' do
|
|
191
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
192
|
+
version: 4
|
|
193
|
+
YAML
|
|
152
194
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
195
|
+
it 'fails and reports error' do
|
|
196
|
+
expect { lookup('a') }.to raise_error(
|
|
197
|
+
"hiera.yaml version 4 cannot be used in the global layer in #{code_dir}/hiera.yaml")
|
|
198
|
+
end
|
|
199
|
+
end
|
|
158
200
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
201
|
+
context 'using hiera version 5' do
|
|
202
|
+
context 'with multiply defined hierarchy' do
|
|
203
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
204
|
+
version: 5
|
|
205
|
+
hierarchy:
|
|
206
|
+
- name: Common
|
|
207
|
+
path: common.yaml
|
|
208
|
+
- name: Other
|
|
209
|
+
path: other.yaml
|
|
210
|
+
- name: Common
|
|
211
|
+
path: common.yaml
|
|
212
|
+
YAML
|
|
213
|
+
|
|
214
|
+
it 'fails and reports error' do
|
|
215
|
+
expect { lookup('a') }.to raise_error(
|
|
216
|
+
"Hierarchy name 'Common' defined more than once. First defined at line 3 at #{code_dir}/hiera.yaml:7")
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
context 'with hiera3_backend that is provided as data_hash function' do
|
|
221
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
222
|
+
version: 5
|
|
223
|
+
hierarchy:
|
|
224
|
+
- name: Common
|
|
225
|
+
hiera3_backend: hocon
|
|
226
|
+
path: common.conf
|
|
227
|
+
YAML
|
|
228
|
+
|
|
229
|
+
it 'fails and reports error' do
|
|
230
|
+
expect { lookup('a') }.to raise_error(
|
|
231
|
+
"Use \"data_hash: hocon_data\" instead of \"hiera3_backend: hocon\" at #{code_dir}/hiera.yaml:4")
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
context 'with no data provider function defined' do
|
|
236
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
237
|
+
version: 5
|
|
238
|
+
defaults:
|
|
239
|
+
datadir: data
|
|
240
|
+
hierarchy:
|
|
241
|
+
- name: Common
|
|
242
|
+
path: common.txt
|
|
243
|
+
YAML
|
|
244
|
+
|
|
245
|
+
it 'fails and reports error' do
|
|
246
|
+
expect { lookup('a') }.to raise_error(
|
|
247
|
+
"One of data_hash, lookup_key, data_dig, or hiera3_backend must be defined in hierarchy 'Common' in #{code_dir}/hiera.yaml")
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
context 'with multiple data providers in defaults' do
|
|
252
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
253
|
+
version: 5
|
|
254
|
+
defaults:
|
|
255
|
+
data_hash: yaml_data
|
|
256
|
+
lookup_key: eyaml_lookup_key
|
|
257
|
+
datadir: data
|
|
258
|
+
hierarchy:
|
|
259
|
+
- name: Common
|
|
260
|
+
path: common.txt
|
|
261
|
+
YAML
|
|
262
|
+
|
|
263
|
+
it 'fails and reports error' do
|
|
264
|
+
expect { lookup('a') }.to raise_error(
|
|
265
|
+
"Only one of data_hash, lookup_key, data_dig, or hiera3_backend can be defined in defaults in #{code_dir}/hiera.yaml")
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
context 'with non existing data provider function' do
|
|
270
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
271
|
+
version: 5
|
|
272
|
+
hierarchy:
|
|
273
|
+
- name: Common
|
|
274
|
+
data_hash: nonesuch_txt_data
|
|
275
|
+
path: common.yaml
|
|
276
|
+
YAML
|
|
277
|
+
|
|
278
|
+
it 'fails and reports error' do
|
|
279
|
+
Puppet[:strict] = :error
|
|
280
|
+
expect { lookup('a') }.to raise_error(
|
|
281
|
+
"Unable to find 'data_hash' function named 'nonesuch_txt_data' in #{code_dir}/hiera.yaml")
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
context 'with a declared default_hierarchy' do
|
|
286
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
287
|
+
version: 5
|
|
288
|
+
hierarchy:
|
|
289
|
+
- name: Common
|
|
290
|
+
path: common.yaml
|
|
291
|
+
default_hierarchy:
|
|
292
|
+
- name: Defaults
|
|
293
|
+
path: defaults.yaml
|
|
294
|
+
YAML
|
|
295
|
+
|
|
296
|
+
it 'fails and reports error' do
|
|
297
|
+
Puppet[:strict] = :error
|
|
298
|
+
expect { lookup('a') }.to raise_error(
|
|
299
|
+
"'default_hierarchy' is only allowed in the module layer at #{code_dir}/hiera.yaml:5")
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
context 'with missing variables' do
|
|
304
|
+
let(:scope_additions) { { 'fqdn' => 'test.example.com' } }
|
|
305
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
306
|
+
version: 5
|
|
307
|
+
hierarchy:
|
|
308
|
+
- name: Common # don't report this line %{::nonesuch}
|
|
309
|
+
path: "%{::fqdn}/%{::nonesuch}/data.yaml"
|
|
310
|
+
YAML
|
|
311
|
+
|
|
312
|
+
it 'fails and reports errors when strict == error' do
|
|
313
|
+
Puppet[:strict] = :error
|
|
314
|
+
expect { lookup('a') }.to raise_error("Undefined variable '::nonesuch' at #{code_dir}/hiera.yaml:4")
|
|
315
|
+
end
|
|
316
|
+
end
|
|
164
317
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
318
|
+
context 'using interpolation functions' do
|
|
319
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
320
|
+
version: 5
|
|
321
|
+
hierarchy:
|
|
322
|
+
- name: Common # don't report this line %{::nonesuch}
|
|
323
|
+
path: "%{lookup('fqdn')}/data.yaml"
|
|
324
|
+
YAML
|
|
325
|
+
|
|
326
|
+
it 'fails and reports errors when strict == error' do
|
|
327
|
+
Puppet[:strict] = :error
|
|
328
|
+
expect { lookup('a') }.to raise_error("Interpolation using method syntax is not allowed in this context in #{code_dir}/hiera.yaml")
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
end
|
|
168
332
|
end
|
|
169
333
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
334
|
+
context 'in environment layer' do
|
|
335
|
+
context 'using hiera version 4' do
|
|
336
|
+
context 'with an unknown backend' do
|
|
337
|
+
let(:env_hiera_yaml) { <<-YAML.unindent }
|
|
338
|
+
version: 4
|
|
339
|
+
hierarchy:
|
|
340
|
+
- name: Common
|
|
341
|
+
backend: nonesuch
|
|
342
|
+
path: common.yaml
|
|
343
|
+
YAML
|
|
344
|
+
|
|
345
|
+
it 'fails and reports error' do
|
|
346
|
+
expect { lookup('a') }.to raise_error(
|
|
347
|
+
"No data provider is registered for backend 'nonesuch' at #{env_dir}/spec/hiera.yaml:4")
|
|
348
|
+
end
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
context 'with multiply defined hierarchy' do
|
|
352
|
+
let(:env_hiera_yaml) { <<-YAML.unindent }
|
|
353
|
+
version: 4
|
|
354
|
+
hierarchy:
|
|
355
|
+
- name: Common
|
|
356
|
+
backend: yaml
|
|
357
|
+
path: common.yaml
|
|
358
|
+
- name: Other
|
|
359
|
+
backend: yaml
|
|
360
|
+
path: other.yaml
|
|
361
|
+
- name: Common
|
|
362
|
+
backend: yaml
|
|
363
|
+
path: common.yaml
|
|
364
|
+
YAML
|
|
365
|
+
|
|
366
|
+
it 'fails and reports error' do
|
|
367
|
+
expect { lookup('a') }.to raise_error(
|
|
368
|
+
"Hierarchy name 'Common' defined more than once. First defined at line 3 at #{env_dir}/spec/hiera.yaml:9")
|
|
369
|
+
end
|
|
370
|
+
end
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
context 'using hiera version 5' do
|
|
374
|
+
context 'with a hiera3_backend declaration' do
|
|
375
|
+
let(:env_hiera_yaml) { <<-YAML.unindent }
|
|
376
|
+
version: 5
|
|
377
|
+
hierarchy:
|
|
378
|
+
- name: Common
|
|
379
|
+
hiera3_backend: something
|
|
380
|
+
YAML
|
|
381
|
+
|
|
382
|
+
it 'fails and reports error' do
|
|
383
|
+
expect { lookup('a') }.to raise_error(
|
|
384
|
+
"'hiera3_backend' is only allowed in the global layer at #{env_dir}/spec/hiera.yaml:4")
|
|
385
|
+
end
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
context 'with a declared default_hierarchy' do
|
|
389
|
+
let(:env_hiera_yaml) { <<-YAML.unindent }
|
|
390
|
+
version: 5
|
|
391
|
+
hierarchy:
|
|
392
|
+
- name: Common
|
|
393
|
+
path: common.yaml
|
|
394
|
+
default_hierarchy:
|
|
395
|
+
- name: Defaults
|
|
396
|
+
path: defaults.yaml
|
|
397
|
+
YAML
|
|
398
|
+
|
|
399
|
+
it 'fails and reports error' do
|
|
400
|
+
Puppet[:strict] = :error
|
|
401
|
+
expect { lookup('a') }.to raise_error(
|
|
402
|
+
"'default_hierarchy' is only allowed in the module layer at #{env_dir}/spec/hiera.yaml:5")
|
|
403
|
+
end
|
|
404
|
+
end
|
|
405
|
+
end
|
|
173
406
|
end
|
|
407
|
+
end
|
|
174
408
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
409
|
+
context 'with an environment' do
|
|
410
|
+
let(:env_data) do
|
|
411
|
+
{
|
|
412
|
+
'common.yaml' => <<-YAML.unindent
|
|
413
|
+
---
|
|
414
|
+
a: value a (from environment)
|
|
415
|
+
c:
|
|
416
|
+
c_b: value c_b (from environment)
|
|
417
|
+
mod_a::a: value mod_a::a (from environment)
|
|
418
|
+
mod_a::hash_a:
|
|
419
|
+
a: value mod_a::hash_a.a (from environment)
|
|
420
|
+
mod_a::hash_b:
|
|
421
|
+
a: value mod_a::hash_b.a (from environment)
|
|
422
|
+
hash_b:
|
|
423
|
+
hash_ba:
|
|
424
|
+
bab: value hash_b.hash_ba.bab (from environment)
|
|
425
|
+
hash_c:
|
|
426
|
+
hash_ca:
|
|
427
|
+
caa: value hash_c.hash_ca.caa (from environment)
|
|
428
|
+
lookup_options:
|
|
429
|
+
mod_a::hash_b:
|
|
430
|
+
merge: hash
|
|
431
|
+
hash_c:
|
|
432
|
+
merge: hash
|
|
433
|
+
YAML
|
|
434
|
+
}
|
|
179
435
|
end
|
|
180
436
|
|
|
181
|
-
it '
|
|
182
|
-
|
|
183
|
-
resources = assemble_and_compile('${r[0]}_${r[1]}_${r[2]}', "'abc::c'", 'Array[String]', "'unique'")
|
|
184
|
-
expect(resources).to include('global_c_env_c_module_c')
|
|
437
|
+
it 'finds data in the environment' do
|
|
438
|
+
expect(lookup('a')).to eql('value a (from environment)')
|
|
185
439
|
end
|
|
186
440
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
441
|
+
context 'that has no lookup configured' do
|
|
442
|
+
let(:environment_files) do
|
|
443
|
+
{
|
|
444
|
+
env_name => {
|
|
445
|
+
'data' => env_data
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
it 'does not find data in the environment' do
|
|
451
|
+
expect { lookup('a') }.to raise_error(Puppet::DataBinding::LookupError, /did not find a value for the name 'a'/)
|
|
452
|
+
end
|
|
453
|
+
|
|
454
|
+
context "but an environment.conf with 'environment_data_provider=hiera'" do
|
|
455
|
+
let(:environment_files) do
|
|
456
|
+
{
|
|
457
|
+
env_name => {
|
|
458
|
+
'environment.conf' => "environment_data_provider=hiera\n",
|
|
459
|
+
'data' => env_data
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
it 'finds data in the environment and reports deprecation warning for environment.conf' do
|
|
465
|
+
expect(lookup('a')).to eql('value a (from environment)')
|
|
466
|
+
expect(warnings).to include(/Defining environment_data_provider='hiera' in environment.conf is deprecated. A 'hiera.yaml' file should be used instead/)
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
context 'and a hiera.yaml file' do
|
|
470
|
+
let(:env_hiera_yaml) do
|
|
471
|
+
<<-YAML.unindent
|
|
472
|
+
---
|
|
473
|
+
version: 4
|
|
474
|
+
hierarchy:
|
|
475
|
+
- name: common
|
|
476
|
+
backend: yaml
|
|
477
|
+
YAML
|
|
478
|
+
end
|
|
479
|
+
|
|
480
|
+
let(:environment_files) do
|
|
481
|
+
{
|
|
482
|
+
env_name => {
|
|
483
|
+
'hiera.yaml' => env_hiera_yaml,
|
|
484
|
+
'environment.conf' => "environment_data_provider=hiera\n",
|
|
485
|
+
'data' => env_data
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
it 'finds data in the environment and reports deprecation warnings for both environment.conf and hiera.yaml' do
|
|
491
|
+
expect(lookup('a')).to eql('value a (from environment)')
|
|
492
|
+
expect(warnings).to include(/Defining environment_data_provider='hiera' in environment.conf is deprecated/)
|
|
493
|
+
expect(warnings).to include(/Use of 'hiera.yaml' version 4 is deprecated. It should be converted to version 5/)
|
|
494
|
+
end
|
|
495
|
+
end
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
context "but an environment.conf with 'environment_data_provider=function'" do
|
|
499
|
+
let(:environment_files) do
|
|
500
|
+
{
|
|
501
|
+
env_name => {
|
|
502
|
+
'environment.conf' => "environment_data_provider=function\n",
|
|
503
|
+
'functions' => {
|
|
504
|
+
'environment' => { 'data.pp' => <<-PUPPET.unindent }
|
|
505
|
+
function environment::data() {
|
|
506
|
+
{ 'a' => 'value a' }
|
|
507
|
+
}
|
|
508
|
+
PUPPET
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
it 'finds data in the environment and reports deprecation warning for environment.conf' do
|
|
515
|
+
expect(lookup('a')).to eql('value a')
|
|
516
|
+
expect(warnings).to include(/Defining environment_data_provider='function' in environment.conf is deprecated. A 'hiera.yaml' file should be used instead/)
|
|
517
|
+
expect(warnings).to include(/Using of legacy data provider function 'environment::data'. Please convert to a 'data_hash' function/)
|
|
518
|
+
end
|
|
519
|
+
end
|
|
191
520
|
end
|
|
192
521
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
522
|
+
context 'that has interpolated paths configured' do
|
|
523
|
+
let(:env_hiera_yaml) do
|
|
524
|
+
<<-YAML.unindent
|
|
525
|
+
---
|
|
526
|
+
version: 5
|
|
527
|
+
hierarchy:
|
|
528
|
+
- name: "Varying"
|
|
529
|
+
data_hash: yaml_data
|
|
530
|
+
path: "#{data_path}"
|
|
531
|
+
YAML
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
let(:environment_files) do
|
|
535
|
+
{
|
|
536
|
+
env_name => {
|
|
537
|
+
'hiera.yaml' => env_hiera_yaml,
|
|
538
|
+
'modules' => {},
|
|
539
|
+
'data' => {
|
|
540
|
+
'x.yaml' => <<-YAML.unindent,
|
|
541
|
+
y: value y from x
|
|
542
|
+
YAML
|
|
543
|
+
'x_d.yaml' => <<-YAML.unindent,
|
|
544
|
+
y: value y from x_d
|
|
545
|
+
YAML
|
|
546
|
+
'x_e.yaml' => <<-YAML.unindent,
|
|
547
|
+
y: value y from x_e
|
|
548
|
+
YAML
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
context 'using local variable reference' do
|
|
555
|
+
let(:data_path) { 'x%{var.sub}.yaml' }
|
|
556
|
+
|
|
557
|
+
it 'reloads the configuration if interpolated values change' do
|
|
558
|
+
Puppet[:log_level] = 'debug'
|
|
559
|
+
collect_notices("notice('success')") do |scope|
|
|
560
|
+
expect(lookup_func.call(scope, 'y')).to eql('value y from x')
|
|
561
|
+
scope['var'] = { 'sub' => '_d' }
|
|
562
|
+
expect(lookup_func.call(scope, 'y')).to eql('value y from x_d')
|
|
563
|
+
nested_scope = scope.compiler.newscope(scope)
|
|
564
|
+
nested_scope['var'] = { 'sub' => '_e' }
|
|
565
|
+
expect(lookup_func.call(nested_scope, 'y')).to eql('value y from x_e')
|
|
566
|
+
end
|
|
567
|
+
expect(notices).to eql(['success'])
|
|
568
|
+
expect(debugs.any? { |m| m =~ /Hiera configuration recreated due to change of scope variables used in interpolation expressions/ }).to be_truthy
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
it 'does not include the lookups performed during stability check in explain output' do
|
|
572
|
+
Puppet[:log_level] = 'debug'
|
|
573
|
+
collect_notices("notice('success')") do |scope|
|
|
574
|
+
var = { 'sub' => '_d' }
|
|
575
|
+
scope['var'] = var
|
|
576
|
+
expect(lookup_func.call(scope, 'y')).to eql('value y from x_d')
|
|
577
|
+
|
|
578
|
+
# Second call triggers the check
|
|
579
|
+
expect(lookup_func.call(scope, 'y')).to eql('value y from x_d')
|
|
580
|
+
end
|
|
581
|
+
expect(notices).to eql(['success'])
|
|
582
|
+
expect(debugs.any? { |m| m =~ /Sub key: "sub"/ }).to be_falsey
|
|
583
|
+
end
|
|
584
|
+
end
|
|
585
|
+
|
|
586
|
+
context 'using global variable reference' do
|
|
587
|
+
let(:data_path) { 'x%{::var.sub}.yaml' }
|
|
588
|
+
|
|
589
|
+
it 'reloads the configuration if interpolated that was previously undefined, gets defined' do
|
|
590
|
+
Puppet[:log_level] = 'debug'
|
|
591
|
+
collect_notices("notice('success')") do |scope|
|
|
592
|
+
expect(lookup_func.call(scope, 'y')).to eql('value y from x')
|
|
593
|
+
scope['var'] = { 'sub' => '_d' }
|
|
594
|
+
expect(lookup_func.call(scope, 'y')).to eql('value y from x_d')
|
|
595
|
+
end
|
|
596
|
+
expect(notices).to eql(['success'])
|
|
597
|
+
expect(debugs.any? { |m| m =~ /Hiera configuration recreated due to change of scope variables used in interpolation expressions/ }).to be_truthy
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
it 'does not reload the configuration if value changes locally' do
|
|
601
|
+
Puppet[:log_level] = 'debug'
|
|
602
|
+
collect_notices("notice('success')") do |scope|
|
|
603
|
+
scope['var'] = { 'sub' => '_d' }
|
|
604
|
+
expect(lookup_func.call(scope, 'y')).to eql('value y from x_d')
|
|
605
|
+
nested_scope = scope.compiler.newscope(scope)
|
|
606
|
+
nested_scope['var'] = { 'sub' => '_e' }
|
|
607
|
+
expect(lookup_func.call(nested_scope, 'y')).to eql('value y from x_d')
|
|
608
|
+
end
|
|
609
|
+
expect(notices).to eql(['success'])
|
|
610
|
+
expect(debugs.any? { |m| m =~ /Hiera configuration recreated due to change of scope variables used in interpolation expressions/ }).to be_falsey
|
|
611
|
+
end
|
|
612
|
+
end
|
|
197
613
|
end
|
|
198
614
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
615
|
+
context 'that uses reserved' do
|
|
616
|
+
let(:environment_files) do
|
|
617
|
+
{ env_name => { 'hiera.yaml' => hiera_yaml } }
|
|
618
|
+
end
|
|
619
|
+
|
|
620
|
+
context 'option' do
|
|
621
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
622
|
+
version: 5
|
|
623
|
+
hierarchy:
|
|
624
|
+
- name: "Illegal"
|
|
625
|
+
options:
|
|
626
|
+
#{opt_spec}
|
|
627
|
+
data_hash: yaml_data
|
|
628
|
+
YAML
|
|
629
|
+
|
|
630
|
+
context 'path' do
|
|
631
|
+
let(:opt_spec) { 'path: data/foo.yaml' }
|
|
632
|
+
|
|
633
|
+
it 'fails and reports the reserved option key' do
|
|
634
|
+
expect { lookup('a') }.to raise_error do |e|
|
|
635
|
+
expect(e.message).to match(/Option key 'path' used in hierarchy 'Illegal' is reserved by Puppet/)
|
|
636
|
+
end
|
|
637
|
+
end
|
|
638
|
+
end
|
|
639
|
+
|
|
640
|
+
context 'uri' do
|
|
641
|
+
let(:opt_spec) { 'uri: file:///data/foo.yaml' }
|
|
642
|
+
|
|
643
|
+
it 'fails and reports the reserved option key' do
|
|
644
|
+
expect { lookup('a') }.to raise_error do |e|
|
|
645
|
+
expect(e.message).to match(/Option key 'uri' used in hierarchy 'Illegal' is reserved by Puppet/)
|
|
646
|
+
end
|
|
647
|
+
end
|
|
648
|
+
end
|
|
649
|
+
end
|
|
650
|
+
|
|
651
|
+
context 'default option' do
|
|
652
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
653
|
+
---
|
|
654
|
+
version: 5
|
|
655
|
+
defaults:
|
|
656
|
+
options:
|
|
657
|
+
#{opt_spec}
|
|
658
|
+
hierarchy:
|
|
659
|
+
- name: "Illegal"
|
|
660
|
+
data_hash: yaml_data
|
|
661
|
+
YAML
|
|
662
|
+
|
|
663
|
+
context 'path' do
|
|
664
|
+
let(:opt_spec) { 'path: data/foo.yaml' }
|
|
665
|
+
|
|
666
|
+
it 'fails and reports the reserved option key' do
|
|
667
|
+
expect { lookup('a') }.to raise_error do |e|
|
|
668
|
+
expect(e.message).to match(/Option key 'path' used in defaults is reserved by Puppet/)
|
|
669
|
+
end
|
|
670
|
+
end
|
|
671
|
+
end
|
|
672
|
+
|
|
673
|
+
context 'uri' do
|
|
674
|
+
let(:opt_spec) { 'uri: file:///data/foo.yaml' }
|
|
675
|
+
|
|
676
|
+
it 'fails and reports the reserved option key' do
|
|
677
|
+
expect { lookup('a') }.to raise_error do |e|
|
|
678
|
+
expect(e.message).to match(/Option key 'uri' used in defaults is reserved by Puppet/)
|
|
679
|
+
end
|
|
680
|
+
end
|
|
681
|
+
end
|
|
682
|
+
end
|
|
203
683
|
end
|
|
204
684
|
|
|
205
|
-
context 'with
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
685
|
+
context 'with yaml data file' do
|
|
686
|
+
let(:environment_files) do
|
|
687
|
+
{
|
|
688
|
+
env_name => {
|
|
689
|
+
'hiera.yaml' => <<-YAML.unindent,
|
|
690
|
+
---
|
|
691
|
+
version: 5
|
|
692
|
+
YAML
|
|
693
|
+
'data' => {
|
|
694
|
+
'common.yaml' => common_yaml
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
end
|
|
699
|
+
|
|
700
|
+
context 'that contains hash values with interpolated keys' do
|
|
701
|
+
let(:common_yaml) do
|
|
702
|
+
<<-YAML.unindent
|
|
703
|
+
---
|
|
704
|
+
a:
|
|
705
|
+
"%{key}": "the %{value}"
|
|
706
|
+
b: "Detail in %{lookup('a.a_key')}"
|
|
707
|
+
YAML
|
|
708
|
+
end
|
|
709
|
+
|
|
710
|
+
it 'interpolates both key and value"' do
|
|
711
|
+
Puppet[:log_level] = 'debug'
|
|
712
|
+
collect_notices("notice('success')") do |scope|
|
|
713
|
+
expect(lookup_func.call(scope, 'a')).to eql({'' => 'the '})
|
|
714
|
+
scope['key'] = 'a_key'
|
|
715
|
+
scope['value'] = 'interpolated value'
|
|
716
|
+
expect(lookup_func.call(scope, 'a')).to eql({'a_key' => 'the interpolated value'})
|
|
717
|
+
end
|
|
718
|
+
expect(notices).to eql(['success'])
|
|
719
|
+
end
|
|
720
|
+
|
|
721
|
+
it 'navigates to a value behind an interpolated key"' do
|
|
722
|
+
Puppet[:log_level] = 'debug'
|
|
723
|
+
collect_notices("notice('success')") do |scope|
|
|
724
|
+
scope['key'] = 'a_key'
|
|
725
|
+
scope['value'] = 'interpolated value'
|
|
726
|
+
expect(lookup_func.call(scope, 'a.a_key')).to eql('the interpolated value')
|
|
727
|
+
end
|
|
728
|
+
expect(notices).to eql(['success'])
|
|
729
|
+
end
|
|
730
|
+
|
|
731
|
+
it 'navigates to a value behind an interpolated key using an interpolated value"' do
|
|
732
|
+
Puppet[:log_level] = 'debug'
|
|
733
|
+
collect_notices("notice('success')") do |scope|
|
|
734
|
+
scope['key'] = 'a_key'
|
|
735
|
+
scope['value'] = 'interpolated value'
|
|
736
|
+
expect(lookup_func.call(scope, 'b')).to eql('Detail in the interpolated value')
|
|
737
|
+
end
|
|
738
|
+
expect(notices).to eql(['success'])
|
|
739
|
+
end
|
|
209
740
|
end
|
|
210
741
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
742
|
+
context 'that is empty' do
|
|
743
|
+
let(:common_yaml) { '' }
|
|
744
|
+
|
|
745
|
+
it 'fails with a "did not find"' do
|
|
746
|
+
expect { lookup('a') }.to raise_error do |e|
|
|
747
|
+
expect(e.message).to match(/did not find a value for the name 'a'/)
|
|
748
|
+
end
|
|
749
|
+
end
|
|
750
|
+
|
|
751
|
+
it 'logs a warning that the file does not contain a hash' do
|
|
752
|
+
expect { lookup('a') }.to raise_error(Puppet::DataBinding::LookupError)
|
|
753
|
+
expect(warnings).to include(/spec\/data\/common.yaml: file does not contain a valid yaml hash/)
|
|
754
|
+
end
|
|
755
|
+
end
|
|
756
|
+
|
|
757
|
+
context 'that contains illegal yaml' do
|
|
758
|
+
let(:common_yaml) { "@!#%**&:\n" }
|
|
759
|
+
|
|
760
|
+
it 'fails lookup and that the key is not found' do
|
|
761
|
+
expect { lookup('a') }.to raise_error do |e|
|
|
762
|
+
expect(e.message).to match(/Unable to parse/)
|
|
763
|
+
end
|
|
764
|
+
end
|
|
214
765
|
end
|
|
215
766
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
767
|
+
context 'that contains a legal yaml that is not a hash' do
|
|
768
|
+
let(:common_yaml) { "- A list\n- of things" }
|
|
769
|
+
|
|
770
|
+
it 'fails with a "did not find"' do
|
|
771
|
+
expect { lookup('a') }.to raise_error do |e|
|
|
772
|
+
expect(e.message).to match(/did not find a value for the name 'a'/)
|
|
773
|
+
end
|
|
774
|
+
end
|
|
775
|
+
|
|
776
|
+
it 'logs a warning that the file does not contain a hash' do
|
|
777
|
+
expect { lookup('a') }.to raise_error(Puppet::DataBinding::LookupError)
|
|
778
|
+
expect(warnings).to include(/spec\/data\/common.yaml: file does not contain a valid yaml hash/)
|
|
779
|
+
end
|
|
219
780
|
end
|
|
220
781
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
782
|
+
context 'that contains a legal yaml hash with illegal types' do
|
|
783
|
+
let(:common_yaml) do
|
|
784
|
+
<<-YAML.unindent
|
|
785
|
+
---
|
|
786
|
+
a: !ruby/object:Puppet::Graph::Key
|
|
787
|
+
value: x
|
|
788
|
+
YAML
|
|
789
|
+
end
|
|
790
|
+
|
|
791
|
+
it 'fails lookup and reports a type mismatch' do
|
|
792
|
+
expect { lookup('a') }.to raise_error do |e|
|
|
793
|
+
expect(e.message).to match(/key 'a'.*data_hash function 'yaml_data'.*using location.*wrong type, expects Puppet::LookupValue, got Runtime/)
|
|
794
|
+
end
|
|
795
|
+
end
|
|
224
796
|
end
|
|
225
797
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
798
|
+
context 'that contains illegal interpolations' do
|
|
799
|
+
context 'in the form of an alias that is not the entire string' do
|
|
800
|
+
let(:common_yaml) { <<-YAML.unindent }
|
|
801
|
+
a: "%{alias('x')} and then some"
|
|
802
|
+
x: value x
|
|
803
|
+
YAML
|
|
804
|
+
|
|
805
|
+
it 'fails lookup and reports a type mismatch' do
|
|
806
|
+
expect { lookup('a') }.to raise_error("'alias' interpolation is only permitted if the expression is equal to the entire string")
|
|
807
|
+
end
|
|
808
|
+
end
|
|
809
|
+
|
|
810
|
+
context 'in the form of an unknown function name' do
|
|
811
|
+
let(:common_yaml) { <<-YAML.unindent }
|
|
812
|
+
a: "%{what('x')}"
|
|
813
|
+
x: value x
|
|
814
|
+
YAML
|
|
815
|
+
|
|
816
|
+
it 'fails lookup and reports a type mismatch' do
|
|
817
|
+
expect { lookup('a') }.to raise_error("Unknown interpolation method 'what'")
|
|
818
|
+
end
|
|
819
|
+
end
|
|
230
820
|
end
|
|
231
821
|
end
|
|
232
822
|
|
|
233
|
-
context 'with
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
823
|
+
context 'with lookup_options configured using patterns' do
|
|
824
|
+
let(:mod_common) {
|
|
825
|
+
<<-YAML.unindent
|
|
826
|
+
mod::hash_a:
|
|
827
|
+
aa:
|
|
828
|
+
aaa: aaa (from module)
|
|
829
|
+
ab:
|
|
830
|
+
aba: aba (from module)
|
|
831
|
+
mod::hash_b:
|
|
832
|
+
ba:
|
|
833
|
+
baa: baa (from module)
|
|
834
|
+
bb:
|
|
835
|
+
bba: bba (from module)
|
|
836
|
+
lookup_options:
|
|
837
|
+
'^mod::ha.*_a':
|
|
838
|
+
merge: deep
|
|
839
|
+
'^mod::ha.*_b':
|
|
840
|
+
merge: deep
|
|
841
|
+
YAML
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
let(:mod_base) do
|
|
845
|
+
{
|
|
846
|
+
'hiera.yaml' => <<-YAML.unindent,
|
|
847
|
+
version: 5
|
|
848
|
+
YAML
|
|
849
|
+
'data' => {
|
|
850
|
+
'common.yaml' => mod_common
|
|
851
|
+
}
|
|
852
|
+
}
|
|
237
853
|
end
|
|
238
854
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
855
|
+
let(:env_modules) do
|
|
856
|
+
{
|
|
857
|
+
'mod' => mod_base
|
|
858
|
+
}
|
|
242
859
|
end
|
|
243
860
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
861
|
+
let(:env_hiera_yaml) do
|
|
862
|
+
<<-YAML.unindent
|
|
863
|
+
---
|
|
864
|
+
version: 5
|
|
865
|
+
hierarchy:
|
|
866
|
+
- name: X
|
|
867
|
+
paths:
|
|
868
|
+
- first.yaml
|
|
869
|
+
- second.yaml
|
|
870
|
+
YAML
|
|
247
871
|
end
|
|
248
872
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
873
|
+
let(:env_lookup_options) { <<-YAML.unindent }
|
|
874
|
+
lookup_options:
|
|
875
|
+
b:
|
|
876
|
+
merge: hash
|
|
877
|
+
'^[^b]$':
|
|
878
|
+
merge: deep
|
|
879
|
+
'^c':
|
|
880
|
+
merge: first
|
|
881
|
+
'^b':
|
|
882
|
+
merge: first
|
|
883
|
+
'^mod::ha.*_b':
|
|
884
|
+
merge: hash
|
|
885
|
+
YAML
|
|
886
|
+
|
|
887
|
+
let(:env_data) do
|
|
888
|
+
{
|
|
889
|
+
'first.yaml' => <<-YAML.unindent + env_lookup_options,
|
|
890
|
+
a:
|
|
891
|
+
aa:
|
|
892
|
+
aaa: a.aa.aaa
|
|
893
|
+
b:
|
|
894
|
+
ba:
|
|
895
|
+
baa: b.ba.baa
|
|
896
|
+
bb:
|
|
897
|
+
bba: b.bb.bba
|
|
898
|
+
c:
|
|
899
|
+
ca:
|
|
900
|
+
caa: c.ca.caa
|
|
901
|
+
mod::hash_a:
|
|
902
|
+
aa:
|
|
903
|
+
aab: aab (from environment)
|
|
904
|
+
ab:
|
|
905
|
+
aba: aba (from environment)
|
|
906
|
+
abb: abb (from environment)
|
|
907
|
+
mod::hash_b:
|
|
908
|
+
ba:
|
|
909
|
+
bab: bab (from environment)
|
|
910
|
+
bc:
|
|
911
|
+
bca: bca (from environment)
|
|
912
|
+
YAML
|
|
913
|
+
'second.yaml' => <<-YAML.unindent,
|
|
914
|
+
a:
|
|
915
|
+
aa:
|
|
916
|
+
aab: a.aa.aab
|
|
917
|
+
b:
|
|
918
|
+
ba:
|
|
919
|
+
bab: b.ba.bab
|
|
920
|
+
bb:
|
|
921
|
+
bbb: b.bb.bbb
|
|
922
|
+
c:
|
|
923
|
+
ca:
|
|
924
|
+
cab: c.ca.cab
|
|
925
|
+
YAML
|
|
926
|
+
}
|
|
252
927
|
end
|
|
253
928
|
|
|
254
|
-
it '
|
|
255
|
-
|
|
256
|
-
expect(resources).to include('no_value')
|
|
929
|
+
it 'finds lookup_options that matches a pattern' do
|
|
930
|
+
expect(lookup('a')).to eql({'aa' => { 'aaa' => 'a.aa.aaa', 'aab' => 'a.aa.aab' }})
|
|
257
931
|
end
|
|
258
932
|
|
|
259
|
-
it '
|
|
260
|
-
expect
|
|
261
|
-
assemble_and_compile_with_block('${r[a]}_${r[b]}', "{'a' => 'dflt_x', 'b' => 32}", "'abc::x'", 'Hash[String,String]')
|
|
262
|
-
end.to raise_error(Puppet::ParseError, /default_block value has wrong type/)
|
|
933
|
+
it 'gives a direct key match higher priority than a matching pattern' do
|
|
934
|
+
expect(lookup('b')).to eql({'ba' => { 'baa' => 'b.ba.baa' }, 'bb' => { 'bba'=>'b.bb.bba' }})
|
|
263
935
|
end
|
|
264
936
|
|
|
265
|
-
it '
|
|
266
|
-
|
|
267
|
-
expect(resources).to include('name_x')
|
|
937
|
+
it 'uses the first matching pattern' do
|
|
938
|
+
expect(lookup('c')).to eql({'ca' => { 'caa' => 'c.ca.caa', 'cab' => 'c.ca.cab' }})
|
|
268
939
|
end
|
|
269
940
|
|
|
270
|
-
it '
|
|
271
|
-
|
|
272
|
-
|
|
941
|
+
it 'uses lookup_option found by pattern from module' do
|
|
942
|
+
expect(lookup('mod::hash_a')).to eql({
|
|
943
|
+
'aa' => {
|
|
944
|
+
'aaa' => 'aaa (from module)',
|
|
945
|
+
'aab' => 'aab (from environment)'
|
|
946
|
+
},
|
|
947
|
+
'ab' => {
|
|
948
|
+
'aba' => 'aba (from environment)',
|
|
949
|
+
'abb' => 'abb (from environment)'
|
|
950
|
+
}
|
|
951
|
+
})
|
|
273
952
|
end
|
|
274
|
-
end
|
|
275
|
-
end
|
|
276
953
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
954
|
+
it 'merges lookup_options found by pattern in environment and module (environment wins)' do
|
|
955
|
+
expect(lookup('mod::hash_b')).to eql({
|
|
956
|
+
'ba' => {
|
|
957
|
+
'bab' => 'bab (from environment)'
|
|
958
|
+
},
|
|
959
|
+
'bb' => {
|
|
960
|
+
'bba' => 'bba (from module)'
|
|
961
|
+
},
|
|
962
|
+
'bc' => {
|
|
963
|
+
'bca' => 'bca (from environment)'
|
|
964
|
+
}
|
|
965
|
+
})
|
|
966
|
+
end
|
|
282
967
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
968
|
+
context 'and patterns in module are not limited to module keys' do
|
|
969
|
+
let(:mod_common) {
|
|
970
|
+
<<-YAML.unindent
|
|
971
|
+
mod::hash_a:
|
|
972
|
+
aa:
|
|
973
|
+
aaa: aaa (from module)
|
|
974
|
+
ab:
|
|
975
|
+
aba: aba (from module)
|
|
976
|
+
lookup_options:
|
|
977
|
+
'^.*_a':
|
|
978
|
+
merge: deep
|
|
979
|
+
YAML
|
|
980
|
+
}
|
|
287
981
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
982
|
+
it 'fails with error' do
|
|
983
|
+
expect { lookup('mod::a') }.to raise_error(Puppet::DataBinding::LookupError, /all lookup_options patterns must match a key starting with module name/)
|
|
984
|
+
end
|
|
985
|
+
end
|
|
292
986
|
|
|
293
|
-
|
|
294
|
-
resources = assemble_and_compile('${r}', "{name => 'abc::x', default_values_hash => { abc::x => 'extra_x'}}")
|
|
295
|
-
expect(resources).to include('extra_x')
|
|
296
|
-
end
|
|
987
|
+
context 'and there are no lookup options that do not use patterns' do
|
|
297
988
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
989
|
+
let(:env_lookup_options) { <<-YAML.unindent }
|
|
990
|
+
lookup_options:
|
|
991
|
+
'^[^b]$':
|
|
992
|
+
merge: deep
|
|
993
|
+
'^c':
|
|
994
|
+
merge: first
|
|
995
|
+
'^b':
|
|
996
|
+
merge: first
|
|
997
|
+
'^mod::ha.*_b':
|
|
998
|
+
merge: hash
|
|
999
|
+
YAML
|
|
302
1000
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
1001
|
+
it 'finds lookup_options that matches a pattern' do
|
|
1002
|
+
expect(lookup('a')).to eql({'aa' => { 'aaa' => 'a.aa.aaa', 'aab' => 'a.aa.aab' }})
|
|
1003
|
+
end
|
|
1004
|
+
end
|
|
306
1005
|
end
|
|
307
1006
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
1007
|
+
context 'and an environment Hiera v5 configuration using globs' do
|
|
1008
|
+
let(:env_hiera_yaml) do
|
|
1009
|
+
<<-YAML.unindent
|
|
1010
|
+
---
|
|
1011
|
+
version: 5
|
|
1012
|
+
hierarchy:
|
|
1013
|
+
- name: Globs
|
|
1014
|
+
globs:
|
|
1015
|
+
- "globs/*.yaml"
|
|
1016
|
+
- "globs_%{domain}/*.yaml"
|
|
1017
|
+
YAML
|
|
1018
|
+
end
|
|
1019
|
+
|
|
1020
|
+
let(:env_data) do
|
|
1021
|
+
{
|
|
1022
|
+
'globs' => {
|
|
1023
|
+
'a.yaml' => <<-YAML.unindent,
|
|
1024
|
+
glob_a: value glob_a
|
|
1025
|
+
YAML
|
|
1026
|
+
'b.yaml' => <<-YAML.unindent
|
|
1027
|
+
glob_b:
|
|
1028
|
+
a: value glob_b.a
|
|
1029
|
+
b: value glob_b.b
|
|
1030
|
+
YAML
|
|
1031
|
+
},
|
|
1032
|
+
'globs_example.com' => {
|
|
1033
|
+
'a.yaml' => <<-YAML.unindent,
|
|
1034
|
+
glob_c: value glob_a
|
|
1035
|
+
YAML
|
|
1036
|
+
'b.yaml' => <<-YAML.unindent
|
|
1037
|
+
glob_b:
|
|
1038
|
+
c: value glob_b.c
|
|
1039
|
+
d: value glob_b.d
|
|
1040
|
+
YAML
|
|
1041
|
+
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
end
|
|
311
1045
|
end
|
|
312
1046
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
1047
|
+
context 'and an environment Hiera v5 configuration using mapped_paths' do
|
|
1048
|
+
let(:scope_additions) do
|
|
1049
|
+
{
|
|
1050
|
+
'mapped' => {
|
|
1051
|
+
'array_var' => ['a', 'b', 'c'],
|
|
1052
|
+
'hash_var' => { 'x' => 'a', 'y' => 'b', 'z' => 'c' },
|
|
1053
|
+
'string_var' => 's' },
|
|
1054
|
+
'var' => 'global_var' # overridden by mapped path variable
|
|
1055
|
+
}
|
|
1056
|
+
end
|
|
1057
|
+
|
|
1058
|
+
let(:env_hiera_yaml) do
|
|
1059
|
+
<<-YAML.unindent
|
|
1060
|
+
---
|
|
1061
|
+
version: 5
|
|
1062
|
+
hierarchy:
|
|
1063
|
+
- name: Mapped Paths
|
|
1064
|
+
mapped_paths: #{mapped_paths}
|
|
1065
|
+
- name: Global Path
|
|
1066
|
+
path: "%{var}.yaml"
|
|
1067
|
+
YAML
|
|
1068
|
+
end
|
|
1069
|
+
|
|
1070
|
+
let(:environment_files) do
|
|
1071
|
+
{
|
|
1072
|
+
env_name => {
|
|
1073
|
+
'hiera.yaml' => env_hiera_yaml,
|
|
1074
|
+
'data' => env_data
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
end
|
|
1078
|
+
|
|
1079
|
+
context 'that originates from an array' do
|
|
1080
|
+
let (:mapped_paths) { '[mapped.array_var, var, "paths/%{var}.yaml"]' }
|
|
1081
|
+
|
|
1082
|
+
let(:env_data) do
|
|
1083
|
+
{
|
|
1084
|
+
'paths' => {
|
|
1085
|
+
'a.yaml' => <<-YAML.unindent,
|
|
1086
|
+
path_a: value path_a
|
|
1087
|
+
path_h:
|
|
1088
|
+
a: value path_h.a
|
|
1089
|
+
c: value path_h.c
|
|
1090
|
+
YAML
|
|
1091
|
+
'b.yaml' => <<-YAML.unindent,
|
|
1092
|
+
path_h:
|
|
1093
|
+
b: value path_h.b
|
|
1094
|
+
d: value path_h.d
|
|
1095
|
+
YAML
|
|
1096
|
+
'd.yaml' => <<-YAML.unindent
|
|
1097
|
+
path_h:
|
|
1098
|
+
b: value path_h.b (from d.yaml)
|
|
1099
|
+
d: value path_h.d (from d.yaml)
|
|
1100
|
+
YAML
|
|
1101
|
+
},
|
|
1102
|
+
'global_var.yaml' => <<-YAML.unindent,
|
|
1103
|
+
path_h:
|
|
1104
|
+
e: value path_h.e
|
|
1105
|
+
YAML
|
|
1106
|
+
'other_var.yaml' => <<-YAML.unindent
|
|
1107
|
+
path_h:
|
|
1108
|
+
e: value path_h.e (from other_var.yaml)
|
|
1109
|
+
YAML
|
|
1110
|
+
}
|
|
1111
|
+
end
|
|
1112
|
+
|
|
1113
|
+
it 'finds environment data using mapped_paths' do
|
|
1114
|
+
expect(lookup('path_a')).to eql('value path_a')
|
|
1115
|
+
expect(warnings).to be_empty
|
|
1116
|
+
end
|
|
1117
|
+
|
|
1118
|
+
it 'includes mapped path in explain output' do
|
|
1119
|
+
explanation = explain('path_h', 'merge' => 'deep')
|
|
1120
|
+
['a', 'b', 'c'].each do |var|
|
|
1121
|
+
expect(explanation).to match(/^\s+Path "#{env_dir}\/spec\/data\/paths\/#{var}\.yaml"\n\s+Original path: "paths\/%\{var\}\.yaml"/)
|
|
1122
|
+
end
|
|
1123
|
+
expect(warnings).to be_empty
|
|
1124
|
+
end
|
|
1125
|
+
|
|
1126
|
+
it 'performs merges between mapped paths and global path interpolated using same key' do
|
|
1127
|
+
expect(lookup('path_h', 'merge' => 'hash')).to eql(
|
|
1128
|
+
{
|
|
1129
|
+
'a' => 'value path_h.a',
|
|
1130
|
+
'b' => 'value path_h.b',
|
|
1131
|
+
'c' => 'value path_h.c',
|
|
1132
|
+
'd' => 'value path_h.d',
|
|
1133
|
+
'e' => 'value path_h.e'
|
|
1134
|
+
})
|
|
1135
|
+
expect(warnings).to be_empty
|
|
1136
|
+
end
|
|
1137
|
+
|
|
1138
|
+
it 'keeps track of changes in key overridden by interpolated key' do
|
|
1139
|
+
Puppet[:log_level] = 'debug'
|
|
1140
|
+
collect_notices("notice('success')") do |scope|
|
|
1141
|
+
expect(lookup_func.call(scope, 'path_h', 'merge' => 'hash')).to eql(
|
|
1142
|
+
{
|
|
1143
|
+
'a' => 'value path_h.a',
|
|
1144
|
+
'b' => 'value path_h.b',
|
|
1145
|
+
'c' => 'value path_h.c',
|
|
1146
|
+
'd' => 'value path_h.d',
|
|
1147
|
+
'e' => 'value path_h.e'
|
|
1148
|
+
})
|
|
1149
|
+
scope.with_local_scope('var' => 'other_var') do
|
|
1150
|
+
expect(lookup_func.call(scope, 'path_h', 'merge' => 'hash')).to eql(
|
|
1151
|
+
{
|
|
1152
|
+
'a' => 'value path_h.a',
|
|
1153
|
+
'b' => 'value path_h.b',
|
|
1154
|
+
'c' => 'value path_h.c',
|
|
1155
|
+
'd' => 'value path_h.d',
|
|
1156
|
+
'e' => 'value path_h.e (from other_var.yaml)'
|
|
1157
|
+
})
|
|
1158
|
+
end
|
|
1159
|
+
end
|
|
1160
|
+
expect(notices).to eql(['success'])
|
|
1161
|
+
expect(debugs.any? { |m| m =~ /Hiera configuration recreated due to change of scope variables used in interpolation expressions/ }).to be_truthy
|
|
1162
|
+
end
|
|
1163
|
+
|
|
1164
|
+
it 'keeps track of changes in elements of mapped key' do
|
|
1165
|
+
Puppet[:log_level] = 'debug'
|
|
1166
|
+
collect_notices("notice('success')") do |scope|
|
|
1167
|
+
expect(lookup_func.call(scope, 'path_h', 'merge' => 'hash')).to eql(
|
|
1168
|
+
{
|
|
1169
|
+
'a' => 'value path_h.a',
|
|
1170
|
+
'b' => 'value path_h.b',
|
|
1171
|
+
'c' => 'value path_h.c',
|
|
1172
|
+
'd' => 'value path_h.d',
|
|
1173
|
+
'e' => 'value path_h.e'
|
|
1174
|
+
})
|
|
1175
|
+
scope['mapped']['array_var'] = ['a', 'c', 'd']
|
|
1176
|
+
expect(lookup_func.call(scope, 'path_h', 'merge' => 'hash')).to eql(
|
|
1177
|
+
{
|
|
1178
|
+
'a' => 'value path_h.a',
|
|
1179
|
+
'b' => 'value path_h.b (from d.yaml)',
|
|
1180
|
+
'c' => 'value path_h.c',
|
|
1181
|
+
'd' => 'value path_h.d (from d.yaml)',
|
|
1182
|
+
'e' => 'value path_h.e'
|
|
1183
|
+
})
|
|
1184
|
+
end
|
|
1185
|
+
expect(notices).to eql(['success'])
|
|
1186
|
+
expect(debugs.any? { |m| m =~ /Hiera configuration recreated due to change of scope variables used in interpolation expressions/ }).to be_truthy
|
|
1187
|
+
end
|
|
1188
|
+
end
|
|
1189
|
+
|
|
1190
|
+
context 'that originates from a hash' do
|
|
1191
|
+
let (:mapped_paths) { '[mapped.hash_var, var, "paths/%{var.0}.%{var.1}.yaml"]' }
|
|
1192
|
+
|
|
1193
|
+
let(:env_data) do
|
|
1194
|
+
{
|
|
1195
|
+
'paths' => {
|
|
1196
|
+
'x.a.yaml' => <<-YAML.unindent,
|
|
1197
|
+
path_xa: value path_xa
|
|
1198
|
+
path_m:
|
|
1199
|
+
a: value path_m.a
|
|
1200
|
+
c: value path_m.c
|
|
1201
|
+
YAML
|
|
1202
|
+
'y.b.yaml' => <<-YAML.unindent
|
|
1203
|
+
path_m:
|
|
1204
|
+
b: value path_m.b
|
|
1205
|
+
d: value path_m.d
|
|
1206
|
+
YAML
|
|
1207
|
+
},
|
|
1208
|
+
'global_var.yaml' => <<-YAML.unindent
|
|
1209
|
+
path_m:
|
|
1210
|
+
e: value path_m.e
|
|
1211
|
+
YAML
|
|
1212
|
+
}
|
|
1213
|
+
end
|
|
1214
|
+
|
|
1215
|
+
it 'finds environment data using mapped_paths' do
|
|
1216
|
+
expect(lookup('path_xa')).to eql('value path_xa')
|
|
1217
|
+
expect(warnings).to be_empty
|
|
1218
|
+
end
|
|
1219
|
+
|
|
1220
|
+
it 'includes mapped path in explain output' do
|
|
1221
|
+
explanation = explain('path_h', 'merge' => 'deep')
|
|
1222
|
+
['x\.a', 'y\.b', 'z\.c'].each do |var|
|
|
1223
|
+
expect(explanation).to match(/^\s+Path "#{env_dir}\/spec\/data\/paths\/#{var}\.yaml"\n\s+Original path: "paths\/%\{var\.0\}\.%\{var\.1\}\.yaml"/)
|
|
1224
|
+
end
|
|
1225
|
+
expect(warnings).to be_empty
|
|
1226
|
+
end
|
|
1227
|
+
|
|
1228
|
+
it 'performs merges between mapped paths' do
|
|
1229
|
+
expect(lookup('path_m', 'merge' => 'hash')).to eql(
|
|
1230
|
+
{
|
|
1231
|
+
'a' => 'value path_m.a',
|
|
1232
|
+
'b' => 'value path_m.b',
|
|
1233
|
+
'c' => 'value path_m.c',
|
|
1234
|
+
'd' => 'value path_m.d',
|
|
1235
|
+
'e' => 'value path_m.e'
|
|
1236
|
+
})
|
|
1237
|
+
expect(warnings).to be_empty
|
|
1238
|
+
end
|
|
1239
|
+
end
|
|
1240
|
+
|
|
1241
|
+
context 'that originates from a string' do
|
|
1242
|
+
let (:mapped_paths) { '[mapped.string_var, var, "paths/%{var}.yaml"]' }
|
|
1243
|
+
|
|
1244
|
+
let(:env_data) do
|
|
1245
|
+
{
|
|
1246
|
+
'paths' => {
|
|
1247
|
+
's.yaml' => <<-YAML.unindent,
|
|
1248
|
+
path_s: value path_s
|
|
1249
|
+
YAML
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1252
|
+
end
|
|
1253
|
+
|
|
1254
|
+
it 'includes mapped path in explain output' do
|
|
1255
|
+
expect(explain('path_s')).to match(/^\s+Path "#{env_dir}\/spec\/data\/paths\/s\.yaml"\n\s+Original path: "paths\/%\{var\}\.yaml"/)
|
|
1256
|
+
expect(warnings).to be_empty
|
|
1257
|
+
end
|
|
1258
|
+
|
|
1259
|
+
it 'finds environment data using mapped_paths' do
|
|
1260
|
+
expect(lookup('path_s')).to eql('value path_s')
|
|
1261
|
+
expect(warnings).to be_empty
|
|
1262
|
+
end
|
|
1263
|
+
end
|
|
1264
|
+
|
|
1265
|
+
context 'where the enty does not exist' do
|
|
1266
|
+
let (:mapped_paths) { '[mapped.nosuch_var, var, "paths/%{var}.yaml"]' }
|
|
1267
|
+
|
|
1268
|
+
it 'finds environment data using mapped_paths' do
|
|
1269
|
+
expect(explain('hello')).to match(/No such key: "hello"/)
|
|
1270
|
+
expect(warnings).to be_empty
|
|
1271
|
+
end
|
|
1272
|
+
end
|
|
317
1273
|
end
|
|
318
1274
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
1275
|
+
context 'and an environment Hiera v3 configuration' do
|
|
1276
|
+
let(:env_hiera_yaml) do
|
|
1277
|
+
<<-YAML.unindent
|
|
1278
|
+
---
|
|
1279
|
+
:backends: yaml
|
|
1280
|
+
:yaml:
|
|
1281
|
+
:datadir: #{env_dir}/#{env_name}/hieradata
|
|
1282
|
+
YAML
|
|
1283
|
+
end
|
|
1284
|
+
|
|
1285
|
+
let(:environment_files) do
|
|
1286
|
+
{
|
|
1287
|
+
env_name => {
|
|
1288
|
+
'hiera.yaml' => env_hiera_yaml,
|
|
1289
|
+
'hieradata' => {
|
|
1290
|
+
'common.yaml' => <<-YAML.unindent,
|
|
1291
|
+
g: Value g
|
|
1292
|
+
YAML
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
end
|
|
1297
|
+
|
|
1298
|
+
it 'will raise an error if --strict is set to error' do
|
|
1299
|
+
Puppet[:strict] = :error
|
|
1300
|
+
expect { lookup('g') }.to raise_error(Puppet::Error, /hiera.yaml version 3 cannot be used in an environment/)
|
|
1301
|
+
end
|
|
1302
|
+
|
|
1303
|
+
it 'will log a warning and ignore the file if --strict is set to warning' do
|
|
1304
|
+
Puppet[:strict] = :warning
|
|
1305
|
+
expect { lookup('g') }.to raise_error(Puppet::Error, /did not find a value for the name 'g'/)
|
|
1306
|
+
end
|
|
1307
|
+
|
|
1308
|
+
it 'will not log a warning and ignore the file if --strict is set to off' do
|
|
1309
|
+
Puppet[:strict] = :off
|
|
1310
|
+
expect { lookup('g') }.to raise_error(Puppet::Error, /did not find a value for the name 'g'/)
|
|
1311
|
+
expect(warnings).to include(/hiera.yaml version 3 found at the environment root was ignored/)
|
|
1312
|
+
end
|
|
1313
|
+
|
|
1314
|
+
it 'will use the configuration if appointed by global setting but still warn when encountered by environment data provider' do
|
|
1315
|
+
Puppet[:strict] = :warning
|
|
1316
|
+
Puppet.settings[:hiera_config] = File.join(env_dir, env_name, 'hiera.yaml')
|
|
1317
|
+
expect(lookup('g')).to eql('Value g')
|
|
1318
|
+
expect(warnings).to include(/hiera.yaml version 3 found at the environment root was ignored/)
|
|
1319
|
+
end
|
|
322
1320
|
end
|
|
323
|
-
end
|
|
324
1321
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
1322
|
+
context 'and a global empty Hiera configuration' do
|
|
1323
|
+
let(:hiera_yaml_path) { File.join(code_dir, 'hiera.yaml') }
|
|
1324
|
+
let(:code_dir_files) do
|
|
1325
|
+
{
|
|
1326
|
+
'hiera.yaml' => '',
|
|
1327
|
+
}
|
|
1328
|
+
end
|
|
1329
|
+
|
|
1330
|
+
let(:environment_files) do
|
|
1331
|
+
{
|
|
1332
|
+
env_name => {
|
|
1333
|
+
'hieradata' => {
|
|
1334
|
+
'common.yaml' => <<-YAML.unindent,
|
|
1335
|
+
x: value x (from environment)
|
|
1336
|
+
YAML
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1340
|
+
end
|
|
1341
|
+
|
|
1342
|
+
before(:each) do
|
|
1343
|
+
# Need to set here since spec_helper defines these settings in its "before each"
|
|
1344
|
+
Puppet.settings[:hiera_config] = hiera_yaml_path
|
|
1345
|
+
end
|
|
1346
|
+
|
|
1347
|
+
it 'uses a Hiera version 3 defaults' do
|
|
1348
|
+
expect(lookup('x')).to eql('value x (from environment)')
|
|
1349
|
+
end
|
|
1350
|
+
|
|
1351
|
+
context 'obtained using /dev/null', :unless => Puppet.features.microsoft_windows? do
|
|
1352
|
+
let(:code_dir_files) { {} }
|
|
1353
|
+
|
|
1354
|
+
it 'uses a Hiera version 3 defaults' do
|
|
1355
|
+
Puppet[:hiera_config] = '/dev/null'
|
|
1356
|
+
expect(lookup('x')).to eql('value x (from environment)')
|
|
1357
|
+
end
|
|
1358
|
+
end
|
|
331
1359
|
end
|
|
332
1360
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
1361
|
+
context 'and a global configuration' do
|
|
1362
|
+
let(:hiera_yaml) do
|
|
1363
|
+
<<-YAML.unindent
|
|
1364
|
+
---
|
|
1365
|
+
:backends:
|
|
1366
|
+
- yaml
|
|
1367
|
+
- json
|
|
1368
|
+
- custom
|
|
1369
|
+
- hocon
|
|
1370
|
+
:yaml:
|
|
1371
|
+
:datadir: #{code_dir}/hieradata
|
|
1372
|
+
:json:
|
|
1373
|
+
:datadir: #{code_dir}/hieradata
|
|
1374
|
+
:hocon:
|
|
1375
|
+
:datadir: #{code_dir}/hieradata
|
|
1376
|
+
:hierarchy:
|
|
1377
|
+
- common
|
|
1378
|
+
- "%{domain}"
|
|
1379
|
+
:merge_behavior: deeper
|
|
1380
|
+
YAML
|
|
1381
|
+
end
|
|
1382
|
+
|
|
1383
|
+
let(:code_dir_files) do
|
|
1384
|
+
{
|
|
1385
|
+
'hiera.yaml' => hiera_yaml,
|
|
1386
|
+
'hieradata' => {
|
|
1387
|
+
'common.yaml' => <<-YAML.unindent,
|
|
1388
|
+
a: value a (from global)
|
|
1389
|
+
hash_b:
|
|
1390
|
+
hash_ba:
|
|
1391
|
+
bab: value hash_b.hash_ba.bab (from global)
|
|
1392
|
+
hash_c:
|
|
1393
|
+
hash_ca:
|
|
1394
|
+
cab: value hash_c.hash_ca.cab (from global)
|
|
1395
|
+
ipl_hiera_env: "environment value '%{hiera('mod_a::hash_a.a')}'"
|
|
1396
|
+
ipl_hiera_mod: "module value '%{hiera('mod_a::abc')}'"
|
|
1397
|
+
ipl_hiera_modc: "module value '%{hiera('mod_a::caller')}'"
|
|
1398
|
+
YAML
|
|
1399
|
+
'example.com.yaml' => <<-YAML.unindent,
|
|
1400
|
+
x: value x (from global example.com.yaml)
|
|
1401
|
+
YAML
|
|
1402
|
+
'common.json' => <<-JSON.unindent,
|
|
1403
|
+
{
|
|
1404
|
+
"hash_b": {
|
|
1405
|
+
"hash_ba": {
|
|
1406
|
+
"bac": "value hash_b.hash_ba.bac (from global json)"
|
|
1407
|
+
}
|
|
1408
|
+
},
|
|
1409
|
+
"hash_c": {
|
|
1410
|
+
"hash_ca": {
|
|
1411
|
+
"cac": "value hash_c.hash_ca.cac (from global json)"
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
JSON
|
|
1416
|
+
'common.conf' => <<-HOCON.unindent,
|
|
1417
|
+
// The 'xs' is a value used for testing
|
|
1418
|
+
xs = { subkey = value xs.subkey (from global hocon) }
|
|
1419
|
+
HOCON
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
end
|
|
1423
|
+
|
|
1424
|
+
let(:ruby_dir_files) do
|
|
1425
|
+
{
|
|
1426
|
+
'hiera' => {
|
|
1427
|
+
'backend' => {
|
|
1428
|
+
'custom_backend.rb' => <<-RUBY.unindent,
|
|
1429
|
+
class Hiera::Backend::Custom_backend
|
|
1430
|
+
def lookup(key, scope, order_override, resolution_type, context)
|
|
1431
|
+
case key
|
|
1432
|
+
when 'hash_c'
|
|
1433
|
+
{ 'hash_ca' => { 'cad' => 'value hash_c.hash_ca.cad (from global custom)' }}
|
|
1434
|
+
when 'hash'
|
|
1435
|
+
{ 'array' => [ 'x5,x6' ] }
|
|
1436
|
+
when 'array'
|
|
1437
|
+
[ 'x5,x6' ]
|
|
1438
|
+
when 'datasources'
|
|
1439
|
+
Hiera::Backend.datasources(scope, order_override) { |source| source }
|
|
1440
|
+
when 'dotted.key'
|
|
1441
|
+
'custom backend received request for dotted.key value'
|
|
1442
|
+
else
|
|
1443
|
+
throw :no_such_key
|
|
1444
|
+
end
|
|
1445
|
+
end
|
|
1446
|
+
end
|
|
1447
|
+
RUBY
|
|
1448
|
+
'other_backend.rb' => <<-RUBY.unindent,
|
|
1449
|
+
class Hiera::Backend::Other_backend
|
|
1450
|
+
def lookup(key, scope, order_override, resolution_type, context)
|
|
1451
|
+
value = Hiera::Config[:other][key.to_sym]
|
|
1452
|
+
throw :no_such_key if value.nil?
|
|
1453
|
+
value
|
|
1454
|
+
end
|
|
1455
|
+
end
|
|
1456
|
+
RUBY
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
end
|
|
1461
|
+
|
|
1462
|
+
before(:each) do
|
|
1463
|
+
# Need to set here since spec_helper defines these settings in its "before each"
|
|
1464
|
+
Puppet.settings[:codedir] = populated_code_dir
|
|
1465
|
+
Puppet.settings[:hiera_config] = File.join(code_dir, 'hiera.yaml')
|
|
1466
|
+
end
|
|
1467
|
+
|
|
1468
|
+
around(:each) do |example|
|
|
1469
|
+
# Faking the load path to enable 'require' to load from 'ruby_stuff'. It removes the need for a static fixture
|
|
1470
|
+
# for the custom backend
|
|
1471
|
+
$LOAD_PATH.unshift(populated_ruby_dir)
|
|
1472
|
+
begin
|
|
1473
|
+
Puppet.override(:environments => environments, :current_environment => env) do
|
|
1474
|
+
example.run
|
|
1475
|
+
end
|
|
1476
|
+
ensure
|
|
1477
|
+
if Kernel.const_defined?(:Hiera) && Hiera.const_defined?(:Backend)
|
|
1478
|
+
Hiera::Backend.send(:remove_const, :Custom_backend) if Hiera::Backend.const_defined?(:Custom_backend)
|
|
1479
|
+
Hiera::Backend.send(:remove_const, :Other_backend) if Hiera::Backend.const_defined?(:Other_backend)
|
|
1480
|
+
end
|
|
1481
|
+
$LOAD_PATH.shift
|
|
1482
|
+
end
|
|
1483
|
+
end
|
|
1484
|
+
|
|
1485
|
+
context 'version 3' do
|
|
1486
|
+
it 'finds data in in global layer and reports deprecation warnings for hiera.yaml' do
|
|
1487
|
+
expect(lookup('a')).to eql('value a (from global)')
|
|
1488
|
+
expect(warnings).to include(/Use of 'hiera.yaml' version 3 is deprecated. It should be converted to version 5/)
|
|
1489
|
+
end
|
|
1490
|
+
|
|
1491
|
+
it 'explain contains output from global layer' do
|
|
1492
|
+
explanation = explain('a')
|
|
1493
|
+
expect(explanation).to include('Global Data Provider (hiera configuration version 3)')
|
|
1494
|
+
expect(explanation).to include('Hierarchy entry "yaml"')
|
|
1495
|
+
expect(explanation).to include('Hierarchy entry "json"')
|
|
1496
|
+
expect(explanation).to include('Found key: "a" value: "value a (from global)"')
|
|
1497
|
+
end
|
|
1498
|
+
|
|
1499
|
+
it 'ignores merge behavior specified in global hiera.yaml' do
|
|
1500
|
+
expect(lookup('hash_b')).to eql(
|
|
1501
|
+
{ 'hash_ba' => { 'bab' => 'value hash_b.hash_ba.bab (from global)'} })
|
|
1502
|
+
end
|
|
1503
|
+
|
|
1504
|
+
it 'uses the merge from lookup options to merge all layers' do
|
|
1505
|
+
expect(lookup('hash_c')).to eql(
|
|
1506
|
+
{ 'hash_ca' => { 'cab' => 'value hash_c.hash_ca.cab (from global)' } })
|
|
1507
|
+
end
|
|
1508
|
+
|
|
1509
|
+
it 'uses the explicitly given merge to override lookup options and to merge all layers' do
|
|
1510
|
+
expect(lookup('hash_c', 'merge' => 'deep')).to eql(
|
|
1511
|
+
{
|
|
1512
|
+
'hash_ca' =>
|
|
1513
|
+
{
|
|
1514
|
+
'caa' => 'value hash_c.hash_ca.caa (from environment)',
|
|
1515
|
+
'cab' => 'value hash_c.hash_ca.cab (from global)',
|
|
1516
|
+
'cac' => 'value hash_c.hash_ca.cac (from global json)',
|
|
1517
|
+
'cad' => 'value hash_c.hash_ca.cad (from global custom)'
|
|
1518
|
+
}
|
|
1519
|
+
})
|
|
1520
|
+
end
|
|
1521
|
+
|
|
1522
|
+
it 'paths are interpolated' do
|
|
1523
|
+
expect(lookup('x')).to eql('value x (from global example.com.yaml)')
|
|
1524
|
+
end
|
|
1525
|
+
|
|
1526
|
+
it 'backend data sources are propagated to custom backend' do
|
|
1527
|
+
expect(lookup('datasources')).to eql(['common', 'example.com'])
|
|
1528
|
+
end
|
|
1529
|
+
|
|
1530
|
+
it 'delegates configured hocon backend to hocon_data function' do
|
|
1531
|
+
expect(explain('xs')).to match(/Hierarchy entry "hocon"\n.*\n.*\n.*"common"\n\s*Found key: "xs"/m)
|
|
1532
|
+
end
|
|
1533
|
+
|
|
1534
|
+
it 'can dig down into subkeys provided by hocon_data function' do
|
|
1535
|
+
expect(lookup('xs.subkey')).to eql('value xs.subkey (from global hocon)')
|
|
1536
|
+
end
|
|
1537
|
+
|
|
1538
|
+
context 'with a module data provider' do
|
|
1539
|
+
let(:module_files) do
|
|
1540
|
+
{
|
|
1541
|
+
'mod_a' => {
|
|
1542
|
+
'hiera.yaml' => <<-YAML.unindent,
|
|
1543
|
+
version: 5
|
|
1544
|
+
hierarchy:
|
|
1545
|
+
- name: Common
|
|
1546
|
+
path: common.yaml
|
|
1547
|
+
YAML
|
|
1548
|
+
'data' => {
|
|
1549
|
+
'common.yaml' => <<-YAML.unindent
|
|
1550
|
+
mod_a::abc: value mod_a::abc (from module)
|
|
1551
|
+
mod_a::caller: "calling module is %{calling_module}"
|
|
1552
|
+
YAML
|
|
1553
|
+
}
|
|
1554
|
+
}
|
|
1555
|
+
}
|
|
1556
|
+
end
|
|
1557
|
+
|
|
1558
|
+
let(:environment_files) do
|
|
1559
|
+
{
|
|
1560
|
+
env_name => {
|
|
1561
|
+
'hiera.yaml' => env_hiera_yaml,
|
|
1562
|
+
'data' => env_data,
|
|
1563
|
+
'modules' => module_files
|
|
1564
|
+
}
|
|
1565
|
+
}
|
|
1566
|
+
end
|
|
1567
|
+
|
|
1568
|
+
it "interpolation function 'hiera' finds values in environment" do
|
|
1569
|
+
expect(lookup('ipl_hiera_env')).to eql("environment value 'value mod_a::hash_a.a (from environment)'")
|
|
1570
|
+
end
|
|
1571
|
+
|
|
1572
|
+
it "interpolation function 'hiera' finds values in module" do
|
|
1573
|
+
expect(lookup('ipl_hiera_mod')).to eql("module value 'value mod_a::abc (from module)'")
|
|
1574
|
+
end
|
|
1575
|
+
|
|
1576
|
+
it "interpolation function 'hiera' finds values in module and that module does not find %{calling_module}" do
|
|
1577
|
+
expect(lookup('ipl_hiera_modc')).to eql("module value 'calling module is '")
|
|
1578
|
+
end
|
|
1579
|
+
|
|
1580
|
+
context 'but no environment data provider' do
|
|
1581
|
+
let(:environment_files) do
|
|
1582
|
+
{
|
|
1583
|
+
env_name => {
|
|
1584
|
+
'modules' => module_files
|
|
1585
|
+
}
|
|
1586
|
+
}
|
|
1587
|
+
end
|
|
1588
|
+
|
|
1589
|
+
it "interpolation function 'hiera' does not find values in a module" do
|
|
1590
|
+
expect(lookup('ipl_hiera_mod')).to eql("module value ''")
|
|
1591
|
+
end
|
|
1592
|
+
end
|
|
1593
|
+
end
|
|
1594
|
+
|
|
1595
|
+
|
|
1596
|
+
context 'using an eyaml backend' do
|
|
1597
|
+
let(:private_key_name) { 'private_key.pkcs7.pem' }
|
|
1598
|
+
let(:public_key_name) { 'public_key.pkcs7.pem' }
|
|
1599
|
+
|
|
1600
|
+
let(:private_key) do
|
|
1601
|
+
<<-PKCS7.unindent
|
|
1602
|
+
-----BEGIN RSA PRIVATE KEY-----
|
|
1603
|
+
MIIEogIBAAKCAQEAwHB3GvImq59em4LV9DMfP0Zjs21eW3Jd5I9fuY0jLJhIkH6f
|
|
1604
|
+
CR7tyOpYV6xUj+TF8giq9WLxZI7sourMJMWjEWhVjgUr5lqp1RLv4lwfDv3Wk4XC
|
|
1605
|
+
2LUuqj1IAErUXKeRz8i3lUSZW1Pf4CaMpnIiPdWbz6f0KkaJSFi9bqexONBx4fKQ
|
|
1606
|
+
NlgZwm2/aYjjrYng788I0QhWDKUqsQOi5mZKlHNRsDlk7J3Afhsx/jTLrCX/G8+2
|
|
1607
|
+
tPtLsHyRN39kluM5vYHbKXDsCG/a88Z2yUE2+r4Clp0FUKffiEDBPm0/H0sQ4Q1o
|
|
1608
|
+
EfQFDQRKaIkhpsm0nOnLYTy3/xJc5uqDNkLiawIDAQABAoIBAE98pNXOe8ab93oI
|
|
1609
|
+
mtNZYmjCbGAqprTjEoFb71A3SfYbmK2Gf65GxjUdBwx/tBYTiuekSOk+yzKcDoZk
|
|
1610
|
+
sZnmwKpqDByzaiSmAkxunANFxdZtZvpcX9UfUX0j/t+QCROUa5gF8j6HrUiZ5nkx
|
|
1611
|
+
sxr1PcuItekaGLJ1nDLz5JsWTQ+H4M+GXQw7/t96x8v8g9el4exTiAHGk6Fv16kD
|
|
1612
|
+
017T02M9qTTmV3Ab/enDIBmKVD42Ta36K/wc4l1aoUQNiRbIGVh96Cgd1CFXLF3x
|
|
1613
|
+
CsaNbYT4SmRXaYqoj6MKq+QFEGxadFmJy48NoSd4joirIn2lUjHxJebw3lLbNLDR
|
|
1614
|
+
uvQnQ2ECgYEA/nD94wEMr6078uMv6nKxPpNGq7fihwSKf0G/PQDqrRmjUCewuW+k
|
|
1615
|
+
/iXMe1Y/y0PjFeNlSbUsUvKQ5xF7F/1AnpuPHIrn3cjGVLb71W+zen1m8SnhsW/f
|
|
1616
|
+
7dPgtcb4SCvfhmLgoov+P34YcNfGi6qgPUu6319IqoB3BIi7PvfEomkCgYEAwZ4+
|
|
1617
|
+
V0bMjFdDn2hnYzjTNcF2aUQ1jPvtuETizGwyCbbMLl9522lrjC2DrH41vvqX35ct
|
|
1618
|
+
CBJkhQFbtHM8Gnmozv0vxhI2jP+u14mzfePZsaXuYrEgWRj+BCsYUHodXryxnEWj
|
|
1619
|
+
yVrTNskab1B5jFm2SCJDmKcycBOYpRBLCMx6W7MCgYBA99z7/6KboOIzzKrJdGup
|
|
1620
|
+
jLV410UyMIikoccQ7pD9jhRTPS80yjsY4dHqlEVJw5XSWvPb9DTTITi6p44EvBep
|
|
1621
|
+
6BKMuTMnQELUEr0O7KypVCfa4FTOl8BX28f+4kU3OGykxc6R8qkC0VGwTohV1UWB
|
|
1622
|
+
ITsgGhZV4uOA9uDI3T8KMQKBgEnQY2HwmuDSD/TA39GDA3qV8+ez2lqSXRGIKZLX
|
|
1623
|
+
mMf9SaBQQ+uzKA4799wWDbVuYeIbB07xfCL83pJP8FUDlqi6+7Celu9wNp7zX1ua
|
|
1624
|
+
Nw8z/ErhzjxJe+Xo7A8aTwIkG+5A2m1UU/up9YsEeiJYvVaIwY58B42U2vfq20BS
|
|
1625
|
+
fD9jAoGAX2MscBzIsmN+U9R0ptL4SXcPiVnOl8mqvQWr1B4OLgxX7ghht5Fs956W
|
|
1626
|
+
bHipxOWMFCPJA/AhNB8q1DvYiD1viZbIALSCJVUkzs4AEFIjiPsCBKxerl7jF6Xp
|
|
1627
|
+
1WYSaCmfvoCVEpFNt8cKp4Gq+zEBYAV4Q6TkcD2lDtEW49MuN8A=
|
|
1628
|
+
-----END RSA PRIVATE KEY-----
|
|
1629
|
+
PKCS7
|
|
1630
|
+
end
|
|
1631
|
+
|
|
1632
|
+
let(:public_key) do
|
|
1633
|
+
<<-PKCS7.unindent
|
|
1634
|
+
-----BEGIN CERTIFICATE-----
|
|
1635
|
+
MIIC2TCCAcGgAwIBAgIBATANBgkqhkiG9w0BAQUFADAAMCAXDTE3MDExMzA5MTY1
|
|
1636
|
+
MloYDzIwNjcwMTAxMDkxNjUyWjAAMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
|
1637
|
+
CgKCAQEAwHB3GvImq59em4LV9DMfP0Zjs21eW3Jd5I9fuY0jLJhIkH6fCR7tyOpY
|
|
1638
|
+
V6xUj+TF8giq9WLxZI7sourMJMWjEWhVjgUr5lqp1RLv4lwfDv3Wk4XC2LUuqj1I
|
|
1639
|
+
AErUXKeRz8i3lUSZW1Pf4CaMpnIiPdWbz6f0KkaJSFi9bqexONBx4fKQNlgZwm2/
|
|
1640
|
+
aYjjrYng788I0QhWDKUqsQOi5mZKlHNRsDlk7J3Afhsx/jTLrCX/G8+2tPtLsHyR
|
|
1641
|
+
N39kluM5vYHbKXDsCG/a88Z2yUE2+r4Clp0FUKffiEDBPm0/H0sQ4Q1oEfQFDQRK
|
|
1642
|
+
aIkhpsm0nOnLYTy3/xJc5uqDNkLiawIDAQABo1wwWjAPBgNVHRMBAf8EBTADAQH/
|
|
1643
|
+
MB0GA1UdDgQWBBSejWrVnw7QaBjNFCHMNFi+doSOcTAoBgNVHSMEITAfgBSejWrV
|
|
1644
|
+
nw7QaBjNFCHMNFi+doSOcaEEpAIwAIIBATANBgkqhkiG9w0BAQUFAAOCAQEAAe85
|
|
1645
|
+
BQ1ydAHFqo0ib38VRPOwf5xPHGbYGhvQi4/sU6aTuR7pxaOJPYz05jLhS+utEmy1
|
|
1646
|
+
sknBq60G67yhQE7IHcfwrl1arirG2WmKGvAbjeYL2K1UiU0pVD3D+Klkv/pK6jIQ
|
|
1647
|
+
eOJRGb3qNUn0Sq9EoYIOXiGXQ641F0bZZ0+5H92kT1lmnF5oLfCb84ImD9T3snH6
|
|
1648
|
+
pIr5RKRx/0YmJIcv3WdpoPT903rOJiRIEgIj/hDk9QZTBpm222Ul5yQQ5pBywpSp
|
|
1649
|
+
xh0bmJKAQWhQm7QlybKfyaQmg5ot1jEzWAvD2I5FjHQxmAlchjb6RreaRhExj+JE
|
|
1650
|
+
5O117dMBdzDBjcNMOA==
|
|
1651
|
+
-----END CERTIFICATE-----
|
|
1652
|
+
PKCS7
|
|
1653
|
+
end
|
|
1654
|
+
|
|
1655
|
+
let(:keys_dir) do
|
|
1656
|
+
keys = tmpdir('keys')
|
|
1657
|
+
dir_contained_in(keys, {
|
|
1658
|
+
private_key_name => private_key,
|
|
1659
|
+
public_key_name => public_key
|
|
1660
|
+
})
|
|
1661
|
+
keys
|
|
1662
|
+
end
|
|
1663
|
+
|
|
1664
|
+
let(:private_key_path) { File.join(keys_dir, private_key_name) }
|
|
1665
|
+
let(:public_key_path) { File.join(keys_dir, public_key_name) }
|
|
1666
|
+
let(:hiera_yaml) do
|
|
1667
|
+
<<-YAML.unindent
|
|
1668
|
+
:backends:
|
|
1669
|
+
- eyaml
|
|
1670
|
+
- yaml
|
|
1671
|
+
:eyaml:
|
|
1672
|
+
:datadir: #{code_dir}/hieradata
|
|
1673
|
+
:pkcs7_private_key: #{private_key_path}
|
|
1674
|
+
:pkcs7_public_key: #{public_key_path}
|
|
1675
|
+
:yaml:
|
|
1676
|
+
:datadir: #{code_dir}/hieradata
|
|
1677
|
+
:hierarchy:
|
|
1678
|
+
- common
|
|
1679
|
+
YAML
|
|
1680
|
+
end
|
|
1681
|
+
|
|
1682
|
+
let(:data_files) do
|
|
1683
|
+
{
|
|
1684
|
+
'common.yaml' => <<-YAML.unindent,
|
|
1685
|
+
b: value 'b' (from global)
|
|
1686
|
+
c:
|
|
1687
|
+
c_a: value c_a (from global)
|
|
1688
|
+
YAML
|
|
1689
|
+
'common.eyaml' => <<-YAML.unindent
|
|
1690
|
+
a: >
|
|
1691
|
+
ENC[PKCS7,MIIBmQYJKoZIhvcNAQcDoIIBijCCAYYCAQAxggEhMIIBHQIBADAFMAACAQEw
|
|
1692
|
+
DQYJKoZIhvcNAQEBBQAEggEAH457bsfL8kYw9O50roE3dcE21nCnmPnQ2XSX
|
|
1693
|
+
LYRJ2C78LarbfFonKz0gvDW7tyhsLWASFCFaiU8T1QPBd2b3hoQK8E4B2Ual
|
|
1694
|
+
xga/K7r9y3OSgRomTm9tpTltC6re0Ubh3Dy71H61obwxEdNVTqjPe95+m2b8
|
|
1695
|
+
6zWZVnzZzXXsTG1S17yJn1zaB/LXHbWNy4KyLLKCGAml+Gfl6ZMjmaplTmUA
|
|
1696
|
+
QIC5rI8abzbPP3TDMmbLOGNkrmLqI+3uS8tSueTMoJmWaMF6c+H/cA7oRxmV
|
|
1697
|
+
QCeEUVXjyFvCHcmbA+keS/RK9XF+vc07/XS4XkYSPs/I5hLQji1y9bkkGAs0
|
|
1698
|
+
tehxQjBcBgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBDHpA6Fcl/R16aIYcow
|
|
1699
|
+
oiO4gDAvfFH6jLUwXkcYtagnwdmhkd9TQJtxNWcIwMpvmk036MqIoGwwhQdg
|
|
1700
|
+
gV4beiCFtLU=]
|
|
1701
|
+
a_ref: "A reference to %{hiera('a')}"
|
|
1702
|
+
b_ref: "A reference to %{hiera('b')}"
|
|
1703
|
+
c_ref: "%{alias('c')}"
|
|
1704
|
+
YAML
|
|
1705
|
+
}
|
|
1706
|
+
end
|
|
1707
|
+
|
|
1708
|
+
let(:code_dir_files) do
|
|
1709
|
+
{
|
|
1710
|
+
'hiera.yaml' => hiera_yaml,
|
|
1711
|
+
'hieradata' => data_files
|
|
1712
|
+
}
|
|
1713
|
+
end
|
|
1714
|
+
|
|
1715
|
+
before(:each) do
|
|
1716
|
+
Puppet.settings[:hiera_config] = File.join(code_dir, 'hiera.yaml')
|
|
1717
|
+
end
|
|
1718
|
+
|
|
1719
|
+
it 'finds data in the global layer' do
|
|
1720
|
+
expect(lookup('a')).to eql("Encrypted value 'a' (from global)")
|
|
1721
|
+
end
|
|
1722
|
+
|
|
1723
|
+
it 'can use a hiera interpolation' do
|
|
1724
|
+
expect(lookup('a_ref')).to eql("A reference to Encrypted value 'a' (from global)")
|
|
1725
|
+
end
|
|
1726
|
+
|
|
1727
|
+
it 'can use a hiera interpolation that refers back to yaml' do
|
|
1728
|
+
expect(lookup('b_ref')).to eql("A reference to value 'b' (from global)")
|
|
1729
|
+
end
|
|
1730
|
+
|
|
1731
|
+
it 'can use a hiera interpolation that refers back to yaml, but only in global layer' do
|
|
1732
|
+
expect(lookup(['c', 'c_ref'], 'merge' => 'deep')).to eql([{'c_a' => 'value c_a (from global)', 'c_b' => 'value c_b (from environment)'}, { 'c_a' => 'value c_a (from global)' }])
|
|
1733
|
+
end
|
|
1734
|
+
|
|
1735
|
+
it 'delegates configured eyaml backend to eyaml_lookup_key function' do
|
|
1736
|
+
expect(explain('a')).to match(/Hierarchy entry "eyaml"\n.*\n.*\n.*"common"\n\s*Found key: "a"/m)
|
|
1737
|
+
end
|
|
1738
|
+
end
|
|
1739
|
+
|
|
1740
|
+
context 'using deep_merge_options' do
|
|
1741
|
+
let(:hiera_yaml) do
|
|
1742
|
+
<<-YAML.unindent
|
|
1743
|
+
---
|
|
1744
|
+
:backends:
|
|
1745
|
+
- yaml
|
|
1746
|
+
:yaml:
|
|
1747
|
+
:datadir: #{code_dir}/hieradata
|
|
1748
|
+
:hierarchy:
|
|
1749
|
+
- common
|
|
1750
|
+
- other
|
|
1751
|
+
:merge_behavior: deeper
|
|
1752
|
+
:deep_merge_options:
|
|
1753
|
+
:unpack_arrays: ','
|
|
1754
|
+
YAML
|
|
1755
|
+
end
|
|
1756
|
+
|
|
1757
|
+
let(:code_dir_files) do
|
|
1758
|
+
{
|
|
1759
|
+
'hiera.yaml' => hiera_yaml,
|
|
1760
|
+
'hieradata' => {
|
|
1761
|
+
'common.yaml' => <<-YAML.unindent,
|
|
1762
|
+
hash:
|
|
1763
|
+
array:
|
|
1764
|
+
- x1,x2
|
|
1765
|
+
array:
|
|
1766
|
+
- x1,x2
|
|
1767
|
+
str: a string
|
|
1768
|
+
mixed:
|
|
1769
|
+
x: hx
|
|
1770
|
+
y: hy
|
|
1771
|
+
YAML
|
|
1772
|
+
'other.yaml' => <<-YAML.unindent,
|
|
1773
|
+
hash:
|
|
1774
|
+
array:
|
|
1775
|
+
- x3
|
|
1776
|
+
- x4
|
|
1777
|
+
array:
|
|
1778
|
+
- x3
|
|
1779
|
+
- x4
|
|
1780
|
+
str: another string
|
|
1781
|
+
mixed:
|
|
1782
|
+
- h1
|
|
1783
|
+
- h2
|
|
1784
|
+
YAML
|
|
1785
|
+
}
|
|
1786
|
+
}
|
|
1787
|
+
end
|
|
1788
|
+
|
|
1789
|
+
it 'ignores configured merge_behavior when looking up arrays' do
|
|
1790
|
+
expect(lookup('array')).to eql(['x1,x2'])
|
|
1791
|
+
end
|
|
1792
|
+
|
|
1793
|
+
it 'ignores configured merge_behavior when merging arrays' do
|
|
1794
|
+
expect(lookup('array', 'merge' => 'unique')).to eql(['x1,x2', 'x3', 'x4'])
|
|
1795
|
+
end
|
|
1796
|
+
|
|
1797
|
+
it 'ignores configured merge_behavior when looking up hashes' do
|
|
1798
|
+
expect(lookup('hash')).to eql({'array' => ['x1,x2']})
|
|
1799
|
+
end
|
|
1800
|
+
|
|
1801
|
+
it 'ignores configured merge_behavior when merging hashes' do
|
|
1802
|
+
expect(lookup('hash', 'merge' => 'hash')).to eql({'array' => ['x1,x2']})
|
|
1803
|
+
end
|
|
1804
|
+
end
|
|
1805
|
+
|
|
1806
|
+
context 'using relative datadir paths' do
|
|
1807
|
+
let(:hiera_yaml) do
|
|
1808
|
+
<<-YAML.unindent
|
|
1809
|
+
---
|
|
1810
|
+
:backends:
|
|
1811
|
+
- yaml
|
|
1812
|
+
:yaml:
|
|
1813
|
+
:datadir: relative_data
|
|
1814
|
+
:hierarchy:
|
|
1815
|
+
- common
|
|
1816
|
+
YAML
|
|
1817
|
+
end
|
|
1818
|
+
|
|
1819
|
+
let(:populated_code_dir) do
|
|
1820
|
+
dir_contained_in(code_dir, code_dir_files.merge({
|
|
1821
|
+
'fake_cwd' => {
|
|
1822
|
+
'relative_data' => {
|
|
1823
|
+
'common.yaml' => <<-YAML.unindent
|
|
1824
|
+
a: value a (from fake_cwd/relative_data/common.yaml)
|
|
1825
|
+
YAML
|
|
1826
|
+
}
|
|
1827
|
+
}
|
|
1828
|
+
}))
|
|
1829
|
+
code_dir
|
|
1830
|
+
end
|
|
1831
|
+
|
|
1832
|
+
around(:each) do |example|
|
|
1833
|
+
cwd = Dir.pwd
|
|
1834
|
+
Dir.chdir(File.join(code_dir, 'fake_cwd'))
|
|
1835
|
+
begin
|
|
1836
|
+
example.run
|
|
1837
|
+
ensure
|
|
1838
|
+
Dir.chdir(cwd)
|
|
1839
|
+
end
|
|
1840
|
+
end
|
|
1841
|
+
|
|
1842
|
+
it 'finds data from data file beneath relative datadir' do
|
|
1843
|
+
expect(lookup('a')).to eql('value a (from fake_cwd/relative_data/common.yaml)')
|
|
1844
|
+
end
|
|
1845
|
+
end
|
|
1846
|
+
end
|
|
1847
|
+
|
|
1848
|
+
context 'version 5' do
|
|
1849
|
+
let(:scope_additions) { { 'ipl_datadir' => 'hieradata' } }
|
|
1850
|
+
let(:hiera_yaml) do
|
|
1851
|
+
<<-YAML.unindent
|
|
1852
|
+
---
|
|
1853
|
+
version: 5
|
|
1854
|
+
defaults:
|
|
1855
|
+
datadir: "%{ipl_datadir}"
|
|
1856
|
+
|
|
1857
|
+
hierarchy:
|
|
1858
|
+
- name: Yaml
|
|
1859
|
+
data_hash: yaml_data
|
|
1860
|
+
paths:
|
|
1861
|
+
- common.yaml
|
|
1862
|
+
- "%{domain}.yaml"
|
|
1863
|
+
- name: Json
|
|
1864
|
+
data_hash: json_data
|
|
1865
|
+
paths:
|
|
1866
|
+
- common.json
|
|
1867
|
+
- "%{domain}.json"
|
|
1868
|
+
- name: Hocon
|
|
1869
|
+
data_hash: hocon_data
|
|
1870
|
+
paths:
|
|
1871
|
+
- common.conf
|
|
1872
|
+
- "%{domain}.conf"
|
|
1873
|
+
- name: Custom
|
|
1874
|
+
hiera3_backend: custom
|
|
1875
|
+
paths:
|
|
1876
|
+
- common.custom
|
|
1877
|
+
- "%{domain}.custom"
|
|
1878
|
+
- name: Other
|
|
1879
|
+
hiera3_backend: other
|
|
1880
|
+
options:
|
|
1881
|
+
other_option: value of other_option
|
|
1882
|
+
paths:
|
|
1883
|
+
- common.other
|
|
1884
|
+
- "%{domain}.other"
|
|
1885
|
+
YAML
|
|
1886
|
+
end
|
|
1887
|
+
|
|
1888
|
+
it 'finds global data and reports no deprecation warnings' do
|
|
1889
|
+
expect(lookup('a')).to eql('value a (from global)')
|
|
1890
|
+
expect(warnings).to be_empty
|
|
1891
|
+
end
|
|
1892
|
+
|
|
1893
|
+
it 'explain contains output from global layer' do
|
|
1894
|
+
explanation = explain('a')
|
|
1895
|
+
expect(explanation).to include('Global Data Provider (hiera configuration version 5)')
|
|
1896
|
+
expect(explanation).to include('Hierarchy entry "Yaml"')
|
|
1897
|
+
expect(explanation).to include('Hierarchy entry "Json"')
|
|
1898
|
+
expect(explanation).to include('Hierarchy entry "Hocon"')
|
|
1899
|
+
expect(explanation).to include('Hierarchy entry "Custom"')
|
|
1900
|
+
expect(explanation).to include('Found key: "a" value: "value a (from global)"')
|
|
1901
|
+
end
|
|
1902
|
+
|
|
1903
|
+
it 'uses the explicitly given merge to override lookup options and to merge all layers' do
|
|
1904
|
+
expect(lookup('hash_c', 'merge' => 'deep')).to eql(
|
|
1905
|
+
{
|
|
1906
|
+
'hash_ca' =>
|
|
1907
|
+
{
|
|
1908
|
+
'caa' => 'value hash_c.hash_ca.caa (from environment)',
|
|
1909
|
+
'cab' => 'value hash_c.hash_ca.cab (from global)',
|
|
1910
|
+
'cac' => 'value hash_c.hash_ca.cac (from global json)',
|
|
1911
|
+
'cad' => 'value hash_c.hash_ca.cad (from global custom)'
|
|
1912
|
+
}
|
|
1913
|
+
})
|
|
1914
|
+
end
|
|
1915
|
+
|
|
1916
|
+
it 'backend data sources are propagated to custom backend' do
|
|
1917
|
+
expect(lookup('datasources')).to eql(['common', 'example.com'])
|
|
1918
|
+
end
|
|
1919
|
+
|
|
1920
|
+
it 'backend specific options are propagated to custom backend' do
|
|
1921
|
+
expect(lookup('other_option')).to eql('value of other_option')
|
|
1922
|
+
end
|
|
1923
|
+
|
|
1924
|
+
it 'dotted keys are passed down to custom backend' do
|
|
1925
|
+
expect(lookup('dotted.key')).to eql('custom backend received request for dotted.key value')
|
|
1926
|
+
end
|
|
1927
|
+
|
|
1928
|
+
it 'multiple hiera3_backend declarations can be used and are merged into the generated config' do
|
|
1929
|
+
expect(lookup(['datasources', 'other_option'])).to eql([['common', 'example.com'], 'value of other_option'])
|
|
1930
|
+
expect(Hiera::Config.instance_variable_get(:@config)).to eql(
|
|
1931
|
+
{
|
|
1932
|
+
:backends => ['custom', 'other'],
|
|
1933
|
+
:hierarchy => ['common', '%{domain}'],
|
|
1934
|
+
:custom => { :datadir => "#{code_dir}/hieradata" },
|
|
1935
|
+
:other => { :other_option => 'value of other_option', :datadir=>"#{code_dir}/hieradata" },
|
|
1936
|
+
:logger => 'puppet'
|
|
1937
|
+
})
|
|
1938
|
+
end
|
|
1939
|
+
|
|
1940
|
+
it 'provides a sensible error message when the hocon library is not loaded' do
|
|
1941
|
+
Puppet.features.stubs(:hocon?).returns(false)
|
|
1942
|
+
|
|
1943
|
+
expect { lookup('a') }.to raise_error do |e|
|
|
1944
|
+
expect(e.message).to match(/Lookup using Hocon data_hash function is not supported without hocon library/)
|
|
1945
|
+
end
|
|
1946
|
+
end
|
|
1947
|
+
|
|
1948
|
+
context 'with missing path declaraion' do
|
|
1949
|
+
context 'and yaml_data function' do
|
|
1950
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
1951
|
+
version: 5
|
|
1952
|
+
hierarchy:
|
|
1953
|
+
- name: Yaml
|
|
1954
|
+
data_hash: yaml_data
|
|
1955
|
+
YAML
|
|
1956
|
+
|
|
1957
|
+
it 'fails and reports the missing path' do
|
|
1958
|
+
expect { lookup('a') }.to raise_error(/one of 'path', 'paths' 'glob', 'globs' or 'mapped_paths' must be declared in hiera.yaml when using this data_hash function/)
|
|
1959
|
+
end
|
|
1960
|
+
end
|
|
1961
|
+
|
|
1962
|
+
context 'and json_data function' do
|
|
1963
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
1964
|
+
version: 5
|
|
1965
|
+
hierarchy:
|
|
1966
|
+
- name: Json
|
|
1967
|
+
data_hash: json_data
|
|
1968
|
+
YAML
|
|
1969
|
+
|
|
1970
|
+
it 'fails and reports the missing path' do
|
|
1971
|
+
expect { lookup('a') }.to raise_error(/one of 'path', 'paths' 'glob', 'globs' or 'mapped_paths' must be declared in hiera.yaml when using this data_hash function/)
|
|
1972
|
+
end
|
|
1973
|
+
end
|
|
1974
|
+
|
|
1975
|
+
context 'and hocon_data function' do
|
|
1976
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
1977
|
+
version: 5
|
|
1978
|
+
hierarchy:
|
|
1979
|
+
- name: Hocon
|
|
1980
|
+
data_hash: hocon_data
|
|
1981
|
+
YAML
|
|
1982
|
+
|
|
1983
|
+
it 'fails and reports the missing path' do
|
|
1984
|
+
expect { lookup('a') }.to raise_error(/one of 'path', 'paths' 'glob', 'globs' or 'mapped_paths' must be declared in hiera.yaml when using this data_hash function/)
|
|
1985
|
+
end
|
|
1986
|
+
end
|
|
1987
|
+
|
|
1988
|
+
context 'and eyaml_lookup_key function' do
|
|
1989
|
+
let(:hiera_yaml) { <<-YAML.unindent }
|
|
1990
|
+
version: 5
|
|
1991
|
+
hierarchy:
|
|
1992
|
+
- name: Yaml
|
|
1993
|
+
lookup_key: eyaml_lookup_key
|
|
1994
|
+
YAML
|
|
1995
|
+
|
|
1996
|
+
it 'fails and reports the missing path' do
|
|
1997
|
+
expect { lookup('a') }.to raise_error(/one of 'path', 'paths' 'glob', 'globs' or 'mapped_paths' must be declared in hiera.yaml when using this lookup_key function/)
|
|
1998
|
+
end
|
|
1999
|
+
end
|
|
2000
|
+
end
|
|
2001
|
+
end
|
|
2002
|
+
|
|
2003
|
+
context 'with a hiera3_backend that has no paths' do
|
|
2004
|
+
let(:hiera_yaml) do
|
|
2005
|
+
<<-YAML.unindent
|
|
2006
|
+
---
|
|
2007
|
+
version: 5
|
|
2008
|
+
hierarchy:
|
|
2009
|
+
- name: Custom
|
|
2010
|
+
hiera3_backend: custom
|
|
2011
|
+
YAML
|
|
2012
|
+
end
|
|
2013
|
+
|
|
2014
|
+
it 'calls the backend' do
|
|
2015
|
+
expect(lookup('hash_c')).to eql(
|
|
2016
|
+
{ 'hash_ca' => { 'cad' => 'value hash_c.hash_ca.cad (from global custom)' }})
|
|
2017
|
+
end
|
|
2018
|
+
end
|
|
342
2019
|
end
|
|
343
2020
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
2021
|
+
context 'and a module' do
|
|
2022
|
+
let(:mod_a_files) { {} }
|
|
2023
|
+
|
|
2024
|
+
let(:populated_env_dir) do
|
|
2025
|
+
dir_contained_in(env_dir, DeepMerge.deep_merge!(environment_files, env_name => { 'modules' => mod_a_files }))
|
|
2026
|
+
env_dir
|
|
2027
|
+
end
|
|
2028
|
+
|
|
2029
|
+
context 'that has no lookup configured' do
|
|
2030
|
+
let(:mod_a_files) do
|
|
2031
|
+
{
|
|
2032
|
+
'mod_a' => {
|
|
2033
|
+
'data' => {
|
|
2034
|
+
'common.yaml' => <<-YAML.unindent
|
|
2035
|
+
---
|
|
2036
|
+
mod_a::b: value mod_a::b (from mod_a)
|
|
2037
|
+
YAML
|
|
2038
|
+
}
|
|
2039
|
+
}
|
|
2040
|
+
}
|
|
2041
|
+
end
|
|
2042
|
+
|
|
2043
|
+
it 'does not find data in the module' do
|
|
2044
|
+
expect { lookup('mod_a::b') }.to raise_error(Puppet::DataBinding::LookupError, /did not find a value for the name 'mod_a::b'/)
|
|
2045
|
+
end
|
|
2046
|
+
|
|
2047
|
+
context 'with a Hiera v3 configuration' do
|
|
2048
|
+
let(:mod_a_files) do
|
|
2049
|
+
{
|
|
2050
|
+
'mod_a' => {
|
|
2051
|
+
'hiera.yaml' => <<-YAML.unindent
|
|
2052
|
+
---
|
|
2053
|
+
:backends: yaml
|
|
2054
|
+
YAML
|
|
2055
|
+
}
|
|
2056
|
+
}
|
|
2057
|
+
end
|
|
2058
|
+
|
|
2059
|
+
it 'raises an error' do
|
|
2060
|
+
expect { lookup('mod_a::a') }.to raise_error(Puppet::Error, /hiera.yaml version 3 cannot be used in a module/)
|
|
2061
|
+
end
|
|
2062
|
+
end
|
|
2063
|
+
|
|
2064
|
+
context "but a metadata.json with 'module_data_provider=hiera'" do
|
|
2065
|
+
let(:mod_a_files_1) { DeepMerge.deep_merge!(mod_a_files, 'mod_a' => { 'metadata.json' => <<-JSON.unindent }) }
|
|
2066
|
+
{
|
|
2067
|
+
"name": "example/mod_a",
|
|
2068
|
+
"version": "0.0.2",
|
|
2069
|
+
"source": "git@github.com/example/mod_a.git",
|
|
2070
|
+
"dependencies": [],
|
|
2071
|
+
"author": "Bob the Builder",
|
|
2072
|
+
"license": "Apache-2.0",
|
|
2073
|
+
"data_provider": "hiera"
|
|
2074
|
+
}
|
|
2075
|
+
JSON
|
|
2076
|
+
|
|
2077
|
+
let(:populated_env_dir) do
|
|
2078
|
+
dir_contained_in(env_dir, DeepMerge.deep_merge!(environment_files, env_name => { 'modules' => mod_a_files_1 }))
|
|
2079
|
+
env_dir
|
|
2080
|
+
end
|
|
2081
|
+
|
|
2082
|
+
it 'finds data in the module and reports deprecation warning for metadata.json' do
|
|
2083
|
+
expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
|
|
2084
|
+
expect(warnings).to include(/Defining "data_provider": "hiera" in metadata.json is deprecated. A 'hiera.yaml' file should be used instead/)
|
|
2085
|
+
end
|
|
2086
|
+
|
|
2087
|
+
context 'and a hiera.yaml file' do
|
|
2088
|
+
let(:mod_a_files_2) { DeepMerge.deep_merge!(mod_a_files_1, 'mod_a' => { 'hiera.yaml' => <<-YAML.unindent }) }
|
|
2089
|
+
---
|
|
2090
|
+
version: 4
|
|
2091
|
+
hierarchy:
|
|
2092
|
+
- name: common
|
|
2093
|
+
backend: yaml
|
|
2094
|
+
YAML
|
|
2095
|
+
|
|
2096
|
+
let(:populated_env_dir) do
|
|
2097
|
+
dir_contained_in(env_dir, DeepMerge.deep_merge!(environment_files, env_name => { 'modules' => mod_a_files_2 }))
|
|
2098
|
+
env_dir
|
|
2099
|
+
end
|
|
2100
|
+
|
|
2101
|
+
it 'finds data in the module and reports deprecation warnings for both metadata.json and hiera.yaml' do
|
|
2102
|
+
expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
|
|
2103
|
+
expect(warnings).to include(/Defining "data_provider": "hiera" in metadata.json is deprecated/)
|
|
2104
|
+
expect(warnings).to include(/Use of 'hiera.yaml' version 4 is deprecated. It should be converted to version 5/)
|
|
2105
|
+
end
|
|
2106
|
+
end
|
|
2107
|
+
end
|
|
2108
|
+
end
|
|
2109
|
+
|
|
2110
|
+
context 'using a data_hash that reads a yaml file' do
|
|
2111
|
+
let(:defaults) {
|
|
2112
|
+
{
|
|
2113
|
+
'mod_a::xd' => 'value mod_a::xd (from default)',
|
|
2114
|
+
'mod_a::xd_found' => 'value mod_a::xd_found (from default)',
|
|
2115
|
+
'scope_xd' => 'value scope_xd (from default)'
|
|
2116
|
+
}}
|
|
2117
|
+
let(:overrides) {
|
|
2118
|
+
{
|
|
2119
|
+
'mod_a::xo' => 'value mod_a::xo (from override)',
|
|
2120
|
+
'scope_xo' => 'value scope_xo (from override)'
|
|
2121
|
+
}}
|
|
2122
|
+
|
|
2123
|
+
let(:scope_additions) do
|
|
2124
|
+
{
|
|
2125
|
+
'scope_scalar' => 'scope scalar value',
|
|
2126
|
+
'scope_hash' => { 'a' => 'scope hash a', 'b' => 'scope hash b' }
|
|
2127
|
+
}
|
|
2128
|
+
end
|
|
2129
|
+
let(:mod_a_files) do
|
|
2130
|
+
{
|
|
2131
|
+
'mod_a' => {
|
|
2132
|
+
'data' => {
|
|
2133
|
+
'common.yaml' => <<-YAML.unindent
|
|
2134
|
+
---
|
|
2135
|
+
mod_a::a: value mod_a::a (from mod_a)
|
|
2136
|
+
mod_a::b: value mod_a::b (from mod_a)
|
|
2137
|
+
mod_a::xo: value mod_a::xo (from mod_a)
|
|
2138
|
+
mod_a::xd_found: value mod_a::xd_found (from mod_a)
|
|
2139
|
+
mod_a::interpolate_xo: "-- %{lookup('mod_a::xo')} --"
|
|
2140
|
+
mod_a::interpolate_xd: "-- %{lookup('mod_a::xd')} --"
|
|
2141
|
+
mod_a::interpolate_scope_xo: "-- %{scope_xo} --"
|
|
2142
|
+
mod_a::interpolate_scope_xd: "-- %{scope_xd} --"
|
|
2143
|
+
mod_a::hash_a:
|
|
2144
|
+
a: value mod_a::hash_a.a (from mod_a)
|
|
2145
|
+
b: value mod_a::hash_a.b (from mod_a)
|
|
2146
|
+
mod_a::hash_b:
|
|
2147
|
+
a: value mod_a::hash_b.a (from mod_a)
|
|
2148
|
+
b: value mod_a::hash_b.b (from mod_a)
|
|
2149
|
+
mod_a::interpolated: "-- %{lookup('mod_a::a')} --"
|
|
2150
|
+
mod_a::a_a: "-- %{lookup('mod_a::hash_a.a')} --"
|
|
2151
|
+
mod_a::a_b: "-- %{lookup('mod_a::hash_a.b')} --"
|
|
2152
|
+
mod_a::b_a: "-- %{lookup('mod_a::hash_b.a')} --"
|
|
2153
|
+
mod_a::b_b: "-- %{lookup('mod_a::hash_b.b')} --"
|
|
2154
|
+
mod_a::interpolate_array:
|
|
2155
|
+
- "-- %{lookup('mod_a::a')} --"
|
|
2156
|
+
- "-- %{lookup('mod_a::b')} --"
|
|
2157
|
+
mod_a::interpolate_literal: "-- %{literal('hello')} --"
|
|
2158
|
+
mod_a::interpolate_scope: "-- %{scope_scalar} --"
|
|
2159
|
+
mod_a::interpolate_scope_not_found: "-- %{scope_nope} --"
|
|
2160
|
+
mod_a::interpolate_scope_dig: "-- %{scope_hash.a} --"
|
|
2161
|
+
mod_a::interpolate_scope_dig_not_found: "-- %{scope_hash.nope} --"
|
|
2162
|
+
mod_a::quoted_interpolation: '-- %{lookup(''"mod_a::a.quoted.key"'')} --'
|
|
2163
|
+
"mod_a::a.quoted.key": "value mod_a::a.quoted.key (from mod_a)"
|
|
2164
|
+
YAML
|
|
2165
|
+
},
|
|
2166
|
+
'hiera.yaml' => <<-YAML.unindent,
|
|
2167
|
+
---
|
|
2168
|
+
version: 5
|
|
2169
|
+
hierarchy:
|
|
2170
|
+
- name: "Common"
|
|
2171
|
+
data_hash: yaml_data
|
|
2172
|
+
path: "common.yaml"
|
|
2173
|
+
YAML
|
|
2174
|
+
}
|
|
2175
|
+
}
|
|
2176
|
+
end
|
|
2177
|
+
|
|
2178
|
+
it 'finds data in the module' do
|
|
2179
|
+
expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
|
|
2180
|
+
end
|
|
2181
|
+
|
|
2182
|
+
it 'environment data has higher priority than module data' do
|
|
2183
|
+
expect(lookup('mod_a::a')).to eql('value mod_a::a (from environment)')
|
|
2184
|
+
end
|
|
2185
|
+
|
|
2186
|
+
it 'environment data has higher priority than module data in interpolated module data' do
|
|
2187
|
+
expect(lookup('mod_a::interpolated')).to eql('-- value mod_a::a (from environment) --')
|
|
2188
|
+
end
|
|
2189
|
+
|
|
2190
|
+
it 'overrides have higher priority than found data' do
|
|
2191
|
+
expect(lookup('mod_a::xo', { 'override' => overrides })).to eql('value mod_a::xo (from override)')
|
|
2192
|
+
end
|
|
2193
|
+
|
|
2194
|
+
it 'overrides have higher priority than found data in lookup interpolations' do
|
|
2195
|
+
expect(lookup('mod_a::interpolate_xo', { 'override' => overrides })).to eql('-- value mod_a::xo (from override) --')
|
|
2196
|
+
end
|
|
2197
|
+
|
|
2198
|
+
it 'overrides have higher priority than found data in scope interpolations' do
|
|
2199
|
+
expect(lookup('mod_a::interpolate_scope_xo', { 'override' => overrides })).to eql('-- value scope_xo (from override) --')
|
|
2200
|
+
end
|
|
2201
|
+
|
|
2202
|
+
it 'defaults have lower priority than found data' do
|
|
2203
|
+
expect(lookup('mod_a::xd_found', { 'default_values_hash' => defaults })).to eql('value mod_a::xd_found (from mod_a)')
|
|
2204
|
+
end
|
|
2205
|
+
|
|
2206
|
+
it 'defaults are used when data is not found' do
|
|
2207
|
+
expect(lookup('mod_a::xd', { 'default_values_hash' => defaults })).to eql('value mod_a::xd (from default)')
|
|
2208
|
+
end
|
|
2209
|
+
|
|
2210
|
+
it 'defaults are used when data is not found in lookup interpolations' do
|
|
2211
|
+
expect(lookup('mod_a::interpolate_xd', { 'default_values_hash' => defaults })).to eql('-- value mod_a::xd (from default) --')
|
|
2212
|
+
end
|
|
2213
|
+
|
|
2214
|
+
it 'defaults are used when data is not found in scope interpolations' do
|
|
2215
|
+
expect(lookup('mod_a::interpolate_scope_xd', { 'default_values_hash' => defaults })).to eql('-- value scope_xd (from default) --')
|
|
2216
|
+
end
|
|
2217
|
+
|
|
2218
|
+
it 'merges hashes from environment and module unless strategy hash is used' do
|
|
2219
|
+
expect(lookup('mod_a::hash_a')).to eql({'a' => 'value mod_a::hash_a.a (from environment)'})
|
|
2220
|
+
end
|
|
2221
|
+
|
|
2222
|
+
it 'merges hashes from environment and module when merge strategy hash is used' do
|
|
2223
|
+
expect(lookup('mod_a::hash_a', :merge => 'hash')).to eql(
|
|
2224
|
+
{'a' => 'value mod_a::hash_a.a (from environment)', 'b' => 'value mod_a::hash_a.b (from mod_a)'})
|
|
2225
|
+
end
|
|
2226
|
+
|
|
2227
|
+
it 'will not merge hashes from environment and module in interpolated expressions' do
|
|
2228
|
+
expect(lookup(['mod_a::a_a', 'mod_a::a_b'])).to eql(
|
|
2229
|
+
['-- value mod_a::hash_a.a (from environment) --', '-- --']) # root key found in environment, no hash merge is performed
|
|
2230
|
+
end
|
|
2231
|
+
|
|
2232
|
+
it 'interpolates arrays' do
|
|
2233
|
+
expect(lookup('mod_a::interpolate_array')).to eql(['-- value mod_a::a (from environment) --', '-- value mod_a::b (from mod_a) --'])
|
|
2234
|
+
end
|
|
2235
|
+
|
|
2236
|
+
it 'can dig into arrays using subkeys' do
|
|
2237
|
+
expect(lookup('mod_a::interpolate_array.1')).to eql('-- value mod_a::b (from mod_a) --')
|
|
2238
|
+
end
|
|
2239
|
+
|
|
2240
|
+
it 'treats an out of range subkey as not found' do
|
|
2241
|
+
expect(explain('mod_a::interpolate_array.2')).to match(/No such key: "2"/)
|
|
2242
|
+
end
|
|
2243
|
+
|
|
2244
|
+
it 'interpolates a literal' do
|
|
2245
|
+
expect(lookup('mod_a::interpolate_literal')).to eql('-- hello --')
|
|
2246
|
+
end
|
|
2247
|
+
|
|
2248
|
+
it 'interpolates scalar from scope' do
|
|
2249
|
+
expect(lookup('mod_a::interpolate_scope')).to eql('-- scope scalar value --')
|
|
2250
|
+
end
|
|
2251
|
+
|
|
2252
|
+
it 'interpolates not found in scope as empty string' do
|
|
2253
|
+
expect(lookup('mod_a::interpolate_scope_not_found')).to eql('-- --')
|
|
2254
|
+
end
|
|
2255
|
+
|
|
2256
|
+
it 'interpolates dotted key from scope' do
|
|
2257
|
+
expect(lookup('mod_a::interpolate_scope_dig')).to eql('-- scope hash a --')
|
|
2258
|
+
end
|
|
2259
|
+
|
|
2260
|
+
it 'treates interpolated dotted key but not found in scope as empty string' do
|
|
2261
|
+
expect(lookup('mod_a::interpolate_scope_dig_not_found')).to eql('-- --')
|
|
2262
|
+
end
|
|
2263
|
+
|
|
2264
|
+
it 'can use quoted keys in interpolation' do
|
|
2265
|
+
expect(lookup('mod_a::quoted_interpolation')).to eql('-- value mod_a::a.quoted.key (from mod_a) --') # root key found in environment, no hash merge is performed
|
|
2266
|
+
end
|
|
2267
|
+
|
|
2268
|
+
it 'merges hashes from environment and module in interpolated expressions if hash merge is specified in lookup options' do
|
|
2269
|
+
expect(lookup(['mod_a::b_a', 'mod_a::b_b'])).to eql(
|
|
2270
|
+
['-- value mod_a::hash_b.a (from environment) --', '-- value mod_a::hash_b.b (from mod_a) --'])
|
|
2271
|
+
end
|
|
2272
|
+
end
|
|
2273
|
+
|
|
2274
|
+
context 'using a lookup_key that uses a path' do
|
|
2275
|
+
let(:mod_a_files) do
|
|
2276
|
+
{
|
|
2277
|
+
'mod_a' => {
|
|
2278
|
+
'functions' => {
|
|
2279
|
+
'pp_lookup_key.pp' => <<-PUPPET.unindent
|
|
2280
|
+
function mod_a::pp_lookup_key($key, $options, $context) {
|
|
2281
|
+
if !$context.cache_has_key(undef) {
|
|
2282
|
+
$context.cache_all(yaml_data($options, $context))
|
|
2283
|
+
$context.cache(undef, true)
|
|
2284
|
+
}
|
|
2285
|
+
if $context.cache_has_key($key) { $context.cached_value($key) } else { $context.not_found }
|
|
2286
|
+
}
|
|
2287
|
+
PUPPET
|
|
2288
|
+
},
|
|
2289
|
+
'hiera.yaml' => <<-YAML.unindent,
|
|
2290
|
+
---
|
|
2291
|
+
version: 5
|
|
2292
|
+
hierarchy:
|
|
2293
|
+
- name: "Common"
|
|
2294
|
+
lookup_key: mod_a::pp_lookup_key
|
|
2295
|
+
path: common.yaml
|
|
2296
|
+
YAML
|
|
2297
|
+
'data' => {
|
|
2298
|
+
'common.yaml' => <<-YAML.unindent
|
|
2299
|
+
mod_a::b: value mod_a::b (from mod_a)
|
|
2300
|
+
YAML
|
|
2301
|
+
}
|
|
2302
|
+
}
|
|
2303
|
+
}
|
|
2304
|
+
end
|
|
2305
|
+
|
|
2306
|
+
it 'finds data in the module' do
|
|
2307
|
+
expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
|
|
2308
|
+
end
|
|
2309
|
+
end
|
|
2310
|
+
|
|
2311
|
+
context 'using a lookup_key that is a puppet function' do
|
|
2312
|
+
let(:puppet_function) { <<-PUPPET.unindent }
|
|
2313
|
+
function mod_a::pp_lookup_key(Puppet::LookupKey $key, Hash[String,String] $options, Puppet::LookupContext $context) >> Puppet::LookupValue {
|
|
2314
|
+
case $key {
|
|
2315
|
+
'mod_a::really_interpolated': { $context.interpolate("-- %{lookup('mod_a::a')} --") }
|
|
2316
|
+
'mod_a::recursive': { lookup($key) }
|
|
2317
|
+
default: {
|
|
2318
|
+
if $context.cache_has_key(mod_a::a) {
|
|
2319
|
+
$context.explain || { 'reusing cache' }
|
|
2320
|
+
} else {
|
|
2321
|
+
$context.explain || { 'initializing cache' }
|
|
2322
|
+
$context.cache_all({
|
|
2323
|
+
mod_a::a => 'value mod_a::a (from mod_a)',
|
|
2324
|
+
mod_a::b => 'value mod_a::b (from mod_a)',
|
|
2325
|
+
mod_a::c => 'value mod_a::c (from mod_a)',
|
|
2326
|
+
mod_a::hash_a => {
|
|
2327
|
+
a => 'value mod_a::hash_a.a (from mod_a)',
|
|
2328
|
+
b => 'value mod_a::hash_a.b (from mod_a)'
|
|
2329
|
+
},
|
|
2330
|
+
mod_a::hash_b => {
|
|
2331
|
+
a => 'value mod_a::hash_b.a (from mod_a)',
|
|
2332
|
+
b => 'value mod_a::hash_b.b (from mod_a)'
|
|
2333
|
+
},
|
|
2334
|
+
mod_a::interpolated => "-- %{lookup('mod_a::a')} --",
|
|
2335
|
+
mod_a::a_a => "-- %{lookup('mod_a::hash_a.a')} --",
|
|
2336
|
+
mod_a::a_b => "-- %{lookup('mod_a::hash_a.b')} --",
|
|
2337
|
+
mod_a::b_a => "-- %{lookup('mod_a::hash_b.a')} --",
|
|
2338
|
+
mod_a::b_b => "-- %{lookup('mod_a::hash_b.b')} --",
|
|
2339
|
+
'mod_a::a.quoted.key' => 'value mod_a::a.quoted.key (from mod_a)',
|
|
2340
|
+
mod_a::sensitive => Sensitive('reduct me please'),
|
|
2341
|
+
mod_a::type => Object[{name => 'FindMe', 'attributes' => {'x' => String}}],
|
|
2342
|
+
mod_a::version => SemVer('3.4.1'),
|
|
2343
|
+
mod_a::version_range => SemVerRange('>=3.4.1'),
|
|
2344
|
+
mod_a::timestamp => Timestamp("1994-03-25T19:30:00"),
|
|
2345
|
+
mod_a::timespan => Timespan("3-10:00:00")
|
|
2346
|
+
})
|
|
2347
|
+
}
|
|
2348
|
+
if !$context.cache_has_key($key) {
|
|
2349
|
+
$context.not_found
|
|
2350
|
+
}
|
|
2351
|
+
$context.explain || { "returning value for $key" }
|
|
2352
|
+
$context.cached_value($key)
|
|
2353
|
+
}
|
|
2354
|
+
}
|
|
2355
|
+
}
|
|
2356
|
+
PUPPET
|
|
2357
|
+
|
|
2358
|
+
let(:mod_a_files) do
|
|
2359
|
+
{
|
|
2360
|
+
'mod_a' => {
|
|
2361
|
+
'functions' => {
|
|
2362
|
+
'pp_lookup_key.pp' => puppet_function
|
|
2363
|
+
},
|
|
2364
|
+
'hiera.yaml' => <<-YAML.unindent,
|
|
2365
|
+
---
|
|
2366
|
+
version: 5
|
|
2367
|
+
hierarchy:
|
|
2368
|
+
- name: "Common"
|
|
2369
|
+
lookup_key: mod_a::pp_lookup_key
|
|
2370
|
+
YAML
|
|
2371
|
+
}
|
|
2372
|
+
}
|
|
2373
|
+
end
|
|
2374
|
+
|
|
2375
|
+
it 'finds data in the module' do
|
|
2376
|
+
expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
|
|
2377
|
+
end
|
|
2378
|
+
|
|
2379
|
+
it 'environment data has higher priority than module data' do
|
|
2380
|
+
expect(lookup('mod_a::a')).to eql('value mod_a::a (from environment)')
|
|
2381
|
+
end
|
|
2382
|
+
|
|
2383
|
+
it 'finds quoted keys in the module' do
|
|
2384
|
+
expect(lookup('"mod_a::a.quoted.key"')).to eql('value mod_a::a.quoted.key (from mod_a)')
|
|
2385
|
+
end
|
|
2386
|
+
|
|
2387
|
+
it 'will not resolve interpolated expressions' do
|
|
2388
|
+
expect(lookup('mod_a::interpolated')).to eql("-- %{lookup('mod_a::a')} --")
|
|
2389
|
+
end
|
|
2390
|
+
|
|
2391
|
+
it 'resolves interpolated expressions using Context#interpolate' do
|
|
2392
|
+
expect(lookup('mod_a::really_interpolated')).to eql("-- value mod_a::a (from environment) --")
|
|
2393
|
+
end
|
|
2394
|
+
|
|
2395
|
+
it 'will not merge hashes from environment and module unless strategy hash is used' do
|
|
2396
|
+
expect(lookup('mod_a::hash_a')).to eql({ 'a' => 'value mod_a::hash_a.a (from environment)' })
|
|
2397
|
+
end
|
|
2398
|
+
|
|
2399
|
+
it 'merges hashes from environment and module when merge strategy hash is used' do
|
|
2400
|
+
expect(lookup('mod_a::hash_a', :merge => 'hash')).to eql({ 'a' => 'value mod_a::hash_a.a (from environment)', 'b' => 'value mod_a::hash_a.b (from mod_a)' })
|
|
2401
|
+
end
|
|
2402
|
+
|
|
2403
|
+
it 'traps recursive lookup trapped' do
|
|
2404
|
+
expect(explain('mod_a::recursive')).to include('Recursive lookup detected')
|
|
2405
|
+
end
|
|
2406
|
+
|
|
2407
|
+
it 'private cache is persisted over multiple calls' do
|
|
2408
|
+
collect_notices("notice(lookup('mod_a::b')) notice(lookup('mod_a::c'))", true)
|
|
2409
|
+
expect(notices).to eql(['value mod_a::b (from mod_a)', 'value mod_a::c (from mod_a)'])
|
|
2410
|
+
expect(explanation).to match(/initializing cache.*reusing cache/m)
|
|
2411
|
+
expect(explanation).not_to match(/initializing cache.*initializing cache/m)
|
|
2412
|
+
end
|
|
2413
|
+
|
|
2414
|
+
it 'the same key is requested only once' do
|
|
2415
|
+
collect_notices("notice(lookup('mod_a::b')) notice(lookup('mod_a::b'))", true)
|
|
2416
|
+
expect(notices).to eql(['value mod_a::b (from mod_a)', 'value mod_a::b (from mod_a)'])
|
|
2417
|
+
expect(explanation).to match(/Found key: "mod_a::b".*Found key: "mod_a::b"/m)
|
|
2418
|
+
expect(explanation).to match(/returning value for mod_a::b/m)
|
|
2419
|
+
expect(explanation).not_to match(/returning value for mod_a::b.*returning value for mod_a::b/m)
|
|
2420
|
+
end
|
|
2421
|
+
|
|
2422
|
+
context 'and calling function via API' do
|
|
2423
|
+
it 'finds and delivers rich data' do
|
|
2424
|
+
collect_notices("notice('success')") do |scope|
|
|
2425
|
+
expect(lookup_func.call(scope, 'mod_a::sensitive')).to be_a(Puppet::Pops::Types::PSensitiveType::Sensitive)
|
|
2426
|
+
expect(lookup_func.call(scope, 'mod_a::type')).to be_a(Puppet::Pops::Types::PObjectType)
|
|
2427
|
+
expect(lookup_func.call(scope, 'mod_a::version')).to eql(SemanticPuppet::Version.parse('3.4.1'))
|
|
2428
|
+
expect(lookup_func.call(scope, 'mod_a::version_range')).to eql(SemanticPuppet::VersionRange.parse('>=3.4.1'))
|
|
2429
|
+
expect(lookup_func.call(scope, 'mod_a::timestamp')).to eql(Puppet::Pops::Time::Timestamp.parse('1994-03-25T19:30:00'))
|
|
2430
|
+
expect(lookup_func.call(scope, 'mod_a::timespan')).to eql(Puppet::Pops::Time::Timespan.parse('3-10:00:00'))
|
|
2431
|
+
end
|
|
2432
|
+
expect(notices).to eql(['success'])
|
|
2433
|
+
end
|
|
2434
|
+
end
|
|
2435
|
+
|
|
2436
|
+
context 'with declared but incompatible return_type' do
|
|
2437
|
+
let(:puppet_function) { <<-PUPPET.unindent }
|
|
2438
|
+
function mod_a::pp_lookup_key(Puppet::LookupKey $key, Hash[String,String] $options, Puppet::LookupContext $context) >> Runtime['ruby','Symbol'] {
|
|
2439
|
+
undef
|
|
2440
|
+
}
|
|
2441
|
+
PUPPET
|
|
2442
|
+
|
|
2443
|
+
it 'fails and reports error' do
|
|
2444
|
+
expect{lookup('mod_a::a')}.to raise_error(
|
|
2445
|
+
"Return type of 'lookup_key' function named 'mod_a::pp_lookup_key' is incorrect, expects a value of type Undef, Scalar, Sensitive, Type, Hash, or Array, got Runtime")
|
|
2446
|
+
end
|
|
2447
|
+
end
|
|
2448
|
+
end
|
|
2449
|
+
|
|
2450
|
+
context 'using a data_dig that is a ruby function' do
|
|
2451
|
+
let(:mod_a_files) do
|
|
2452
|
+
{
|
|
2453
|
+
'mod_a' => {
|
|
2454
|
+
'lib' => {
|
|
2455
|
+
'puppet' => {
|
|
2456
|
+
'functions' => {
|
|
2457
|
+
'mod_a' => {
|
|
2458
|
+
'ruby_dig.rb' => <<-RUBY.unindent
|
|
2459
|
+
Puppet::Functions.create_function(:'mod_a::ruby_dig') do
|
|
2460
|
+
dispatch :ruby_dig do
|
|
2461
|
+
param 'Array[String[1]]', :segments
|
|
2462
|
+
param 'Hash[String,Any]', :options
|
|
2463
|
+
param 'Puppet::LookupContext', :context
|
|
2464
|
+
return_type 'Puppet::LookupValue'
|
|
2465
|
+
end
|
|
2466
|
+
|
|
2467
|
+
def ruby_dig(segments, options, context)
|
|
2468
|
+
sub_segments = segments.dup
|
|
2469
|
+
root_key = sub_segments.shift
|
|
2470
|
+
case root_key
|
|
2471
|
+
when 'mod_a::options'
|
|
2472
|
+
hash = { 'mod_a::options' => options }
|
|
2473
|
+
when 'mod_a::lookup'
|
|
2474
|
+
return call_function('lookup', segments.join('.'))
|
|
2475
|
+
else
|
|
2476
|
+
hash = {
|
|
2477
|
+
'mod_a::a' => 'value mod_a::a (from mod_a)',
|
|
2478
|
+
'mod_a::b' => 'value mod_a::b (from mod_a)',
|
|
2479
|
+
'mod_a::hash_a' => {
|
|
2480
|
+
'a' => 'value mod_a::hash_a.a (from mod_a)',
|
|
2481
|
+
'b' => 'value mod_a::hash_a.b (from mod_a)'
|
|
2482
|
+
},
|
|
2483
|
+
'mod_a::hash_b' => {
|
|
2484
|
+
'a' => 'value mod_a::hash_b.a (from mod_a)',
|
|
2485
|
+
'b' => 'value mod_a::hash_b.b (from mod_a)'
|
|
2486
|
+
},
|
|
2487
|
+
'mod_a::interpolated' => "-- %{lookup('mod_a::a')} --",
|
|
2488
|
+
'mod_a::really_interpolated' => "-- %{lookup('mod_a::a')} --",
|
|
2489
|
+
'mod_a::a_a' => "-- %{lookup('mod_a::hash_a.a')} --",
|
|
2490
|
+
'mod_a::a_b' => "-- %{lookup('mod_a::hash_a.b')} --",
|
|
2491
|
+
'mod_a::b_a' => "-- %{lookup('mod_a::hash_b.a')} --",
|
|
2492
|
+
'mod_a::b_b' => "-- %{lookup('mod_a::hash_b.b')} --",
|
|
2493
|
+
'mod_a::bad_type' => :oops,
|
|
2494
|
+
'mod_a::bad_type_in_hash' => { 'a' => :oops },
|
|
2495
|
+
}
|
|
2496
|
+
end
|
|
2497
|
+
context.not_found unless hash.include?(root_key)
|
|
2498
|
+
value = sub_segments.reduce(hash[root_key]) do |memo, segment|
|
|
2499
|
+
context.not_found unless memo.is_a?(Hash) && memo.include?(segment)
|
|
2500
|
+
memo[segment]
|
|
2501
|
+
end
|
|
2502
|
+
root_key == 'mod_a::really_interpolated' ? context.interpolate(value) : value
|
|
2503
|
+
end
|
|
2504
|
+
end
|
|
2505
|
+
RUBY
|
|
2506
|
+
}
|
|
2507
|
+
}
|
|
2508
|
+
}
|
|
2509
|
+
},
|
|
2510
|
+
'hiera.yaml' => <<-YAML.unindent,
|
|
2511
|
+
---
|
|
2512
|
+
version: 5
|
|
2513
|
+
defaults:
|
|
2514
|
+
options:
|
|
2515
|
+
option_b:
|
|
2516
|
+
z: Default option value b.z
|
|
2517
|
+
|
|
2518
|
+
hierarchy:
|
|
2519
|
+
- name: "Common"
|
|
2520
|
+
data_dig: mod_a::ruby_dig
|
|
2521
|
+
uri: "http://www.example.com/passed/as/option"
|
|
2522
|
+
options:
|
|
2523
|
+
option_a: Option value a
|
|
2524
|
+
option_b:
|
|
2525
|
+
x: Option value b.x
|
|
2526
|
+
y: Option value b.y
|
|
2527
|
+
- name: "Extra"
|
|
2528
|
+
data_dig: mod_a::ruby_dig
|
|
2529
|
+
YAML
|
|
2530
|
+
}
|
|
2531
|
+
}
|
|
2532
|
+
end
|
|
2533
|
+
|
|
2534
|
+
it 'finds data in the module' do
|
|
2535
|
+
expect(lookup('mod_a::b')).to eql('value mod_a::b (from mod_a)')
|
|
2536
|
+
end
|
|
2537
|
+
|
|
2538
|
+
it 'environment data has higher priority than module data' do
|
|
2539
|
+
expect(lookup('mod_a::a')).to eql('value mod_a::a (from environment)')
|
|
2540
|
+
end
|
|
2541
|
+
|
|
2542
|
+
it 'will not resolve interpolated expressions' do
|
|
2543
|
+
expect(lookup('mod_a::interpolated')).to eql("-- %{lookup('mod_a::a')} --")
|
|
2544
|
+
end
|
|
2545
|
+
|
|
2546
|
+
it 'resolves interpolated expressions using Context#interpolate' do
|
|
2547
|
+
expect(lookup('mod_a::really_interpolated')).to eql("-- value mod_a::a (from environment) --")
|
|
2548
|
+
end
|
|
2549
|
+
|
|
2550
|
+
it 'does not accept return of runtime type from function' do
|
|
2551
|
+
# Message is produced by the called function, not by the lookup framework
|
|
2552
|
+
expect(explain('mod_a::bad_type')).to include("value returned from function 'ruby_dig' has wrong type")
|
|
2553
|
+
end
|
|
2554
|
+
|
|
2555
|
+
it 'does not accept return of runtime type embedded in hash from function' do
|
|
2556
|
+
# Message is produced by the called function, not by the lookup framework
|
|
2557
|
+
expect(explain('mod_a::bad_type_in_hash')).to include("value returned from function 'ruby_dig' has wrong type")
|
|
2558
|
+
end
|
|
2559
|
+
|
|
2560
|
+
it 'will not merge hashes from environment and module unless strategy hash is used' do
|
|
2561
|
+
expect(lookup('mod_a::hash_a')).to eql({'a' => 'value mod_a::hash_a.a (from environment)'})
|
|
2562
|
+
end
|
|
2563
|
+
|
|
2564
|
+
it 'hierarchy entry options are passed to the function' do
|
|
2565
|
+
expect(lookup('mod_a::options.option_b.x')).to eql('Option value b.x')
|
|
2566
|
+
end
|
|
2567
|
+
|
|
2568
|
+
it 'default options are passed to the function' do
|
|
2569
|
+
expect(lookup('mod_a::options.option_b.z')).to eql('Default option value b.z')
|
|
2570
|
+
end
|
|
2571
|
+
|
|
2572
|
+
it 'default options are not merged with hierarchy options' do
|
|
2573
|
+
expect(lookup('mod_a::options')).to eql(
|
|
2574
|
+
{
|
|
2575
|
+
'option_a' => 'Option value a',
|
|
2576
|
+
'option_b' => {
|
|
2577
|
+
'y' => 'Option value b.y',
|
|
2578
|
+
'x' => 'Option value b.x'
|
|
2579
|
+
},
|
|
2580
|
+
'uri' => 'http://www.example.com/passed/as/option'
|
|
2581
|
+
})
|
|
2582
|
+
end
|
|
2583
|
+
|
|
2584
|
+
it 'hierarchy entry "uri" is passed as location option to the function' do
|
|
2585
|
+
expect(lookup('mod_a::options.uri')).to eql('http://www.example.com/passed/as/option')
|
|
2586
|
+
end
|
|
2587
|
+
|
|
2588
|
+
it 'recursive lookup is trapped' do
|
|
2589
|
+
expect(explain('mod_a::lookup.mod_a::lookup')).to include('Recursive lookup detected')
|
|
2590
|
+
end
|
|
2591
|
+
|
|
2592
|
+
context 'with merge strategy hash' do
|
|
2593
|
+
it 'merges hashes from environment and module' do
|
|
2594
|
+
expect(lookup('mod_a::hash_a', :merge => 'hash')).to eql({'a' => 'value mod_a::hash_a.a (from environment)', 'b' => 'value mod_a::hash_a.b (from mod_a)'})
|
|
2595
|
+
end
|
|
2596
|
+
|
|
2597
|
+
it 'will "undig" value from data_dig function, merge root hashes, and then dig to get values by subkey' do
|
|
2598
|
+
expect(lookup(['mod_a::hash_a.a', 'mod_a::hash_a.b'], :merge => 'hash')).to eql(
|
|
2599
|
+
['value mod_a::hash_a.a (from environment)', 'value mod_a::hash_a.b (from mod_a)'])
|
|
2600
|
+
end
|
|
2601
|
+
end
|
|
2602
|
+
end
|
|
2603
|
+
|
|
2604
|
+
context 'that has a default_hierarchy' do
|
|
2605
|
+
let(:mod_a_hiera_yaml) { <<-YAML.unindent }
|
|
2606
|
+
version: 5
|
|
2607
|
+
hierarchy:
|
|
2608
|
+
- name: "Common"
|
|
2609
|
+
path: common.yaml
|
|
2610
|
+
- name: "Common 2"
|
|
2611
|
+
path: common2.yaml
|
|
2612
|
+
|
|
2613
|
+
default_hierarchy:
|
|
2614
|
+
- name: "Default"
|
|
2615
|
+
path: defaults.yaml
|
|
2616
|
+
- name: "Default 2"
|
|
2617
|
+
path: defaults2.yaml
|
|
2618
|
+
YAML
|
|
2619
|
+
|
|
2620
|
+
let(:mod_a_common) { <<-YAML.unindent }
|
|
2621
|
+
mod_a::a: value mod_a::a (from module)
|
|
2622
|
+
mod_a::d:
|
|
2623
|
+
a: value mod_a::d.a (from module)
|
|
2624
|
+
mod_a::f:
|
|
2625
|
+
a:
|
|
2626
|
+
a: value mod_a::f.a.a (from module)
|
|
2627
|
+
lookup_options:
|
|
2628
|
+
mod_a::e:
|
|
2629
|
+
merge: deep
|
|
2630
|
+
YAML
|
|
2631
|
+
|
|
2632
|
+
|
|
2633
|
+
let(:mod_a_common2) { <<-YAML.unindent }
|
|
2634
|
+
mod_a::b: value mod_a::b (from module)
|
|
2635
|
+
mod_a::d:
|
|
2636
|
+
c: value mod_a::d.c (from module)
|
|
2637
|
+
mod_a::f:
|
|
2638
|
+
a:
|
|
2639
|
+
b: value mod_a::f.a.b (from module)
|
|
2640
|
+
YAML
|
|
2641
|
+
|
|
2642
|
+
let(:mod_a_defaults) { <<-YAML.unindent }
|
|
2643
|
+
mod_a::a: value mod_a::a (from module defaults)
|
|
2644
|
+
mod_a::b: value mod_a::b (from module defaults)
|
|
2645
|
+
mod_a::c: value mod_a::c (from module defaults)
|
|
2646
|
+
mod_a::d:
|
|
2647
|
+
b: value mod_a::d.b (from module defaults)
|
|
2648
|
+
mod_a::e:
|
|
2649
|
+
a:
|
|
2650
|
+
a: value mod_a::e.a.a (from module defaults)
|
|
2651
|
+
mod_a::g:
|
|
2652
|
+
a:
|
|
2653
|
+
a: value mod_a::g.a.a (from module defaults)
|
|
2654
|
+
lookup_options:
|
|
2655
|
+
mod_a::d:
|
|
2656
|
+
merge: hash
|
|
2657
|
+
mod_a::g:
|
|
2658
|
+
merge: deep
|
|
2659
|
+
YAML
|
|
2660
|
+
|
|
2661
|
+
let(:mod_a_defaults2) { <<-YAML.unindent }
|
|
2662
|
+
mod_a::e:
|
|
2663
|
+
a:
|
|
2664
|
+
b: value mod_a::e.a.b (from module defaults)
|
|
2665
|
+
mod_a::g:
|
|
2666
|
+
a:
|
|
2667
|
+
b: value mod_a::g.a.b (from module defaults)
|
|
2668
|
+
YAML
|
|
2669
|
+
|
|
2670
|
+
let(:mod_a_files) do
|
|
2671
|
+
{
|
|
2672
|
+
'mod_a' => {
|
|
2673
|
+
'data' => {
|
|
2674
|
+
'common.yaml' => mod_a_common,
|
|
2675
|
+
'common2.yaml' => mod_a_common2,
|
|
2676
|
+
'defaults.yaml' => mod_a_defaults,
|
|
2677
|
+
'defaults2.yaml' => mod_a_defaults2
|
|
2678
|
+
},
|
|
2679
|
+
'hiera.yaml' => mod_a_hiera_yaml
|
|
2680
|
+
}
|
|
2681
|
+
}
|
|
2682
|
+
end
|
|
2683
|
+
|
|
2684
|
+
it 'the default hierarchy does not interfere with environment hierarchy' do
|
|
2685
|
+
expect(lookup('mod_a::a')).to eql('value mod_a::a (from environment)')
|
|
2686
|
+
end
|
|
2687
|
+
|
|
2688
|
+
it 'the default hierarchy does not interfere with regular hierarchy in module' do
|
|
2689
|
+
expect(lookup('mod_a::b')).to eql('value mod_a::b (from module)')
|
|
2690
|
+
end
|
|
2691
|
+
|
|
2692
|
+
it 'the default hierarchy is consulted when no value is found elsewhere' do
|
|
2693
|
+
expect(lookup('mod_a::c')).to eql('value mod_a::c (from module defaults)')
|
|
2694
|
+
end
|
|
2695
|
+
|
|
2696
|
+
it 'the default hierarchy does not participate in a merge' do
|
|
2697
|
+
expect(lookup('mod_a::d', 'merge' => 'hash')).to eql('a' => 'value mod_a::d.a (from module)', 'c' => 'value mod_a::d.c (from module)')
|
|
2698
|
+
end
|
|
2699
|
+
|
|
2700
|
+
it 'lookup_options from regular hierarchy does not effect values found in the default hierarchy' do
|
|
2701
|
+
expect(lookup('mod_a::e')).to eql('a' => { 'a' => 'value mod_a::e.a.a (from module defaults)' })
|
|
2702
|
+
end
|
|
2703
|
+
|
|
2704
|
+
it 'lookup_options from default hierarchy affects values found in the default hierarchy' do
|
|
2705
|
+
expect(lookup('mod_a::g')).to eql('a' => { 'a' => 'value mod_a::g.a.a (from module defaults)', 'b' => 'value mod_a::g.a.b (from module defaults)'})
|
|
2706
|
+
end
|
|
2707
|
+
|
|
2708
|
+
it 'merge parameter does not override lookup_options defined in the default hierarchy' do
|
|
2709
|
+
expect(lookup('mod_a::g', 'merge' => 'hash')).to eql(
|
|
2710
|
+
'a' => { 'a' => 'value mod_a::g.a.a (from module defaults)', 'b' => 'value mod_a::g.a.b (from module defaults)'})
|
|
2711
|
+
end
|
|
2712
|
+
|
|
2713
|
+
it 'lookup_options from default hierarchy does not effect values found in the regular hierarchy' do
|
|
2714
|
+
expect(lookup('mod_a::d')).to eql('a' => 'value mod_a::d.a (from module)')
|
|
2715
|
+
end
|
|
2716
|
+
|
|
2717
|
+
it 'the default hierarchy lookup is included in the explain output' do
|
|
2718
|
+
explanation = explain('mod_a::c')
|
|
2719
|
+
expect(explanation).to match(/Searching default_hierarchy of module "mod_a".+Original path: "defaults.yaml"/m)
|
|
2720
|
+
end
|
|
2721
|
+
end
|
|
353
2722
|
end
|
|
354
|
-
end
|
|
355
2723
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
2724
|
+
context 'and an eyaml lookup_key function' do
|
|
2725
|
+
let(:private_key_name) { 'private_key.pkcs7.pem' }
|
|
2726
|
+
let(:public_key_name) { 'public_key.pkcs7.pem' }
|
|
2727
|
+
|
|
2728
|
+
let(:private_key) do
|
|
2729
|
+
<<-PKCS7.unindent
|
|
2730
|
+
-----BEGIN RSA PRIVATE KEY-----
|
|
2731
|
+
MIIEogIBAAKCAQEAwHB3GvImq59em4LV9DMfP0Zjs21eW3Jd5I9fuY0jLJhIkH6f
|
|
2732
|
+
CR7tyOpYV6xUj+TF8giq9WLxZI7sourMJMWjEWhVjgUr5lqp1RLv4lwfDv3Wk4XC
|
|
2733
|
+
2LUuqj1IAErUXKeRz8i3lUSZW1Pf4CaMpnIiPdWbz6f0KkaJSFi9bqexONBx4fKQ
|
|
2734
|
+
NlgZwm2/aYjjrYng788I0QhWDKUqsQOi5mZKlHNRsDlk7J3Afhsx/jTLrCX/G8+2
|
|
2735
|
+
tPtLsHyRN39kluM5vYHbKXDsCG/a88Z2yUE2+r4Clp0FUKffiEDBPm0/H0sQ4Q1o
|
|
2736
|
+
EfQFDQRKaIkhpsm0nOnLYTy3/xJc5uqDNkLiawIDAQABAoIBAE98pNXOe8ab93oI
|
|
2737
|
+
mtNZYmjCbGAqprTjEoFb71A3SfYbmK2Gf65GxjUdBwx/tBYTiuekSOk+yzKcDoZk
|
|
2738
|
+
sZnmwKpqDByzaiSmAkxunANFxdZtZvpcX9UfUX0j/t+QCROUa5gF8j6HrUiZ5nkx
|
|
2739
|
+
sxr1PcuItekaGLJ1nDLz5JsWTQ+H4M+GXQw7/t96x8v8g9el4exTiAHGk6Fv16kD
|
|
2740
|
+
017T02M9qTTmV3Ab/enDIBmKVD42Ta36K/wc4l1aoUQNiRbIGVh96Cgd1CFXLF3x
|
|
2741
|
+
CsaNbYT4SmRXaYqoj6MKq+QFEGxadFmJy48NoSd4joirIn2lUjHxJebw3lLbNLDR
|
|
2742
|
+
uvQnQ2ECgYEA/nD94wEMr6078uMv6nKxPpNGq7fihwSKf0G/PQDqrRmjUCewuW+k
|
|
2743
|
+
/iXMe1Y/y0PjFeNlSbUsUvKQ5xF7F/1AnpuPHIrn3cjGVLb71W+zen1m8SnhsW/f
|
|
2744
|
+
7dPgtcb4SCvfhmLgoov+P34YcNfGi6qgPUu6319IqoB3BIi7PvfEomkCgYEAwZ4+
|
|
2745
|
+
V0bMjFdDn2hnYzjTNcF2aUQ1jPvtuETizGwyCbbMLl9522lrjC2DrH41vvqX35ct
|
|
2746
|
+
CBJkhQFbtHM8Gnmozv0vxhI2jP+u14mzfePZsaXuYrEgWRj+BCsYUHodXryxnEWj
|
|
2747
|
+
yVrTNskab1B5jFm2SCJDmKcycBOYpRBLCMx6W7MCgYBA99z7/6KboOIzzKrJdGup
|
|
2748
|
+
jLV410UyMIikoccQ7pD9jhRTPS80yjsY4dHqlEVJw5XSWvPb9DTTITi6p44EvBep
|
|
2749
|
+
6BKMuTMnQELUEr0O7KypVCfa4FTOl8BX28f+4kU3OGykxc6R8qkC0VGwTohV1UWB
|
|
2750
|
+
ITsgGhZV4uOA9uDI3T8KMQKBgEnQY2HwmuDSD/TA39GDA3qV8+ez2lqSXRGIKZLX
|
|
2751
|
+
mMf9SaBQQ+uzKA4799wWDbVuYeIbB07xfCL83pJP8FUDlqi6+7Celu9wNp7zX1ua
|
|
2752
|
+
Nw8z/ErhzjxJe+Xo7A8aTwIkG+5A2m1UU/up9YsEeiJYvVaIwY58B42U2vfq20BS
|
|
2753
|
+
fD9jAoGAX2MscBzIsmN+U9R0ptL4SXcPiVnOl8mqvQWr1B4OLgxX7ghht5Fs956W
|
|
2754
|
+
bHipxOWMFCPJA/AhNB8q1DvYiD1viZbIALSCJVUkzs4AEFIjiPsCBKxerl7jF6Xp
|
|
2755
|
+
1WYSaCmfvoCVEpFNt8cKp4Gq+zEBYAV4Q6TkcD2lDtEW49MuN8A=
|
|
2756
|
+
-----END RSA PRIVATE KEY-----
|
|
2757
|
+
PKCS7
|
|
2758
|
+
end
|
|
2759
|
+
|
|
2760
|
+
let(:public_key) do
|
|
2761
|
+
<<-PKCS7.unindent
|
|
2762
|
+
-----BEGIN CERTIFICATE-----
|
|
2763
|
+
MIIC2TCCAcGgAwIBAgIBATANBgkqhkiG9w0BAQUFADAAMCAXDTE3MDExMzA5MTY1
|
|
2764
|
+
MloYDzIwNjcwMTAxMDkxNjUyWjAAMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
|
2765
|
+
CgKCAQEAwHB3GvImq59em4LV9DMfP0Zjs21eW3Jd5I9fuY0jLJhIkH6fCR7tyOpY
|
|
2766
|
+
V6xUj+TF8giq9WLxZI7sourMJMWjEWhVjgUr5lqp1RLv4lwfDv3Wk4XC2LUuqj1I
|
|
2767
|
+
AErUXKeRz8i3lUSZW1Pf4CaMpnIiPdWbz6f0KkaJSFi9bqexONBx4fKQNlgZwm2/
|
|
2768
|
+
aYjjrYng788I0QhWDKUqsQOi5mZKlHNRsDlk7J3Afhsx/jTLrCX/G8+2tPtLsHyR
|
|
2769
|
+
N39kluM5vYHbKXDsCG/a88Z2yUE2+r4Clp0FUKffiEDBPm0/H0sQ4Q1oEfQFDQRK
|
|
2770
|
+
aIkhpsm0nOnLYTy3/xJc5uqDNkLiawIDAQABo1wwWjAPBgNVHRMBAf8EBTADAQH/
|
|
2771
|
+
MB0GA1UdDgQWBBSejWrVnw7QaBjNFCHMNFi+doSOcTAoBgNVHSMEITAfgBSejWrV
|
|
2772
|
+
nw7QaBjNFCHMNFi+doSOcaEEpAIwAIIBATANBgkqhkiG9w0BAQUFAAOCAQEAAe85
|
|
2773
|
+
BQ1ydAHFqo0ib38VRPOwf5xPHGbYGhvQi4/sU6aTuR7pxaOJPYz05jLhS+utEmy1
|
|
2774
|
+
sknBq60G67yhQE7IHcfwrl1arirG2WmKGvAbjeYL2K1UiU0pVD3D+Klkv/pK6jIQ
|
|
2775
|
+
eOJRGb3qNUn0Sq9EoYIOXiGXQ641F0bZZ0+5H92kT1lmnF5oLfCb84ImD9T3snH6
|
|
2776
|
+
pIr5RKRx/0YmJIcv3WdpoPT903rOJiRIEgIj/hDk9QZTBpm222Ul5yQQ5pBywpSp
|
|
2777
|
+
xh0bmJKAQWhQm7QlybKfyaQmg5ot1jEzWAvD2I5FjHQxmAlchjb6RreaRhExj+JE
|
|
2778
|
+
5O117dMBdzDBjcNMOA==
|
|
2779
|
+
-----END CERTIFICATE-----
|
|
2780
|
+
PKCS7
|
|
2781
|
+
end
|
|
2782
|
+
|
|
2783
|
+
let(:keys_dir) do
|
|
2784
|
+
keys = tmpdir('keys')
|
|
2785
|
+
dir_contained_in(keys, {
|
|
2786
|
+
private_key_name => private_key,
|
|
2787
|
+
public_key_name => public_key
|
|
2788
|
+
})
|
|
2789
|
+
keys
|
|
2790
|
+
end
|
|
2791
|
+
|
|
2792
|
+
let(:private_key_path) { File.join(keys_dir, private_key_name) }
|
|
2793
|
+
let(:public_key_path) { File.join(keys_dir, public_key_name) }
|
|
2794
|
+
|
|
2795
|
+
let(:env_hiera_yaml) do
|
|
2796
|
+
<<-YAML.unindent
|
|
2797
|
+
version: 5
|
|
2798
|
+
hierarchy:
|
|
2799
|
+
- name: EYaml
|
|
2800
|
+
path: common.eyaml
|
|
2801
|
+
lookup_key: eyaml_lookup_key
|
|
2802
|
+
options:
|
|
2803
|
+
pkcs7_private_key: #{private_key_path}
|
|
2804
|
+
pkcs7_public_key: #{public_key_path}
|
|
2805
|
+
YAML
|
|
2806
|
+
end
|
|
2807
|
+
|
|
2808
|
+
let(:scope_additions) { { 'ipl_suffix' => 'aa' } }
|
|
2809
|
+
let(:data_files) do
|
|
2810
|
+
{
|
|
2811
|
+
'common.eyaml' => <<-YAML.unindent
|
|
2812
|
+
# a: Encrypted value 'a' (from environment)
|
|
2813
|
+
a: >
|
|
2814
|
+
ENC[PKCS7,MIIBmQYJKoZIhvcNAQcDoIIBijCCAYYCAQAxggEhMIIBHQIBADAFMAACAQEw
|
|
2815
|
+
DQYJKoZIhvcNAQEBBQAEggEAUwwNRA5ZKM87SLnjnJfzDFRQbeheSYMTOhcr
|
|
2816
|
+
sgTPCGtzEAzvRBrkdIRAvDZVRfadV9OB+bJsYrhWIkU1bYiOn1m78ginh96M
|
|
2817
|
+
44RuspnIZYnL9Dhs+JyC8VvB5nlvlEph2RGt+KYg9iU4JYhwZ2+8+yxB6/UK
|
|
2818
|
+
H5HGKDCjBbEc8o9MbCckLsciIh11hKKgT6K0yhKB/nBxxM78nrX0BxmAHX2u
|
|
2819
|
+
bejKDRa9S/0uS7Y91nvnbIkaQpZ4KteSQ+J4/lQBMlMAeE+2F9ncM8jFKnQC
|
|
2820
|
+
rzzdbn1O/zwsEt5J5CRP1Sc+8hM644+IqkLs+17segxArHVGOsEqyDcHbXEK
|
|
2821
|
+
9jspfzBcBgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBCIq/L5HeJgA9XQm67j
|
|
2822
|
+
JHUngDDS5s52FsuSIMin7Z/pV+XuaJGFkL80ia4bXnCWilmtM8oUa/DZuBje
|
|
2823
|
+
dCILO7I8QqU=]
|
|
2824
|
+
hash_a:
|
|
2825
|
+
"hash_%{ipl_suffix}":
|
|
2826
|
+
# aaa: Encrypted value hash_a.hash_aa.aaa (from environment)
|
|
2827
|
+
aaa: >
|
|
2828
|
+
ENC[PKCS7,MIIBqQYJKoZIhvcNAQcDoIIBmjCCAZYCAQAxggEhMIIBHQIBADAFMAACAQEw
|
|
2829
|
+
DQYJKoZIhvcNAQEBBQAEggEAhvGXL5RxVUs9wdqJvpCyXtfCHrm2HbG/u30L
|
|
2830
|
+
n8EuRD9ravlsgIISAnd27JPtrxA+0rZq4EQRGz6OcovnH9vTg86/lVBhhPnz
|
|
2831
|
+
b83ArptGJhRvTYUJ19GZI3AYjJbhWj/Jo5NL56oQJaPBccqHxMApm/U0wlus
|
|
2832
|
+
QtASL94cLuh4toVIBQCQzD5/Bx51p2wQobm9p4WKSl1zJhDceurmoLZXqhuN
|
|
2833
|
+
JwwEBwXopJvgid3ZDPbdX8nI6vHhb/8wDq9yb5DOsrkgqDqQgwPU9sUUioQj
|
|
2834
|
+
Hr1pGyeOWnbEe99iEb2+m7TWsC0NN7OBo06mAgFNbBLjvn2k4PiCxrOOgJ8S
|
|
2835
|
+
LI5eXjBsBgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBCWNS6j3m/Xvrp5RFaN
|
|
2836
|
+
ovm/gEB4oPlYJswoXuWqcEBfwZzbpy96x3b2Le/yoa72ylbPAUc5GfLENvFQ
|
|
2837
|
+
zXpTtSmQE0fixY4JMaBTke65ZRvoiOQO]
|
|
2838
|
+
array_a:
|
|
2839
|
+
# - "array_a[0]"
|
|
2840
|
+
- >
|
|
2841
|
+
ENC[PKCS7,MIIBeQYJKoZIhvcNAQcDoIIBajCCAWYCAQAxggEhMIIBHQIBADAFMAACAQEw
|
|
2842
|
+
DQYJKoZIhvcNAQEBBQAEggEAmXZfyfU77vVCZqHpR10qhD0Jy9DpMGBgal97
|
|
2843
|
+
vUO2VHX7KlCgagK0kz8/uLRIthkYzcpn8ISmw/+CIAny3jOjxOsylJiujqyu
|
|
2844
|
+
hx/JEFl8bOKOg40Bd0UuBaw/qZ+CoAtOorhiIW7x6t7DpknItC6gkH/cSJ4/
|
|
2845
|
+
p3MdhoARRuwj2fvuaChVsD39l2rXjgJj0OJOaDXdbuisG75VRZf5l8IH6+44
|
|
2846
|
+
Q7m6W7BU69LX+ozn+W3filQoiJ5MPf8w/KXAObMSbKYIDsrZUyIWyyNUbpW0
|
|
2847
|
+
MieIkHj93bX3gIEcenECLdWaEzcPa7MHgl6zevQKg4H0JVmcvKYyfHYqcrVE
|
|
2848
|
+
PqizKDA8BgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBDf259KZEay1widVSFy
|
|
2849
|
+
I9zGgBAICjm0x2GeqoCnHdiAA+jt]
|
|
2850
|
+
# - "array_a[1]"
|
|
2851
|
+
- >
|
|
2852
|
+
ENC[PKCS7,MIIBeQYJKoZIhvcNAQcDoIIBajCCAWYCAQAxggEhMIIBHQIBADAFMAACAQEw
|
|
2853
|
+
DQYJKoZIhvcNAQEBBQAEggEATVy4hHG356INFKOswAhoravh66iJljp+Vn3o
|
|
2854
|
+
UVD1kyRiqY5tz3UVSptzUmzD+YssX/f73AKCjUI3HrPNL7kAxsk6fWS7nDEj
|
|
2855
|
+
AuxtCqGYeBha6oYJYziSGIHfAdY3MiJUI1C9g/OQB4TTvKdrlDArPiY8THJi
|
|
2856
|
+
bzLLMbVQYJ6ixSldwkdKD75vtikyamx+1LSyVBSg8maVyPvLHtLZJuT71rln
|
|
2857
|
+
WON3Ious9PIbd+izbcCzaoqh5UnTfDCjOuAYliXalBxamIIwNzSV1sdR8/qf
|
|
2858
|
+
t22zpYK4J8lgCBV2gKfrOWSi9MAs6JhCeOb8wNLMmAUTbc0WrFJxoCwAPX0z
|
|
2859
|
+
MAjsNjA8BgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBC4v4bNE4gFlbLmVY+9
|
|
2860
|
+
BtSLgBBm7U0wu6d6s9wF9Ek9IHPe]
|
|
2861
|
+
# ref_a: "A resolved = '%{hiera('a')}'"
|
|
2862
|
+
ref_a: >
|
|
2863
|
+
ENC[PKCS7,MIIBiQYJKoZIhvcNAQcDoIIBejCCAXYCAQAxggEhMIIBHQIBADAFMAACAQEw
|
|
2864
|
+
DQYJKoZIhvcNAQEBBQAEggEAFSuUp+yk+oaA7b5ekT0u360CQ9Q2sIQ/bTcM
|
|
2865
|
+
jT3XLjm8HIGYPcysOEnuo8WcAxJFY5iya4yQ7Y/UhMWXaTi7Vzv/6BmyPDwz
|
|
2866
|
+
+7Z2Mf0r0PvS5+ylue6aem/3bXPOmXTKTf68OCehTRXlDUs8/av9gnsDzojp
|
|
2867
|
+
yiUTBZvKxhIP2n//GyoHgyATveHT0lxPVpdMycB347DtWS7IduCxx0+KiOOw
|
|
2868
|
+
DXYFlYbIVxVInwgERxtsfYSr+Fu0/mkjtRsQm+dPzMQOATE9Val2gGKsV6bi
|
|
2869
|
+
kdm1OM9HrwVsFj6Lma6FYmr89Bcm/1uEc8fiOMtNK3z2+nwunWBMNCGneMYD
|
|
2870
|
+
C5IJejBMBgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBAeiZDGQyXHkZlV5ceT
|
|
2871
|
+
iCxpgCDDatuVvbPEEi8rKOC7xhPHZ22zLEEV//l7C9jxq+DZcA==]
|
|
2872
|
+
YAML
|
|
2873
|
+
}
|
|
2874
|
+
end
|
|
2875
|
+
|
|
2876
|
+
let(:env_data) { data_files }
|
|
2877
|
+
|
|
2878
|
+
it 'finds data in the environment' do
|
|
2879
|
+
expect(lookup('a')).to eql("Encrypted value 'a' (from environment)")
|
|
2880
|
+
end
|
|
2881
|
+
|
|
2882
|
+
it 'evaluates interpolated keys' do
|
|
2883
|
+
expect(lookup('hash_a')).to include('hash_aa')
|
|
2884
|
+
end
|
|
2885
|
+
|
|
2886
|
+
it 'evaluates interpolations in encrypted values' do
|
|
2887
|
+
expect(lookup('ref_a')).to eql("A resolved = 'Encrypted value 'a' (from environment)'")
|
|
2888
|
+
end
|
|
2889
|
+
|
|
2890
|
+
it 'can read encrypted values inside a hash' do
|
|
2891
|
+
expect(lookup('hash_a.hash_aa.aaa')).to eql('Encrypted value hash_a.hash_aa.aaa (from environment)')
|
|
2892
|
+
end
|
|
2893
|
+
|
|
2894
|
+
it 'can read encrypted values inside an array' do
|
|
2895
|
+
expect(lookup('array_a')).to eql(['array_a[0]', 'array_a[1]'])
|
|
2896
|
+
end
|
|
2897
|
+
|
|
2898
|
+
context 'declared in global scope as a Hiera v3 backend' do
|
|
2899
|
+
let(:environment_files) { {} }
|
|
2900
|
+
let(:data_file_content) { <<-YAML.unindent }
|
|
2901
|
+
a: >
|
|
2902
|
+
ENC[PKCS7,MIIBmQYJKoZIhvcNAQcDoIIBijCCAYYCAQAxggEhMIIBHQIBADAFMAACAQEw
|
|
2903
|
+
DQYJKoZIhvcNAQEBBQAEggEAH457bsfL8kYw9O50roE3dcE21nCnmPnQ2XSX
|
|
2904
|
+
LYRJ2C78LarbfFonKz0gvDW7tyhsLWASFCFaiU8T1QPBd2b3hoQK8E4B2Ual
|
|
2905
|
+
xga/K7r9y3OSgRomTm9tpTltC6re0Ubh3Dy71H61obwxEdNVTqjPe95+m2b8
|
|
2906
|
+
6zWZVnzZzXXsTG1S17yJn1zaB/LXHbWNy4KyLLKCGAml+Gfl6ZMjmaplTmUA
|
|
2907
|
+
QIC5rI8abzbPP3TDMmbLOGNkrmLqI+3uS8tSueTMoJmWaMF6c+H/cA7oRxmV
|
|
2908
|
+
QCeEUVXjyFvCHcmbA+keS/RK9XF+vc07/XS4XkYSPs/I5hLQji1y9bkkGAs0
|
|
2909
|
+
tehxQjBcBgkqhkiG9w0BBwEwHQYJYIZIAWUDBAEqBBDHpA6Fcl/R16aIYcow
|
|
2910
|
+
oiO4gDAvfFH6jLUwXkcYtagnwdmhkd9TQJtxNWcIwMpvmk036MqIoGwwhQdg
|
|
2911
|
+
gV4beiCFtLU=]
|
|
2912
|
+
YAML
|
|
2913
|
+
|
|
2914
|
+
let(:hiera_yaml) do
|
|
2915
|
+
<<-YAML.unindent
|
|
2916
|
+
:backends: eyaml
|
|
2917
|
+
:eyaml:
|
|
2918
|
+
:datadir: #{code_dir}/hieradata
|
|
2919
|
+
:pkcs7_private_key: #{private_key_path}
|
|
2920
|
+
:pkcs7_public_key: #{public_key_path}
|
|
2921
|
+
:hierarchy:
|
|
2922
|
+
- common
|
|
2923
|
+
YAML
|
|
2924
|
+
end
|
|
2925
|
+
|
|
2926
|
+
let(:data_files) do
|
|
2927
|
+
{
|
|
2928
|
+
'common.eyaml' => data_file_content
|
|
2929
|
+
}
|
|
2930
|
+
end
|
|
2931
|
+
|
|
2932
|
+
let(:code_dir_files) do
|
|
2933
|
+
{
|
|
2934
|
+
'hiera.yaml' => hiera_yaml,
|
|
2935
|
+
'hieradata' => data_files
|
|
2936
|
+
}
|
|
2937
|
+
end
|
|
2938
|
+
|
|
2939
|
+
before(:each) do
|
|
2940
|
+
Puppet.settings[:hiera_config] = File.join(code_dir, 'hiera.yaml')
|
|
2941
|
+
end
|
|
2942
|
+
|
|
2943
|
+
it 'finds data in the global layer' do
|
|
2944
|
+
expect(lookup('a')).to eql("Encrypted value 'a' (from global)")
|
|
2945
|
+
end
|
|
2946
|
+
|
|
2947
|
+
it 'delegates configured eyaml backend to eyaml_lookup_key function' do
|
|
2948
|
+
expect(explain('a')).to match(/Hierarchy entry "eyaml"\n.*\n.*\n.*"common"\n\s*Found key: "a"/m)
|
|
2949
|
+
end
|
|
2950
|
+
|
|
2951
|
+
context 'using intepolated paths to the key pair' do
|
|
2952
|
+
let(:scope_additions) { { 'priv_path' => private_key_path, 'pub_path' => public_key_path } }
|
|
2953
|
+
|
|
2954
|
+
let(:hiera_yaml) do
|
|
2955
|
+
<<-YAML.unindent
|
|
2956
|
+
:backends: eyaml
|
|
2957
|
+
:eyaml:
|
|
2958
|
+
:datadir: #{code_dir}/hieradata
|
|
2959
|
+
:pkcs7_private_key: "%{priv_path}"
|
|
2960
|
+
:pkcs7_public_key: "%{pub_path}"
|
|
2961
|
+
:hierarchy:
|
|
2962
|
+
- common
|
|
2963
|
+
YAML
|
|
2964
|
+
end
|
|
2965
|
+
|
|
2966
|
+
it 'finds data in the global layer' do
|
|
2967
|
+
expect(lookup('a')).to eql("Encrypted value 'a' (from global)")
|
|
2968
|
+
end
|
|
2969
|
+
end
|
|
2970
|
+
|
|
2971
|
+
context 'with special extension declared in options' do
|
|
2972
|
+
let(:environment_files) { {} }
|
|
2973
|
+
let(:hiera_yaml) do
|
|
2974
|
+
<<-YAML.unindent
|
|
2975
|
+
:backends: eyaml
|
|
2976
|
+
:eyaml:
|
|
2977
|
+
:extension: xyaml
|
|
2978
|
+
:datadir: #{code_dir}/hieradata
|
|
2979
|
+
:pkcs7_private_key: #{private_key_path}
|
|
2980
|
+
:pkcs7_public_key: #{public_key_path}
|
|
2981
|
+
:hierarchy:
|
|
2982
|
+
- common
|
|
2983
|
+
YAML
|
|
2984
|
+
end
|
|
2985
|
+
|
|
2986
|
+
let(:data_files) do
|
|
2987
|
+
{
|
|
2988
|
+
'common.xyaml' => data_file_content
|
|
2989
|
+
}
|
|
2990
|
+
end
|
|
2991
|
+
|
|
2992
|
+
it 'finds data in the global layer' do
|
|
2993
|
+
expect(lookup('a')).to eql("Encrypted value 'a' (from global)")
|
|
2994
|
+
end
|
|
2995
|
+
|
|
2996
|
+
it 'delegates configured eyaml backend to eyaml_lookup_key function' do
|
|
2997
|
+
expect(explain('a')).to match(/Hierarchy entry "eyaml"\n.*\n.*\n.*"common"\n\s*Found key: "a"/m)
|
|
2998
|
+
end
|
|
2999
|
+
end
|
|
3000
|
+
end
|
|
362
3001
|
end
|
|
363
3002
|
end
|
|
364
3003
|
end
|