puppet 4.2.3-x86-mingw32 → 4.3.0-x86-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.
- data/Gemfile +3 -0
- data/README.md +1 -1
- data/ext/debian/puppet.init +0 -1
- data/ext/debian/puppet.logrotate +14 -5
- data/ext/osx/puppet.plist +0 -2
- data/ext/redhat/client.init +13 -5
- data/ext/redhat/logrotate +15 -3
- data/ext/redhat/puppet.spec.erb +5 -1
- data/ext/redhat/server.init +1 -1
- data/ext/systemd/puppet.service +1 -0
- data/lib/puppet.rb +12 -0
- data/lib/puppet/agent.rb +4 -4
- data/lib/puppet/agent/locker.rb +11 -2
- data/lib/puppet/application/agent.rb +5 -1
- data/lib/puppet/application/apply.rb +4 -0
- data/lib/puppet/application/filebucket.rb +78 -4
- data/lib/puppet/application/lookup.rb +356 -0
- data/lib/puppet/application/master.rb +3 -0
- data/lib/puppet/configurer.rb +9 -5
- data/lib/puppet/context.rb +16 -1
- data/lib/puppet/context/trusted_information.rb +21 -1
- data/lib/puppet/daemon.rb +17 -13
- data/lib/puppet/data_binding.rb +4 -2
- data/lib/puppet/data_providers.rb +12 -13
- data/lib/puppet/data_providers/data_adapter.rb +7 -68
- data/lib/puppet/data_providers/data_function_support.rb +5 -26
- data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
- data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
- data/lib/puppet/data_providers/hiera_config.rb +106 -0
- data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
- data/lib/puppet/data_providers/hiera_interpolate.rb +97 -0
- data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
- data/lib/puppet/data_providers/hiera_support.rb +37 -0
- data/lib/puppet/data_providers/json_data_provider_factory.rb +31 -0
- data/lib/puppet/data_providers/lookup_adapter.rb +200 -0
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +32 -0
- data/lib/puppet/defaults.rb +12 -2
- data/lib/puppet/error.rb +4 -0
- data/lib/puppet/face/module/changes.rb +2 -1
- data/lib/puppet/feature/cfacter.rb +1 -0
- data/lib/puppet/file_bucket/dipper.rb +58 -2
- data/lib/puppet/functions.rb +2 -4
- data/lib/puppet/functions/assert_type.rb +48 -12
- data/lib/puppet/functions/defined.rb +79 -48
- data/lib/puppet/functions/each.rb +85 -27
- data/lib/puppet/functions/filter.rb +58 -23
- data/lib/puppet/functions/hiera.rb +76 -3
- data/lib/puppet/functions/hiera_array.rb +65 -3
- data/lib/puppet/functions/hiera_hash.rb +74 -2
- data/lib/puppet/functions/hiera_include.rb +75 -2
- data/lib/puppet/functions/lookup.rb +19 -17
- data/lib/puppet/functions/map.rb +56 -21
- data/lib/puppet/functions/match.rb +29 -12
- data/lib/puppet/functions/reduce.rb +95 -58
- data/lib/puppet/functions/versioncmp.rb +36 -0
- data/lib/puppet/functions/with.rb +15 -7
- data/lib/puppet/indirector/catalog/compiler.rb +3 -3
- data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
- data/lib/puppet/indirector/data_binding/none.rb +4 -1
- data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
- data/lib/puppet/indirector/hiera.rb +4 -0
- data/lib/puppet/indirector/json.rb +1 -1
- data/lib/puppet/indirector/msgpack.rb +1 -1
- data/lib/puppet/indirector/request.rb +7 -8
- data/lib/puppet/indirector/resource_type/parser.rb +5 -3
- data/lib/puppet/info_service.rb +7 -0
- data/lib/puppet/info_service/class_information_service.rb +111 -0
- data/lib/puppet/module_tool/metadata.rb +32 -9
- data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
- data/lib/puppet/network/authconfig.rb +21 -1
- data/lib/puppet/network/authorization.rb +8 -1
- data/lib/puppet/network/http/api/master/v3.rb +7 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
- data/lib/puppet/node/environment.rb +9 -2
- data/lib/puppet/parser.rb +3 -0
- data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
- data/lib/puppet/parser/compiler.rb +302 -12
- data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
- data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +38 -0
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
- data/lib/puppet/parser/environment_compiler.rb +165 -0
- data/lib/puppet/parser/functions/assert_type.rb +46 -16
- data/lib/puppet/parser/functions/defined.rb +105 -68
- data/lib/puppet/parser/functions/each.rb +85 -27
- data/lib/puppet/parser/functions/filter.rb +59 -23
- data/lib/puppet/parser/functions/hiera.rb +83 -27
- data/lib/puppet/parser/functions/hiera_array.rb +71 -28
- data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
- data/lib/puppet/parser/functions/hiera_include.rb +81 -40
- data/lib/puppet/parser/functions/map.rb +55 -20
- data/lib/puppet/parser/functions/match.rb +27 -12
- data/lib/puppet/parser/functions/reduce.rb +97 -60
- data/lib/puppet/parser/functions/with.rb +16 -8
- data/lib/puppet/parser/resource.rb +98 -19
- data/lib/puppet/plugins/configuration.rb +3 -2
- data/lib/puppet/plugins/data_providers.rb +12 -60
- data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
- data/lib/puppet/plugins/data_providers/registry.rb +84 -0
- data/lib/puppet/pops.rb +19 -17
- data/lib/puppet/pops/adapters.rb +12 -0
- data/lib/puppet/pops/binder/binder.rb +2 -2
- data/lib/puppet/pops/binder/bindings_checker.rb +1 -1
- data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
- data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
- data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
- data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
- data/lib/puppet/pops/binder/injector.rb +4 -4
- data/lib/puppet/pops/binder/key_factory.rb +3 -9
- data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
- data/lib/puppet/pops/evaluator/access_operator.rb +27 -60
- data/lib/puppet/pops/evaluator/closure.rb +8 -8
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
- data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
- data/lib/puppet/pops/evaluator/relationship_operator.rb +7 -1
- data/lib/puppet/pops/functions/dispatcher.rb +3 -3
- data/lib/puppet/pops/issues.rb +1 -1
- data/lib/puppet/pops/label_provider.rb +1 -1
- data/lib/puppet/pops/lookup.rb +25 -47
- data/lib/puppet/pops/lookup/explainer.rb +402 -0
- data/lib/puppet/pops/lookup/invocation.rb +117 -0
- data/lib/puppet/pops/merge_strategy.rb +73 -5
- data/lib/puppet/pops/model/factory.rb +34 -0
- data/lib/puppet/pops/model/model_label_provider.rb +10 -1
- data/lib/puppet/pops/model/model_meta.rb +15 -0
- data/lib/puppet/pops/model/model_tree_dumper.rb +18 -0
- data/lib/puppet/pops/parser/code_merger.rb +13 -1
- data/lib/puppet/pops/parser/egrammar.ra +56 -3
- data/lib/puppet/pops/parser/eparser.rb +1549 -1352
- data/lib/puppet/pops/parser/lexer2.rb +31 -6
- data/lib/puppet/pops/parser/locator.rb +1 -1
- data/lib/puppet/pops/parser/parser_support.rb +25 -13
- data/lib/puppet/pops/types/enumeration.rb +1 -2
- data/lib/puppet/pops/types/type_asserter.rb +16 -15
- data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
- data/lib/puppet/pops/types/type_calculator.rb +171 -1020
- data/lib/puppet/pops/types/type_factory.rb +87 -148
- data/lib/puppet/pops/types/type_mismatch_describer.rb +743 -0
- data/lib/puppet/pops/types/type_parser.rb +116 -127
- data/lib/puppet/pops/types/types.rb +1394 -255
- data/lib/puppet/pops/types/types_meta.rb +0 -234
- data/lib/puppet/pops/validation.rb +7 -2
- data/lib/puppet/pops/validation/checker4_0.rb +28 -0
- data/lib/puppet/provider/augeas/augeas.rb +50 -0
- data/lib/puppet/provider/group/directoryservice.rb +10 -0
- data/lib/puppet/provider/package/dnf.rb +41 -0
- data/lib/puppet/provider/package/gem.rb +7 -2
- data/lib/puppet/provider/package/rpm.rb +1 -0
- data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
- data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
- data/lib/puppet/provider/package/windows/package.rb +9 -1
- data/lib/puppet/provider/package/yum.rb +14 -9
- data/lib/puppet/provider/service/bsd.rb +1 -1
- data/lib/puppet/provider/service/debian.rb +21 -0
- data/lib/puppet/provider/service/init.rb +6 -0
- data/lib/puppet/provider/service/rcng.rb +51 -0
- data/lib/puppet/provider/service/redhat.rb +2 -1
- data/lib/puppet/provider/service/smf.rb +43 -2
- data/lib/puppet/provider/service/src.rb +27 -0
- data/lib/puppet/provider/service/systemd.rb +15 -3
- data/lib/puppet/provider/sshkey/parsed.rb +19 -9
- data/lib/puppet/reference/report.rb +9 -12
- data/lib/puppet/reports.rb +5 -1
- data/lib/puppet/resource.rb +50 -73
- data/lib/puppet/resource/capability_finder.rb +95 -0
- data/lib/puppet/resource/catalog.rb +47 -7
- data/lib/puppet/resource/status.rb +0 -2
- data/lib/puppet/resource/type.rb +238 -44
- data/lib/puppet/resource/type_collection.rb +60 -2
- data/lib/puppet/settings.rb +2 -2
- data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
- data/lib/puppet/ssl/oids.rb +9 -1
- data/lib/puppet/transaction.rb +4 -1
- data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
- data/lib/puppet/transaction/resource_harness.rb +9 -4
- data/lib/puppet/type.rb +74 -3
- data/lib/puppet/type/augeas.rb +8 -0
- data/lib/puppet/type/file/source.rb +14 -12
- data/lib/puppet/type/user.rb +4 -2
- data/lib/puppet/util/windows/security.rb +4 -1
- data/lib/puppet/util/windows/taskscheduler.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/spec/fixtures/unit/application/environments/production/data/common.yaml +3 -0
- data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +18 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +3 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
- data/spec/integration/data_binding_spec.rb +229 -0
- data/spec/integration/file_bucket/file_spec.rb +2 -2
- data/spec/integration/parser/compiler_spec.rb +23 -19
- data/spec/integration/parser/resource_expressions_spec.rb +4 -4
- data/spec/integration/parser/undef_param_spec.rb +1 -1
- data/spec/integration/resource/catalog_spec.rb +1 -1
- data/spec/integration/type/package_spec.rb +2 -0
- data/spec/integration/util/windows/security_spec.rb +18 -0
- data/spec/lib/matchers/include_in_order.rb +2 -2
- data/spec/shared_behaviours/iterative_functions.rb +8 -8
- data/spec/spec_helper.rb +7 -0
- data/spec/unit/agent/locker_spec.rb +4 -4
- data/spec/unit/agent_spec.rb +0 -8
- data/spec/unit/application/agent_spec.rb +5 -0
- data/spec/unit/application/apply_spec.rb +8 -0
- data/spec/unit/application/filebucket_spec.rb +87 -1
- data/spec/unit/application/lookup_spec.rb +195 -0
- data/spec/unit/appmgmt_spec.rb +657 -0
- data/spec/unit/capability_spec.rb +414 -0
- data/spec/unit/configurer_spec.rb +7 -1
- data/spec/unit/context/trusted_information_spec.rb +24 -1
- data/spec/unit/daemon_spec.rb +18 -8
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +201 -0
- data/spec/unit/file_bucket/dipper_spec.rb +210 -1
- data/spec/unit/functions/assert_type_spec.rb +5 -7
- data/spec/unit/functions/defined_spec.rb +2 -2
- data/spec/unit/functions/epp_spec.rb +2 -2
- data/spec/unit/functions/lookup_spec.rb +200 -9
- data/spec/unit/functions/regsubst_spec.rb +17 -8
- data/spec/unit/functions/scanf_spec.rb +1 -1
- data/spec/unit/functions/split_spec.rb +2 -2
- data/spec/unit/functions/versioncmp_spec.rb +36 -0
- data/spec/unit/functions4_spec.rb +58 -72
- data/spec/unit/indirector/catalog/compiler_spec.rb +28 -8
- data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
- data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +52 -1
- data/spec/unit/indirector/request_spec.rb +8 -8
- data/spec/unit/info_service_spec.rb +236 -0
- data/spec/unit/module_tool/metadata_spec.rb +31 -2
- data/spec/unit/network/authconfig_spec.rb +62 -32
- data/spec/unit/network/authorization_spec.rb +30 -2
- data/spec/unit/network/http/connection_spec.rb +14 -19
- data/spec/unit/parser/compiler_spec.rb +86 -2
- data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
- data/spec/unit/parser/resource_spec.rb +2 -20
- data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
- data/spec/unit/pops/binder/injector_spec.rb +3 -3
- data/spec/unit/pops/evaluator/access_ops_spec.rb +13 -11
- data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +19 -11
- data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
- data/spec/unit/pops/label_provider_spec.rb +5 -1
- data/spec/unit/pops/parser/lexer2_spec.rb +33 -7
- data/spec/unit/pops/parser/parse_application_spec.rb +40 -0
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +4 -0
- data/spec/unit/pops/parser/parse_capabilities_spec.rb +47 -0
- data/spec/unit/pops/parser/parse_site_spec.rb +38 -0
- data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
- data/spec/unit/pops/parser/parser_spec.rb +18 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +427 -444
- data/spec/unit/pops/types/type_factory_spec.rb +12 -12
- data/spec/unit/pops/types/type_parser_spec.rb +7 -12
- data/spec/unit/pops/validator/validator_spec.rb +25 -0
- data/spec/unit/provider/augeas/augeas_spec.rb +50 -0
- data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
- data/spec/unit/provider/group/windows_adsi_spec.rb +3 -0
- data/spec/unit/provider/package/dnf_spec.rb +92 -0
- data/spec/unit/provider/package/gem_spec.rb +7 -0
- data/spec/unit/provider/package/rpm_spec.rb +25 -2
- data/spec/unit/provider/package/windows/package_spec.rb +41 -0
- data/spec/unit/provider/package/yum_spec.rb +21 -13
- data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
- data/spec/unit/provider/service/debian_spec.rb +27 -0
- data/spec/unit/provider/service/rcng_spec.rb +41 -0
- data/spec/unit/provider/service/redhat_spec.rb +8 -1
- data/spec/unit/provider/service/smf_spec.rb +30 -5
- data/spec/unit/provider/service/src_spec.rb +19 -4
- data/spec/unit/provider/service/systemd_spec.rb +78 -29
- data/spec/unit/provider/sshkey/parsed_spec.rb +23 -0
- data/spec/unit/reports_spec.rb +10 -0
- data/spec/unit/resource/capability_finder_spec.rb +56 -0
- data/spec/unit/resource/catalog_spec.rb +31 -8
- data/spec/unit/resource/type_collection_spec.rb +23 -2
- data/spec/unit/resource/type_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +22 -4
- data/spec/unit/settings_spec.rb +90 -1
- data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
- data/spec/unit/ssl/oids_spec.rb +8 -0
- data/spec/unit/transaction/additional_resource_generator_spec.rb +78 -5
- data/spec/unit/transaction/report_spec.rb +24 -1
- data/spec/unit/type/package_spec.rb +1 -0
- data/spec/unit/type/user_spec.rb +14 -7
- data/spec/unit/type_spec.rb +1 -1
- metadata +169 -5
- data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
- data/spec/integration/data_binding.rb +0 -104
data/lib/puppet/defaults.rb
CHANGED
@@ -21,7 +21,8 @@ module Puppet
|
|
21
21
|
:default => false,
|
22
22
|
:type => :boolean,
|
23
23
|
:desc => 'Whether to enable a pre-Facter 3.0 release of native Facter (distributed as
|
24
|
-
the "cfacter" package). This is not necessary if Facter 3.0 or later is installed.
|
24
|
+
the "cfacter" package). This is not necessary if Facter 3.0 or later is installed.
|
25
|
+
This setting is deprecated, as Facter 3 is now the default in puppet-agent.',
|
25
26
|
:hook => proc do |value|
|
26
27
|
return unless value
|
27
28
|
raise ArgumentError, 'facter has already evaluated facts.' if Facter.instance_variable_get(:@collection)
|
@@ -526,6 +527,15 @@ module Puppet
|
|
526
527
|
:desc => "The directory where catalog previews per node are generated."
|
527
528
|
}
|
528
529
|
)
|
530
|
+
|
531
|
+
define_settings(:main,
|
532
|
+
:app_management => {
|
533
|
+
:default => false,
|
534
|
+
:type => :boolean,
|
535
|
+
:desc => "Whether the application management feature is on or off. You must restart Puppet Server after changing this setting.",
|
536
|
+
}
|
537
|
+
)
|
538
|
+
|
529
539
|
Puppet.define_settings(:module_tool,
|
530
540
|
:module_repository => {
|
531
541
|
:default => 'https://forgeapi.puppetlabs.com',
|
@@ -545,7 +555,7 @@ module Puppet
|
|
545
555
|
},
|
546
556
|
:module_groups => {
|
547
557
|
:default => nil,
|
548
|
-
:desc => "Extra module groups to request from the Puppet Forge",
|
558
|
+
:desc => "Extra module groups to request from the Puppet Forge. This is an internal setting, and users should never change it.",
|
549
559
|
}
|
550
560
|
)
|
551
561
|
|
data/lib/puppet/error.rb
CHANGED
@@ -4,7 +4,8 @@ Puppet::Face.define(:module, '1.0.0') do
|
|
4
4
|
description <<-EOT
|
5
5
|
Shows any files in a module that have been modified since it was
|
6
6
|
installed. This action compares the files on disk to the md5 checksums
|
7
|
-
included in the module's
|
7
|
+
included in the module's checksums.json or, if that is missing, in
|
8
|
+
metadata.json.
|
8
9
|
EOT
|
9
10
|
|
10
11
|
returns "Array of strings representing paths of modified files."
|
@@ -2,6 +2,8 @@ require 'pathname'
|
|
2
2
|
require 'puppet/file_bucket'
|
3
3
|
require 'puppet/file_bucket/file'
|
4
4
|
require 'puppet/indirector/request'
|
5
|
+
require 'puppet/util/diff'
|
6
|
+
require 'tempfile'
|
5
7
|
|
6
8
|
class Puppet::FileBucket::Dipper
|
7
9
|
include Puppet::Util::Checksums
|
@@ -22,7 +24,7 @@ class Puppet::FileBucket::Dipper
|
|
22
24
|
@rest_path = nil
|
23
25
|
else
|
24
26
|
@local_path = nil
|
25
|
-
@rest_path = "
|
27
|
+
@rest_path = "filebucket://#{server}:#{port}/"
|
26
28
|
end
|
27
29
|
@checksum_type = Puppet[:digest_algorithm].to_sym
|
28
30
|
@digest = method(@checksum_type)
|
@@ -56,6 +58,46 @@ class Puppet::FileBucket::Dipper
|
|
56
58
|
end
|
57
59
|
end
|
58
60
|
|
61
|
+
# Diffs two filebucket files identified by their sums
|
62
|
+
def diff(checksum_a, checksum_b, file_a, file_b)
|
63
|
+
raise RuntimeError, "Diff is not supported on this platform" if Puppet[:diff] == ""
|
64
|
+
if checksum_a
|
65
|
+
source_path = "#{@rest_path}#{@checksum_type}/#{checksum_a}"
|
66
|
+
if checksum_b
|
67
|
+
file_diff = Puppet::FileBucket::File.indirection.find(
|
68
|
+
source_path,
|
69
|
+
:bucket_path => @local_path,
|
70
|
+
:diff_with => checksum_b)
|
71
|
+
elsif file_b
|
72
|
+
tmp_file = ::Tempfile.new('diff')
|
73
|
+
begin
|
74
|
+
restore(tmp_file.path, checksum_a)
|
75
|
+
file_diff = Puppet::Util::Diff.diff(tmp_file.path, file_b)
|
76
|
+
ensure
|
77
|
+
tmp_file.close
|
78
|
+
tmp_file.unlink
|
79
|
+
end
|
80
|
+
else
|
81
|
+
raise Puppet::Error, "Please provide a file or checksum do diff with"
|
82
|
+
end
|
83
|
+
elsif file_a
|
84
|
+
if checksum_b
|
85
|
+
tmp_file = ::Tempfile.new('diff')
|
86
|
+
begin
|
87
|
+
restore(tmp_file.path, checksum_b)
|
88
|
+
file_diff = Puppet::Util::Diff.diff(file_a, tmp_file.path)
|
89
|
+
ensure
|
90
|
+
tmp_file.close
|
91
|
+
tmp_file.unlink
|
92
|
+
end
|
93
|
+
elsif file_b
|
94
|
+
file_diff = Puppet::Util::Diff.diff(file_a, file_b)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
raise Puppet::Error, "Failed to diff files" unless file_diff
|
98
|
+
file_diff.to_s
|
99
|
+
end
|
100
|
+
|
59
101
|
# Retrieves a file by sum.
|
60
102
|
def getfile(sum)
|
61
103
|
get_bucket_file(sum).to_s
|
@@ -109,10 +151,24 @@ class Puppet::FileBucket::Dipper
|
|
109
151
|
end
|
110
152
|
end
|
111
153
|
|
154
|
+
# List Filebucket content.
|
155
|
+
def list(fromdate, todate)
|
156
|
+
raise Puppet::Error, "Listing remote file buckets is not allowed" unless local?
|
157
|
+
|
158
|
+
source_path = "#{@rest_path}#{@checksum_type}/"
|
159
|
+
file_bucket_list = Puppet::FileBucket::File.indirection.find(
|
160
|
+
source_path,
|
161
|
+
:bucket_path => @local_path,
|
162
|
+
:list_all => true,
|
163
|
+
:fromdate => fromdate,
|
164
|
+
:todate => todate)
|
165
|
+
raise Puppet::Error, "File not found" unless file_bucket_list
|
166
|
+
file_bucket_list.to_s
|
167
|
+
end
|
168
|
+
|
112
169
|
private
|
113
170
|
def absolutize_path( path )
|
114
171
|
Pathname.new(path).realpath
|
115
172
|
end
|
116
173
|
|
117
174
|
end
|
118
|
-
|
data/lib/puppet/functions.rb
CHANGED
@@ -349,12 +349,10 @@ module Puppet::Functions
|
|
349
349
|
def block_param(*type_and_name)
|
350
350
|
case type_and_name.size
|
351
351
|
when 0
|
352
|
-
|
353
|
-
type = @all_callables.copy
|
352
|
+
type = @all_callables
|
354
353
|
name = :block
|
355
354
|
when 1
|
356
|
-
|
357
|
-
type = @all_callables.copy
|
355
|
+
type = @all_callables
|
358
356
|
name = type_and_name[0]
|
359
357
|
when 2
|
360
358
|
type_string, name = type_and_name
|
@@ -1,18 +1,54 @@
|
|
1
|
-
# Returns the given value if it is
|
2
|
-
#
|
3
|
-
#
|
1
|
+
# Returns the given value if it is of the given
|
2
|
+
# [data type](https://docs.puppetlabs.com/puppet/latest/reference/lang_data.html), or
|
3
|
+
# otherwise either raises an error or executes an optional two-parameter
|
4
|
+
# [lambda](https://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html).
|
4
5
|
#
|
5
|
-
#
|
6
|
-
# # assert that `$b` is a non empty `String` and assign to `$a`
|
7
|
-
# $a = assert_type(String[1], $b)
|
6
|
+
# The function takes two mandatory arguments, in this order:
|
8
7
|
#
|
9
|
-
#
|
10
|
-
#
|
8
|
+
# 1. The expected data type.
|
9
|
+
# 2. A value to compare against the expected data type.
|
11
10
|
#
|
12
|
-
# @example
|
13
|
-
# $a = assert_type(String[1], $b) |$expected, $actual| { warning("Name is empty, using default") 'anonymous' }
|
11
|
+
# @example Using `assert_type`
|
14
12
|
#
|
15
|
-
#
|
13
|
+
# ~~~ puppet
|
14
|
+
# $raw_username = 'Amy Berry'
|
15
|
+
#
|
16
|
+
# # Assert that $raw_username is a non-empty string and assign it to $valid_username.
|
17
|
+
# $valid_username = assert_type(String[1], $raw_username)
|
18
|
+
#
|
19
|
+
# # $valid_username contains "Amy Berry".
|
20
|
+
# # If $raw_username was an empty string or a different data type, the Puppet run would
|
21
|
+
# # fail with an "Expected type does not match actual" error.
|
22
|
+
# ~~~
|
23
|
+
#
|
24
|
+
# You can use an optional lambda to provide enhanced feedback. The lambda takes two
|
25
|
+
# mandatory parameters, in this order:
|
26
|
+
#
|
27
|
+
# 1. The expected data type as described in the function's first argument.
|
28
|
+
# 2. The actual data type of the value.
|
29
|
+
#
|
30
|
+
# @example Using `assert_type` with a warning and default value
|
31
|
+
#
|
32
|
+
# ~~~ puppet
|
33
|
+
# $raw_username = 'Amy Berry'
|
34
|
+
#
|
35
|
+
# # Assert that $raw_username is a non-empty string and assign it to $valid_username.
|
36
|
+
# # If it isn't, output a warning describing the problem and use a default value.
|
37
|
+
# $valid_username = assert_type(String[1], $raw_username) |$expected, $actual| {
|
38
|
+
# warning( "The username should be \'${expected}\', not \'${actual}\'. Using 'anonymous'." )
|
39
|
+
# 'anonymous'
|
40
|
+
# }
|
41
|
+
#
|
42
|
+
# # $valid_username contains "Amy Berry".
|
43
|
+
# # If $raw_username was an empty string, the Puppet run would set $valid_username to
|
44
|
+
# # "anonymous" and output a warning: "The username should be 'String[1, default]', not
|
45
|
+
# # 'String[0, 0]'. Using 'anonymous'."
|
46
|
+
# ~~~
|
47
|
+
#
|
48
|
+
# For more information about data types, see the
|
49
|
+
# [documentation](https://docs.puppetlabs.com/puppet/latest/reference/lang_data.html).
|
50
|
+
#
|
51
|
+
# @since 4.0.0
|
16
52
|
#
|
17
53
|
Puppet::Functions.create_function(:assert_type) do
|
18
54
|
dispatch :assert_type do
|
@@ -42,7 +78,7 @@ Puppet::Functions.create_function(:assert_type) do
|
|
42
78
|
# Do not give all the details - i.e. format as Integer, instead of Integer[n, n] for exact value, which
|
43
79
|
# is just confusing. (OTOH: may need to revisit, or provide a better "type diff" output.
|
44
80
|
#
|
45
|
-
actual = Puppet::Pops::Types::TypeCalculator.generalize
|
81
|
+
actual = Puppet::Pops::Types::TypeCalculator.generalize(inferred_type)
|
46
82
|
raise Puppet::Pops::Types::TypeAssertionError.new("assert_type(): Expected type #{type} does not match actual: #{actual}", type,actual)
|
47
83
|
end
|
48
84
|
end
|
@@ -1,70 +1,101 @@
|
|
1
|
-
# Determines whether
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
1
|
+
# Determines whether a given class or resource type is defined and returns a Boolean
|
2
|
+
# value. You can also use `defined` to determine whether a specific resource is defined,
|
3
|
+
# or whether a variable has a value (including `undef`, as opposed to the variable never
|
4
|
+
# being declared or assigned).
|
5
|
+
#
|
6
|
+
# This function takes at least one string argument, which can be a class name, type name,
|
7
|
+
# resource reference, or variable reference of the form `'$name'`.
|
8
8
|
#
|
9
9
|
# The `defined` function checks both native and defined types, including types
|
10
|
-
# provided
|
10
|
+
# provided by modules. Types and classes are matched by their names. The function matches
|
11
|
+
# resource declarations by using resource references.
|
12
|
+
#
|
13
|
+
# **Examples**: Different types of `defined` function matches
|
14
|
+
#
|
15
|
+
# ~~~ puppet
|
16
|
+
# # Matching resource types
|
17
|
+
# defined("file")
|
18
|
+
# defined("customtype")
|
19
|
+
#
|
20
|
+
# # Matching defines and classes
|
21
|
+
# defined("foo")
|
22
|
+
# defined("foo::bar")
|
23
|
+
#
|
24
|
+
# # Matching variables
|
25
|
+
# defined('$name')
|
26
|
+
#
|
27
|
+
# # Matching declared resources
|
28
|
+
# defined(File['/tmp/file'])
|
29
|
+
# ~~~
|
30
|
+
#
|
31
|
+
# Puppet depends on the configuration's evaluation order when checking whether a resource
|
32
|
+
# is declared.
|
11
33
|
#
|
12
|
-
#
|
13
|
-
# defined("customtype")
|
14
|
-
# defined("foo")
|
15
|
-
# defined("foo::bar")
|
16
|
-
# defined('$name')
|
34
|
+
# @example Importance of evaluation order when using `defined`
|
17
35
|
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
# has been declared is, unfortunately, dependent on the evaluation order of
|
22
|
-
# the configuration, and the following code will not work:
|
36
|
+
# ~~~ puppet
|
37
|
+
# # Assign values to $is_defined_before and $is_defined_after using identical `defined`
|
38
|
+
# # functions.
|
23
39
|
#
|
24
|
-
#
|
25
|
-
# notify { "This configuration includes the /tmp/foo file.":}
|
26
|
-
# }
|
27
|
-
# file { "/tmp/foo":
|
28
|
-
# ensure => present,
|
29
|
-
# }
|
40
|
+
# $is_defined_before = defined(File['/tmp/file'])
|
30
41
|
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
42
|
+
# file { "/tmp/file":
|
43
|
+
# ensure => present,
|
44
|
+
# }
|
34
45
|
#
|
35
|
-
#
|
46
|
+
# $is_defined_after = defined(File['/tmp/file'])
|
36
47
|
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
# defined(Class['foo'])
|
48
|
+
# # $is_defined_before returns false, but $is_defined_after returns true.
|
49
|
+
# ~~~
|
40
50
|
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
51
|
+
# This order requirement only refers to evaluation order. The order of resources in the
|
52
|
+
# configuration graph (e.g. with `before` or `require`) does not affect the `defined`
|
53
|
+
# function's behavior.
|
44
54
|
#
|
45
|
-
#
|
46
|
-
#
|
55
|
+
# > **Warning:** Avoid relying on the result of the `defined` function in modules, as you
|
56
|
+
# > might not be able to guarantee the evaluation order well enough to produce consistent
|
57
|
+
# > results. This can cause other code that relies on the function's result to behave
|
58
|
+
# > inconsistently or fail.
|
47
59
|
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
#
|
60
|
+
# If you pass more than one argument to `defined`, the function returns `true` if _any_
|
61
|
+
# of the arguments are defined. You can also match resources by type, allowing you to
|
62
|
+
# match conditions of different levels of specificity, such as whether a specific resource
|
63
|
+
# is of a specific data type.
|
51
64
|
#
|
52
|
-
#
|
53
|
-
# a resource type (built in or defined), or a class, by giving its type:
|
65
|
+
# @example Matching multiple resources and resources by different types with `defined`
|
54
66
|
#
|
55
|
-
#
|
56
|
-
#
|
67
|
+
# ~~~ puppet
|
68
|
+
# file { "/tmp/file1":
|
69
|
+
# ensure => file,
|
70
|
+
# }
|
57
71
|
#
|
58
|
-
#
|
72
|
+
# $tmp_file = file { "/tmp/file2":
|
73
|
+
# ensure => file,
|
74
|
+
# }
|
59
75
|
#
|
60
|
-
#
|
76
|
+
# # Each of these statements return `true` ...
|
77
|
+
# defined(File['/tmp/file1'])
|
78
|
+
# defined(File['/tmp/file1'],File['/tmp/file2'])
|
79
|
+
# defined(File['/tmp/file1'],File['/tmp/file2'],File['/tmp/file3'])
|
80
|
+
# # ... but this returns `false`.
|
81
|
+
# defined(File['/tmp/file3'])
|
61
82
|
#
|
62
|
-
#
|
63
|
-
#
|
83
|
+
# # Each of these statements returns `true` ...
|
84
|
+
# defined(Type[Resource['file','/tmp/file2']])
|
85
|
+
# defined(Resource['file','/tmp/file2'])
|
86
|
+
# defined(File['/tmp/file2'])
|
87
|
+
# defined('$tmp_file')
|
88
|
+
# # ... but each of these returns `false`.
|
89
|
+
# defined(Type[Resource['exec','/tmp/file2']])
|
90
|
+
# defined(Resource['exec','/tmp/file2'])
|
91
|
+
# defined(File['/tmp/file3'])
|
92
|
+
# defined('$tmp_file2')
|
93
|
+
# ~~~
|
64
94
|
#
|
65
95
|
# @since 2.7.0
|
66
|
-
# @since 3.6.0 variable reference and future parser types
|
96
|
+
# @since 3.6.0 variable reference and future parser types
|
67
97
|
# @since 3.8.1 type specific requests with future parser
|
98
|
+
# @since 4.0.0
|
68
99
|
#
|
69
100
|
Puppet::Functions.create_function(:'defined', Puppet::Functions::InternalFunction) do
|
70
101
|
|
@@ -1,38 +1,96 @@
|
|
1
|
-
#
|
2
|
-
#
|
1
|
+
# Runs a [lambda](http://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html)
|
2
|
+
# repeatedly using each value in a data structure, then returns the values unchanged.
|
3
3
|
#
|
4
|
-
# This function takes two mandatory arguments
|
5
|
-
# of enumerable type (integer, Integer range, or String), and the second
|
6
|
-
# a parameterized block as produced by the puppet syntax:
|
4
|
+
# This function takes two mandatory arguments, in this order:
|
7
5
|
#
|
8
|
-
#
|
9
|
-
#
|
6
|
+
# 1. An array or hash the function will iterate over.
|
7
|
+
# 2. A lambda, which the function calls for each element in the first argument. It can
|
8
|
+
# request one or two parameters.
|
10
9
|
#
|
11
|
-
#
|
12
|
-
# should define one or two block parameters.
|
13
|
-
# For each application of the block, the next element from the array is selected, and it is passed to
|
14
|
-
# the block if the block has one parameter. If the block has two parameters, the first is the elements
|
15
|
-
# index, and the second the value. The index starts from 0.
|
10
|
+
# @example Using the `each` function
|
16
11
|
#
|
17
|
-
#
|
18
|
-
# each($a) |$index, $value| { ... }
|
12
|
+
# `$data.each |$parameter| { <PUPPET CODE BLOCK> }`
|
19
13
|
#
|
20
|
-
#
|
21
|
-
# When one parameter is defined, the iteration is performed with each entry as an array of `[key, value]`,
|
22
|
-
# and when two parameters are defined the iteration is performed with key and value.
|
14
|
+
# or
|
23
15
|
#
|
24
|
-
#
|
25
|
-
# $a.each |$key, $value| { ..."key ${key}, value ${value}" }
|
16
|
+
# `each($data) |$parameter| { <PUPPET CODE BLOCK> }`
|
26
17
|
#
|
27
|
-
#
|
18
|
+
# When the first argument (`$data` in the above example) is an array, Puppet passes each
|
19
|
+
# value in turn to the lambda, then returns the original values.
|
28
20
|
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
35
|
-
#
|
21
|
+
# @example Using the `each` function with an array and a one-parameter lambda
|
22
|
+
#
|
23
|
+
# ~~~ puppet
|
24
|
+
# # For the array $data, run a lambda that creates a resource for each item.
|
25
|
+
# $data = ["routers", "servers", "workstations"]
|
26
|
+
# $data.each |$item| {
|
27
|
+
# notify { $item:
|
28
|
+
# message => $item
|
29
|
+
# }
|
30
|
+
# }
|
31
|
+
# # Puppet creates one resource for each of the three items in $data. Each resource is
|
32
|
+
# # named after the item's value and uses the item's value in a parameter.
|
33
|
+
# ~~~
|
34
|
+
#
|
35
|
+
# When the first argument is a hash, Puppet passes each key and value pair to the lambda
|
36
|
+
# as an array in the form `[key, value]` and returns the original hash.
|
37
|
+
#
|
38
|
+
# @example Using the `each` function with a hash and a one-parameter lambda
|
39
|
+
#
|
40
|
+
# ~~~ puppet
|
41
|
+
# # For the hash $data, run a lambda using each item as a key-value array that creates a
|
42
|
+
# # resource for each item.
|
43
|
+
# $data = {"rtr" => "Router", "svr" => "Server", "wks" => "Workstation"}
|
44
|
+
# $data.each |$items| {
|
45
|
+
# notify { $items[0]:
|
46
|
+
# message => $items[1]
|
47
|
+
# }
|
48
|
+
# }
|
49
|
+
# # Puppet creates one resource for each of the three items in $data, each named after the
|
50
|
+
# # item's key and containing a parameter using the item's value.
|
51
|
+
# ~~~
|
52
|
+
#
|
53
|
+
# When the first argument is an array and the lambda has two parameters, Puppet passes the
|
54
|
+
# array's indexes (enumerated from 0) in the first parameter and its values in the second
|
55
|
+
# parameter.
|
56
|
+
#
|
57
|
+
# @example Using the `each` function with an array and a two-parameter lambda
|
58
|
+
#
|
59
|
+
# ~~~ puppet
|
60
|
+
# # For the array $data, run a lambda using each item's index and value that creates a
|
61
|
+
# # resource for each item.
|
62
|
+
# $data = ["routers", "servers", "workstations"]
|
63
|
+
# $data.each |$index, $value| {
|
64
|
+
# notify { $value:
|
65
|
+
# message => $index
|
66
|
+
# }
|
67
|
+
# }
|
68
|
+
# # Puppet creates one resource for each of the three items in $data, each named after the
|
69
|
+
# # item's value and containing a parameter using the item's index.
|
70
|
+
# ~~~
|
71
|
+
#
|
72
|
+
# When the first argument is a hash, Puppet passes its keys to the first parameter and its
|
73
|
+
# values to the second parameter.
|
74
|
+
#
|
75
|
+
# @example Using the `each` function with a hash and a two-parameter lambda
|
76
|
+
#
|
77
|
+
# ~~~ puppet
|
78
|
+
# # For the hash $data, run a lambda using each item's key and value to create a resource
|
79
|
+
# # for each item.
|
80
|
+
# $data = {"rtr" => "Router", "svr" => "Server", "wks" => "Workstation"}
|
81
|
+
# $data.each |$key, $value| {
|
82
|
+
# notify { $key:
|
83
|
+
# message => $value
|
84
|
+
# }
|
85
|
+
# }
|
86
|
+
# # Puppet creates one resource for each of the three items in $data, each named after the
|
87
|
+
# # item's key and containing a parameter using the item's value.
|
88
|
+
# ~~~
|
89
|
+
#
|
90
|
+
# For an example that demonstrates how to create multiple `file` resources using `each`,
|
91
|
+
# see the Puppet
|
92
|
+
# [iteration](https://docs.puppetlabs.com/puppet/latest/reference/lang_iteration.html)
|
93
|
+
# documentation.
|
36
94
|
#
|
37
95
|
# @since 4.0.0
|
38
96
|
#
|