puppet 4.3.2-x64-mingw32 → 4.4.0-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/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/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/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 +4 -4
- 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/yaml_data_provider_factory.rb +2 -2
- data/lib/puppet/defaults.rb +65 -19
- 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.rb +2 -2
- 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/forge.rb +1 -1
- data/lib/puppet/forge/repository.rb +1 -31
- data/lib/puppet/functions.rb +45 -6
- 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/map.rb +6 -14
- 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/graph/rb_tree_map.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +188 -5
- 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/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 +3 -0
- 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.rb +1 -1
- data/lib/puppet/node/environment.rb +11 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
- data/lib/puppet/parser/compiler.rb +3 -3
- data/lib/puppet/parser/environment_compiler.rb +0 -1
- data/lib/puppet/parser/functions.rb +28 -16
- 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/map.rb +1 -1
- 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/resource.rb +19 -17
- data/lib/puppet/parser/scope.rb +176 -5
- data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
- data/lib/puppet/pops.rb +0 -8
- data/lib/puppet/pops/adaptable.rb +4 -1
- data/lib/puppet/pops/adapters.rb +38 -13
- 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 +95 -93
- data/lib/puppet/pops/evaluator/closure.rb +84 -68
- data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -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 +41 -45
- data/lib/puppet/pops/issue_reporter.rb +6 -4
- data/lib/puppet/pops/issues.rb +34 -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 +16 -12
- 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.rb +14 -12
- data/lib/puppet/pops/merge_strategy.rb +16 -19
- data/lib/puppet/pops/model/factory.rb +26 -2
- data/lib/puppet/pops/model/model.rb +8 -8
- data/lib/puppet/pops/model/model_label_provider.rb +13 -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 +14 -10
- data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
- data/lib/puppet/pops/parser/lexer2.rb +26 -19
- 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 +11 -7
- 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 +138 -381
- 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 -1247
- data/lib/puppet/pops/utils.rb +11 -10
- data/lib/puppet/pops/validation.rb +11 -9
- data/lib/puppet/pops/validation/checker4_0.rb +83 -55
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
- 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/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 +5 -8
- 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/windows.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/package/zypper.rb +19 -0
- data/lib/puppet/provider/service/debian.rb +2 -2
- data/lib/puppet/provider/service/launchd.rb +6 -18
- 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/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.rb +15 -12
- 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 +28 -38
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/settings/config_file.rb +1 -1
- data/lib/puppet/settings/environment_conf.rb +13 -5
- 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.rb +15 -2
- data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
- data/lib/puppet/transaction/report.rb +31 -1
- data/lib/puppet/transaction/resource_harness.rb +0 -25
- data/lib/puppet/type.rb +11 -11
- data/lib/puppet/type/augeas.rb +1 -1
- data/lib/puppet/type/cron.rb +12 -12
- data/lib/puppet/type/file.rb +91 -39
- 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/filebucket.rb +1 -1
- 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/util.rb +109 -22
- 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 +4 -4
- 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 +23 -14
- data/lib/puppet/util/windows/process.rb +78 -11
- data/lib/puppet/util/windows/registry.rb +1 -1
- 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 +42 -4
- data/lib/puppet/util/windows/taskscheduler.rb +15 -15
- data/lib/puppet/util/windows/user.rb +10 -10
- 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/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/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/manifests/init.pp +3 -1
- 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/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/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 +90 -4
- data/spec/integration/util/windows/process_spec.rb +31 -0
- data/spec/integration/util/windows/security_spec.rb +6 -6
- 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/configurer/downloader_spec.rb +5 -5
- data/spec/unit/configurer_spec.rb +271 -39
- 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/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 +11 -3
- data/spec/unit/functions/lookup_spec.rb +58 -13
- 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 +61 -5
- 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/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 +1 -1
- data/spec/unit/parser/compiler_spec.rb +16 -0
- data/spec/unit/parser/scope_spec.rb +28 -11
- data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
- data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
- 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 +44 -1
- data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
- data/spec/unit/pops/parser/parse_calls_spec.rb +8 -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 -373
- 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 +100 -43
- data/spec/unit/provider/cron/parsed_spec.rb +1 -0
- 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 +47 -34
- 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/yum_spec.rb +11 -0
- data/spec/unit/provider/package/zypper_spec.rb +14 -0
- data/spec/unit/provider/service/launchd_spec.rb +17 -35
- data/spec/unit/provider/service/systemd_spec.rb +7 -0
- data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
- data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
- 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 +96 -57
- 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 +4 -4
- 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 +1 -1
- data/spec/unit/util_spec.rb +123 -13
- data/tasks/cfpropertylist.rake +15 -0
- metadata +114 -26
- 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.rb +0 -22
- 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/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
@@ -0,0 +1,82 @@
|
|
1
|
+
# Reverses the order of the elements of something that is iterable and optionally runs a
|
2
|
+
# [lambda](http://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html) for each
|
3
|
+
# element.
|
4
|
+
#
|
5
|
+
# This function takes one to two arguments.
|
6
|
+
#
|
7
|
+
# 1. An `Iterable` that the function will iterate over.
|
8
|
+
# 2. An optional lambda, which the function calls for each element in the first argument. It must
|
9
|
+
# request one parameter.
|
10
|
+
#
|
11
|
+
# @example Using the `reverse_each` function
|
12
|
+
#
|
13
|
+
# `$data.reverse_each |$parameter| { <PUPPET CODE BLOCK> }`
|
14
|
+
#
|
15
|
+
# or
|
16
|
+
#
|
17
|
+
# `$reverse_data = $data.reverse_each`
|
18
|
+
#
|
19
|
+
# or
|
20
|
+
#
|
21
|
+
# `reverse_each($data) |$parameter| { <PUPPET CODE BLOCK> }`
|
22
|
+
#
|
23
|
+
# or
|
24
|
+
#
|
25
|
+
# `$reverse_data = reverse_each($data)`
|
26
|
+
#
|
27
|
+
# When no second argument is present, Puppet returns an `Iterable` that represents the reverse
|
28
|
+
# order of its first argument. This allows methods on `Iterable` to be chained.
|
29
|
+
#
|
30
|
+
# When a lamdba is given as the second argument, Puppet iterates the first argument in reverse
|
31
|
+
# order and passes each value in turn to the lambda, then returns `undef`.
|
32
|
+
#
|
33
|
+
# @example Using the `reverse_each` function with an array and a one-parameter lambda
|
34
|
+
#
|
35
|
+
# ~~~ puppet
|
36
|
+
# # Puppet will log a notice for each of the three items in $data in reverse order.
|
37
|
+
# $data = [1,2,3]
|
38
|
+
# $data.reverse_each |$item| { notice($item) }
|
39
|
+
#
|
40
|
+
# ~~~
|
41
|
+
#
|
42
|
+
# When no second argument is present, Puppet returns a new `Iterable` which allows it to
|
43
|
+
# be directly chained into another function that takes an `Iterable` as an argument.
|
44
|
+
#
|
45
|
+
# @example Using the `reverse_each` function chained with a `map` function.
|
46
|
+
#
|
47
|
+
# # For the array $data, return an array containing each value multiplied by 10 in reverse order
|
48
|
+
# $data = [1,2,3]
|
49
|
+
# $transformed_data = $data.reverse_each.map |$item| { $item * 10 }
|
50
|
+
# # $transformed_data is set to [30,20,10]
|
51
|
+
# ~~~
|
52
|
+
#
|
53
|
+
# @example The same example using `reverse_each` function chained with a `map` in alternative syntax
|
54
|
+
#
|
55
|
+
# # For the array $data, return an array containing each value multiplied by 10 in reverse order
|
56
|
+
# $data = [1,2,3]
|
57
|
+
# $transformed_data = map(reverse_each($data)) |$item| { $item * 10 }
|
58
|
+
# # $transformed_data is set to [30,20,10]
|
59
|
+
# ~~~
|
60
|
+
#
|
61
|
+
# @since 4.4.0
|
62
|
+
#
|
63
|
+
Puppet::Functions.create_function(:reverse_each) do
|
64
|
+
dispatch :reverse_each do
|
65
|
+
param 'Iterable', :iterable
|
66
|
+
end
|
67
|
+
|
68
|
+
dispatch :reverse_each_block do
|
69
|
+
param 'Iterable', :iterable
|
70
|
+
block_param 'Callable[1,1]', :block
|
71
|
+
end
|
72
|
+
|
73
|
+
def reverse_each(iterable)
|
74
|
+
# produces an Iterable
|
75
|
+
Puppet::Pops::Types::Iterable.asserted_iterable(self, iterable).reverse_each
|
76
|
+
end
|
77
|
+
|
78
|
+
def reverse_each_block(iterable, &block)
|
79
|
+
Puppet::Pops::Types::Iterable.asserted_iterable(self, iterable).reverse_each(&block)
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
end
|
@@ -1,23 +1,16 @@
|
|
1
|
-
# Scans a string and returns an array of one or more converted values
|
2
|
-
# See the documenation of Ruby's String
|
3
|
-
# are similar but not identical to the formats used in Puppet's `sprintf` function.
|
4
|
-
#
|
5
|
-
# This function takes two mandatory arguments: the first is the
|
6
|
-
# the format
|
7
|
-
#
|
8
|
-
# the
|
9
|
-
#
|
10
|
-
# The result of the scan is an Array, with each sucessfully scanned and transformed value.args The scanning
|
11
|
-
# stops if a scan is unsuccesful and the scanned result up to that point is returned. If there was no
|
12
|
-
# succesful scan at all, the result is an empty Array. The optional code block is typically used to
|
13
|
-
# assert that the scan was succesful, and either produce the same input, or perform unwrapping of
|
14
|
-
# the result
|
15
|
-
#
|
16
|
-
# @example scanning an integer in string form (result is an array with
|
17
|
-
# integer, or empty if unsuccessful)
|
1
|
+
# Scans a string and returns an array of one or more converted values based on the given format string.
|
2
|
+
# See the documenation of Ruby's String#scanf method for details about the supported formats (which
|
3
|
+
# are similar but not identical to the formats used in Puppet's `sprintf` function.)
|
4
|
+
#
|
5
|
+
# This function takes two mandatory arguments: the first is the string to convert, and the second is
|
6
|
+
# the format string. The result of the scan is an array, with each sucessfully scanned and transformed value.
|
7
|
+
# The scanning stops if a scan is unsuccesful, and the scanned result up to that point is returned. If there
|
8
|
+
# was no succesful scan, the result is an empty array.
|
9
|
+
#
|
18
10
|
# "42".scanf("%i")
|
19
11
|
#
|
20
|
-
#
|
12
|
+
# You can also optionally pass a lambda to scanf, to do additional validation or processing.
|
13
|
+
#
|
21
14
|
#
|
22
15
|
# "42".scanf("%i") |$x| {
|
23
16
|
# unless $x[0] =~ Integer {
|
@@ -26,6 +19,10 @@
|
|
26
19
|
# $x[0]
|
27
20
|
# }
|
28
21
|
#
|
22
|
+
#
|
23
|
+
#
|
24
|
+
#
|
25
|
+
#
|
29
26
|
# @since 4.0.0
|
30
27
|
#
|
31
28
|
Puppet::Functions.create_function(:scanf) do
|
@@ -1,51 +1,45 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
|
-
# the slices.
|
1
|
+
# This function takes two mandatory arguments: the first should be an array or hash, and the second specifies
|
2
|
+
# the number of elements to include in each slice.
|
4
3
|
#
|
5
|
-
#
|
6
|
-
# enumerable type (integer, Integer range, or String), and the second, `$n`, the number of elements to include
|
7
|
-
# in each slice. The optional third argument should be a a parameterized block as produced by the puppet syntax:
|
8
|
-
#
|
9
|
-
# $a.slice($n) |$x| { ... }
|
10
|
-
# slice($a) |$x| { ... }
|
11
|
-
#
|
12
|
-
# The parameterized block should have either one parameter (receiving an array with the slice), or the same number
|
13
|
-
# of parameters as specified by the slice size (each parameter receiving its part of the slice).
|
14
|
-
# In case there are fewer remaining elements than the slice size for the last slice it will contain the remaining
|
15
|
-
# elements. When the block has multiple parameters, excess parameters are set to undef for an array or
|
16
|
-
# enumerable type, and to empty arrays for a Hash.
|
17
|
-
#
|
18
|
-
# $a.slice(2) |$first, $second| { ... }
|
19
|
-
#
|
20
|
-
# When the first argument is a Hash, each `key,value` entry is counted as one, e.g, a slice size of 2 will produce
|
4
|
+
# When the first argument is a hash, each key value pair is counted as one. For example, a slice size of 2 will produce
|
21
5
|
# an array of two arrays with key, and value.
|
22
6
|
#
|
23
|
-
# @example Using slice with Hash
|
24
|
-
#
|
25
7
|
# $a.slice(2) |$entry| { notice "first ${$entry[0]}, second ${$entry[1]}" }
|
26
8
|
# $a.slice(2) |$first, $second| { notice "first ${first}, second ${second}" }
|
27
9
|
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
# @example Using slice without a block
|
10
|
+
# The function produces a concatenated result of the slices.
|
31
11
|
#
|
32
12
|
# slice([1,2,3,4,5,6], 2) # produces [[1,2], [3,4], [5,6]]
|
33
13
|
# slice(Integer[1,6], 2) # produces [[1,2], [3,4], [5,6]]
|
34
14
|
# slice(4,2) # produces [[0,1], [2,3]]
|
35
15
|
# slice('hello',2) # produces [[h, e], [l, l], [o]]
|
36
16
|
#
|
17
|
+
#
|
18
|
+
# You can also optionally pass a lambda to slice.
|
19
|
+
#
|
20
|
+
# $a.slice($n) |$x| { ... }
|
21
|
+
# slice($a) |$x| { ... }
|
22
|
+
#
|
23
|
+
# The lambda should have either one parameter (receiving an array with the slice), or the same number
|
24
|
+
# of parameters as specified by the slice size (each parameter receiving its part of the slice).
|
25
|
+
# If there are fewer remaining elements than the slice size for the last slice, it will contain the remaining
|
26
|
+
# elements. If the lambda has multiple parameters, excess parameters are set to undef for an array, or
|
27
|
+
# to empty arrays for a hash.
|
28
|
+
#
|
29
|
+
# $a.slice(2) |$first, $second| { ... }
|
30
|
+
#
|
37
31
|
# @since 4.0.0
|
38
32
|
#
|
39
33
|
Puppet::Functions.create_function(:slice) do
|
40
34
|
dispatch :slice_Hash do
|
41
35
|
param 'Hash[Any, Any]', :hash
|
42
|
-
param 'Integer[1, default]', :
|
36
|
+
param 'Integer[1, default]', :slice_size
|
43
37
|
optional_block_param
|
44
38
|
end
|
45
39
|
|
46
40
|
dispatch :slice_Enumerable do
|
47
|
-
param '
|
48
|
-
param 'Integer[1, default]', :
|
41
|
+
param 'Iterable', :enumerable
|
42
|
+
param 'Integer[1, default]', :slice_size
|
49
43
|
optional_block_param
|
50
44
|
end
|
51
45
|
|
@@ -55,7 +49,7 @@ Puppet::Functions.create_function(:slice) do
|
|
55
49
|
end
|
56
50
|
|
57
51
|
def slice_Enumerable(enumerable, slice_size, &pblock)
|
58
|
-
enum =
|
52
|
+
enum = Puppet::Pops::Types::Iterable.asserted_iterable(self, enumerable)
|
59
53
|
result = slice_Common(enum, slice_size, nil, block_given? ? pblock : nil)
|
60
54
|
block_given? ? enumerable : result
|
61
55
|
end
|
@@ -114,12 +108,4 @@ Puppet::Functions.create_function(:slice) do
|
|
114
108
|
end
|
115
109
|
serving_size
|
116
110
|
end
|
117
|
-
|
118
|
-
def asserted_enumerable(obj)
|
119
|
-
unless enum = Puppet::Pops::Types::Enumeration.enumerator(obj)
|
120
|
-
raise ArgumentError, ("#{self.class.name}(): wrong argument type (#{obj.class}; must be something enumerable.")
|
121
|
-
end
|
122
|
-
enum
|
123
|
-
end
|
124
|
-
|
125
111
|
end
|
@@ -6,7 +6,7 @@
|
|
6
6
|
# $string = 'v1.v2:v3.v4'
|
7
7
|
# $array_var1 = split($string, /:/)
|
8
8
|
# $array_var2 = split($string, '[.]')
|
9
|
-
# $array_var3 = split($string, Regexp
|
9
|
+
# $array_var3 = split($string, Regexp['[.:]'])
|
10
10
|
#
|
11
11
|
# `$array_var1` now holds the result `['v1.v2', 'v3.v4']`,
|
12
12
|
# while `$array_var2` holds `['v1', 'v2:v3', 'v4']`, and
|
@@ -15,7 +15,7 @@
|
|
15
15
|
# Note that in the second example, we split on a literal string that contains
|
16
16
|
# a regexp meta-character (.), which must be escaped. A simple
|
17
17
|
# way to do that for a single character is to enclose it in square
|
18
|
-
# brackets; a backslash will also escape a single character.
|
18
|
+
# brackets; a backslash will also escape a single character.
|
19
19
|
#
|
20
20
|
Puppet::Functions.create_function(:split) do
|
21
21
|
dispatch :split_String do
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# Provides stepping with given interval over elements in an iterable and optionally runs a
|
2
|
+
# [lambda](http://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html) for each
|
3
|
+
# element.
|
4
|
+
#
|
5
|
+
# This function takes two to three arguments.
|
6
|
+
#
|
7
|
+
# 1. An 'Iterable' that the function will iterate over.
|
8
|
+
# 2. An `Integer` step factor. This must be a positive integer.
|
9
|
+
# 3. An optional lambda, which the function calls for each element in the interval. It must
|
10
|
+
# request one parameter.
|
11
|
+
#
|
12
|
+
# @example Using the `step` function
|
13
|
+
#
|
14
|
+
# `$data.step(<n>) |$parameter| { <PUPPET CODE BLOCK> }`
|
15
|
+
#
|
16
|
+
# or
|
17
|
+
#
|
18
|
+
# `$stepped_data = $data.step(<n>)`
|
19
|
+
#
|
20
|
+
# or
|
21
|
+
#
|
22
|
+
# `step($data, <n>) |$parameter| { <PUPPET CODE BLOCK> }`
|
23
|
+
#
|
24
|
+
# or
|
25
|
+
#
|
26
|
+
# `$stepped_data = step($data, <n>)`
|
27
|
+
#
|
28
|
+
# When no block is given, Puppet returns an `Iterable` that yields the first element and every nth successor
|
29
|
+
# element, from its first argument. This allows functions on iterables to be chained.
|
30
|
+
#
|
31
|
+
# When a block is given, Puppet iterates and calls the block with the first element and then with
|
32
|
+
# every nth successor element. It then returns `undef`.
|
33
|
+
#
|
34
|
+
# @example Using the `step` function with an array, a step factor, and a one-parameter block
|
35
|
+
#
|
36
|
+
# ~~~ puppet
|
37
|
+
# # For the array $data, call a block with the first element and then with each 3rd successor element
|
38
|
+
# $data = [1,2,3,4,5,6,7,8]
|
39
|
+
# $data.step(3) |$item| {
|
40
|
+
# notice($item)
|
41
|
+
# }
|
42
|
+
# # Puppet notices the values '1', '4', '7'.
|
43
|
+
# ~~~
|
44
|
+
#
|
45
|
+
# When no block is given, Puppet returns a new `Iterable` which allows it to be directly chained into
|
46
|
+
# another function that takes an `Iterable` as an argument.
|
47
|
+
#
|
48
|
+
# @example Using the `step` function chained with a `map` function.
|
49
|
+
#
|
50
|
+
# # For the array $data, return an array, set to the first element and each 5th successor element, in reverse
|
51
|
+
# # order multiplied by 10
|
52
|
+
# $data = Integer[0,20]
|
53
|
+
# $transformed_data = $data.step(5).map |$item| { $item * 10 }
|
54
|
+
# # $transformed_data contains [0,50,100,150,200]
|
55
|
+
# ~~~
|
56
|
+
#
|
57
|
+
# @example The same example using `step` function chained with a `map` in alternative syntax
|
58
|
+
#
|
59
|
+
# # For the array $data, return an array, set to the first and each 5th successor, in reverse order, multiplied by 10
|
60
|
+
# $data = Integer[0,20]
|
61
|
+
# $transformed_data = map(step($data, 5)) |$item| { $item * 10 }
|
62
|
+
# # $transformed_data contains [0,50,100,150,200]
|
63
|
+
# ~~~
|
64
|
+
#
|
65
|
+
# @since 4.4.0
|
66
|
+
#
|
67
|
+
Puppet::Functions.create_function(:step) do
|
68
|
+
dispatch :step do
|
69
|
+
param 'Iterable', :iterable
|
70
|
+
param 'Integer[1]', :step
|
71
|
+
end
|
72
|
+
|
73
|
+
dispatch :step_block do
|
74
|
+
param 'Iterable', :iterable
|
75
|
+
param 'Integer[1]', :step
|
76
|
+
block_param 'Callable[1,1]', :block
|
77
|
+
end
|
78
|
+
|
79
|
+
def step(iterable, step)
|
80
|
+
# produces an Iterable
|
81
|
+
Puppet::Pops::Types::Iterable.asserted_iterable(self, iterable).step(step)
|
82
|
+
end
|
83
|
+
|
84
|
+
def step_block(iterable, step, &block)
|
85
|
+
Puppet::Pops::Types::Iterable.asserted_iterable(self, iterable).step(step, &block)
|
86
|
+
nil
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# Returns the data type of a given value with a given degree of generality.
|
2
|
+
#
|
3
|
+
# @example Using `type()`
|
4
|
+
#
|
5
|
+
# ~~~ puppet
|
6
|
+
# notice type(42) =~ Type[Integer]
|
7
|
+
# ~~~
|
8
|
+
#
|
9
|
+
# Would notice true
|
10
|
+
#
|
11
|
+
# By default, the best possible inference is made where all details are retained.
|
12
|
+
# This is good when the type is used for futher type calculations but is overwhelmingly
|
13
|
+
# rich i information if it is used in a error message.
|
14
|
+
#
|
15
|
+
# The optional argument `inference_method` may be given as (from lowest to highest fidelity):
|
16
|
+
#
|
17
|
+
# * ´generalized` - reduces to common type and drops size constraints
|
18
|
+
# * `reduced` - reduces to common type in collections
|
19
|
+
# * `detailed` - (defaut) all details about inferred types is retained
|
20
|
+
#
|
21
|
+
# @example Using `type()` with different qualities:
|
22
|
+
#
|
23
|
+
# ~~~ puppet
|
24
|
+
# notice type([3.14, 42], generalized)
|
25
|
+
# notice type([3.14, 42], reduced)
|
26
|
+
# notice type([3.14, 42], detailed)
|
27
|
+
# notice type([3.14, 42])
|
28
|
+
# ~~~
|
29
|
+
#
|
30
|
+
# Would notice the four values:
|
31
|
+
#
|
32
|
+
# 1. 'Array[Numeric]'
|
33
|
+
# 2. 'Array[Numeric, 2, 2]'
|
34
|
+
# 3. 'Tuple[Float[3.14], Integer[42,42]]]'
|
35
|
+
# 4. 'Tuple[Float[3.14], Integer[42,42]]]'
|
36
|
+
#
|
37
|
+
# @param value [Any] - the value for which data type is returned
|
38
|
+
# @param inference_type[Enum[generalized, reduced, detailed]] inference_type
|
39
|
+
# @returns [Type] - the inferred type
|
40
|
+
#
|
41
|
+
# @since 4.4.0
|
42
|
+
#
|
43
|
+
Puppet::Functions.create_function(:type) do
|
44
|
+
dispatch :type_detailed do
|
45
|
+
param 'Any', :value
|
46
|
+
optional_param 'Enum[detailed]', :inference_method
|
47
|
+
end
|
48
|
+
|
49
|
+
dispatch :type_parameterized do
|
50
|
+
param 'Any', :value
|
51
|
+
param 'Enum[reduced]', :inference_method
|
52
|
+
end
|
53
|
+
|
54
|
+
dispatch :type_generalized do
|
55
|
+
param 'Any', :value
|
56
|
+
param 'Enum[generalized]', :inference_method
|
57
|
+
end
|
58
|
+
|
59
|
+
def type_detailed(value, _ = nil)
|
60
|
+
Puppet::Pops::Types::TypeCalculator.infer_set(value)
|
61
|
+
end
|
62
|
+
|
63
|
+
def type_parameterized(value, _)
|
64
|
+
Puppet::Pops::Types::TypeCalculator.infer(value)
|
65
|
+
end
|
66
|
+
|
67
|
+
def type_generalized(value, _)
|
68
|
+
Puppet::Pops::Types::TypeCalculator.infer(value).generalize
|
69
|
+
end
|
70
|
+
end
|
@@ -26,7 +26,7 @@
|
|
26
26
|
# iterated over in order. This is useful for many datasets.
|
27
27
|
#
|
28
28
|
# The implementation is adapted from Robert Sedgewick's Left Leaning Red-Black Tree implementation,
|
29
|
-
# which can be found at
|
29
|
+
# which can be found at https://www.cs.princeton.edu/~rs/talks/LLRB/Java/RedBlackBST.java
|
30
30
|
#
|
31
31
|
# Most methods have O(log n) complexity.
|
32
32
|
|
@@ -2,12 +2,15 @@ require 'puppet/node'
|
|
2
2
|
require 'puppet/resource/catalog'
|
3
3
|
require 'puppet/indirector/code'
|
4
4
|
require 'puppet/util/profiler'
|
5
|
+
require 'puppet/util/checksums'
|
5
6
|
require 'yaml'
|
7
|
+
require 'uri'
|
6
8
|
|
7
9
|
class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
|
8
10
|
desc "Compiles catalogs on demand using Puppet's compiler."
|
9
11
|
|
10
12
|
include Puppet::Util
|
13
|
+
include Puppet::Util::Checksums
|
11
14
|
|
12
15
|
attr_accessor :code
|
13
16
|
|
@@ -47,7 +50,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
|
|
47
50
|
node = node_from_request(request)
|
48
51
|
node.trusted_data = Puppet.lookup(:trusted_information) { Puppet::Context::TrustedInformation.local(node) }.to_h
|
49
52
|
|
50
|
-
if catalog = compile(node, request.options
|
53
|
+
if catalog = compile(node, request.options)
|
51
54
|
return catalog
|
52
55
|
else
|
53
56
|
# This shouldn't actually happen; we should either return
|
@@ -81,23 +84,203 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
|
|
81
84
|
node.add_server_facts(@server_facts)
|
82
85
|
end
|
83
86
|
|
87
|
+
# Determine which checksum to use; if agent_checksum_type is not nil,
|
88
|
+
# use the first entry in it that is also in known_checksum_types.
|
89
|
+
# If no match is found, return nil.
|
90
|
+
def common_checksum_type(agent_checksum_type)
|
91
|
+
if agent_checksum_type
|
92
|
+
agent_checksum_types = agent_checksum_type.split('.').map {|type| type.to_sym}
|
93
|
+
checksum_type = agent_checksum_types.drop_while do |type|
|
94
|
+
not known_checksum_types.include? type
|
95
|
+
end.first
|
96
|
+
end
|
97
|
+
checksum_type
|
98
|
+
end
|
99
|
+
|
100
|
+
def get_content_uri(metadata, source, environment_path)
|
101
|
+
# The static file content server doesn't know how to expand mountpoints, so
|
102
|
+
# we need to do that ourselves from the actual system path of the source file.
|
103
|
+
# This does that, while preserving any user-specified server or port.
|
104
|
+
source_path = Pathname.new(metadata.full_path)
|
105
|
+
path = source_path.relative_path_from(environment_path).to_s
|
106
|
+
source_as_uri = URI.parse(URI.escape(source))
|
107
|
+
server = source_as_uri.host
|
108
|
+
port = ":#{source_as_uri.port}" if source_as_uri.port
|
109
|
+
return "puppet://#{server}#{port}/#{path}"
|
110
|
+
end
|
111
|
+
|
112
|
+
# Helper method to decide if a file resource's metadata can be inlined.
|
113
|
+
# Also used to profile/log reasons for not inlining.
|
114
|
+
def inlineable?(resource, sources)
|
115
|
+
case
|
116
|
+
when resource[:ensure] == 'absent'
|
117
|
+
return Puppet::Util::Profiler.profile("Not inlining absent resource", [:compiler, :static_compile_inlining, :skipped_file_metadata, :absent]) { false }
|
118
|
+
when sources.empty?
|
119
|
+
return Puppet::Util::Profiler.profile("Not inlining resource without sources", [:compiler, :static_compile_inlining, :skipped_file_metadata, :no_sources]) { false }
|
120
|
+
when (not (sources.all? {|source| source =~ /^puppet:/}))
|
121
|
+
return Puppet::Util::Profiler.profile("Not inlining unsupported source scheme", [:compiler, :static_compile_inlining, :skipped_file_metadata, :unsupported_scheme]) { false }
|
122
|
+
else
|
123
|
+
return true
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Return true if metadata is inlineable, meaning the request's source is
|
128
|
+
# for the 'modules' mount and the resolved path is of the form:
|
129
|
+
# $codedir/environments/$environment/*/*/files/**
|
130
|
+
def inlineable_metadata?(metadata, source, environment_path)
|
131
|
+
source_as_uri = URI.parse(URI.escape(source))
|
132
|
+
location = Puppet::Module::FILETYPES['files']
|
133
|
+
|
134
|
+
!!(source_as_uri.path =~ /^\/modules\// &&
|
135
|
+
metadata.full_path =~ /#{environment_path}[^\/]+\/[^\/]+\/#{location}\/.+/)
|
136
|
+
end
|
137
|
+
|
138
|
+
# Helper method to log file resources that could not be inlined because they
|
139
|
+
# fall outside of an environment.
|
140
|
+
def log_file_outside_environment
|
141
|
+
Puppet::Util::Profiler.profile("Not inlining file outside environment", [:compiler, :static_compile_inlining, :skipped_file_metadata, :file_outside_environment]) { true }
|
142
|
+
end
|
143
|
+
|
144
|
+
# Helper method to log file resources that were successfully inlined.
|
145
|
+
def log_metadata_inlining
|
146
|
+
Puppet::Util::Profiler.profile("Inlining file metadata", [:compiler, :static_compile_inlining, :inlined_file_metadata]) { true }
|
147
|
+
end
|
148
|
+
|
149
|
+
# Inline file metadata for static catalogs
|
150
|
+
# Initially restricted to files sourced from codedir via puppet:/// uri.
|
151
|
+
def inline_metadata(catalog, checksum_type)
|
152
|
+
environment_path = Pathname.new File.join(Puppet[:environmentpath], catalog.environment, "")
|
153
|
+
list_of_resources = catalog.resources.find_all { |res| res.type == "File" }
|
154
|
+
|
155
|
+
# TODO: get property/parameter defaults if entries are nil in the resource
|
156
|
+
# For now they're hard-coded to match the File type.
|
157
|
+
|
158
|
+
file_metadata = {}
|
159
|
+
list_of_resources.each do |resource|
|
160
|
+
sources = [resource[:source]].flatten.compact
|
161
|
+
next unless inlineable?(resource, sources)
|
162
|
+
|
163
|
+
# both need to handle multiple sources
|
164
|
+
if resource[:recurse] == true || resource[:recurse] == 'true' || resource[:recurse] == 'remote'
|
165
|
+
# Construct a hash mapping sources to arrays (list of files found recursively) of metadata
|
166
|
+
options = {
|
167
|
+
:environment => catalog.environment_instance,
|
168
|
+
:links => resource[:links] ? resource[:links].to_sym : :manage,
|
169
|
+
:checksum_type => resource[:checksum] ? resource[:checksum].to_sym : checksum_type.to_sym,
|
170
|
+
:source_permissions => resource[:source_permissions] ? resource[:source_permissions].to_sym : :ignore,
|
171
|
+
:recurse => true,
|
172
|
+
:recurselimit => resource[:recurselimit],
|
173
|
+
:ignore => resource[:ignore],
|
174
|
+
}
|
175
|
+
|
176
|
+
sources_in_environment = true
|
177
|
+
|
178
|
+
source_to_metadatas = {}
|
179
|
+
sources.each do |source|
|
180
|
+
source = Puppet::Type.type(:file).attrclass(:source).normalize(source)
|
181
|
+
|
182
|
+
if list_of_data = Puppet::FileServing::Metadata.indirection.search(source, options)
|
183
|
+
basedir_meta = list_of_data.find {|meta| meta.relative_path == '.'}
|
184
|
+
devfail "FileServing::Metadata search should always return the root search path" if basedir_meta.nil?
|
185
|
+
|
186
|
+
if ! inlineable_metadata?(basedir_meta, source, environment_path)
|
187
|
+
# If any source is not in the environment path, skip inlining this resource.
|
188
|
+
log_file_outside_environment
|
189
|
+
sources_in_environment = false
|
190
|
+
break
|
191
|
+
end
|
192
|
+
|
193
|
+
base_content_uri = get_content_uri(basedir_meta, source, environment_path)
|
194
|
+
list_of_data.each do |metadata|
|
195
|
+
if metadata.relative_path == '.'
|
196
|
+
metadata.content_uri = base_content_uri
|
197
|
+
else
|
198
|
+
metadata.content_uri = "#{base_content_uri}/#{metadata.relative_path}"
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
source_to_metadatas[source] = list_of_data
|
203
|
+
# Optimize for returning less data if sourceselect is first
|
204
|
+
if resource[:sourceselect] == 'first' || resource[:sourceselect].nil?
|
205
|
+
break
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
if sources_in_environment && !source_to_metadatas.empty?
|
211
|
+
log_metadata_inlining
|
212
|
+
catalog.recursive_metadata[resource.title] = source_to_metadatas
|
213
|
+
end
|
214
|
+
else
|
215
|
+
options = {
|
216
|
+
:environment => catalog.environment_instance,
|
217
|
+
:links => resource[:links] ? resource[:links].to_sym : :manage,
|
218
|
+
:checksum_type => resource[:checksum] ? resource[:checksum].to_sym : checksum_type.to_sym,
|
219
|
+
:source_permissions => resource[:source_permissions] ? resource[:source_permissions].to_sym : :ignore
|
220
|
+
}
|
221
|
+
|
222
|
+
metadata = nil
|
223
|
+
sources.each do |source|
|
224
|
+
source = Puppet::Type.type(:file).attrclass(:source).normalize(source)
|
225
|
+
|
226
|
+
if data = Puppet::FileServing::Metadata.indirection.find(source, options)
|
227
|
+
metadata = data
|
228
|
+
metadata.source = source
|
229
|
+
break
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
raise "Could not get metadata for #{resource[:source]}" unless metadata
|
234
|
+
|
235
|
+
if inlineable_metadata?(metadata, metadata.source, environment_path)
|
236
|
+
metadata.content_uri = get_content_uri(metadata, metadata.source, environment_path)
|
237
|
+
log_metadata_inlining
|
238
|
+
|
239
|
+
# If the file is in the environment directory, we can safely inline
|
240
|
+
catalog.metadata[resource.title] = metadata
|
241
|
+
else
|
242
|
+
# Log a profiler event that we skipped this file because it is not in an environment.
|
243
|
+
log_file_outside_environment
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
84
249
|
# Compile the actual catalog.
|
85
|
-
def compile(node,
|
86
|
-
|
250
|
+
def compile(node, options)
|
251
|
+
if node.environment && node.environment.static_catalogs? && options[:static_catalog] && options[:code_id]
|
252
|
+
# Check for errors before compiling the catalog
|
253
|
+
checksum_type = common_checksum_type(options[:checksum_type])
|
254
|
+
raise Puppet::Error, "Unable to find a common checksum type between agent '#{options[:checksum_type]}' and master '#{known_checksum_types}'." unless checksum_type
|
255
|
+
end
|
256
|
+
|
257
|
+
str = "Compiled %s for #{node.name}" % [checksum_type ? 'static catalog' : 'catalog']
|
87
258
|
str += " in environment #{node.environment}" if node.environment
|
88
259
|
config = nil
|
89
260
|
|
90
261
|
benchmark(:notice, str) do
|
91
|
-
|
262
|
+
compile_type = checksum_type ? :static_compile : :compile
|
263
|
+
Puppet::Util::Profiler.profile(str, [:compiler, compile_type, node.environment, node.name]) do
|
92
264
|
begin
|
93
|
-
config = Puppet::Parser::Compiler.compile(node, code_id)
|
265
|
+
config = Puppet::Parser::Compiler.compile(node, options[:code_id])
|
94
266
|
rescue Puppet::Error => detail
|
95
267
|
Puppet.err(detail.to_s) if networked?
|
96
268
|
raise
|
97
269
|
end
|
270
|
+
|
271
|
+
if checksum_type && config.is_a?(model)
|
272
|
+
str = "Inlined resource metadata into static catalog for #{node.name}"
|
273
|
+
str += " in environment #{node.environment}" if node.environment
|
274
|
+
benchmark(:notice, str) do
|
275
|
+
Puppet::Util::Profiler.profile(str, [:compiler, :static_compile_postprocessing, node.environment, node.name]) do
|
276
|
+
inline_metadata(config, checksum_type)
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
98
280
|
end
|
99
281
|
end
|
100
282
|
|
283
|
+
|
101
284
|
config
|
102
285
|
end
|
103
286
|
|