puppet 4.3.0 → 4.4.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 +7 -0
- data/COMMITTERS.md +2 -2
- data/CONTRIBUTING.md +6 -6
- data/LICENSE +1 -1
- data/README.md +8 -9
- data/conf/auth.conf +2 -2
- data/ext/README.environment +1 -1
- data/ext/build_defaults.yaml +1 -1
- data/ext/debian/README.source +1 -1
- data/ext/debian/control +1 -1
- data/ext/debian/copyright +4 -4
- 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/project_data.yaml +8 -0
- data/ext/puppet-test +3 -3
- data/ext/rack/example-passenger-vhost.conf +1 -1
- data/ext/redhat/puppet.spec.erb +2 -2
- data/ext/regexp_nodes/regexp_nodes.rb +1 -1
- data/ext/solaris/pkginfo +1 -1
- data/ext/solaris/smf/puppet.xml +1 -1
- data/ext/suse/puppet.spec +2 -2
- 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/yaml_nodes.rb +1 -1
- data/install.rb +30 -20
- data/lib/hiera/scope.rb +1 -1
- data/lib/puppet/agent.rb +1 -1
- data/lib/puppet/application/agent.rb +4 -2
- data/lib/puppet/application/apply.rb +7 -4
- data/lib/puppet/application/cert.rb +1 -1
- data/lib/puppet/application/device.rb +1 -1
- data/lib/puppet/application/filebucket.rb +1 -1
- data/lib/puppet/application/inspect.rb +1 -1
- data/lib/puppet/application/lookup.rb +45 -47
- data/lib/puppet/application/master.rb +2 -2
- data/lib/puppet/application/resource.rb +1 -1
- data/lib/puppet/configurer.rb +100 -22
- data/lib/puppet/data_providers/hiera_config.rb +28 -3
- data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
- data/lib/puppet/data_providers/hiera_support.rb +1 -1
- data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
- data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
- data/lib/puppet/defaults.rb +69 -22
- data/lib/puppet/environments.rb +3 -1
- data/lib/puppet/face/config.rb +1 -1
- data/lib/puppet/face/epp.rb +1 -1
- data/lib/puppet/face/help/man.erb +1 -1
- data/lib/puppet/face/module/install.rb +6 -6
- data/lib/puppet/face/parser.rb +12 -9
- data/lib/puppet/face/status.rb +2 -1
- data/lib/puppet/feature/cfpropertylist.rb +3 -0
- data/lib/puppet/feature/telnet.rb +9 -0
- 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 +2 -2
- data/lib/puppet/file_system/memory_impl.rb +1 -1
- data/lib/puppet/file_system/uniquefile.rb +1 -1
- data/lib/puppet/file_system.rb +2 -2
- data/lib/puppet/forge/repository.rb +1 -31
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/functions/assert_type.rb +9 -9
- data/lib/puppet/functions/each.rb +5 -13
- data/lib/puppet/functions/filter.rb +5 -14
- data/lib/puppet/functions/lookup.rb +126 -150
- data/lib/puppet/functions/map.rb +6 -14
- data/lib/puppet/functions/match.rb +1 -0
- data/lib/puppet/functions/reduce.rb +5 -13
- data/lib/puppet/functions/reverse_each.rb +82 -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 +88 -0
- data/lib/puppet/functions/type.rb +70 -0
- data/lib/puppet/functions.rb +45 -6
- data/lib/puppet/graph/rb_tree_map.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +188 -5
- data/lib/puppet/indirector/facts/facter.rb +2 -13
- 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 +3 -1
- data/lib/puppet/indirector/indirection.rb +6 -2
- data/lib/puppet/indirector/json.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/rest.rb +2 -1
- data/lib/puppet/info_service/class_information_service.rb +13 -12
- data/lib/puppet/loaders.rb +1 -0
- data/lib/puppet/module.rb +6 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
- data/lib/puppet/module_tool/tar/mini.rb +3 -3
- data/lib/puppet/network/http/pool.rb +9 -0
- data/lib/puppet/node/environment.rb +11 -2
- data/lib/puppet/node.rb +11 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
- data/lib/puppet/parser/compiler.rb +4 -11
- data/lib/puppet/parser/environment_compiler.rb +0 -1
- data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
- data/lib/puppet/parser/functions/inline_template.rb +1 -1
- data/lib/puppet/parser/functions/lookup.rb +128 -149
- data/lib/puppet/parser/functions/map.rb +1 -1
- data/lib/puppet/parser/functions/match.rb +1 -0
- data/lib/puppet/parser/functions/scanf.rb +15 -26
- data/lib/puppet/parser/functions/slice.rb +17 -24
- data/lib/puppet/parser/functions/split.rb +1 -1
- data/lib/puppet/parser/functions.rb +28 -16
- data/lib/puppet/parser/resource.rb +19 -17
- data/lib/puppet/parser/scope.rb +176 -5
- data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
- data/lib/puppet/pops/adaptable.rb +4 -1
- data/lib/puppet/pops/adapters.rb +80 -12
- 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_model.rb +49 -47
- data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
- data/lib/puppet/pops/binder/injector.rb +53 -48
- data/lib/puppet/pops/binder/key_factory.rb +10 -6
- data/lib/puppet/pops/binder/producers.rb +67 -62
- data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
- data/lib/puppet/pops/evaluator/closure.rb +122 -106
- data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
- data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
- data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
- data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
- data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
- data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
- data/lib/puppet/pops/functions/function.rb +6 -2
- data/lib/puppet/pops/issue_reporter.rb +6 -4
- data/lib/puppet/pops/issues.rb +50 -11
- data/lib/puppet/pops/loader/base_loader.rb +1 -1
- data/lib/puppet/pops/loader/loader.rb +1 -1
- data/lib/puppet/pops/loader/loader_paths.rb +15 -0
- data/lib/puppet/pops/loader/module_loaders.rb +17 -13
- data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
- data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
- data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
- data/lib/puppet/pops/loaders.rb +51 -9
- data/lib/puppet/pops/lookup/explainer.rb +73 -3
- data/lib/puppet/pops/lookup/invocation.rb +21 -19
- data/lib/puppet/pops/lookup.rb +17 -12
- data/lib/puppet/pops/merge_strategy.rb +16 -19
- data/lib/puppet/pops/model/factory.rb +179 -157
- data/lib/puppet/pops/model/model.rb +17 -8
- data/lib/puppet/pops/model/model_label_provider.rb +14 -7
- data/lib/puppet/pops/model/model_meta.rb +17 -0
- data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
- data/lib/puppet/pops/parser/egrammar.ra +38 -14
- data/lib/puppet/pops/parser/eparser.rb +1353 -1276
- data/lib/puppet/pops/parser/epp_support.rb +11 -7
- data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
- data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
- data/lib/puppet/pops/parser/lexer2.rb +428 -403
- data/lib/puppet/pops/parser/lexer_support.rb +85 -7
- data/lib/puppet/pops/parser/locator.rb +21 -0
- data/lib/puppet/pops/parser/parser_support.rb +19 -16
- data/lib/puppet/pops/parser/slurp_support.rb +16 -8
- data/lib/puppet/pops/types/class_loader.rb +23 -19
- data/lib/puppet/pops/types/enumeration.rb +9 -26
- data/lib/puppet/pops/types/iterable.rb +308 -0
- data/lib/puppet/pops/types/recursion_guard.rb +82 -0
- data/lib/puppet/pops/types/type_acceptor.rb +25 -0
- data/lib/puppet/pops/types/type_asserter.rb +10 -9
- data/lib/puppet/pops/types/type_calculator.rb +140 -387
- data/lib/puppet/pops/types/type_factory.rb +91 -57
- data/lib/puppet/pops/types/type_formatter.rb +334 -0
- data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
- data/lib/puppet/pops/types/type_parser.rb +159 -112
- data/lib/puppet/pops/types/types.rb +2057 -1253
- data/lib/puppet/pops/utils.rb +11 -10
- data/lib/puppet/pops/validation/checker4_0.rb +115 -63
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
- data/lib/puppet/pops/validation.rb +11 -9
- data/lib/puppet/pops.rb +0 -8
- data/lib/puppet/provider/aixobject.rb +1 -1
- data/lib/puppet/provider/augeas/augeas.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +1 -1
- data/lib/puppet/provider/exec/windows.rb +1 -1
- data/lib/puppet/provider/group/windows_adsi.rb +2 -2
- data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
- data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
- data/lib/puppet/provider/package/appdmg.rb +3 -2
- data/lib/puppet/provider/package/dnf.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +16 -9
- data/lib/puppet/provider/package/pip3.rb +1 -1
- data/lib/puppet/provider/package/pkg.rb +1 -1
- data/lib/puppet/provider/package/pkgdmg.rb +3 -2
- data/lib/puppet/provider/package/pkgng.rb +13 -4
- data/lib/puppet/provider/package/rpm.rb +0 -1
- data/lib/puppet/provider/package/windows.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +2 -2
- data/lib/puppet/provider/package/zypper.rb +19 -0
- data/lib/puppet/provider/service/debian.rb +7 -20
- data/lib/puppet/provider/service/init.rb +7 -0
- data/lib/puppet/provider/service/launchd.rb +6 -12
- data/lib/puppet/provider/service/systemd.rb +9 -2
- data/lib/puppet/provider/sshkey/parsed.rb +1 -1
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/directoryservice.rb +33 -58
- data/lib/puppet/provider/user/windows_adsi.rb +2 -2
- data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
- data/lib/puppet/provider/zfs/zfs.rb +1 -1
- data/lib/puppet/provider/zpool/zpool.rb +1 -1
- data/lib/puppet/reference/configuration.rb +1 -1
- data/lib/puppet/reference/providers.rb +1 -1
- data/lib/puppet/resource/capability_finder.rb +20 -13
- data/lib/puppet/resource/catalog.rb +60 -3
- data/lib/puppet/resource/status.rb +11 -2
- data/lib/puppet/resource/type.rb +33 -42
- data/lib/puppet/resource.rb +15 -12
- data/lib/puppet/settings/config_file.rb +1 -1
- data/lib/puppet/settings/environment_conf.rb +13 -5
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/ssl/certificate_factory.rb +3 -3
- data/lib/puppet/ssl/certificate_request.rb +4 -4
- data/lib/puppet/ssl/certificate_signer.rb +1 -1
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/test/test_helper.rb +16 -4
- data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
- data/lib/puppet/transaction/report.rb +31 -1
- data/lib/puppet/transaction/resource_harness.rb +0 -25
- data/lib/puppet/transaction.rb +15 -2
- data/lib/puppet/type/augeas.rb +1 -1
- data/lib/puppet/type/cron.rb +12 -12
- data/lib/puppet/type/file/checksum_value.rb +53 -0
- data/lib/puppet/type/file/content.rb +26 -111
- data/lib/puppet/type/file/data_sync.rb +84 -0
- data/lib/puppet/type/file/ensure.rb +17 -14
- data/lib/puppet/type/file/selcontext.rb +1 -1
- data/lib/puppet/type/file/source.rb +103 -18
- data/lib/puppet/type/file.rb +91 -39
- data/lib/puppet/type/filebucket.rb +1 -1
- data/lib/puppet/type/group.rb +6 -2
- data/lib/puppet/type/interface.rb +8 -3
- data/lib/puppet/type/macauthorization.rb +1 -1
- data/lib/puppet/type/package.rb +6 -0
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/stage.rb +1 -1
- data/lib/puppet/type/user.rb +19 -17
- data/lib/puppet/type/yumrepo.rb +20 -0
- data/lib/puppet/type.rb +11 -11
- data/lib/puppet/util/autoload.rb +16 -11
- data/lib/puppet/util/checksums.rb +74 -31
- data/lib/puppet/util/execution.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +72 -0
- data/lib/puppet/util/log.rb +2 -0
- data/lib/puppet/util/logging.rb +43 -1
- data/lib/puppet/util/monkey_patches.rb +2 -2
- data/lib/puppet/util/multi_match.rb +51 -0
- data/lib/puppet/util/network_device/cisco/device.rb +10 -2
- data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
- 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 +130 -0
- data/lib/puppet/util/resource_template.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/windows/access_control_entry.rb +1 -1
- data/lib/puppet/util/windows/access_control_list.rb +3 -3
- data/lib/puppet/util/windows/adsi.rb +65 -28
- 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 +8 -8
- data/lib/puppet/util/windows/principal.rb +190 -0
- data/lib/puppet/util/windows/process.rb +78 -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 +33 -35
- 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 +15 -15
- data/lib/puppet/util/windows/user.rb +10 -10
- data/lib/puppet/util/windows.rb +4 -0
- data/lib/puppet/util.rb +109 -22
- data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
- data/lib/puppet/vendor/pathspec/LICENSE +2 -2
- data/lib/puppet/vendor/pathspec/README.md +1 -1
- data/lib/puppet/vendor/rgen/README.rdoc +1 -1
- data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet.rb +17 -0
- data/lib/semver.rb +17 -1
- data/man/man5/puppet.conf.5 +12 -12
- 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 +4 -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/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_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/hiera.yaml +7 -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/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
- data/spec/fixtures/unit/module/trailing-comma.json +1 -1
- 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/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 +81 -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/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
- data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -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/defaults_spec.rb +14 -2
- data/spec/integration/file_system/uniquefile_spec.rb +29 -0
- data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
- data/spec/integration/node/environment_spec.rb +13 -0
- data/spec/integration/parser/collection_spec.rb +8 -0
- data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
- data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
- data/spec/integration/parser/undef_param_spec.rb +8 -0
- data/spec/integration/provider/yumrepo_spec.rb +1 -1
- data/spec/integration/test/test_helper_spec.rb +28 -0
- data/spec/integration/transaction/report_spec.rb +16 -0
- data/spec/integration/transaction_spec.rb +11 -0
- data/spec/integration/type/file_spec.rb +194 -4
- data/spec/integration/type/package_spec.rb +5 -1
- data/spec/integration/type/tidy_spec.rb +21 -9
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/windows/principal_spec.rb +201 -0
- data/spec/integration/util/windows/process_spec.rb +31 -0
- data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
- data/spec/integration/util/windows/security_spec.rb +8 -8
- data/spec/integration/util/windows/user_spec.rb +1 -1
- data/spec/integration/util_spec.rb +49 -27
- data/spec/lib/puppet_spec/compiler.rb +17 -0
- data/spec/lib/puppet_spec/files.rb +2 -2
- data/spec/lib/puppet_spec/pops.rb +13 -0
- data/spec/shared_behaviours/iterative_functions.rb +1 -1
- data/spec/shared_contexts/types_setup.rb +96 -0
- data/spec/unit/agent_spec.rb +1 -0
- data/spec/unit/application/agent_spec.rb +10 -0
- data/spec/unit/application/apply_spec.rb +9 -0
- data/spec/unit/application/lookup_spec.rb +138 -28
- data/spec/unit/configurer/downloader_spec.rb +5 -5
- data/spec/unit/configurer_spec.rb +271 -39
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
- data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
- data/spec/unit/defaults_spec.rb +15 -0
- data/spec/unit/environments_spec.rb +24 -4
- data/spec/unit/face/epp_face_spec.rb +2 -2
- data/spec/unit/face/parser_spec.rb +43 -2
- 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/terminus_selector_spec.rb +12 -2
- data/spec/unit/file_system_spec.rb +26 -0
- data/spec/unit/functions/assert_type_spec.rb +36 -2
- data/spec/unit/functions/defined_spec.rb +2 -2
- data/spec/unit/functions/epp_spec.rb +17 -9
- data/spec/unit/functions/inline_epp_spec.rb +4 -4
- data/spec/unit/functions/lookup_spec.rb +88 -16
- data/spec/unit/functions/regsubst_spec.rb +1 -1
- data/spec/unit/functions/reverse_each_spec.rb +108 -0
- data/spec/unit/functions/step_spec.rb +113 -0
- data/spec/unit/functions/type_spec.rb +35 -0
- data/spec/unit/functions4_spec.rb +62 -6
- data/spec/unit/hiera/scope_spec.rb +5 -2
- data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
- data/spec/unit/indirector/indirection_spec.rb +1 -1
- data/spec/unit/indirector/json_spec.rb +1 -1
- data/spec/unit/info_service_spec.rb +94 -32
- data/spec/unit/module_spec.rb +14 -0
- data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
- data/spec/unit/network/authstore_spec.rb +1 -1
- data/spec/unit/network/http/connection_spec.rb +1 -0
- data/spec/unit/network/http/pool_spec.rb +30 -0
- data/spec/unit/node_spec.rb +8 -0
- data/spec/unit/parser/compiler_spec.rb +16 -18
- data/spec/unit/parser/scope_spec.rb +28 -11
- data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
- data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
- data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
- data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
- data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
- data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
- data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
- data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
- data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
- data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
- data/spec/unit/pops/parser/parser_spec.rb +10 -0
- data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
- data/spec/unit/pops/types/iterable_spec.rb +262 -0
- data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
- data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
- data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
- data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
- data/spec/unit/pops/types/type_parser_spec.rb +58 -13
- data/spec/unit/pops/types/types_spec.rb +241 -0
- data/spec/unit/pops/validator/validator_spec.rb +159 -15
- data/spec/unit/provider/cron/parsed_spec.rb +1 -0
- data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
- data/spec/unit/provider/macauthorization_spec.rb +5 -2
- data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
- data/spec/unit/provider/package/appdmg_spec.rb +3 -3
- data/spec/unit/provider/package/dnf_spec.rb +16 -0
- data/spec/unit/provider/package/pip3_spec.rb +60 -42
- data/spec/unit/provider/package/pip_spec.rb +88 -47
- data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
- data/spec/unit/provider/package/pkgng_spec.rb +4 -2
- data/spec/unit/provider/package/rpm_spec.rb +2 -25
- data/spec/unit/provider/package/yum_spec.rb +12 -1
- data/spec/unit/provider/package/zypper_spec.rb +14 -0
- data/spec/unit/provider/service/debian_spec.rb +6 -24
- data/spec/unit/provider/service/init_spec.rb +11 -1
- data/spec/unit/provider/service/launchd_spec.rb +18 -25
- data/spec/unit/provider/service/systemd_spec.rb +25 -12
- data/spec/unit/provider/service/upstart_spec.rb +57 -0
- data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
- data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
- data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
- data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
- data/spec/unit/resource/capability_finder_spec.rb +28 -15
- data/spec/unit/resource/catalog_spec.rb +33 -1
- data/spec/unit/resource/type_spec.rb +149 -7
- data/spec/unit/resource_spec.rb +99 -50
- data/spec/unit/settings/environment_conf_spec.rb +18 -1
- data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
- data/spec/unit/transaction/report_spec.rb +27 -0
- data/spec/unit/transaction/resource_harness_spec.rb +0 -47
- data/spec/unit/transaction_spec.rb +5 -0
- 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 +12 -193
- data/spec/unit/type/file/source_spec.rb +211 -119
- data/spec/unit/type/file_spec.rb +133 -34
- data/spec/unit/type/interface_spec.rb +32 -0
- data/spec/unit/type/macauthorization_spec.rb +4 -1
- data/spec/unit/type/yumrepo_spec.rb +2 -2
- data/spec/unit/util/filetype_spec.rb +1 -1
- data/spec/unit/util/http_proxy_spec.rb +2 -2
- data/spec/unit/util/log/destinations_spec.rb +0 -2
- data/spec/unit/util/logging_spec.rb +69 -0
- data/spec/unit/util/multi_match_spec.rb +39 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
- data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
- data/spec/unit/util/plist_spec.rb +110 -0
- data/spec/unit/util/resource_template_spec.rb +2 -2
- data/spec/unit/util/run_mode_spec.rb +27 -3
- data/spec/unit/util/windows/adsi_spec.rb +46 -38
- data/spec/unit/util/windows/api_types_spec.rb +42 -0
- data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
- data/spec/unit/util/windows/sid_spec.rb +48 -11
- data/spec/unit/util_spec.rb +123 -13
- data/tasks/cfpropertylist.rake +15 -0
- metadata +3342 -3195
- 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/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,19 +1,21 @@
|
|
|
1
|
+
module Puppet::Pops
|
|
2
|
+
module Loader
|
|
1
3
|
# The PuppetFunctionInstantiator instantiates a Puppet::Functions::PuppetFunction given a Puppet Programming language
|
|
2
4
|
# source that when called evaluates the Puppet logic it contains.
|
|
3
5
|
#
|
|
4
|
-
class
|
|
6
|
+
class PuppetFunctionInstantiator
|
|
5
7
|
# Produces an instance of the Function class with the given typed_name, or fails with an error if the
|
|
6
8
|
# given puppet source does not produce this instance when evaluated.
|
|
7
9
|
#
|
|
8
|
-
# @param loader [
|
|
9
|
-
# @param typed_name [
|
|
10
|
+
# @param loader [Loader] The loader the function is associated with
|
|
11
|
+
# @param typed_name [TypedName] the type / name of the function to load
|
|
10
12
|
# @param source_ref [URI, String] a reference to the source / origin of the puppet code to evaluate
|
|
11
13
|
# @param pp_code_string [String] puppet code in a string
|
|
12
14
|
#
|
|
13
|
-
# @return [
|
|
15
|
+
# @return [Functions::Function] - an instantiated function with global scope closure associated with the given loader
|
|
14
16
|
#
|
|
15
17
|
def self.create(loader, typed_name, source_ref, pp_code_string)
|
|
16
|
-
parser =
|
|
18
|
+
parser = Parser::EvaluatingParser.new()
|
|
17
19
|
|
|
18
20
|
# parse and validate
|
|
19
21
|
result = parser.parse_string(pp_code_string, source_ref)
|
|
@@ -28,7 +30,7 @@ class Puppet::Pops::Loader::PuppetFunctionInstantiator
|
|
|
28
30
|
end
|
|
29
31
|
the_function_definition = result.model.definitions[0]
|
|
30
32
|
|
|
31
|
-
unless the_function_definition.is_a?(
|
|
33
|
+
unless the_function_definition.is_a?(Model::FunctionDefinition)
|
|
32
34
|
raise ArgumentError, "The code loaded from #{source_ref} does not define the function '#{typed_name.name}' - no function found."
|
|
33
35
|
end
|
|
34
36
|
unless the_function_definition.name == typed_name.name
|
|
@@ -43,7 +45,8 @@ class Puppet::Pops::Loader::PuppetFunctionInstantiator
|
|
|
43
45
|
# Adapt the function definition with loader - this is used from logic contained in it body to find the
|
|
44
46
|
# loader to use when making calls to the new function API. Such logic have a hard time finding the closure (where
|
|
45
47
|
# the loader is known - hence this mechanism
|
|
46
|
-
|
|
48
|
+
private_loader = loader.private_loader
|
|
49
|
+
Adapters::LoaderAdapter.adapt(the_function_definition).loader = private_loader
|
|
47
50
|
|
|
48
51
|
# TODO: Cheating wrt. scope - assuming it is found in the context
|
|
49
52
|
closure_scope = Puppet.lookup(:global_scope) { {} }
|
|
@@ -53,26 +56,28 @@ class Puppet::Pops::Loader::PuppetFunctionInstantiator
|
|
|
53
56
|
# when calling functions etc.
|
|
54
57
|
# It should be bound to global scope
|
|
55
58
|
|
|
56
|
-
created.new(closure_scope,
|
|
59
|
+
created.new(closure_scope, private_loader)
|
|
57
60
|
end
|
|
58
61
|
|
|
59
62
|
# Creates Function class and instantiates it based on a FunctionDefinition model
|
|
60
|
-
# @return [Array<
|
|
63
|
+
# @return [Array<Loader::TypedName, Functions.Function>] - array of
|
|
61
64
|
# typed name, and an instantiated function with global scope closure associated with the given loader
|
|
62
65
|
#
|
|
63
66
|
def self.create_from_model(function_definition, loader)
|
|
64
67
|
closure_scope = Puppet.lookup(:global_scope) { {} }
|
|
65
68
|
created = create_function_class(function_definition, closure_scope)
|
|
66
|
-
typed_name =
|
|
69
|
+
typed_name = Loader::TypedName.new(:function, function_definition.name)
|
|
67
70
|
[typed_name, created.new(closure_scope, loader)]
|
|
68
71
|
end
|
|
69
72
|
|
|
70
73
|
def self.create_function_class(function_definition, closure_scope)
|
|
71
74
|
# Create a 4x function wrapper around a named closure
|
|
72
75
|
Puppet::Functions.create_function(function_definition.name, Puppet::Functions::PuppetFunction) do
|
|
73
|
-
init_dispatch(
|
|
76
|
+
init_dispatch(Evaluator::Closure::Named.new(
|
|
74
77
|
function_definition.name,
|
|
75
|
-
|
|
78
|
+
Evaluator::EvaluatorImpl.new(), function_definition, closure_scope))
|
|
76
79
|
end
|
|
77
80
|
end
|
|
78
|
-
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -16,7 +16,10 @@ class Puppet::Pops::Loader::RubyFunctionInstantiator
|
|
|
16
16
|
unless ruby_code_string.is_a?(String) && ruby_code_string =~ /Puppet\:\:Functions\.create_function/
|
|
17
17
|
raise ArgumentError, "The code loaded from #{source_ref} does not seem to be a Puppet 4x API function - no create_function call."
|
|
18
18
|
end
|
|
19
|
-
|
|
19
|
+
# make the private loader available in a binding to allow it to be passed on
|
|
20
|
+
loader_for_function = loader.private_loader
|
|
21
|
+
here = get_binding(loader_for_function)
|
|
22
|
+
created = eval(ruby_code_string, here, source_ref, 1)
|
|
20
23
|
unless created.is_a?(Class)
|
|
21
24
|
raise ArgumentError, "The code loaded from #{source_ref} did not produce a Function class when evaluated. Got '#{created.class}'"
|
|
22
25
|
end
|
|
@@ -27,8 +30,18 @@ class Puppet::Pops::Loader::RubyFunctionInstantiator
|
|
|
27
30
|
# when calling functions etc.
|
|
28
31
|
# It should be bound to global scope
|
|
29
32
|
|
|
30
|
-
#
|
|
33
|
+
# Cheating wrt. scope - assuming it is found in the context (else an empty hash is used).
|
|
31
34
|
closure_scope = Puppet.lookup(:global_scope) { {} }
|
|
32
|
-
|
|
35
|
+
# If function definition used the loader from the binding to create a new loader, that loader wins
|
|
36
|
+
created.new(closure_scope, loader_for_function)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
# Produces a binding where the given loader is bound as a local variable (loader_injected_arg). This variable can be used in loaded
|
|
42
|
+
# ruby code - e.g. to call Puppet::Function.create_loaded_function(:name, loader,...)
|
|
43
|
+
#
|
|
44
|
+
def self.get_binding(loader_injected_arg)
|
|
45
|
+
binding
|
|
33
46
|
end
|
|
34
47
|
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# The TypeDefinitionInstantiator instantiates a type alias or a type definition
|
|
2
|
+
#
|
|
3
|
+
module Puppet::Pops
|
|
4
|
+
module Loader
|
|
5
|
+
class TypeDefinitionInstantiator
|
|
6
|
+
def self.create(loader, typed_name, source_ref, pp_code_string)
|
|
7
|
+
# parse and validate
|
|
8
|
+
parser = Parser::EvaluatingParser.new()
|
|
9
|
+
model = parser.parse_string(pp_code_string, source_ref).model
|
|
10
|
+
# Only one type is allowed (and no other definitions)
|
|
11
|
+
|
|
12
|
+
name = typed_name.name
|
|
13
|
+
case model.definitions.size
|
|
14
|
+
when 0
|
|
15
|
+
raise ArgumentError, "The code loaded from #{source_ref} does not define the type '#{name}' - it is empty."
|
|
16
|
+
when 1
|
|
17
|
+
# ok
|
|
18
|
+
else
|
|
19
|
+
raise ArgumentError,
|
|
20
|
+
"The code loaded from #{source_ref} must contain only the type '#{name}' - it has additional definitions."
|
|
21
|
+
end
|
|
22
|
+
type_definition = model.definitions[0]
|
|
23
|
+
|
|
24
|
+
unless type_definition.is_a?(Model::TypeAlias) || type_definition.is_a?(Model::TypeDefinition)
|
|
25
|
+
raise ArgumentError,
|
|
26
|
+
"The code loaded from #{source_ref} does not define the type '#{name}' - no type alias or type definition found."
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
actual_name = type_definition.name
|
|
30
|
+
unless name == actual_name.downcase
|
|
31
|
+
raise ArgumentError,
|
|
32
|
+
"The code loaded from #{source_ref} produced type with the wrong name, expected '#{name}', actual '#{actual_name}'"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
unless model.body == type_definition
|
|
36
|
+
raise ArgumentError,
|
|
37
|
+
"The code loaded from #{source_ref} contains additional logic - can only contain the type '#{name}'"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Adapt the type definition with loader - this is used from logic contained in its body to find the
|
|
41
|
+
# loader to use when resolving contained aliases API. Such logic have a hard time finding the closure (where
|
|
42
|
+
# the loader is known - hence this mechanism
|
|
43
|
+
private_loader = loader.private_loader
|
|
44
|
+
Adapters::LoaderAdapter.adapt(type_definition).loader = private_loader
|
|
45
|
+
|
|
46
|
+
Types::PTypeAliasType.new(name, type_definition.type_expr)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def self.create_from_model(type_definition, loader)
|
|
50
|
+
name = type_definition.name
|
|
51
|
+
[Loader::TypedName.new(:type, name.downcase), Types::PTypeAliasType.new(name, type_definition.type_expr)]
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
data/lib/puppet/pops/loaders.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
module Puppet::Pops
|
|
2
|
+
class Loaders
|
|
2
3
|
class LoaderError < Puppet::Error; end
|
|
3
4
|
|
|
4
5
|
attr_reader :static_loader
|
|
@@ -8,7 +9,7 @@ class Puppet::Pops::Loaders
|
|
|
8
9
|
|
|
9
10
|
def initialize(environment)
|
|
10
11
|
# The static loader can only be changed after a reboot
|
|
11
|
-
@@static_loader ||=
|
|
12
|
+
@@static_loader ||= Loader::StaticLoader.new()
|
|
12
13
|
|
|
13
14
|
# Create the set of loaders
|
|
14
15
|
# 1. Puppet, loads from the "running" puppet - i.e. bundled functions, types, extension points and extensions
|
|
@@ -35,6 +36,46 @@ class Puppet::Pops::Loaders
|
|
|
35
36
|
@puppet_system_loader = nil
|
|
36
37
|
end
|
|
37
38
|
|
|
39
|
+
# Finds the `Loaders` instance by looking up the :loaders in the global Puppet context and then uses it to
|
|
40
|
+
# find the appropriate loader for the given `module_name`, or for the environment in case `module_name`
|
|
41
|
+
# is `nil` or empty.
|
|
42
|
+
#
|
|
43
|
+
# @param module_name [String,nil] the name of the module
|
|
44
|
+
# @return [Loader::Loader] the found loader
|
|
45
|
+
# @raise [Puppet::ParseError] if no loader can be found
|
|
46
|
+
# @api private
|
|
47
|
+
def self.find_loader(module_name)
|
|
48
|
+
loaders = Puppet.lookup(:loaders) { nil }
|
|
49
|
+
raise Puppet::ParseError, "Internal Error: Puppet Context ':loaders' missing" if loaders.nil?
|
|
50
|
+
loaders.find_loader(module_name)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Finds the appropriate loader for the given `module_name`, or for the environment in case `module_name`
|
|
54
|
+
# is `nil` or empty.
|
|
55
|
+
#
|
|
56
|
+
# @param module_name [String,nil] the name of the module
|
|
57
|
+
# @return [Loader::Loader] the found loader
|
|
58
|
+
# @raise [Puppet::ParseError] if no loader can be found
|
|
59
|
+
# @api private
|
|
60
|
+
def find_loader(module_name)
|
|
61
|
+
if module_name.nil? || module_name == ''
|
|
62
|
+
# TODO : Later when fdefinition can be private, a decision is needed regarding what that means.
|
|
63
|
+
# A private environment loader could be used for logic outside of modules, then only that logic
|
|
64
|
+
# would see the definition.
|
|
65
|
+
#
|
|
66
|
+
# Use the private loader, this definition may see the environment's dependencies (currently, all modules)
|
|
67
|
+
loader = private_environment_loader()
|
|
68
|
+
raise Puppet::ParseError, 'Internal Error: did not find public loader' if loader.nil?
|
|
69
|
+
loader
|
|
70
|
+
else
|
|
71
|
+
# TODO : Later check if definition is private, and then add it to private_loader_for_module
|
|
72
|
+
#
|
|
73
|
+
loader = public_loader_for_module(module_name)
|
|
74
|
+
raise Puppet::ParseError, "Internal Error: did not find public loader for module: '#{module_name}'" if loader.nil?
|
|
75
|
+
loader
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
38
79
|
def static_loader
|
|
39
80
|
@@static_loader
|
|
40
81
|
end
|
|
@@ -66,7 +107,7 @@ class Puppet::Pops::Loaders
|
|
|
66
107
|
private
|
|
67
108
|
|
|
68
109
|
def create_puppet_system_loader()
|
|
69
|
-
|
|
110
|
+
Loader::ModuleLoaders.system_loader_from(static_loader, self)
|
|
70
111
|
end
|
|
71
112
|
|
|
72
113
|
def create_environment_loader(environment)
|
|
@@ -91,10 +132,10 @@ class Puppet::Pops::Loaders
|
|
|
91
132
|
env_conf = Puppet.lookup(:environments).get_conf(environment.name)
|
|
92
133
|
if env_conf.nil? || !env_conf.is_a?(Puppet::Settings::EnvironmentConf)
|
|
93
134
|
# Not a real directory environment, cannot work as a module TODO: Drop when legacy env are dropped?
|
|
94
|
-
loader =
|
|
135
|
+
loader = Loader::SimpleEnvironmentLoader.new(puppet_system_loader, loader_name)
|
|
95
136
|
else
|
|
96
137
|
# View the environment as a module to allow loading from it - this module is always called 'environment'
|
|
97
|
-
loader =
|
|
138
|
+
loader = Loader::ModuleLoaders.module_loader_from(puppet_system_loader, self, 'environment', env_conf.path_to_env)
|
|
98
139
|
end
|
|
99
140
|
|
|
100
141
|
# An environment has a module path even if it has a null loader
|
|
@@ -105,7 +146,7 @@ class Puppet::Pops::Loaders
|
|
|
105
146
|
# Code in the environment gets to see all modules (since there is no metadata for the environment)
|
|
106
147
|
# but since this is not given to the module loaders, they can not load global code (since they can not
|
|
107
148
|
# have prior knowledge about this
|
|
108
|
-
loader =
|
|
149
|
+
loader = Loader::DependencyLoader.new(loader, "environment", @module_resolver.all_module_loaders())
|
|
109
150
|
|
|
110
151
|
# The module loader gets the private loader via a lazy operation to look up the module's private loader.
|
|
111
152
|
# This does not work for an environment since it is not resolved the same way.
|
|
@@ -121,7 +162,7 @@ class Puppet::Pops::Loaders
|
|
|
121
162
|
# Create data about this module
|
|
122
163
|
md = LoaderModuleData.new(puppet_module)
|
|
123
164
|
mr[puppet_module.name] = md
|
|
124
|
-
md.public_loader =
|
|
165
|
+
md.public_loader = Loader::ModuleLoaders.module_loader_from(parent_loader, self, md.name, md.path)
|
|
125
166
|
end
|
|
126
167
|
# NOTE: Do not resolve all modules here - this is wasteful if only a subset of modules / functions are used
|
|
127
168
|
# The resolution is triggered by asking for a module's private loader, since this means there is interest
|
|
@@ -224,7 +265,7 @@ class Puppet::Pops::Loaders
|
|
|
224
265
|
def create_loader_with_all_modules_visible(from_module_data)
|
|
225
266
|
Puppet.debug{"ModuleLoader: module '#{from_module_data.name}' has unknown dependencies - it will have all other modules visible"}
|
|
226
267
|
|
|
227
|
-
|
|
268
|
+
Loader::DependencyLoader.new(from_module_data.public_loader, from_module_data.name, all_module_loaders())
|
|
228
269
|
end
|
|
229
270
|
|
|
230
271
|
def create_loader_with_only_dependencies_visible(from_module_data)
|
|
@@ -234,7 +275,8 @@ class Puppet::Pops::Loaders
|
|
|
234
275
|
" Use 'puppet module list --tree' to see information about modules")
|
|
235
276
|
end
|
|
236
277
|
dependency_loaders = from_module_data.dependency_names.collect { |name| @index[name].public_loader }
|
|
237
|
-
|
|
278
|
+
Loader::DependencyLoader.new(from_module_data.public_loader, from_module_data.name, dependency_loaders)
|
|
238
279
|
end
|
|
239
280
|
end
|
|
240
281
|
end
|
|
282
|
+
end
|
|
@@ -28,7 +28,8 @@ module Puppet::Pops::Lookup
|
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
class ExplainTreeNode < ExplainNode
|
|
31
|
-
attr_reader :parent, :event, :
|
|
31
|
+
attr_reader :parent, :event, :value
|
|
32
|
+
attr_accessor :key
|
|
32
33
|
|
|
33
34
|
def initialize(parent)
|
|
34
35
|
@parent = parent
|
|
@@ -133,6 +134,55 @@ module Puppet::Pops::Lookup
|
|
|
133
134
|
end
|
|
134
135
|
end
|
|
135
136
|
|
|
137
|
+
class ExplainTop < ExplainTreeNode
|
|
138
|
+
def initialize(parent, type, key)
|
|
139
|
+
super(parent)
|
|
140
|
+
@type = type
|
|
141
|
+
self.key = key
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def dump_on(io, indent, first_indent)
|
|
145
|
+
io << first_indent << 'Searching for "' << key << "\"\n"
|
|
146
|
+
indent = increase_indent(indent)
|
|
147
|
+
branches.each {|b| b.dump_on(io, indent, indent)}
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
class ExplainInvalidKey < ExplainTreeNode
|
|
152
|
+
def initialize(parent, key)
|
|
153
|
+
super(parent)
|
|
154
|
+
@key = key
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def dump_on(io, indent, first_indent)
|
|
158
|
+
io << first_indent << "Invalid key \"" << @key << "\"\n"
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def type
|
|
162
|
+
:invalid_key
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
class ExplainMergeSource < ExplainNode
|
|
167
|
+
attr_reader :merge_source
|
|
168
|
+
|
|
169
|
+
def initialize(merge_source)
|
|
170
|
+
@merge_source = merge_source
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def dump_on(io, indent, first_indent)
|
|
174
|
+
io << first_indent << 'Using merge options from "' << merge_source << "\" hash\n"
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def to_hash
|
|
178
|
+
{ :type => type, :merge_source => merge_source }
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def type
|
|
182
|
+
:merge_source
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
136
186
|
class ExplainInterpolate < ExplainTreeNode
|
|
137
187
|
def initialize(parent, expression)
|
|
138
188
|
super(parent)
|
|
@@ -163,6 +213,8 @@ module Puppet::Pops::Lookup
|
|
|
163
213
|
end
|
|
164
214
|
|
|
165
215
|
def dump_on(io, indent, first_indent)
|
|
216
|
+
return if branches.size == 0
|
|
217
|
+
|
|
166
218
|
# It's pointless to report a merge where there's only one branch
|
|
167
219
|
return branches[0].dump_on(io, indent, first_indent) if branches.size == 1
|
|
168
220
|
|
|
@@ -297,7 +349,7 @@ module Puppet::Pops::Lookup
|
|
|
297
349
|
def dump_on(io, indent, first_indent)
|
|
298
350
|
io << indent << 'Path "' << @path.path << "\"\n"
|
|
299
351
|
indent = increase_indent(indent)
|
|
300
|
-
io << indent << 'Original path: ' << @path.original_path << "\n"
|
|
352
|
+
io << indent << 'Original path: "' << @path.original_path << "\"\n"
|
|
301
353
|
branches.each {|b| b.dump_on(io, indent, indent)}
|
|
302
354
|
io << indent << "Path not found\n" if @event == :path_not_found
|
|
303
355
|
dump_outcome(io, indent)
|
|
@@ -332,8 +384,10 @@ module Puppet::Pops::Lookup
|
|
|
332
384
|
end
|
|
333
385
|
|
|
334
386
|
class Explainer < ExplainNode
|
|
335
|
-
def initialize
|
|
387
|
+
def initialize(explain_options = false, only_explain_options = false)
|
|
336
388
|
@current = self
|
|
389
|
+
@explain_options = explain_options
|
|
390
|
+
@only_explain_options = only_explain_options
|
|
337
391
|
end
|
|
338
392
|
|
|
339
393
|
def push(qualifier_type, qualifier)
|
|
@@ -352,6 +406,10 @@ module Puppet::Pops::Lookup
|
|
|
352
406
|
ExplainMerge.new(@current, qualifier)
|
|
353
407
|
when :scope
|
|
354
408
|
ExplainScope.new(@current)
|
|
409
|
+
when :meta, :data
|
|
410
|
+
ExplainTop.new(@current, qualifier_type, qualifier)
|
|
411
|
+
when :invalid_key
|
|
412
|
+
ExplainInvalidKey.new(@current, qualifier)
|
|
355
413
|
else
|
|
356
414
|
raise ArgumentError, "Unknown Explain type #{qualifier_type}"
|
|
357
415
|
end
|
|
@@ -359,6 +417,14 @@ module Puppet::Pops::Lookup
|
|
|
359
417
|
@current = node
|
|
360
418
|
end
|
|
361
419
|
|
|
420
|
+
def only_explain_options?
|
|
421
|
+
@only_explain_options
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
def explain_options?
|
|
425
|
+
@explain_options
|
|
426
|
+
end
|
|
427
|
+
|
|
362
428
|
def pop
|
|
363
429
|
@current = @current.parent unless @current.parent.nil?
|
|
364
430
|
end
|
|
@@ -375,6 +441,10 @@ module Puppet::Pops::Lookup
|
|
|
375
441
|
@current.found(key, value)
|
|
376
442
|
end
|
|
377
443
|
|
|
444
|
+
def accept_merge_source(merge_source)
|
|
445
|
+
@current.branches << ExplainMergeSource.new(merge_source)
|
|
446
|
+
end
|
|
447
|
+
|
|
378
448
|
def accept_not_found(key)
|
|
379
449
|
@current.not_found(key)
|
|
380
450
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
module Puppet::Pops::Lookup
|
|
2
2
|
class Invocation
|
|
3
|
-
attr_reader :scope, :override_values, :default_values, :explainer
|
|
3
|
+
attr_reader :scope, :override_values, :default_values, :explainer
|
|
4
|
+
attr_accessor :module_name, :top_key
|
|
4
5
|
|
|
5
6
|
# Creates a context object for a lookup invocation. The object contains the current scope, overrides, and default
|
|
6
7
|
# values and may optionally contain an {ExplanationAcceptor} instance that will receive book-keeping information
|
|
@@ -50,34 +51,31 @@ module Puppet::Pops::Lookup
|
|
|
50
51
|
# :merge - qualifier is a MergeStrategy instance
|
|
51
52
|
# :module - qualifier is the name of a module
|
|
52
53
|
# :interpolation - qualifier is the unresolved interpolation expression
|
|
53
|
-
# :meta - qualifier is the
|
|
54
|
+
# :meta - qualifier is the module name
|
|
55
|
+
# :data - qualifier is the key
|
|
54
56
|
#
|
|
55
57
|
# @param qualifier [Object] A branch, a provider, or a path
|
|
56
58
|
def with(qualifier_type, qualifier)
|
|
57
|
-
is_meta = qualifier_type == :meta
|
|
58
|
-
@module_name = qualifier if is_meta
|
|
59
59
|
if @explainer.nil?
|
|
60
60
|
yield
|
|
61
61
|
else
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
ensure
|
|
68
|
-
@explainer = save_explainer
|
|
69
|
-
end
|
|
70
|
-
else
|
|
71
|
-
@explainer.push(qualifier_type, qualifier)
|
|
72
|
-
begin
|
|
73
|
-
yield
|
|
74
|
-
ensure
|
|
75
|
-
@explainer.pop
|
|
76
|
-
end
|
|
62
|
+
@explainer.push(qualifier_type, qualifier)
|
|
63
|
+
begin
|
|
64
|
+
yield
|
|
65
|
+
ensure
|
|
66
|
+
@explainer.pop
|
|
77
67
|
end
|
|
78
68
|
end
|
|
79
69
|
end
|
|
80
70
|
|
|
71
|
+
def only_explain_options?
|
|
72
|
+
@explainer.nil? ? false : @explainer.only_explain_options?
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def explain_options?
|
|
76
|
+
@explainer.nil? ? false : @explainer.explain_options?
|
|
77
|
+
end
|
|
78
|
+
|
|
81
79
|
def report_found_in_overrides(key, value)
|
|
82
80
|
@explainer.accept_found_in_overrides(key, value) unless @explainer.nil?
|
|
83
81
|
value
|
|
@@ -93,6 +91,10 @@ module Puppet::Pops::Lookup
|
|
|
93
91
|
value
|
|
94
92
|
end
|
|
95
93
|
|
|
94
|
+
def report_merge_source(merge_source)
|
|
95
|
+
@explainer.accept_merge_source(merge_source) unless @explainer.nil?
|
|
96
|
+
end
|
|
97
|
+
|
|
96
98
|
# Report the result of a merge or fully resolved interpolated string
|
|
97
99
|
# @param value [Object] The result to report
|
|
98
100
|
# @return [Object] the given value
|
data/lib/puppet/pops/lookup.rb
CHANGED
|
@@ -1,32 +1,36 @@
|
|
|
1
1
|
# This class is the backing implementation of the Puppet function 'lookup'.
|
|
2
2
|
# See puppet/functions/lookup.rb for documentation.
|
|
3
3
|
#
|
|
4
|
-
module Puppet::Pops
|
|
4
|
+
module Puppet::Pops
|
|
5
|
+
module Lookup
|
|
6
|
+
LOOKUP_OPTIONS = 'lookup_options'.freeze
|
|
7
|
+
GLOBAL = '__global__'.freeze
|
|
8
|
+
|
|
5
9
|
# Performs a lookup in the configured scopes and optionally merges the default.
|
|
6
10
|
#
|
|
7
11
|
# This is a backing function and all parameters are assumed to have been type checked.
|
|
8
12
|
# See puppet/functions/lookup.rb for full documentation and all parameter combinations.
|
|
9
13
|
#
|
|
10
14
|
# @param name [String|Array<String>] The name or names to lookup
|
|
11
|
-
# @param type [
|
|
15
|
+
# @param type [Types::PAnyType|nil] The expected type of the found value
|
|
12
16
|
# @param default_value [Object] The value to use as default when no value is found
|
|
13
17
|
# @param has_default [Boolean] Set to _true_ if _default_value_ is included (_nil_ is a valid _default_value_)
|
|
14
|
-
# @param merge [
|
|
15
|
-
# @param lookup_invocation [
|
|
18
|
+
# @param merge [MergeStrategy,String,Hash<String,Object>,nil] Merge strategy or hash with strategy and options
|
|
19
|
+
# @param lookup_invocation [Invocation] Invocation data containing scope, overrides, and defaults
|
|
16
20
|
# @return [Object] The found value
|
|
17
21
|
#
|
|
18
22
|
def self.lookup(name, value_type, default_value, has_default, merge, lookup_invocation)
|
|
19
|
-
value_type =
|
|
23
|
+
value_type = Types::PDataType::DEFAULT if value_type.nil?
|
|
20
24
|
names = name.is_a?(Array) ? name : [name]
|
|
21
25
|
|
|
22
26
|
# find first name that yields a non-nil result and wrap it in a two element array
|
|
23
27
|
# with name and value.
|
|
24
|
-
not_found =
|
|
28
|
+
not_found = MergeStrategy::NOT_FOUND
|
|
25
29
|
override_values = lookup_invocation.override_values
|
|
26
30
|
result_with_name = names.reduce([nil, not_found]) do |memo, key|
|
|
27
|
-
value = override_values.include?(key) ? assert_type('override
|
|
31
|
+
value = override_values.include?(key) ? assert_type(["Value found for key '%s' in override hash", key], value_type, override_values[key]) : not_found
|
|
28
32
|
catch(:no_such_key) { value = search_and_merge(key, lookup_invocation, merge) } if value.equal?(not_found)
|
|
29
|
-
break [key, assert_type('
|
|
33
|
+
break [key, assert_type('Found value', value_type, value)] unless value.equal?(not_found)
|
|
30
34
|
memo
|
|
31
35
|
end
|
|
32
36
|
|
|
@@ -35,7 +39,7 @@ module Puppet::Pops::Lookup
|
|
|
35
39
|
default_values = lookup_invocation.default_values
|
|
36
40
|
unless default_values.empty?
|
|
37
41
|
result_with_name = names.reduce(result_with_name) do |memo, key|
|
|
38
|
-
value = default_values.include?(key) ? assert_type('
|
|
42
|
+
value = default_values.include?(key) ? assert_type(["Value found for key '%s' in default values hash", key], value_type, default_values[key]) : not_found
|
|
39
43
|
memo = [key, value]
|
|
40
44
|
break memo unless value.equal?(not_found)
|
|
41
45
|
memo
|
|
@@ -46,9 +50,9 @@ module Puppet::Pops::Lookup
|
|
|
46
50
|
answer = result_with_name[1]
|
|
47
51
|
if answer.equal?(not_found)
|
|
48
52
|
if block_given?
|
|
49
|
-
answer = assert_type('
|
|
53
|
+
answer = assert_type('Value returned from default block', value_type, yield(name))
|
|
50
54
|
elsif has_default
|
|
51
|
-
answer = assert_type('
|
|
55
|
+
answer = assert_type('Default value', value_type, default_value)
|
|
52
56
|
else
|
|
53
57
|
fail_lookup(names)
|
|
54
58
|
end
|
|
@@ -62,7 +66,7 @@ module Puppet::Pops::Lookup
|
|
|
62
66
|
end
|
|
63
67
|
|
|
64
68
|
def self.assert_type(subject, type, value)
|
|
65
|
-
|
|
69
|
+
Types::TypeAsserter.assert_instance_of(subject, type, value)
|
|
66
70
|
end
|
|
67
71
|
private_class_method :assert_type
|
|
68
72
|
|
|
@@ -72,3 +76,4 @@ module Puppet::Pops::Lookup
|
|
|
72
76
|
end
|
|
73
77
|
private_class_method :fail_lookup
|
|
74
78
|
end
|
|
79
|
+
end
|