puppet 6.0.10-x64-mingw32 → 6.1.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/Gemfile +1 -0
- data/Gemfile.lock +31 -27
- data/Guardfile.example +76 -0
- data/LICENSE +189 -4
- data/MAINTAINERS +47 -0
- data/README.md +3 -3
- data/lib/hiera/scope.rb +0 -7
- data/lib/puppet.rb +6 -5
- data/lib/puppet/application.rb +3 -3
- data/lib/puppet/application/cert.rb +2 -2
- data/lib/puppet/application/device.rb +83 -109
- data/lib/puppet/application/filebucket.rb +1 -10
- data/lib/puppet/application/ssl.rb +0 -2
- data/lib/puppet/configurer.rb +9 -10
- data/lib/puppet/confine/false.rb +1 -7
- data/lib/puppet/confine/true.rb +1 -7
- data/lib/puppet/defaults.rb +39 -51
- data/lib/puppet/forge.rb +1 -4
- data/lib/puppet/functions/abs.rb +1 -1
- data/lib/puppet/functions/call.rb +1 -2
- data/lib/puppet/functions/new.rb +1 -1
- data/lib/puppet/indirector/request.rb +15 -26
- data/lib/puppet/network/http/connection.rb +12 -32
- data/lib/puppet/network/http/factory.rb +0 -5
- data/lib/puppet/pal/catalog_compiler.rb +96 -0
- data/lib/puppet/pal/compiler.rb +221 -0
- data/lib/puppet/pal/function_signature.rb +52 -0
- data/lib/puppet/pal/json_catalog_encoder.rb +67 -0
- data/lib/puppet/pal/pal_api.rb +15 -0
- data/lib/puppet/pal/pal_impl.rb +523 -0
- data/lib/puppet/pal/plan_signature.rb +71 -0
- data/lib/puppet/pal/script_compiler.rb +71 -0
- data/lib/puppet/pal/task_signature.rb +58 -0
- data/lib/puppet/parser/functions/generate.rb +7 -6
- data/lib/puppet/plugins/configuration.rb +5 -1
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -1
- data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -3
- data/lib/puppet/pops/issues.rb +0 -4
- data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +4 -60
- data/lib/puppet/pops/model/factory.rb +4 -38
- data/lib/puppet/pops/model/pn_transformer.rb +0 -5
- data/lib/puppet/pops/parser/egrammar.ra +2 -2
- data/lib/puppet/pops/parser/heredoc_support.rb +7 -17
- data/lib/puppet/pops/parser/lexer2.rb +1 -6
- data/lib/puppet/pops/parser/locator.rb +86 -106
- data/lib/puppet/pops/parser/parser_support.rb +2 -11
- data/lib/puppet/pops/types/string_converter.rb +7 -2
- data/lib/puppet/pops/types/type_mismatch_describer.rb +1 -1
- data/lib/puppet/pops/types/types.rb +3 -5
- data/lib/puppet/pops/validation/checker4_0.rb +13 -0
- data/lib/puppet/provider.rb +2 -1
- data/lib/puppet/provider/exec.rb +6 -1
- data/lib/puppet/provider/file/windows.rb +1 -49
- data/lib/puppet/provider/group/windows_adsi.rb +1 -4
- data/lib/puppet/provider/package.rb +0 -2
- data/lib/puppet/provider/package/dpkg.rb +2 -15
- data/lib/puppet/provider/package/gem.rb +42 -102
- data/lib/puppet/provider/package/pip.rb +111 -135
- data/lib/puppet/provider/package/pip3.rb +1 -1
- data/lib/puppet/provider/package/pkgng.rb +37 -21
- data/lib/puppet/provider/package/puppet_gem.rb +1 -1
- data/lib/puppet/provider/package/rpm.rb +16 -27
- data/lib/puppet/provider/package/windows.rb +1 -5
- data/lib/puppet/provider/package/yum.rb +1 -2
- data/lib/puppet/provider/service/systemd.rb +17 -0
- data/lib/puppet/provider/service/upstart.rb +5 -17
- data/lib/puppet/provider/service/windows.rb +8 -3
- data/lib/puppet/provider/user/directoryservice.rb +4 -16
- data/lib/puppet/provider/user/useradd.rb +13 -16
- data/lib/puppet/resource.rb +3 -1
- data/lib/puppet/rest/client.rb +83 -0
- data/lib/puppet/rest/route.rb +1 -1
- data/lib/puppet/settings.rb +5 -10
- data/lib/puppet/settings/server_list_setting.rb +0 -9
- data/lib/puppet/ssl/host.rb +11 -0
- data/lib/puppet/ssl/validator/default_validator.rb +0 -31
- data/lib/puppet/syntax_checkers/epp.rb +34 -0
- data/lib/puppet/syntax_checkers/pp.rb +34 -0
- data/lib/puppet/transaction.rb +7 -12
- data/lib/puppet/transaction/event_manager.rb +5 -1
- data/lib/puppet/transaction/resource_harness.rb +0 -1
- data/lib/puppet/type.rb +6 -0
- data/lib/puppet/type/exec.rb +5 -27
- data/lib/puppet/type/file/mode.rb +1 -6
- data/lib/puppet/type/file/source.rb +1 -0
- data/lib/puppet/type/filebucket.rb +8 -12
- data/lib/puppet/type/package.rb +11 -44
- data/lib/puppet/type/schedule.rb +0 -4
- data/lib/puppet/type/service.rb +12 -0
- data/lib/puppet/type/user.rb +1 -1
- data/lib/puppet/util/command_line.rb +1 -5
- data/lib/puppet/util/connection.rb +6 -15
- data/lib/puppet/util/http_proxy.rb +2 -3
- data/lib/puppet/util/log.rb +2 -7
- data/lib/puppet/util/pidlock.rb +1 -15
- data/lib/puppet/util/windows/process.rb +5 -73
- data/lib/puppet/util/windows/registry.rb +1 -7
- data/lib/puppet/util/windows/security.rb +8 -29
- data/lib/puppet/util/windows/service.rb +33 -27
- data/lib/puppet/util/windows/user.rb +4 -14
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet_pal.rb +5 -1132
- data/locales/ja/puppet.po +297 -363
- data/locales/puppet.pot +445 -517
- data/man/man5/puppet.conf.5 +12 -20
- data/man/man8/puppet-agent.8 +1 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- 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 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +2 -6
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/unit/provider/package/pkgng/pkg.query +7 -1
- data/spec/fixtures/unit/provider/package/pkgng/pkg.query.zsh +1 -0
- data/spec/integration/agent/logging_spec.rb +7 -5
- data/spec/integration/application/apply_spec.rb +16 -18
- data/spec/integration/application/doc_spec.rb +2 -1
- data/spec/integration/application/lookup_spec.rb +5 -5
- data/spec/integration/configurer_spec.rb +6 -5
- data/spec/integration/defaults_spec.rb +6 -5
- data/spec/integration/directory_environments_spec.rb +1 -1
- data/spec/integration/faces/config_spec.rb +4 -3
- data/spec/integration/faces/documentation_spec.rb +1 -0
- data/spec/integration/faces/plugin_spec.rb +1 -1
- data/spec/integration/file_bucket/file_spec.rb +4 -2
- data/spec/integration/file_serving/content_spec.rb +1 -0
- data/spec/integration/file_serving/fileset_spec.rb +1 -0
- data/spec/integration/file_serving/metadata_spec.rb +1 -0
- data/spec/integration/file_serving/terminus_helper_spec.rb +1 -0
- data/spec/integration/indirector/catalog/compiler_spec.rb +11 -10
- data/spec/integration/indirector/direct_file_server_spec.rb +1 -1
- data/spec/integration/indirector/facts/facter_spec.rb +5 -4
- data/spec/integration/indirector/file_content/file_server_spec.rb +8 -7
- data/spec/integration/indirector/file_metadata/file_server_spec.rb +8 -7
- data/spec/integration/network/authconfig_spec.rb +24 -23
- data/spec/integration/network/formats_spec.rb +1 -0
- data/spec/integration/node/environment_spec.rb +1 -0
- data/spec/integration/node/facts_spec.rb +10 -9
- data/spec/integration/node_spec.rb +7 -6
- data/spec/integration/parser/catalog_spec.rb +5 -1
- data/spec/integration/parser/collection_spec.rb +2 -1
- data/spec/integration/parser/compiler_spec.rb +6 -6
- data/spec/integration/parser/scope_spec.rb +1 -1
- data/spec/integration/parser/undef_param_spec.rb +1 -1
- data/spec/integration/provider/service/init_spec.rb +5 -4
- data/spec/integration/provider/service/systemd_spec.rb +2 -0
- data/spec/integration/provider/service/windows_spec.rb +2 -1
- data/spec/integration/reference/providers_spec.rb +2 -1
- data/spec/integration/reports_spec.rb +2 -1
- data/spec/integration/resource/catalog_spec.rb +17 -14
- data/spec/integration/resource/type_collection_spec.rb +5 -4
- data/spec/integration/ssl/certificate_request_spec.rb +1 -0
- data/spec/integration/ssl/host_spec.rb +2 -1
- data/spec/integration/ssl/key_spec.rb +1 -0
- data/spec/integration/test/test_helper_spec.rb +1 -0
- data/spec/integration/transaction/report_spec.rb +11 -6
- data/spec/integration/transaction_spec.rb +19 -18
- data/spec/integration/type/exec_spec.rb +1 -0
- data/spec/integration/type/file_spec.rb +33 -13
- data/spec/integration/type/package_spec.rb +24 -20
- data/spec/integration/type/tidy_spec.rb +2 -1
- data/spec/integration/type_spec.rb +1 -0
- data/spec/integration/util/autoload_spec.rb +2 -1
- data/spec/integration/util/rdoc/parser_spec.rb +1 -0
- data/spec/integration/util/settings_spec.rb +1 -0
- data/spec/integration/util/windows/adsi_spec.rb +5 -3
- data/spec/integration/util/windows/principal_spec.rb +1 -0
- data/spec/integration/util/windows/process_spec.rb +6 -4
- data/spec/integration/util/windows/registry_spec.rb +51 -93
- data/spec/integration/util/windows/security_spec.rb +4 -2
- data/spec/integration/util/windows/user_spec.rb +20 -37
- data/spec/integration/util_spec.rb +7 -4
- data/spec/lib/puppet_spec/compiler.rb +1 -1
- data/spec/lib/puppet_spec/files.rb +1 -0
- data/spec/lib/puppet_spec/module_tool/shared_functions.rb +1 -1
- data/spec/lib/puppet_spec/scope.rb +2 -1
- data/spec/shared_behaviours/all_parsedfile_providers.rb +1 -1
- data/spec/shared_behaviours/file_server_terminus.rb +9 -8
- data/spec/shared_behaviours/file_serving.rb +8 -6
- data/spec/shared_behaviours/file_serving_model.rb +5 -3
- data/spec/shared_behaviours/hiera_indirections.rb +4 -3
- data/spec/shared_behaviours/iterative_functions.rb +1 -0
- data/spec/shared_behaviours/memory_terminus.rb +2 -2
- data/spec/shared_examples/rhel_package_provider.rb +70 -112
- data/spec/spec_helper.rb +2 -11
- data/spec/unit/agent/disabler_spec.rb +5 -4
- data/spec/unit/agent/locker_spec.rb +13 -12
- data/spec/unit/agent_spec.rb +85 -80
- data/spec/unit/application/agent_spec.rb +93 -88
- data/spec/unit/application/apply_spec.rb +83 -82
- data/spec/unit/application/config_spec.rb +1 -0
- data/spec/unit/application/describe_spec.rb +7 -6
- data/spec/unit/application/device_spec.rb +419 -395
- data/spec/unit/application/doc_spec.rb +46 -44
- data/spec/unit/application/face_base_spec.rb +62 -61
- data/spec/unit/application/facts_spec.rb +4 -3
- data/spec/unit/application/filebucket_spec.rb +74 -66
- data/spec/unit/application/indirection_base_spec.rb +6 -8
- data/spec/unit/application/lookup_spec.rb +26 -26
- data/spec/unit/application/resource_spec.rb +48 -42
- data/spec/unit/application/ssl_spec.rb +3 -8
- data/spec/unit/application_spec.rb +98 -86
- data/spec/unit/capability_spec.rb +6 -6
- data/spec/unit/certificate_factory_spec.rb +5 -3
- data/spec/unit/configurer/downloader_spec.rb +21 -20
- data/spec/unit/configurer/fact_handler_spec.rb +3 -2
- data/spec/unit/configurer/plugin_handler_spec.rb +8 -41
- data/spec/unit/configurer_spec.rb +198 -194
- data/spec/unit/confine/exists_spec.rb +15 -17
- data/spec/unit/confine/false_spec.rb +6 -32
- data/spec/unit/confine/feature_spec.rb +5 -7
- data/spec/unit/confine/true_spec.rb +6 -32
- data/spec/unit/confine/variable_spec.rb +15 -14
- data/spec/unit/confine_collection_spec.rb +29 -28
- data/spec/unit/confine_spec.rb +14 -13
- data/spec/unit/confiner_spec.rb +11 -10
- data/spec/unit/context/trusted_information_spec.rb +1 -1
- data/spec/unit/daemon_spec.rb +36 -35
- data/spec/unit/data_providers/function_data_provider_spec.rb +1 -0
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +1 -0
- data/spec/unit/datatypes_spec.rb +4 -3
- data/spec/unit/defaults_spec.rb +27 -18
- data/spec/unit/environments_spec.rb +7 -7
- data/spec/unit/etc_spec.rb +32 -30
- data/spec/unit/external/pson_spec.rb +1 -0
- data/spec/unit/face/catalog_spec.rb +1 -0
- data/spec/unit/face/config_spec.rb +35 -31
- data/spec/unit/face/epp_face_spec.rb +4 -3
- data/spec/unit/face/facts_spec.rb +6 -5
- data/spec/unit/face/generate_spec.rb +5 -4
- data/spec/unit/face/help_spec.rb +8 -7
- data/spec/unit/face/key_spec.rb +1 -0
- data/spec/unit/face/man_spec.rb +2 -1
- data/spec/unit/face/module/install_spec.rb +5 -3
- data/spec/unit/face/module/list_spec.rb +12 -2
- data/spec/unit/face/module/search_spec.rb +9 -11
- data/spec/unit/face/module/uninstall_spec.rb +8 -4
- data/spec/unit/face/node_spec.rb +24 -23
- data/spec/unit/face/parser_spec.rb +18 -3
- data/spec/unit/face/plugin_spec.rb +9 -36
- data/spec/unit/face/status_spec.rb +1 -0
- data/spec/unit/file_bucket/dipper_spec.rb +20 -24
- data/spec/unit/file_bucket/file_spec.rb +2 -0
- data/spec/unit/file_serving/base_spec.rb +15 -14
- data/spec/unit/file_serving/configuration/parser_spec.rb +28 -27
- data/spec/unit/file_serving/configuration_spec.rb +66 -63
- data/spec/unit/file_serving/content_spec.rb +11 -10
- data/spec/unit/file_serving/fileset_spec.rb +58 -63
- data/spec/unit/file_serving/http_metadata_spec.rb +7 -8
- data/spec/unit/file_serving/metadata_spec.rb +36 -36
- data/spec/unit/file_serving/mount/file_spec.rb +32 -31
- data/spec/unit/file_serving/mount/locales_spec.rb +24 -23
- data/spec/unit/file_serving/mount/modules_spec.rb +15 -14
- data/spec/unit/file_serving/mount/pluginfacts_spec.rb +24 -23
- data/spec/unit/file_serving/mount/plugins_spec.rb +24 -23
- data/spec/unit/file_serving/mount/tasks_spec.rb +15 -14
- data/spec/unit/file_serving/mount_spec.rb +1 -0
- data/spec/unit/file_serving/terminus_helper_spec.rb +42 -37
- data/spec/unit/file_serving/terminus_selector_spec.rb +13 -12
- data/spec/unit/file_system/uniquefile_spec.rb +4 -4
- data/spec/unit/file_system_spec.rb +2 -2
- data/spec/unit/forge/errors_spec.rb +1 -1
- data/spec/unit/forge/forge_spec.rb +16 -17
- data/spec/unit/forge/module_release_spec.rb +18 -18
- data/spec/unit/forge/repository_spec.rb +30 -29
- data/spec/unit/forge_spec.rb +11 -15
- data/spec/unit/functions/binary_file_spec.rb +3 -3
- data/spec/unit/functions/contain_spec.rb +2 -0
- data/spec/unit/functions/defined_spec.rb +1 -0
- data/spec/unit/functions/epp_spec.rb +2 -2
- data/spec/unit/functions/find_file_spec.rb +7 -7
- data/spec/unit/functions/include_spec.rb +4 -0
- data/spec/unit/functions/lookup_fixture_spec.rb +1 -0
- data/spec/unit/functions/lookup_spec.rb +2 -1
- data/spec/unit/functions/module_directory_spec.rb +12 -12
- data/spec/unit/functions/new_spec.rb +0 -15
- data/spec/unit/functions/require_spec.rb +3 -0
- data/spec/unit/functions/shared.rb +8 -5
- data/spec/unit/functions/versioncmp_spec.rb +2 -1
- data/spec/unit/functions4_spec.rb +10 -9
- data/spec/unit/gettext/config_spec.rb +4 -4
- data/spec/unit/gettext/module_loading_spec.rb +7 -7
- data/spec/unit/graph/rb_tree_map_spec.rb +2 -0
- data/spec/unit/graph/relationship_graph_spec.rb +2 -1
- data/spec/unit/graph/simple_graph_spec.rb +10 -9
- data/spec/unit/hiera/scope_spec.rb +0 -7
- data/spec/unit/hiera_puppet_spec.rb +20 -20
- data/spec/unit/indirector/catalog/compiler_spec.rb +149 -147
- data/spec/unit/indirector/catalog/json_spec.rb +2 -1
- data/spec/unit/indirector/catalog/msgpack_spec.rb +1 -0
- data/spec/unit/indirector/catalog/rest_spec.rb +1 -0
- data/spec/unit/indirector/catalog/store_configs_spec.rb +1 -0
- data/spec/unit/indirector/catalog/yaml_spec.rb +1 -0
- data/spec/unit/indirector/certificate/file_spec.rb +1 -0
- data/spec/unit/indirector/certificate/rest_spec.rb +10 -8
- data/spec/unit/indirector/certificate_request/file_spec.rb +1 -0
- data/spec/unit/indirector/certificate_request/rest_spec.rb +1 -0
- data/spec/unit/indirector/direct_file_server_spec.rb +18 -17
- data/spec/unit/indirector/envelope_spec.rb +2 -1
- data/spec/unit/indirector/exec_spec.rb +5 -4
- data/spec/unit/indirector/face_spec.rb +9 -9
- data/spec/unit/indirector/facts/facter_spec.rb +43 -37
- data/spec/unit/indirector/facts/network_device_spec.rb +9 -8
- data/spec/unit/indirector/facts/rest_spec.rb +8 -7
- data/spec/unit/indirector/facts/store_configs_spec.rb +1 -0
- data/spec/unit/indirector/facts/yaml_spec.rb +1 -0
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +4 -3
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +1 -0
- data/spec/unit/indirector/file_bucket_file/selector_spec.rb +5 -4
- data/spec/unit/indirector/file_content/file_server_spec.rb +1 -0
- data/spec/unit/indirector/file_content/file_spec.rb +1 -0
- data/spec/unit/indirector/file_content/rest_spec.rb +1 -0
- data/spec/unit/indirector/file_content/selector_spec.rb +1 -0
- data/spec/unit/indirector/file_metadata/file_server_spec.rb +1 -0
- data/spec/unit/indirector/file_metadata/file_spec.rb +13 -12
- data/spec/unit/indirector/file_metadata/rest_spec.rb +1 -0
- data/spec/unit/indirector/file_metadata/selector_spec.rb +1 -0
- data/spec/unit/indirector/file_server_spec.rb +87 -87
- data/spec/unit/indirector/indirection_spec.rb +226 -242
- data/spec/unit/indirector/json_spec.rb +9 -7
- data/spec/unit/indirector/key/file_spec.rb +22 -21
- data/spec/unit/indirector/memory_spec.rb +7 -6
- data/spec/unit/indirector/msgpack_spec.rb +9 -7
- data/spec/unit/indirector/node/exec_spec.rb +3 -2
- data/spec/unit/indirector/node/memory_spec.rb +4 -2
- data/spec/unit/indirector/node/msgpack_spec.rb +1 -0
- data/spec/unit/indirector/node/plain_spec.rb +4 -2
- data/spec/unit/indirector/node/rest_spec.rb +1 -0
- data/spec/unit/indirector/node/store_configs_spec.rb +1 -0
- data/spec/unit/indirector/node/yaml_spec.rb +1 -0
- data/spec/unit/indirector/none_spec.rb +5 -5
- data/spec/unit/indirector/plain_spec.rb +8 -7
- data/spec/unit/indirector/report/msgpack_spec.rb +1 -0
- data/spec/unit/indirector/report/processor_spec.rb +22 -21
- data/spec/unit/indirector/report/rest_spec.rb +12 -11
- data/spec/unit/indirector/report/yaml_spec.rb +1 -0
- data/spec/unit/indirector/request_spec.rb +12 -11
- data/spec/unit/indirector/resource/ral_spec.rb +54 -47
- data/spec/unit/indirector/resource/store_configs_spec.rb +1 -0
- data/spec/unit/indirector/rest_spec.rb +110 -113
- data/spec/unit/indirector/ssl_file_spec.rb +65 -64
- data/spec/unit/indirector/status/local_spec.rb +1 -0
- data/spec/unit/indirector/status/rest_spec.rb +1 -0
- data/spec/unit/indirector/store_configs_spec.rb +1 -0
- data/spec/unit/indirector/terminus_spec.rb +27 -27
- data/spec/unit/indirector/yaml_spec.rb +6 -5
- data/spec/unit/indirector_spec.rb +2 -1
- data/spec/unit/info_service_spec.rb +1 -1
- data/spec/unit/interface/action_builder_spec.rb +1 -0
- data/spec/unit/interface/action_manager_spec.rb +1 -0
- data/spec/unit/interface/action_spec.rb +3 -2
- data/spec/unit/interface/documentation_spec.rb +1 -0
- data/spec/unit/interface/face_collection_spec.rb +12 -19
- data/spec/unit/interface_spec.rb +3 -3
- data/spec/unit/man_spec.rb +4 -3
- data/spec/unit/module_spec.rb +51 -46
- data/spec/unit/module_tool/applications/installer_spec.rb +11 -10
- data/spec/unit/module_tool/applications/searcher_spec.rb +3 -3
- data/spec/unit/module_tool/applications/uninstaller_spec.rb +2 -1
- data/spec/unit/module_tool/applications/unpacker_spec.rb +13 -13
- data/spec/unit/module_tool/applications/upgrader_spec.rb +5 -5
- data/spec/unit/module_tool/install_directory_spec.rb +8 -8
- data/spec/unit/module_tool/installed_modules_spec.rb +3 -3
- data/spec/unit/module_tool/tar/gnu_spec.rb +6 -6
- data/spec/unit/module_tool/tar/mini_spec.rb +12 -12
- data/spec/unit/module_tool/tar_spec.rb +13 -12
- data/spec/unit/module_tool_spec.rb +12 -7
- data/spec/unit/network/auth_config_parser_spec.rb +13 -11
- data/spec/unit/network/authconfig_spec.rb +18 -17
- data/spec/unit/network/authorization_spec.rb +5 -4
- data/spec/unit/network/authstore_spec.rb +1 -0
- data/spec/unit/network/format_handler_spec.rb +1 -0
- data/spec/unit/network/format_spec.rb +10 -9
- data/spec/unit/network/format_support_spec.rb +29 -28
- data/spec/unit/network/formats_spec.rb +5 -4
- data/spec/unit/network/http/api/indirected_routes_spec.rb +29 -24
- data/spec/unit/network/http/api/master/v3/authorization_spec.rb +2 -2
- data/spec/unit/network/http/api/master/v3/environment_spec.rb +1 -1
- data/spec/unit/network/http/api/master/v3/environments_spec.rb +7 -6
- data/spec/unit/network/http/api_spec.rb +2 -0
- data/spec/unit/network/http/compression_spec.rb +22 -21
- data/spec/unit/network/http/connection_spec.rb +121 -30
- data/spec/unit/network/http/factory_spec.rb +6 -11
- data/spec/unit/network/http/handler_spec.rb +18 -9
- data/spec/unit/network/http/nocache_pool_spec.rb +7 -6
- data/spec/unit/network/http/pool_spec.rb +29 -28
- data/spec/unit/network/http/request_spec.rb +2 -0
- data/spec/unit/network/http/response_spec.rb +13 -11
- data/spec/unit/network/http/route_spec.rb +1 -0
- data/spec/unit/network/http/session_spec.rb +2 -1
- data/spec/unit/network/http/site_spec.rb +1 -0
- data/spec/unit/network/http_pool_spec.rb +9 -18
- data/spec/unit/network/http_spec.rb +1 -0
- data/spec/unit/network/resolver_spec.rb +26 -25
- data/spec/unit/network/rights_spec.rb +53 -52
- data/spec/unit/node/environment_spec.rb +15 -14
- data/spec/unit/node/facts_spec.rb +7 -5
- data/spec/unit/node_spec.rb +10 -4
- data/spec/unit/other/selinux_spec.rb +1 -0
- data/spec/unit/parameter/boolean_spec.rb +2 -1
- data/spec/unit/parameter/package_options_spec.rb +2 -1
- data/spec/unit/parameter/path_spec.rb +1 -0
- data/spec/unit/parameter/value_collection_spec.rb +1 -0
- data/spec/unit/parameter/value_spec.rb +1 -0
- data/spec/unit/parameter_spec.rb +9 -9
- data/spec/unit/parser/ast/block_expression_spec.rb +8 -6
- data/spec/unit/parser/ast/leaf_spec.rb +21 -20
- data/spec/unit/parser/compiler_spec.rb +96 -84
- data/spec/unit/parser/environment_compiler_spec.rb +8 -7
- data/spec/unit/parser/files_spec.rb +1 -0
- data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
- data/spec/unit/parser/functions/digest_spec.rb +1 -0
- data/spec/unit/parser/functions/fail_spec.rb +2 -1
- data/spec/unit/parser/functions/file_spec.rb +14 -13
- data/spec/unit/parser/functions/fqdn_rand_spec.rb +6 -5
- data/spec/unit/parser/functions/generate_spec.rb +8 -7
- data/spec/unit/parser/functions/inline_template_spec.rb +1 -0
- data/spec/unit/parser/functions/regsubst_spec.rb +1 -0
- data/spec/unit/parser/functions/scanf_spec.rb +1 -0
- data/spec/unit/parser/functions/shellquote_spec.rb +1 -0
- data/spec/unit/parser/functions/split_spec.rb +1 -0
- data/spec/unit/parser/functions/sprintf_spec.rb +1 -0
- data/spec/unit/parser/functions/tag_spec.rb +2 -1
- data/spec/unit/parser/functions/tagged_spec.rb +3 -2
- data/spec/unit/parser/functions/template_spec.rb +13 -13
- data/spec/unit/parser/functions/versioncmp_spec.rb +2 -1
- data/spec/unit/parser/functions_spec.rb +7 -6
- data/spec/unit/parser/relationship_spec.rb +1 -0
- data/spec/unit/parser/resource_spec.rb +42 -42
- data/spec/unit/parser/scope_spec.rb +35 -39
- data/spec/unit/parser/templatewrapper_spec.rb +12 -11
- data/spec/unit/parser/type_loader_spec.rb +19 -17
- data/spec/unit/pops/adaptable_spec.rb +1 -0
- data/spec/unit/pops/benchmark_spec.rb +1 -0
- data/spec/unit/pops/evaluator/access_ops_spec.rb +1 -0
- data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +1 -0
- data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -0
- data/spec/unit/pops/evaluator/collections_ops_spec.rb +1 -0
- data/spec/unit/pops/evaluator/comparison_ops_spec.rb +1 -0
- data/spec/unit/pops/evaluator/conditionals_spec.rb +1 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +47 -10
- data/spec/unit/pops/evaluator/logical_ops_spec.rb +1 -0
- data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +1 -0
- data/spec/unit/pops/evaluator/string_interpolation_spec.rb +1 -0
- data/spec/unit/pops/evaluator/variables_spec.rb +1 -0
- data/spec/unit/pops/factory_spec.rb +4 -3
- data/spec/unit/pops/issues_spec.rb +20 -19
- data/spec/unit/pops/loaders/loader_spec.rb +4 -8
- data/spec/unit/pops/loaders/loaders_spec.rb +31 -101
- data/spec/unit/pops/lookup/context_spec.rb +1 -0
- data/spec/unit/pops/lookup/interpolation_spec.rb +3 -2
- data/spec/unit/pops/merge_strategy_spec.rb +1 -0
- data/spec/unit/pops/migration_spec.rb +5 -3
- data/spec/unit/pops/model/model_spec.rb +1 -0
- data/spec/unit/pops/model/pn_transformer_spec.rb +1 -4
- data/spec/unit/pops/parser/locator_spec.rb +6 -48
- data/spec/unit/pops/parser/parse_application_spec.rb +1 -0
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +1 -0
- data/spec/unit/pops/parser/parse_calls_spec.rb +1 -0
- data/spec/unit/pops/parser/parse_capabilities_spec.rb +1 -0
- data/spec/unit/pops/parser/parse_conditionals_spec.rb +1 -0
- data/spec/unit/pops/parser/parse_containers_spec.rb +1 -0
- data/spec/unit/pops/parser/parse_heredoc_spec.rb +15 -111
- data/spec/unit/pops/parser/parse_plan_spec.rb +1 -0
- data/spec/unit/pops/parser/parse_resource_spec.rb +1 -0
- data/spec/unit/pops/parser/parse_site_spec.rb +1 -0
- data/spec/unit/pops/parser/pn_parser_spec.rb +1 -0
- data/spec/unit/pops/pn_spec.rb +1 -0
- data/spec/unit/pops/resource/resource_type_impl_spec.rb +1 -0
- data/spec/unit/pops/serialization/serialization_spec.rb +1 -1
- data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
- data/spec/unit/pops/types/recursion_guard_spec.rb +10 -10
- data/spec/unit/pops/types/ruby_generator_spec.rb +2 -2
- data/spec/unit/pops/types/string_converter_spec.rb +5 -1
- data/spec/unit/pops/types/type_asserter_spec.rb +2 -2
- data/spec/unit/pops/types/type_calculator_spec.rb +30 -30
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +0 -9
- data/spec/unit/pops/types/type_parser_spec.rb +13 -13
- data/spec/unit/pops/validator/validator_spec.rb +2 -1
- data/spec/unit/pops/visitor_spec.rb +1 -0
- data/spec/unit/property/boolean_spec.rb +1 -1
- data/spec/unit/property/ensure_spec.rb +1 -0
- data/spec/unit/property/keyvalue_spec.rb +34 -32
- data/spec/unit/property/list_spec.rb +27 -26
- data/spec/unit/property/ordered_list_spec.rb +14 -10
- data/spec/unit/property_spec.rb +43 -42
- data/spec/unit/provider/aix_object_spec.rb +45 -47
- data/spec/unit/provider/command_spec.rb +9 -9
- data/spec/unit/provider/exec/posix_spec.rb +31 -6
- data/spec/unit/provider/exec/shell_spec.rb +1 -0
- data/spec/unit/provider/exec/windows_spec.rb +4 -2
- data/spec/unit/provider/exec_spec.rb +1 -0
- data/spec/unit/provider/file/posix_spec.rb +24 -22
- data/spec/unit/provider/file/windows_spec.rb +17 -15
- data/spec/unit/provider/group/aix_spec.rb +2 -3
- data/spec/unit/provider/group/groupadd_spec.rb +26 -30
- data/spec/unit/provider/group/ldap_spec.rb +18 -18
- data/spec/unit/provider/group/pw_spec.rb +11 -11
- data/spec/unit/provider/group/windows_adsi_spec.rb +53 -59
- data/spec/unit/provider/ldap_spec.rb +62 -61
- data/spec/unit/provider/nameservice/directoryservice_spec.rb +36 -35
- data/spec/unit/provider/nameservice_spec.rb +40 -38
- data/spec/unit/provider/package/aix_spec.rb +15 -15
- data/spec/unit/provider/package/appdmg_spec.rb +13 -13
- data/spec/unit/provider/package/apt_spec.rb +27 -44
- data/spec/unit/provider/package/aptitude_spec.rb +7 -6
- data/spec/unit/provider/package/aptrpm_spec.rb +12 -7
- data/spec/unit/provider/package/base_spec.rb +4 -4
- data/spec/unit/provider/package/dnf_spec.rb +20 -18
- data/spec/unit/provider/package/dpkg_spec.rb +53 -70
- data/spec/unit/provider/package/freebsd_spec.rb +11 -11
- data/spec/unit/provider/package/gem_spec.rb +55 -132
- data/spec/unit/provider/package/hpux_spec.rb +8 -8
- data/spec/unit/provider/package/macports_spec.rb +42 -46
- data/spec/unit/provider/package/nim_spec.rb +39 -30
- data/spec/unit/provider/package/openbsd_spec.rb +39 -36
- data/spec/unit/provider/package/opkg_spec.rb +26 -23
- data/spec/unit/provider/package/pacman_spec.rb +118 -97
- data/spec/unit/provider/package/pip3_spec.rb +0 -17
- data/spec/unit/provider/package/pip_spec.rb +106 -95
- data/spec/unit/provider/package/pkg_spec.rb +109 -109
- data/spec/unit/provider/package/pkgdmg_spec.rb +63 -65
- data/spec/unit/provider/package/pkgin_spec.rb +8 -10
- data/spec/unit/provider/package/pkgng_spec.rb +31 -22
- data/spec/unit/provider/package/pkgutil_spec.rb +49 -45
- data/spec/unit/provider/package/portage_spec.rb +74 -70
- data/spec/unit/provider/package/puppet_gem_spec.rb +13 -37
- data/spec/unit/provider/package/rpm_spec.rb +76 -154
- data/spec/unit/provider/package/sun_spec.rb +18 -16
- data/spec/unit/provider/package/tdnf_spec.rb +2 -2
- data/spec/unit/provider/package/up2date_spec.rb +4 -2
- data/spec/unit/provider/package/urpmi_spec.rb +17 -15
- data/spec/unit/provider/package/windows/exe_package_spec.rb +15 -12
- data/spec/unit/provider/package/windows/msi_package_spec.rb +22 -19
- data/spec/unit/provider/package/windows/package_spec.rb +42 -37
- data/spec/unit/provider/package/windows_spec.rb +32 -47
- data/spec/unit/provider/package/yum_spec.rb +7 -7
- data/spec/unit/provider/package/zypper_spec.rb +87 -87
- data/spec/unit/provider/parsedfile_spec.rb +45 -44
- data/spec/unit/provider/service/base_spec.rb +5 -4
- data/spec/unit/provider/service/bsd_spec.rb +29 -27
- data/spec/unit/provider/service/daemontools_spec.rb +35 -35
- data/spec/unit/provider/service/debian_spec.rb +38 -38
- data/spec/unit/provider/service/freebsd_spec.rb +18 -18
- data/spec/unit/provider/service/gentoo_spec.rb +55 -50
- data/spec/unit/provider/service/init_spec.rb +52 -53
- data/spec/unit/provider/service/launchd_spec.rb +116 -138
- data/spec/unit/provider/service/openbsd_spec.rb +50 -50
- data/spec/unit/provider/service/openrc_spec.rb +45 -43
- data/spec/unit/provider/service/openwrt_spec.rb +31 -26
- data/spec/unit/provider/service/rcng_spec.rb +14 -14
- data/spec/unit/provider/service/redhat_spec.rb +43 -45
- data/spec/unit/provider/service/runit_spec.rb +27 -29
- data/spec/unit/provider/service/smf_spec.rb +66 -74
- data/spec/unit/provider/service/src_spec.rb +47 -46
- data/spec/unit/provider/service/systemd_spec.rb +136 -109
- data/spec/unit/provider/service/upstart_spec.rb +93 -77
- data/spec/unit/provider/service/windows_spec.rb +41 -33
- data/spec/unit/provider/user/aix_spec.rb +31 -31
- data/spec/unit/provider/user/directoryservice_spec.rb +114 -146
- data/spec/unit/provider/user/hpux_spec.rb +16 -16
- data/spec/unit/provider/user/ldap_spec.rb +57 -57
- data/spec/unit/provider/user/openbsd_spec.rb +12 -10
- data/spec/unit/provider/user/pw_spec.rb +35 -37
- data/spec/unit/provider/user/user_role_add_spec.rb +93 -93
- data/spec/unit/provider/user/useradd_spec.rb +92 -93
- data/spec/unit/provider/user/windows_adsi_spec.rb +60 -59
- data/spec/unit/provider_spec.rb +35 -35
- data/spec/unit/puppet_pal_2pec.rb +5 -4
- data/spec/unit/puppet_pal_spec.rb +1 -0
- data/spec/unit/puppet_spec.rb +7 -6
- data/spec/unit/relationship_spec.rb +1 -0
- data/spec/unit/reports/http_spec.rb +23 -21
- data/spec/unit/reports/store_spec.rb +4 -3
- data/spec/unit/reports_spec.rb +14 -12
- data/spec/unit/resource/capability_finder_spec.rb +17 -15
- data/spec/unit/resource/catalog_spec.rb +68 -72
- data/spec/unit/resource/status_spec.rb +8 -6
- data/spec/unit/resource/type_collection_spec.rb +18 -17
- data/spec/unit/resource/type_spec.rb +35 -34
- data/spec/unit/resource_spec.rb +63 -36
- data/spec/unit/rest/client_spec.rb +135 -0
- data/spec/unit/rest/route_spec.rb +6 -6
- data/spec/unit/scheduler/job_spec.rb +1 -0
- data/spec/unit/scheduler/scheduler_spec.rb +1 -0
- data/spec/unit/scheduler/splay_job_spec.rb +2 -1
- data/spec/unit/settings/array_setting_spec.rb +1 -1
- data/spec/unit/settings/autosign_setting_spec.rb +9 -9
- data/spec/unit/settings/certificate_revocation_setting_spec.rb +1 -1
- data/spec/unit/settings/config_file_spec.rb +1 -0
- data/spec/unit/settings/directory_setting_spec.rb +7 -2
- data/spec/unit/settings/duration_setting_spec.rb +2 -1
- data/spec/unit/settings/enum_setting_spec.rb +1 -1
- data/spec/unit/settings/environment_conf_spec.rb +6 -4
- data/spec/unit/settings/file_setting_spec.rb +46 -44
- data/spec/unit/settings/path_setting_spec.rb +2 -1
- data/spec/unit/settings/priority_setting_spec.rb +2 -1
- data/spec/unit/settings/string_setting_spec.rb +15 -14
- data/spec/unit/settings/terminus_setting_spec.rb +2 -1
- data/spec/unit/settings/value_translator_spec.rb +1 -0
- data/spec/unit/settings_spec.rb +224 -253
- data/spec/unit/ssl/base_spec.rb +15 -14
- data/spec/unit/ssl/certificate_request_spec.rb +58 -62
- data/spec/unit/ssl/certificate_spec.rb +25 -23
- data/spec/unit/ssl/digest_spec.rb +1 -0
- data/spec/unit/ssl/host_spec.rb +149 -166
- data/spec/unit/ssl/key_spec.rb +31 -30
- data/spec/unit/ssl/validator_spec.rb +39 -40
- data/spec/unit/task_spec.rb +45 -44
- data/spec/unit/transaction/additional_resource_generator_spec.rb +5 -3
- data/spec/unit/transaction/event_manager_spec.rb +88 -87
- data/spec/unit/transaction/event_spec.rb +15 -16
- data/spec/unit/transaction/persistence_spec.rb +17 -16
- data/spec/unit/transaction/report_spec.rb +12 -11
- data/spec/unit/transaction/resource_harness_spec.rb +31 -52
- data/spec/unit/transaction_spec.rb +87 -140
- data/spec/unit/type/component_spec.rb +1 -0
- data/spec/unit/type/exec_spec.rb +50 -101
- data/spec/unit/type/file/checksum_spec.rb +10 -9
- data/spec/unit/type/file/checksum_value_spec.rb +32 -31
- data/spec/unit/type/file/content_spec.rb +61 -58
- data/spec/unit/type/file/ctime_spec.rb +1 -0
- data/spec/unit/type/file/ensure_spec.rb +13 -12
- data/spec/unit/type/file/group_spec.rb +7 -5
- data/spec/unit/type/file/mode_spec.rb +6 -4
- data/spec/unit/type/file/mtime_spec.rb +1 -0
- data/spec/unit/type/file/owner_spec.rb +8 -6
- data/spec/unit/type/file/selinux_spec.rb +19 -17
- data/spec/unit/type/file/source_spec.rb +101 -104
- data/spec/unit/type/file/type_spec.rb +1 -0
- data/spec/unit/type/file_spec.rb +185 -195
- data/spec/unit/type/filebucket_spec.rb +10 -11
- data/spec/unit/type/group_spec.rb +8 -6
- data/spec/unit/type/noop_metaparam_spec.rb +2 -1
- data/spec/unit/type/package/package_settings_spec.rb +23 -44
- data/spec/unit/type/package_spec.rb +57 -56
- data/spec/unit/type/resources_spec.rb +74 -72
- data/spec/unit/type/schedule_spec.rb +26 -24
- data/spec/unit/type/service_spec.rb +75 -49
- data/spec/unit/type/stage_spec.rb +1 -0
- data/spec/unit/type/tidy_spec.rb +62 -61
- data/spec/unit/type/user_spec.rb +25 -24
- data/spec/unit/type/whit_spec.rb +1 -0
- data/spec/unit/type_spec.rb +54 -55
- data/spec/unit/util/at_fork_spec.rb +19 -18
- data/spec/unit/util/autoload_spec.rb +56 -55
- data/spec/unit/util/backups_spec.rb +35 -34
- data/spec/unit/util/character_encoding_spec.rb +5 -5
- data/spec/unit/util/checksums_spec.rb +39 -38
- data/spec/unit/util/colors_spec.rb +2 -1
- data/spec/unit/util/command_line_spec.rb +20 -40
- data/spec/unit/util/constant_inflector_spec.rb +1 -0
- data/spec/unit/util/diff_spec.rb +8 -7
- data/spec/unit/util/errors_spec.rb +1 -0
- data/spec/unit/util/execution_spec.rb +163 -187
- data/spec/unit/util/execution_stub_spec.rb +1 -0
- data/spec/unit/util/feature_spec.rb +14 -21
- data/spec/unit/util/filetype_spec.rb +49 -49
- data/spec/unit/util/http_proxy_spec.rb +12 -12
- data/spec/unit/util/inifile_spec.rb +31 -26
- data/spec/unit/util/json_lockfile_spec.rb +5 -3
- data/spec/unit/util/ldap/connection_spec.rb +25 -26
- data/spec/unit/util/ldap/generator_spec.rb +1 -0
- data/spec/unit/util/ldap/manager_spec.rb +101 -102
- data/spec/unit/util/lockfile_spec.rb +1 -0
- data/spec/unit/util/log/destinations_spec.rb +33 -30
- data/spec/unit/util/log_spec.rb +34 -48
- data/spec/unit/util/logging_spec.rb +72 -58
- data/spec/unit/util/metric_spec.rb +1 -0
- data/spec/unit/util/monkey_patches_spec.rb +9 -7
- data/spec/unit/util/multi_match_spec.rb +1 -0
- data/spec/unit/util/network_device/config_spec.rb +1 -0
- data/spec/unit/util/network_device/transport/base_spec.rb +6 -5
- data/spec/unit/util/network_device_spec.rb +9 -7
- data/spec/unit/util/package_spec.rb +1 -0
- data/spec/unit/util/pidlock_spec.rb +15 -60
- data/spec/unit/util/plist_spec.rb +33 -40
- data/spec/unit/util/posix_spec.rb +51 -54
- data/spec/unit/util/rdoc_spec.rb +10 -9
- data/spec/unit/util/reference_spec.rb +1 -0
- data/spec/unit/util/resource_template_spec.rb +20 -20
- data/spec/unit/util/retry_action_spec.rb +8 -7
- data/spec/unit/util/rubygems_spec.rb +8 -7
- data/spec/unit/util/run_mode_spec.rb +4 -3
- data/spec/unit/util/selinux_spec.rb +72 -79
- data/spec/unit/util/splayer_spec.rb +9 -8
- data/spec/unit/util/ssl_spec.rb +1 -0
- data/spec/unit/util/storage_spec.rb +23 -22
- data/spec/unit/util/suidmanager_spec.rb +54 -45
- data/spec/unit/util/symbolic_file_mode_spec.rb +1 -0
- data/spec/unit/util/tag_set_spec.rb +1 -0
- data/spec/unit/util/tagging_spec.rb +1 -0
- data/spec/unit/util/terminal_spec.rb +10 -9
- data/spec/unit/util/user_attr_spec.rb +2 -1
- data/spec/unit/util/warnings_spec.rb +4 -3
- data/spec/unit/util/watcher/periodic_watcher_spec.rb +2 -2
- data/spec/unit/util/watcher_spec.rb +21 -51
- data/spec/unit/util/windows/access_control_entry_spec.rb +1 -0
- data/spec/unit/util/windows/access_control_list_spec.rb +1 -0
- data/spec/unit/util/windows/adsi_spec.rb +138 -136
- data/spec/unit/util/windows/api_types_spec.rb +1 -0
- data/spec/unit/util/windows/eventlog_spec.rb +12 -9
- data/spec/unit/util/windows/file_spec.rb +1 -0
- data/spec/unit/util/windows/root_certs_spec.rb +1 -0
- data/spec/unit/util/windows/security_descriptor_spec.rb +2 -0
- data/spec/unit/util/windows/service_spec.rb +103 -100
- data/spec/unit/util/windows/sid_spec.rb +13 -11
- data/spec/unit/util/windows/string_spec.rb +1 -0
- data/spec/unit/util_spec.rb +57 -55
- data/spec/unit/version_spec.rb +6 -6
- metadata +20 -32
- data/CODEOWNERS +0 -30
- data/ext/autotest/Rakefile +0 -8
- data/ext/autotest/config +0 -43
- data/ext/autotest/readme.rst +0 -16
- data/lib/puppet/confine/boolean.rb +0 -45
- data/lib/puppet/provider/package_targetable.rb +0 -68
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/usee/lib/puppet/parser/functions/bad_func_load2.rb +0 -11
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/usee/lib/puppet/parser/functions/bad_func_load3.rb +0 -11
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/usee/lib/puppet/parser/functions/bad_func_load4.rb +0 -11
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/usee/lib/puppet/parser/functions/bad_func_load5.rb +0 -12
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/usee/lib/puppet/parser/functions/good_func_load.rb +0 -9
- data/spec/fixtures/unit/provider/package/pkgng/pkg.info +0 -7
- data/spec/fixtures/unit/provider/package/pkgng/pkg.query_absent +0 -1
- data/spec/integration/network/http_pool_spec.rb +0 -120
- data/spec/integration/provider/file/windows_spec.rb +0 -162
- data/spec/lib/puppet_spec/https.rb +0 -166
- data/spec/unit/settings/server_list_setting_spec.rb +0 -21
- data/spec/watchr.rb +0 -137
@@ -274,7 +274,7 @@ module Puppet::Util::Windows::Security
|
|
274
274
|
# mode. Only a user with the SE_BACKUP_NAME and SE_RESTORE_NAME
|
275
275
|
# privileges in their process token can change the mode for objects
|
276
276
|
# that they do not have read and write access to.
|
277
|
-
def set_mode(mode, path, protected = true
|
277
|
+
def set_mode(mode, path, protected = true)
|
278
278
|
sd = get_security_descriptor(path)
|
279
279
|
well_known_world_sid = Puppet::Util::Windows::SID::Everyone
|
280
280
|
well_known_nobody_sid = Puppet::Util::Windows::SID::Nobody
|
@@ -319,8 +319,6 @@ module Puppet::Util::Windows::Security
|
|
319
319
|
nobody_allow |= FILE::FILE_APPEND_DATA;
|
320
320
|
end
|
321
321
|
|
322
|
-
isownergroup = sd.owner == sd.group
|
323
|
-
|
324
322
|
# caller is NOT managing SYSTEM by using group or owner, so set to FULL
|
325
323
|
if ! [sd.owner, sd.group].include? well_known_system_sid
|
326
324
|
# we don't check S_ISYSTEM_MISSING bit, but automatically carry over existing SYSTEM perms
|
@@ -330,35 +328,15 @@ module Puppet::Util::Windows::Security
|
|
330
328
|
# It is possible to set SYSTEM with a mode other than Full Control (7) however this makes no sense and in practical terms
|
331
329
|
# should not be done. We can trap these instances and correct them before being applied.
|
332
330
|
if (sd.owner == well_known_system_sid) && (owner_allow != FILE::FILE_ALL_ACCESS)
|
333
|
-
#
|
334
|
-
|
335
|
-
|
336
|
-
#TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
|
337
|
-
Puppet.warning _("Setting control rights for %{path} owner SYSTEM to less than Full Control rights. Setting SYSTEM rights to less than Full Control may have unintented consequences for operations on this file") % { path: path }
|
338
|
-
elsif managing_owner && isownergroup
|
339
|
-
#TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
|
340
|
-
Puppet.debug _("%{path} owner and group both set to user SYSTEM, but group is not managed directly: SYSTEM user rights will be set to FullControl by group") % { path: path }
|
341
|
-
else
|
342
|
-
#TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
|
343
|
-
Puppet.debug _("An attempt to set mode %{mode} on item %{path} would result in the owner, SYSTEM, to have less than Full Control rights. This attempt has been corrected to Full Control") % { mode: mode.to_s(8), path: path }
|
344
|
-
owner_allow = FILE::FILE_ALL_ACCESS
|
345
|
-
end
|
331
|
+
#TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
|
332
|
+
Puppet.debug _("An attempt to set mode %{mode} on item %{path} would result in the owner, SYSTEM, to have less than Full Control rights. This attempt has been corrected to Full Control") % { mode: mode.to_s(8), path: path }
|
333
|
+
owner_allow = FILE::FILE_ALL_ACCESS
|
346
334
|
end
|
347
335
|
|
348
336
|
if (sd.group == well_known_system_sid) && (group_allow != FILE::FILE_ALL_ACCESS)
|
349
|
-
#
|
350
|
-
|
351
|
-
|
352
|
-
#TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
|
353
|
-
Puppet.warning _("Setting control rights for %{path} group SYSTEM to less than Full Control rights. Setting SYSTEM rights to less than Full Control may have unintented consequences for operations on this file") % { path: path }
|
354
|
-
elsif managing_group && isownergroup
|
355
|
-
#TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
|
356
|
-
Puppet.debug _("%{path} owner and group both set to user SYSTEM, but owner is not managed directly: SYSTEM user rights will be set to FullControl by owner") % { path: path }
|
357
|
-
else
|
358
|
-
#TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
|
359
|
-
Puppet.debug _("An attempt to set mode %{mode} on item %{path} would result in the group, SYSTEM, to have less than Full Control rights. This attempt has been corrected to Full Control") % { mode: mode.to_s(8), path: path }
|
360
|
-
group_allow = FILE::FILE_ALL_ACCESS
|
361
|
-
end
|
337
|
+
#TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
|
338
|
+
Puppet.debug _("An attempt to set mode %{mode} on item %{path} would result in the group, SYSTEM, to have less than Full Control rights. This attempt has been corrected to Full Control") % { mode: mode.to_s(8), path: path }
|
339
|
+
group_allow = FILE::FILE_ALL_ACCESS
|
362
340
|
end
|
363
341
|
end
|
364
342
|
|
@@ -375,6 +353,7 @@ module Puppet::Util::Windows::Security
|
|
375
353
|
end
|
376
354
|
|
377
355
|
# if owner and group the same, then map group permissions to the one owner ACE
|
356
|
+
isownergroup = sd.owner == sd.group
|
378
357
|
if isownergroup
|
379
358
|
owner_allow |= group_allow
|
380
359
|
end
|
@@ -282,7 +282,7 @@ module Puppet::Util::Windows
|
|
282
282
|
|
283
283
|
# Returns true if the service exists, false otherwise.
|
284
284
|
#
|
285
|
-
# @param [
|
285
|
+
# @param [String] service_name name of the service
|
286
286
|
def exists?(service_name)
|
287
287
|
open_service(service_name, SC_MANAGER_CONNECT, SERVICE_QUERY_STATUS) do |_|
|
288
288
|
true
|
@@ -295,9 +295,10 @@ module Puppet::Util::Windows
|
|
295
295
|
|
296
296
|
# Start a windows service
|
297
297
|
#
|
298
|
-
# @param [
|
299
|
-
|
300
|
-
|
298
|
+
# @param [String] service_name name of the service to start
|
299
|
+
# @param optional [Integer] timeout the minumum number of seconds to wait before timing out
|
300
|
+
def start(service_name, timeout: DEFAULT_TIMEOUT)
|
301
|
+
Puppet.debug _("Starting the %{service_name} service. Timeout set to: %{timeout} seconds") % { service_name: service_name, timeout: timeout }
|
301
302
|
|
302
303
|
valid_initial_states = [
|
303
304
|
SERVICE_STOP_PENDING,
|
@@ -305,7 +306,7 @@ module Puppet::Util::Windows
|
|
305
306
|
SERVICE_START_PENDING
|
306
307
|
]
|
307
308
|
|
308
|
-
transition_service_state(service_name, valid_initial_states, SERVICE_RUNNING) do |service|
|
309
|
+
transition_service_state(service_name, valid_initial_states, SERVICE_RUNNING, timeout) do |service|
|
309
310
|
if StartServiceW(service, 0, FFI::Pointer::NULL) == FFI::WIN32_FALSE
|
310
311
|
raise Puppet::Util::Windows::Error, _("Failed to start the service")
|
311
312
|
end
|
@@ -317,13 +318,14 @@ module Puppet::Util::Windows
|
|
317
318
|
|
318
319
|
# Stop a windows service
|
319
320
|
#
|
320
|
-
# @param [
|
321
|
-
|
322
|
-
|
321
|
+
# @param [String] service_name name of the service to stop
|
322
|
+
# @param optional [Integer] timeout the minumum number of seconds to wait before timing out
|
323
|
+
def stop(service_name, timeout: DEFAULT_TIMEOUT)
|
324
|
+
Puppet.debug _("Stopping the %{service_name} service. Timeout set to: %{timeout} seconds") % { service_name: service_name, timeout: timeout }
|
323
325
|
|
324
326
|
valid_initial_states = SERVICE_STATES.keys - [SERVICE_STOPPED]
|
325
327
|
|
326
|
-
transition_service_state(service_name, valid_initial_states, SERVICE_STOPPED) do |service|
|
328
|
+
transition_service_state(service_name, valid_initial_states, SERVICE_STOPPED, timeout) do |service|
|
327
329
|
send_service_control_signal(service, SERVICE_CONTROL_STOP)
|
328
330
|
end
|
329
331
|
|
@@ -333,9 +335,10 @@ module Puppet::Util::Windows
|
|
333
335
|
|
334
336
|
# Resume a paused windows service
|
335
337
|
#
|
336
|
-
# @param [
|
337
|
-
|
338
|
-
|
338
|
+
# @param [String] service_name name of the service to resume
|
339
|
+
# @param optional [Integer] :timeout the minumum number of seconds to wait before timing out
|
340
|
+
def resume(service_name, timeout: DEFAULT_TIMEOUT)
|
341
|
+
Puppet.debug _("Resuming the %{service_name} service. Timeout set to: %{timeout} seconds") % { service_name: service_name, timeout: timeout }
|
339
342
|
|
340
343
|
valid_initial_states = [
|
341
344
|
SERVICE_PAUSE_PENDING,
|
@@ -343,10 +346,10 @@ module Puppet::Util::Windows
|
|
343
346
|
SERVICE_CONTINUE_PENDING
|
344
347
|
]
|
345
348
|
|
346
|
-
transition_service_state(service_name, valid_initial_states, SERVICE_RUNNING) do |service|
|
349
|
+
transition_service_state(service_name, valid_initial_states, SERVICE_RUNNING, timeout) do |service|
|
347
350
|
# The SERVICE_CONTROL_CONTINUE signal can only be sent when
|
348
351
|
# the service is in the SERVICE_PAUSED state
|
349
|
-
wait_on_pending_state(service, SERVICE_PAUSE_PENDING)
|
352
|
+
wait_on_pending_state(service, SERVICE_PAUSE_PENDING, timeout)
|
350
353
|
|
351
354
|
send_service_control_signal(service, SERVICE_CONTROL_CONTINUE)
|
352
355
|
end
|
@@ -357,7 +360,7 @@ module Puppet::Util::Windows
|
|
357
360
|
|
358
361
|
# Query the state of a service using QueryServiceStatusEx
|
359
362
|
#
|
360
|
-
# @param [
|
363
|
+
# @param [string] service_name name of the service to query
|
361
364
|
# @return [string] the status of the service
|
362
365
|
def service_state(service_name)
|
363
366
|
state = nil
|
@@ -375,7 +378,7 @@ module Puppet::Util::Windows
|
|
375
378
|
|
376
379
|
# Query the configuration of a service using QueryServiceConfigW
|
377
380
|
#
|
378
|
-
# @param [
|
381
|
+
# @param [String] service_name name of the service to query
|
379
382
|
# @return [QUERY_SERVICE_CONFIGW.struct] the configuration of the service
|
380
383
|
def service_start_type(service_name)
|
381
384
|
start_type = nil
|
@@ -560,8 +563,9 @@ module Puppet::Util::Windows
|
|
560
563
|
#
|
561
564
|
# @param [String] service_name the name of the service to transition
|
562
565
|
# @param [[Integer]] valid_initial_states an array of valid states that the service can transition from
|
563
|
-
# @param [
|
564
|
-
|
566
|
+
# @param [Integer] final_state the state that the service will transition to
|
567
|
+
# @param [Integer] timeout the minumum number of seconds to wait before timing out
|
568
|
+
def transition_service_state(service_name, valid_initial_states, final_state, timeout, &block)
|
565
569
|
service_access = SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_QUERY_STATUS
|
566
570
|
open_service(service_name, SC_MANAGER_CONNECT, service_access) do |service|
|
567
571
|
query_status(service) do |status|
|
@@ -593,7 +597,7 @@ module Puppet::Util::Windows
|
|
593
597
|
end
|
594
598
|
if possible_pending_states.include?(initial_state)
|
595
599
|
Puppet.debug _("There is already a pending transition to the %{final_state} state for the %{service_name} service.") % { final_state: SERVICE_STATES[final_state], service_name: service_name }
|
596
|
-
wait_on_pending_state(service, initial_state)
|
600
|
+
wait_on_pending_state(service, initial_state, timeout)
|
597
601
|
|
598
602
|
next
|
599
603
|
end
|
@@ -609,7 +613,7 @@ module Puppet::Util::Windows
|
|
609
613
|
# to perform the state transition (it may not even exist).
|
610
614
|
if UNSAFE_PENDING_STATES.include?(initial_state)
|
611
615
|
Puppet.debug _("The service is in the %{pending_state} state, which is an unsafe pending state.") % { pending_state: SERVICE_STATES[initial_state] }
|
612
|
-
wait_on_pending_state(service, initial_state)
|
616
|
+
wait_on_pending_state(service, initial_state, timeout)
|
613
617
|
initial_state = FINAL_STATES[initial_state]
|
614
618
|
end
|
615
619
|
|
@@ -618,7 +622,7 @@ module Puppet::Util::Windows
|
|
618
622
|
yield service
|
619
623
|
|
620
624
|
Puppet.debug _("Waiting for the transition to finish")
|
621
|
-
wait_on_state_transition(service, initial_state, final_state)
|
625
|
+
wait_on_state_transition(service, initial_state, final_state, timeout)
|
622
626
|
end
|
623
627
|
end
|
624
628
|
rescue => detail
|
@@ -726,7 +730,8 @@ module Puppet::Util::Windows
|
|
726
730
|
# @param [:handle] service handle to the service to wait on
|
727
731
|
# @param [Integer] initial_state the state that the service is transitioning from.
|
728
732
|
# @param [Integer] final_state the state that the service is transitioning to
|
729
|
-
|
733
|
+
# @param [Integer] timeout the minumum number of seconds to wait before timing out
|
734
|
+
def wait_on_state_transition(service, initial_state, final_state, timeout)
|
730
735
|
# Get the pending state for this transition. Note that SERVICE_RUNNING
|
731
736
|
# has two possible pending states, which is why we need this logic.
|
732
737
|
if final_state != SERVICE_RUNNING
|
@@ -742,14 +747,14 @@ module Puppet::Util::Windows
|
|
742
747
|
# Wait for the transition to finish
|
743
748
|
state = nil
|
744
749
|
elapsed_time = 0
|
745
|
-
while elapsed_time <=
|
750
|
+
while elapsed_time <= timeout
|
746
751
|
|
747
752
|
query_status(service) do |status|
|
748
753
|
state = status[:dwCurrentState]
|
749
754
|
return if state == final_state
|
750
755
|
if state == pending_state
|
751
756
|
Puppet.debug _("The service transitioned to the %{pending_state} state.") % { pending_state: SERVICE_STATES[pending_state] }
|
752
|
-
wait_on_pending_state(service, pending_state)
|
757
|
+
wait_on_pending_state(service, pending_state, timeout)
|
753
758
|
return
|
754
759
|
end
|
755
760
|
sleep(1)
|
@@ -773,7 +778,8 @@ module Puppet::Util::Windows
|
|
773
778
|
#
|
774
779
|
# @param [:handle] service handle to the service to wait on
|
775
780
|
# @param [Integer] pending_state the pending state
|
776
|
-
|
781
|
+
# @param [Integer] timeout the minumum number of seconds to wait before timing out
|
782
|
+
def wait_on_pending_state(service, pending_state, timeout)
|
777
783
|
final_state = FINAL_STATES[pending_state]
|
778
784
|
|
779
785
|
Puppet.debug _("Waiting for the pending transition to the %{final_state} state to finish.") % { final_state: SERVICE_STATES[final_state] }
|
@@ -800,8 +806,8 @@ module Puppet::Util::Windows
|
|
800
806
|
elapsed_time = 0
|
801
807
|
last_checkpoint = checkpoint
|
802
808
|
else
|
803
|
-
|
804
|
-
timeout =
|
809
|
+
wait_hint = milliseconds_to_seconds(status[:dwWaitHint])
|
810
|
+
timeout = wait_hint < timeout ? timeout : wait_hint
|
805
811
|
|
806
812
|
if elapsed_time >= timeout
|
807
813
|
raise Puppet::Error, _("Timed out while waiting for the pending transition from %{pending_state} to %{final_state} to finish. The current state is %{current_state}.") % { pending_state: SERVICE_STATES[pending_state], final_state: SERVICE_STATES[final_state], current_state: SERVICE_STATES[state] }
|
@@ -75,18 +75,15 @@ module Puppet::Util::Windows::User
|
|
75
75
|
module_function :password_is?
|
76
76
|
|
77
77
|
def logon_user(name, password, &block)
|
78
|
-
fLOGON32_PROVIDER_DEFAULT = 0
|
79
|
-
fLOGON32_LOGON_INTERACTIVE = 2
|
80
78
|
fLOGON32_LOGON_NETWORK = 3
|
79
|
+
fLOGON32_PROVIDER_DEFAULT = 0
|
81
80
|
|
82
81
|
token = nil
|
83
82
|
begin
|
84
83
|
FFI::MemoryPointer.new(:handle, 1) do |token_pointer|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
raise Puppet::Util::Windows::Error.new(_("Failed to logon user %{name}") % {name: name.inspect})
|
89
|
-
end
|
84
|
+
if LogonUserW(wide_string(name), wide_string('.'), password.nil? ? FFI::Pointer::NULL : wide_string(password),
|
85
|
+
fLOGON32_LOGON_NETWORK, fLOGON32_PROVIDER_DEFAULT, token_pointer) == FFI::WIN32_FALSE
|
86
|
+
raise Puppet::Util::Windows::Error.new(_("Failed to logon user %{name}") % { name: name.inspect })
|
90
87
|
end
|
91
88
|
|
92
89
|
yield token = token_pointer.read_handle
|
@@ -98,15 +95,8 @@ module Puppet::Util::Windows::User
|
|
98
95
|
# token has been closed by this point
|
99
96
|
true
|
100
97
|
end
|
101
|
-
|
102
98
|
module_function :logon_user
|
103
99
|
|
104
|
-
def self.logon_user_by_logon_type(name, password, logon_type, logon_provider, token)
|
105
|
-
LogonUserW(wide_string(name), wide_string('.'), password.nil? ? FFI::Pointer::NULL : wide_string(password), logon_type, logon_provider, token)
|
106
|
-
end
|
107
|
-
|
108
|
-
private_class_method :logon_user_by_logon_type
|
109
|
-
|
110
100
|
def load_profile(user, password)
|
111
101
|
logon_user(user, password) do |token|
|
112
102
|
FFI::MemoryPointer.from_string_to_wide_string(user) do |lpUserName|
|
data/lib/puppet/version.rb
CHANGED
data/lib/puppet_pal.rb
CHANGED
@@ -1,1135 +1,8 @@
|
|
1
1
|
# Puppet as a Library "PAL"
|
2
|
-
|
3
|
-
# Yes, this requires all of puppet for now because 'settings' and many other things...
|
4
|
-
require 'puppet'
|
5
|
-
require 'puppet/parser/script_compiler'
|
6
|
-
require 'puppet/parser/catalog_compiler'
|
7
|
-
|
8
|
-
# This is the main entry point for "Puppet As a Library" PAL.
|
9
|
-
# This file should be required instead of "puppet"
|
10
|
-
# Initially, this will require ALL of puppet - over time this will change as the monolithical "puppet" is broken up
|
11
|
-
# into smaller components.
|
12
|
-
#
|
13
|
-
# @example Running a snippet of Puppet Language code
|
14
|
-
# require 'puppet_pal'
|
15
|
-
# result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: ['/tmp/testmodules']) do |pal|
|
16
|
-
# pal.evaluate_script_string('1+2+3')
|
17
|
-
# end
|
18
|
-
# # The result is the value 6
|
2
|
+
# This is the entry point when using PAL as a standalone library.
|
19
3
|
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
# result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: ['/tmp/testmodules']) do |pal|
|
23
|
-
# pal.call_function('mymodule::myfunction', 10, 20)
|
24
|
-
# end
|
25
|
-
# # The result is what 'mymodule::myfunction' returns
|
4
|
+
# This requires all of puppet because 'settings' and many other things are still required in PAL.
|
5
|
+
# Eventually that will not be the case.
|
26
6
|
#
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
# A configured compiler as obtained in the callback from `with_script_compiler`.
|
31
|
-
# (Later, there may also be a catalog compiler available.)
|
32
|
-
#
|
33
|
-
class Compiler
|
34
|
-
attr_reader :internal_compiler
|
35
|
-
protected :internal_compiler
|
36
|
-
|
37
|
-
attr_reader :internal_evaluator
|
38
|
-
protected :internal_evaluator
|
39
|
-
|
40
|
-
def initialize(internal_compiler)
|
41
|
-
@internal_compiler = internal_compiler
|
42
|
-
@internal_evaluator = Puppet::Pops::Parser::EvaluatingParser.new
|
43
|
-
end
|
44
|
-
|
45
|
-
# Calls a function given by name with arguments specified in an `Array`, and optionally accepts a code block.
|
46
|
-
# @param function_name [String] the name of the function to call
|
47
|
-
# @param args [Object] the arguments to the function
|
48
|
-
# @param block [Proc] an optional callable block that is given to the called function
|
49
|
-
# @return [Object] what the called function returns
|
50
|
-
#
|
51
|
-
def call_function(function_name, *args, &block)
|
52
|
-
# TRANSLATORS: do not translate variable name strings in these assertions
|
53
|
-
Pal::assert_non_empty_string(function_name, 'function_name', false)
|
54
|
-
Pal::assert_type(Pal::T_ANY_ARRAY, args, 'args', false)
|
55
|
-
internal_evaluator.evaluator.external_call_function(function_name, args, topscope, &block)
|
56
|
-
end
|
57
|
-
|
58
|
-
# Returns a Puppet::Pal::FunctionSignature object or nil if function is not found
|
59
|
-
# The returned FunctionSignature has information about all overloaded signatures of the function
|
60
|
-
#
|
61
|
-
# @example using function_signature
|
62
|
-
# # returns true if 'myfunc' is callable with three integer arguments 1, 2, 3
|
63
|
-
# compiler.function_signature('myfunc').callable_with?([1,2,3])
|
64
|
-
#
|
65
|
-
# @param function_name [String] the name of the function to get a signature for
|
66
|
-
# @return [Puppet::Pal::FunctionSignature] a function signature, or nil if function not found
|
67
|
-
#
|
68
|
-
def function_signature(function_name)
|
69
|
-
loader = internal_compiler.loaders.private_environment_loader
|
70
|
-
if func = loader.load(:function, function_name)
|
71
|
-
return FunctionSignature.new(func.class)
|
72
|
-
end
|
73
|
-
# Could not find function
|
74
|
-
nil
|
75
|
-
end
|
76
|
-
|
77
|
-
# Returns an array of TypedName objects for all functions, optionally filtered by a regular expression.
|
78
|
-
# The returned array has more information than just the leaf name - the typical thing is to just get
|
79
|
-
# the name as showing the following example.
|
80
|
-
#
|
81
|
-
# Errors that occur during function discovery will either be logged as warnings or collected by the optional
|
82
|
-
# `error_collector` array. When provided, it will receive {Puppet::DataTypes::Error} instances describing
|
83
|
-
# each error in detail and no warnings will be logged.
|
84
|
-
#
|
85
|
-
# @example getting the names of all functions
|
86
|
-
# compiler.list_functions.map {|tn| tn.name }
|
87
|
-
#
|
88
|
-
# @param filter_regex [Regexp] an optional regexp that filters based on name (matching names are included in the result)
|
89
|
-
# @param error_collector [Array<Puppet::DataTypes::Error>] an optional array that will receive errors during load
|
90
|
-
# @return [Array<Puppet::Pops::Loader::TypedName>] an array of typed names
|
91
|
-
#
|
92
|
-
def list_functions(filter_regex = nil, error_collector = nil)
|
93
|
-
list_loadable_kind(:function, filter_regex, error_collector)
|
94
|
-
end
|
95
|
-
|
96
|
-
# Evaluates a string of puppet language code in top scope.
|
97
|
-
# A "source_file" reference to a source can be given - if not an actual file name, by convention the name should
|
98
|
-
# be bracketed with < > to indicate it is something symbolic; for example `<commandline>` if the string was given on the
|
99
|
-
# command line.
|
100
|
-
#
|
101
|
-
# If the given `puppet_code` is `nil` or an empty string, `nil` is returned, otherwise the result of evaluating the
|
102
|
-
# puppet language string. The given string must form a complete and valid expression/statement as an error is raised
|
103
|
-
# otherwise. That is, it is not possible to divide a compound expression by line and evaluate each line individually.
|
104
|
-
#
|
105
|
-
# @param puppet_code [String, nil] the puppet language code to evaluate, must be a complete expression/statement
|
106
|
-
# @param source_file [String, nil] an optional reference to a source (a file or symbolic name/location)
|
107
|
-
# @return [Object] what the `puppet_code` evaluates to
|
108
|
-
#
|
109
|
-
def evaluate_string(puppet_code, source_file = nil)
|
110
|
-
return nil if puppet_code.nil? || puppet_code == ''
|
111
|
-
unless puppet_code.is_a?(String)
|
112
|
-
raise ArgumentError, _("The argument 'puppet_code' must be a String, got %{type}") % { type: puppet_code.class }
|
113
|
-
end
|
114
|
-
evaluate(parse_string(puppet_code, source_file))
|
115
|
-
end
|
116
|
-
|
117
|
-
# Evaluates a puppet language file in top scope.
|
118
|
-
# The file must exist and contain valid puppet language code or an error is raised.
|
119
|
-
#
|
120
|
-
# @param file [Path, String] an absolute path to a file with puppet language code, must exist
|
121
|
-
# @return [Object] what the last evaluated expression in the file evaluated to
|
122
|
-
#
|
123
|
-
def evaluate_file(file)
|
124
|
-
evaluate(parse_file(file))
|
125
|
-
end
|
126
|
-
|
127
|
-
# Evaluates an AST obtained from `parse_string` or `parse_file` in topscope.
|
128
|
-
# If the ast is a `Puppet::Pops::Model::Program` (what is returned from the `parse` methods, any definitions
|
129
|
-
# in the program (that is, any function, plan, etc. that is defined will be made available for use).
|
130
|
-
#
|
131
|
-
# @param ast [Puppet::Pops::Model::PopsObject] typically the returned `Program` from the parse methods, but can be any `Expression`
|
132
|
-
# @returns [Object] whatever the ast evaluates to
|
133
|
-
#
|
134
|
-
def evaluate(ast)
|
135
|
-
if ast.is_a?(Puppet::Pops::Model::Program)
|
136
|
-
loaders = Puppet.lookup(:loaders)
|
137
|
-
loaders.instantiate_definitions(ast, loaders.public_environment_loader)
|
138
|
-
end
|
139
|
-
internal_evaluator.evaluate(topscope, ast)
|
140
|
-
end
|
141
|
-
|
142
|
-
# Produces a literal value if the AST obtained from `parse_string` or `parse_file` does not require any actual evaluation.
|
143
|
-
# This method is useful if obtaining an AST that represents literal values; string, integer, float, boolean, regexp, array, hash;
|
144
|
-
# for example from having read this from the command line or as values in some file.
|
145
|
-
#
|
146
|
-
# @param ast [Puppet::Pops::Model::PopsObject] typically the returned `Program` from the parse methods, but can be any `Expression`
|
147
|
-
# @returns [Object] whatever the literal value the ast evaluates to
|
148
|
-
#
|
149
|
-
def evaluate_literal(ast)
|
150
|
-
catch :not_literal do
|
151
|
-
return Puppet::Pops::Evaluator::LiteralEvaluator.new().literal(ast)
|
152
|
-
end
|
153
|
-
# TRANSLATORS, the 'ast' is the name of a parameter, do not translate
|
154
|
-
raise ArgumentError, _("The given 'ast' does not represent a literal value")
|
155
|
-
end
|
156
|
-
|
157
|
-
# Parses and validates a puppet language string and returns an instance of Puppet::Pops::Model::Program on success.
|
158
|
-
# If the content is not valid an error is raised.
|
159
|
-
#
|
160
|
-
# @param code_string [String] a puppet language string to parse and validate
|
161
|
-
# @param source_file [String] an optional reference to a file or other location in angled brackets
|
162
|
-
# @return [Puppet::Pops::Model::Program] returns a `Program` instance on success
|
163
|
-
#
|
164
|
-
def parse_string(code_string, source_file = nil)
|
165
|
-
unless code_string.is_a?(String)
|
166
|
-
raise ArgumentError, _("The argument 'code_string' must be a String, got %{type}") % { type: code_string.class }
|
167
|
-
end
|
168
|
-
internal_evaluator.parse_string(code_string, source_file)
|
169
|
-
end
|
170
|
-
|
171
|
-
# Parses and validates a puppet language file and returns an instance of Puppet::Pops::Model::Program on success.
|
172
|
-
# If the content is not valid an error is raised.
|
173
|
-
#
|
174
|
-
# @param file [String] a file with puppet language content to parse and validate
|
175
|
-
# @return [Puppet::Pops::Model::Program] returns a `Program` instance on success
|
176
|
-
#
|
177
|
-
def parse_file(file)
|
178
|
-
unless file.is_a?(String)
|
179
|
-
raise ArgumentError, _("The argument 'file' must be a String, got %{type}") % { type: file.class }
|
180
|
-
end
|
181
|
-
internal_evaluator.parse_file(file)
|
182
|
-
end
|
183
|
-
|
184
|
-
# Parses a puppet data type given in String format and returns that type, or raises an error.
|
185
|
-
# A type is needed in calls to `new` to create an instance of the data type, or to perform type checking
|
186
|
-
# of values - typically using `type.instance?(obj)` to check if `obj` is an instance of the type.
|
187
|
-
#
|
188
|
-
# @example Verify if obj is an instance of a data type
|
189
|
-
# # evaluates to true
|
190
|
-
# pal.type('Enum[red, blue]').instance?("blue")
|
191
|
-
#
|
192
|
-
# @example Create an instance of a data type
|
193
|
-
# # using an already create type
|
194
|
-
# t = pal.type('Car')
|
195
|
-
# pal.create(t, 'color' => 'black', 'make' => 't-ford')
|
196
|
-
#
|
197
|
-
# # letting 'new_object' parse the type from a string
|
198
|
-
# pal.create('Car', 'color' => 'black', 'make' => 't-ford')
|
199
|
-
#
|
200
|
-
# @param type_string [String] a puppet language data type
|
201
|
-
# @return [Puppet::Pops::Types::PAnyType] the data type
|
202
|
-
#
|
203
|
-
def type(type_string)
|
204
|
-
Puppet::Pops::Types::TypeParser.singleton.parse(type_string)
|
205
|
-
end
|
206
|
-
|
207
|
-
# Creates a new instance of a given data type.
|
208
|
-
# @param data_type [String, Puppet::Pops::Types::PAnyType] the data type as a data type or in String form.
|
209
|
-
# @param arguments [Object] one or more arguments to the called `new` function
|
210
|
-
# @return [Object] an instance of the given data type,
|
211
|
-
# or raises an error if it was not possible to parse data type or create an instance.
|
212
|
-
#
|
213
|
-
def create(data_type, *arguments)
|
214
|
-
t = data_type.is_a?(String) ? type(data_type) : data_type
|
215
|
-
unless t.is_a?(Puppet::Pops::Types::PAnyType)
|
216
|
-
raise ArgumentError, _("Given data_type value is not a data type, got '%{type}'") % {type: t.class}
|
217
|
-
end
|
218
|
-
call_function('new', t, *arguments)
|
219
|
-
end
|
220
|
-
|
221
|
-
# Returns true if this is a compiler that compiles a catalog.
|
222
|
-
# This implementation returns `false`
|
223
|
-
# @return Boolan false
|
224
|
-
def has_catalog?
|
225
|
-
false
|
226
|
-
end
|
227
|
-
|
228
|
-
protected
|
229
|
-
|
230
|
-
def list_loadable_kind(kind, filter_regex = nil, error_collector = nil)
|
231
|
-
loader = internal_compiler.loaders.private_environment_loader
|
232
|
-
if filter_regex.nil?
|
233
|
-
loader.discover(kind, error_collector)
|
234
|
-
else
|
235
|
-
loader.discover(kind, error_collector) {|f| f.name =~ filter_regex }
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
private
|
240
|
-
|
241
|
-
def topscope
|
242
|
-
internal_compiler.topscope
|
243
|
-
end
|
244
|
-
end
|
245
|
-
|
246
|
-
class ScriptCompiler < Compiler
|
247
|
-
# Returns the signature of the given plan name
|
248
|
-
# @param plan_name [String] the name of the plan to get the signature of
|
249
|
-
# @return [Puppet::Pal::PlanSignature, nil] returns a PlanSignature, or nil if plan is not found
|
250
|
-
#
|
251
|
-
def plan_signature(plan_name)
|
252
|
-
loader = internal_compiler.loaders.private_environment_loader
|
253
|
-
if func = loader.load(:plan, plan_name)
|
254
|
-
return PlanSignature.new(func)
|
255
|
-
end
|
256
|
-
# Could not find plan
|
257
|
-
nil
|
258
|
-
end
|
259
|
-
|
260
|
-
# Returns an array of TypedName objects for all plans, optionally filtered by a regular expression.
|
261
|
-
# The returned array has more information than just the leaf name - the typical thing is to just get
|
262
|
-
# the name as showing the following example.
|
263
|
-
#
|
264
|
-
# Errors that occur during plan discovery will either be logged as warnings or collected by the optional
|
265
|
-
# `error_collector` array. When provided, it will receive {Puppet::DataTypes::Error} instances describing
|
266
|
-
# each error in detail and no warnings will be logged.
|
267
|
-
#
|
268
|
-
# @example getting the names of all plans
|
269
|
-
# compiler.list_plans.map {|tn| tn.name }
|
270
|
-
#
|
271
|
-
# @param filter_regex [Regexp] an optional regexp that filters based on name (matching names are included in the result)
|
272
|
-
# @param error_collector [Array<Puppet::DataTypes::Error>] an optional array that will receive errors during load
|
273
|
-
# @return [Array<Puppet::Pops::Loader::TypedName>] an array of typed names
|
274
|
-
#
|
275
|
-
def list_plans(filter_regex = nil, error_collector = nil)
|
276
|
-
list_loadable_kind(:plan, filter_regex, error_collector)
|
277
|
-
end
|
278
|
-
|
279
|
-
# Returns the signature callable of the given task (the arguments it accepts, and the data type it returns)
|
280
|
-
# @param task_name [String] the name of the task to get the signature of
|
281
|
-
# @return [Puppet::Pal::TaskSignature, nil] returns a TaskSignature, or nil if task is not found
|
282
|
-
#
|
283
|
-
def task_signature(task_name)
|
284
|
-
loader = internal_compiler.loaders.private_environment_loader
|
285
|
-
if task = loader.load(:task, task_name)
|
286
|
-
return TaskSignature.new(task)
|
287
|
-
end
|
288
|
-
# Could not find task
|
289
|
-
nil
|
290
|
-
end
|
291
|
-
|
292
|
-
# Returns an array of TypedName objects for all tasks, optionally filtered by a regular expression.
|
293
|
-
# The returned array has more information than just the leaf name - the typical thing is to just get
|
294
|
-
# the name as showing the following example.
|
295
|
-
#
|
296
|
-
# @example getting the names of all tasks
|
297
|
-
# compiler.list_tasks.map {|tn| tn.name }
|
298
|
-
#
|
299
|
-
# Errors that occur during task discovery will either be logged as warnings or collected by the optional
|
300
|
-
# `error_collector` array. When provided, it will receive {Puppet::DataTypes::Error} instances describing
|
301
|
-
# each error in detail and no warnings will be logged.
|
302
|
-
#
|
303
|
-
# @param filter_regex [Regexp] an optional regexp that filters based on name (matching names are included in the result)
|
304
|
-
# @param error_collector [Array<Puppet::DataTypes::Error>] an optional array that will receive errors during load
|
305
|
-
# @return [Array<Puppet::Pops::Loader::TypedName>] an array of typed names
|
306
|
-
#
|
307
|
-
def list_tasks(filter_regex = nil, error_collector = nil)
|
308
|
-
list_loadable_kind(:task, filter_regex, error_collector)
|
309
|
-
end
|
310
|
-
end
|
311
|
-
|
312
|
-
# A CatalogCompiler is a compiler that builds a catalog of resources and dependencies as a side effect of
|
313
|
-
# evaluating puppet language code.
|
314
|
-
# When the compilation of the given input manifest(s)/code string/file is finished the catalog is complete
|
315
|
-
# for encoding and use. It is also possible to evaluate more strings within the same compilation context to
|
316
|
-
# add or remove things from the catalog.
|
317
|
-
#
|
318
|
-
# @api public
|
319
|
-
class CatalogCompiler < Compiler
|
320
|
-
|
321
|
-
# @api private
|
322
|
-
def catalog
|
323
|
-
internal_compiler.catalog
|
324
|
-
end
|
325
|
-
private :catalog
|
326
|
-
|
327
|
-
# Returns true if this is a compiler that compiles a catalog.
|
328
|
-
# This implementation returns `true`
|
329
|
-
# @return [Boolean] true
|
330
|
-
# @api public
|
331
|
-
def has_catalog?
|
332
|
-
true
|
333
|
-
end
|
334
|
-
|
335
|
-
# Calls a block of code and yields a configured `JsonCatalogEncoder` to the block.
|
336
|
-
# @example Get resulting catalog as pretty printed Json
|
337
|
-
# Puppet::Pal.in_environment(...) do |pal|
|
338
|
-
# pal.with_catalog_compiler(...) do |compiler|
|
339
|
-
# compiler.with_json_encoding {| encoder | encoder.encode
|
340
|
-
# end
|
341
|
-
# end
|
342
|
-
#
|
343
|
-
# @api public
|
344
|
-
#
|
345
|
-
def with_json_encoding(pretty: true, exclude_virtual: true)
|
346
|
-
yield JsonCatalogEncoder.new(catalog, pretty: pretty, exclude_virtual: exclude_virtual)
|
347
|
-
end
|
348
|
-
|
349
|
-
# Evaluates an AST obtained from `parse_string` or `parse_file` in topscope.
|
350
|
-
# If the ast is a `Puppet::Pops::Model::Program` (what is returned from the `parse` methods, any definitions
|
351
|
-
# in the program (that is, any function, plan, etc. that is defined will be made available for use).
|
352
|
-
#
|
353
|
-
# @param ast [Puppet::Pops::Model::PopsObject] typically the returned `Program` from the parse methods, but can be any `Expression`
|
354
|
-
# @returns [Object] whatever the ast evaluates to
|
355
|
-
#
|
356
|
-
def evaluate(ast)
|
357
|
-
if ast.is_a?(Puppet::Pops::Model::Program)
|
358
|
-
bridged = Puppet::Parser::AST::PopsBridge::Program.new(ast)
|
359
|
-
# define all catalog types
|
360
|
-
internal_compiler.environment.known_resource_types.import_ast(bridged, "")
|
361
|
-
bridged.evaluate(internal_compiler.topscope)
|
362
|
-
else
|
363
|
-
internal_evaluator.evaluate(topscope, ast)
|
364
|
-
end
|
365
|
-
end
|
366
|
-
|
367
|
-
|
368
|
-
# Compiles the result of additional evaluation taking place in a PAL catalog compilation.
|
369
|
-
# This will evaluate all lazy constructs until all have been evaluated, and will the validate
|
370
|
-
# the result.
|
371
|
-
#
|
372
|
-
# This should be called if evaluating string or files of puppet logic after the initial
|
373
|
-
# compilation taking place by giving PAL a manifest or code-string.
|
374
|
-
# This method should be called when a series of evaluation should have reached a
|
375
|
-
# valid state (there should be no dangling relationships (to resources that does not
|
376
|
-
# exist).
|
377
|
-
#
|
378
|
-
# As an alternative the methods `evaluate_additions` can be called without any
|
379
|
-
# requirements on consistency and then calling `validate` at the end.
|
380
|
-
#
|
381
|
-
# Can be called multiple times.
|
382
|
-
#
|
383
|
-
# @return [Void]
|
384
|
-
def compile_additions
|
385
|
-
internal_compiler.compile_additions
|
386
|
-
end
|
387
|
-
|
388
|
-
# Validates the state of the catalog (without performing evaluation of any elements
|
389
|
-
# requiring lazy evaluation. Can be called multiple times.
|
390
|
-
#
|
391
|
-
def validate
|
392
|
-
internal_compiler.validate
|
393
|
-
end
|
394
|
-
|
395
|
-
# Evaluates all lazy constructs that were produced as a side effect of evaluating puppet logic.
|
396
|
-
# Can be called multiple times.
|
397
|
-
#
|
398
|
-
def evaluate_additions
|
399
|
-
internal_compiler.evaluate_additions
|
400
|
-
end
|
401
|
-
|
402
|
-
end
|
403
|
-
|
404
|
-
# The JsonCatalogEncoder is a wrapper around a catalog produced by the Pal::CatalogCompiler.with_json_encoding
|
405
|
-
# method.
|
406
|
-
# It allows encoding the entire catalog or an individual resource as Rich Data Json.
|
407
|
-
#
|
408
|
-
# @api public
|
409
|
-
#
|
410
|
-
class JsonCatalogEncoder
|
411
|
-
# Is the resulting Json pretty printed or not.
|
412
|
-
attr_reader :pretty
|
413
|
-
|
414
|
-
# Should unrealized virtual resources be included in the result or not.
|
415
|
-
attr_reader :exclude_virtual
|
416
|
-
|
417
|
-
# The internal catalog being build - what this class wraps with a public API.
|
418
|
-
attr_reader :catalog
|
419
|
-
private :catalog
|
420
|
-
|
421
|
-
# Do not instantiate this class directly! Use the `Pal::CatalogCompiler#with_json_encoding` method
|
422
|
-
# instead.
|
423
|
-
#
|
424
|
-
# @param catalog [Puppet::Resource::Catalog] the internal catalog that this class wraps
|
425
|
-
# @param pretty [Boolean] (true), if the resulting JSON should be pretty printed or not
|
426
|
-
# @param exclude_virtual [Boolean] (true), if the resulting catalog should contain unrealzed virtual resources or not
|
427
|
-
#
|
428
|
-
# @api private
|
429
|
-
#
|
430
|
-
def initialize(catalog, pretty: true, exclude_virtual: true)
|
431
|
-
@catalog = catalog
|
432
|
-
@pretty = pretty
|
433
|
-
@exclude_virtual = exclude_virtual
|
434
|
-
end
|
435
|
-
|
436
|
-
# Encodes the entire catalog as a rich-data Json catalog.
|
437
|
-
# @return String The catalog in Json format using rich data format
|
438
|
-
# @api public
|
439
|
-
#
|
440
|
-
def encode
|
441
|
-
possibly_filtered_catalog.to_json(:pretty => pretty)
|
442
|
-
end
|
443
|
-
|
444
|
-
# Returns one particular resource as a Json string, or returns nil if resource was not found.
|
445
|
-
# @param type [String] the name of the puppet type (case independent)
|
446
|
-
# @param title [String] the title of the wanted resource
|
447
|
-
# @return [String] the resulting Json text
|
448
|
-
# @api public
|
449
|
-
#
|
450
|
-
def encode_resource(type, title)
|
451
|
-
# Ensure that both type and title are given since the underlying API will do mysterious things
|
452
|
-
# if 'title' is nil. (Other assertions are made by the catalog when looking up the resource).
|
453
|
-
#
|
454
|
-
# TRANSLATORS 'type' and 'title' are internal parameter names - do not translate
|
455
|
-
raise ArgumentError, _("Both type and title must be given") if type.nil? or title.nil?
|
456
|
-
r = possibly_filtered_catalog.resource(type, title)
|
457
|
-
return nil if r.nil?
|
458
|
-
r.to_data_hash.to_json(:pretty => pretty)
|
459
|
-
end
|
460
|
-
|
461
|
-
# Applies a filter for virtual resources and returns filtered catalog
|
462
|
-
# or the catalog itself if filtering was not needed.
|
463
|
-
# The result is cached.
|
464
|
-
# @api private
|
465
|
-
#
|
466
|
-
def possibly_filtered_catalog
|
467
|
-
@filtered ||= (exclude_virtual ? catalog.filter { |r| r.virtual? } : catalog)
|
468
|
-
end
|
469
|
-
private :possibly_filtered_catalog
|
470
|
-
end
|
471
|
-
|
472
|
-
# A FunctionSignature is returned from `function_signature`. Its purpose is to answer questions about the function's parameters
|
473
|
-
# and if it can be called with a set of parameters.
|
474
|
-
#
|
475
|
-
# It is also possible to get an array of puppet Callable data type where each callable describes one possible way
|
476
|
-
# the function can be called.
|
477
|
-
#
|
478
|
-
# @api public
|
479
|
-
#
|
480
|
-
class FunctionSignature
|
481
|
-
# @api private
|
482
|
-
def initialize(function_class)
|
483
|
-
@func = function_class
|
484
|
-
end
|
485
|
-
|
486
|
-
# Returns true if the function can be called with the given arguments and false otherwise.
|
487
|
-
# If the function is not callable, and a code block is given, it is given a formatted error message that describes
|
488
|
-
# the type mismatch. That error message can be quite complex if the function has multiple dispatch depending on
|
489
|
-
# given types.
|
490
|
-
#
|
491
|
-
# @param args [Array] The arguments as given to the function call
|
492
|
-
# @param callable [Proc, nil] An optional ruby Proc or puppet lambda given to the function
|
493
|
-
# @yield [String] a formatted error message describing a type mismatch if the function is not callable with given args + block
|
494
|
-
# @return [Boolean] true if the function can be called with given args + block, and false otherwise
|
495
|
-
# @api public
|
496
|
-
#
|
497
|
-
def callable_with?(args, callable=nil)
|
498
|
-
signatures = @func.dispatcher.to_type
|
499
|
-
callables = signatures.is_a?(Puppet::Pops::Types::PVariantType) ? signatures.types : [signatures]
|
500
|
-
|
501
|
-
return true if callables.any? {|t| t.callable_with?(args) }
|
502
|
-
return false unless block_given?
|
503
|
-
args_type = Puppet::Pops::Types::TypeCalculator.singleton.infer_set(callable.nil? ? args : args + [callable])
|
504
|
-
error_message = Puppet::Pops::Types::TypeMismatchDescriber.describe_signatures(@func.name, @func.signatures, args_type)
|
505
|
-
yield error_message
|
506
|
-
false
|
507
|
-
end
|
508
|
-
|
509
|
-
# Returns an array of Callable puppet data type
|
510
|
-
# @return [Array<Puppet::Pops::Types::PCallableType] one callable per way the function can be called
|
511
|
-
#
|
512
|
-
# @api public
|
513
|
-
#
|
514
|
-
def callables
|
515
|
-
signatures = @func.dispatcher.to_type
|
516
|
-
signatures.is_a?(Puppet::Pops::Types::PVariantType) ? signatures.types : [signatures]
|
517
|
-
end
|
518
|
-
end
|
519
|
-
|
520
|
-
# A TaskSignature is returned from `task_signature`. Its purpose is to answer questions about the task's parameters
|
521
|
-
# and if it can be run/called with a hash of named parameters.
|
522
|
-
#
|
523
|
-
class TaskSignature
|
524
|
-
def initialize(task)
|
525
|
-
@task = task
|
526
|
-
end
|
527
|
-
|
528
|
-
# Returns whether or not the given arguments are acceptable when running the task.
|
529
|
-
# In addition to returning the boolean outcome, if a block is given, it is called with a string of formatted
|
530
|
-
# error messages that describes the difference between what was given and what is expected. The error message may
|
531
|
-
# have multiple lines of text, and each line is indented one space.
|
532
|
-
#
|
533
|
-
# @param args_hash [Hash] a hash mapping parameter names to argument values
|
534
|
-
# @yieldparam [String] a formatted error message if a type mismatch occurs that explains the mismatch
|
535
|
-
# @return [Boolean] if the given arguments are acceptable when running the task
|
536
|
-
#
|
537
|
-
def runnable_with?(args_hash)
|
538
|
-
params = @task.parameters
|
539
|
-
params_type = if params.nil?
|
540
|
-
T_GENERIC_TASK_HASH
|
541
|
-
else
|
542
|
-
Puppet::Pops::Types::TypeFactory.struct(params)
|
543
|
-
end
|
544
|
-
return true if params_type.instance?(args_hash)
|
545
|
-
|
546
|
-
if block_given?
|
547
|
-
tm = Puppet::Pops::Types::TypeMismatchDescriber.singleton
|
548
|
-
error = if params.nil?
|
549
|
-
tm.describe_mismatch('', params_type, Puppet::Pops::Types::TypeCalculator.infer_set(args_hash))
|
550
|
-
else
|
551
|
-
tm.describe_struct_signature(params_type, args_hash).flatten.map {|e| e.format }.join("\n")
|
552
|
-
end
|
553
|
-
yield "Task #{@task.name}:\n#{error}"
|
554
|
-
end
|
555
|
-
false
|
556
|
-
end
|
557
|
-
|
558
|
-
# Returns the Task instance as a hash
|
559
|
-
#
|
560
|
-
# @return [Hash{String=>Object}] the hash representation of the task
|
561
|
-
def task_hash
|
562
|
-
@task._pcore_init_hash
|
563
|
-
end
|
564
|
-
|
565
|
-
# Returns the Task instance which can be further explored. It contains all meta-data defined for
|
566
|
-
# the task such as the description, parameters, output, etc.
|
567
|
-
#
|
568
|
-
# @return [Puppet::Pops::Types::PuppetObject] An instance of a dynamically created Task class
|
569
|
-
def task
|
570
|
-
@task
|
571
|
-
end
|
572
|
-
end
|
573
|
-
|
574
|
-
# A PlanSignature is returned from `plan_signature`. Its purpose is to answer questions about the plans's parameters
|
575
|
-
# and if it can be called with a hash of named parameters.
|
576
|
-
#
|
577
|
-
# @api public
|
578
|
-
#
|
579
|
-
class PlanSignature
|
580
|
-
def initialize(plan_function)
|
581
|
-
@plan_func = plan_function
|
582
|
-
end
|
583
|
-
|
584
|
-
# Returns true or false depending on if the given PlanSignature is callable with a set of named arguments or not
|
585
|
-
# In addition to returning the boolean outcome, if a block is given, it is called with a string of formatted
|
586
|
-
# error messages that describes the difference between what was given and what is expected. The error message may
|
587
|
-
# have multiple lines of text, and each line is indented one space.
|
588
|
-
#
|
589
|
-
# @example Checking if signature is acceptable
|
590
|
-
#
|
591
|
-
# signature = pal.plan_signature('myplan')
|
592
|
-
# signature.callable_with?({x => 10}) { |errors| raise ArgumentError("Ooops: given arguments does not match\n#{errors}") }
|
593
|
-
#
|
594
|
-
# @api public
|
595
|
-
#
|
596
|
-
def callable_with?(args_hash)
|
597
|
-
dispatcher = @plan_func.class.dispatcher.dispatchers[0]
|
598
|
-
|
599
|
-
param_scope = {}
|
600
|
-
# Assign all non-nil values, even those that represent non-existent parameters.
|
601
|
-
args_hash.each { |k, v| param_scope[k] = v unless v.nil? }
|
602
|
-
dispatcher.parameters.each do |p|
|
603
|
-
name = p.name
|
604
|
-
arg = args_hash[name]
|
605
|
-
if arg.nil?
|
606
|
-
# Arg either wasn't given, or it was undef
|
607
|
-
if p.value.nil?
|
608
|
-
# No default. Assign nil if the args_hash included it
|
609
|
-
param_scope[name] = nil if args_hash.include?(name)
|
610
|
-
else
|
611
|
-
# parameter does not have a default value, it will be assigned its default when being called
|
612
|
-
# we assume that the default value is of the correct type and therefore simply skip
|
613
|
-
# checking this
|
614
|
-
# param_scope[name] = param_scope.evaluate(name, p.value, closure_scope, @evaluator)
|
615
|
-
end
|
616
|
-
end
|
617
|
-
end
|
618
|
-
|
619
|
-
errors = Puppet::Pops::Types::TypeMismatchDescriber.singleton.describe_struct_signature(dispatcher.params_struct, param_scope).flatten
|
620
|
-
return true if errors.empty?
|
621
|
-
if block_given?
|
622
|
-
yield errors.map {|e| e.format }.join("\n")
|
623
|
-
end
|
624
|
-
false
|
625
|
-
end
|
626
|
-
|
627
|
-
# Returns a PStructType describing the parameters as a puppet Struct data type
|
628
|
-
# Note that a `to_s` on the returned structure will result in a human readable Struct datatype as a
|
629
|
-
# description of what a plan expects.
|
630
|
-
#
|
631
|
-
# @return [Puppet::Pops::Types::PStructType] a struct data type describing the parameters and their types
|
632
|
-
#
|
633
|
-
# @api public
|
634
|
-
#
|
635
|
-
def params_type
|
636
|
-
dispatcher = @plan_func.class.dispatcher.dispatchers[0]
|
637
|
-
dispatcher.params_struct
|
638
|
-
end
|
639
|
-
end
|
640
|
-
|
641
|
-
# Defines a context in which multiple operations in an env with a script compiler can be performed in a given block.
|
642
|
-
# The calls that takes place to PAL inside of the given block are all with the same instance of the compiler.
|
643
|
-
# The parameter `configured_by_env` makes it possible to either use the configuration in the environment, or specify
|
644
|
-
# `manifest_file` or `code_string` manually. If neither is given, an empty `code_string` is used.
|
645
|
-
#
|
646
|
-
# @example define a script compiler without any initial logic
|
647
|
-
# pal.with_script_compiler do | compiler |
|
648
|
-
# # do things with compiler
|
649
|
-
# end
|
650
|
-
#
|
651
|
-
# @example define a script compiler with a code_string containing initial logic
|
652
|
-
# pal.with_script_compiler(code_string: '$myglobal_var = 42') do | compiler |
|
653
|
-
# # do things with compiler
|
654
|
-
# end
|
655
|
-
#
|
656
|
-
# @param configured_by_env [Boolean] when true the environment's settings are used, otherwise the given `manifest_file` or `code_string`
|
657
|
-
# @param manifest_file [String] a Puppet Language file to load and evaluate before calling the given block, mutually exclusive with `code_string`
|
658
|
-
# @param code_string [String] a Puppet Language source string to load and evaluate before calling the given block, mutually exclusive with `manifest_file`
|
659
|
-
# @param facts [Hash] optional map of fact name to fact value - if not given will initialize the facts (which is a slow operation)
|
660
|
-
# If given at the environment level, the facts given here are merged with higher priority.
|
661
|
-
# @param variables [Hash] optional map of fully qualified variable name to value. If given at the environment level, the variables
|
662
|
-
# given here are merged with higher priority.
|
663
|
-
# @param block [Proc] the block performing operations on compiler
|
664
|
-
# @return [Object] what the block returns
|
665
|
-
# @yieldparam [Puppet::Pal::ScriptCompiler] compiler, a ScriptCompiler to perform operations on.
|
666
|
-
#
|
667
|
-
def self.with_script_compiler(
|
668
|
-
configured_by_env: false,
|
669
|
-
manifest_file: nil,
|
670
|
-
code_string: nil,
|
671
|
-
facts: nil,
|
672
|
-
variables: nil,
|
673
|
-
&block
|
674
|
-
)
|
675
|
-
# TRANSLATORS: do not translate variable name strings in these assertions
|
676
|
-
assert_mutually_exclusive(manifest_file, code_string, 'manifest_file', 'code_string')
|
677
|
-
assert_non_empty_string(manifest_file, 'manifest_file', true)
|
678
|
-
assert_non_empty_string(code_string, 'code_string', true)
|
679
|
-
assert_type(T_BOOLEAN, configured_by_env, "configured_by_env", false)
|
680
|
-
|
681
|
-
if configured_by_env
|
682
|
-
unless manifest_file.nil? && code_string.nil?
|
683
|
-
# TRANSLATORS: do not translate the variable names in this error message
|
684
|
-
raise ArgumentError, _("manifest_file or code_string cannot be given when configured_by_env is true")
|
685
|
-
end
|
686
|
-
# Use the manifest setting
|
687
|
-
manifest_file = Puppet[:manifest]
|
688
|
-
else
|
689
|
-
# An "undef" code_string is the only way to override Puppet[:manifest] & Puppet[:code] settings since an
|
690
|
-
# empty string is taken as Puppet[:code] not being set.
|
691
|
-
#
|
692
|
-
if manifest_file.nil? && code_string.nil?
|
693
|
-
code_string = 'undef'
|
694
|
-
end
|
695
|
-
end
|
696
|
-
|
697
|
-
Puppet[:tasks] = true
|
698
|
-
# After the assertions, if code_string is non nil - it has the highest precedence
|
699
|
-
Puppet[:code] = code_string unless code_string.nil?
|
700
|
-
|
701
|
-
# If manifest_file is nil, the #main method will use the env configured manifest
|
702
|
-
# to do things in the block while a Script Compiler is in effect
|
703
|
-
main(manifest_file, facts, variables, :script, &block)
|
704
|
-
end
|
705
|
-
|
706
|
-
# Evaluates a Puppet Language script string.
|
707
|
-
# @param code_string [String] a snippet of Puppet Language source code
|
708
|
-
# @return [Object] what the Puppet Language code_string evaluates to
|
709
|
-
# @deprecated Use {#with_script_compiler} and then evaluate_string on the given compiler - to be removed in 1.0 version
|
710
|
-
#
|
711
|
-
def self.evaluate_script_string(code_string)
|
712
|
-
# prevent the default loading of Puppet[:manifest] which is the environment's manifest-dir by default settings
|
713
|
-
# by setting code_string to 'undef'
|
714
|
-
with_script_compiler do |compiler|
|
715
|
-
compiler.evaluate_string(code_string)
|
716
|
-
end
|
717
|
-
end
|
718
|
-
|
719
|
-
# Evaluates a Puppet Language script (.pp) file.
|
720
|
-
# @param manifest_file [String] a file with Puppet Language source code
|
721
|
-
# @return [Object] what the Puppet Language manifest_file contents evaluates to
|
722
|
-
# @deprecated Use {#with_script_compiler} and then evaluate_file on the given compiler - to be removed in 1.0 version
|
723
|
-
#
|
724
|
-
def self.evaluate_script_manifest(manifest_file)
|
725
|
-
with_script_compiler do |compiler|
|
726
|
-
compiler.evaluate_file(manifest_file)
|
727
|
-
end
|
728
|
-
end
|
729
|
-
|
730
|
-
# Defines a context in which multiple operations in an env with a catalog producing compiler can be performed
|
731
|
-
# in a given block.
|
732
|
-
# The calls that takes place to PAL inside of the given block are all with the same instance of the compiler.
|
733
|
-
# The parameter `configured_by_env` makes it possible to either use the configuration in the environment, or specify
|
734
|
-
# `manifest_file` or `code_string` manually. If neither is given, an empty `code_string` is used.
|
735
|
-
#
|
736
|
-
# @example define a catalog compiler without any initial logic
|
737
|
-
# pal.with_catalog_compiler do | compiler |
|
738
|
-
# # do things with compiler
|
739
|
-
# end
|
740
|
-
#
|
741
|
-
# @example define a catalog compiler with a code_string containing initial logic
|
742
|
-
# pal.with_catalog_compiler(code_string: '$myglobal_var = 42') do | compiler |
|
743
|
-
# # do things with compiler
|
744
|
-
# end
|
745
|
-
#
|
746
|
-
# @param configured_by_env [Boolean] when true the environment's settings are used, otherwise the
|
747
|
-
# given `manifest_file` or `code_string`
|
748
|
-
# @param manifest_file [String] a Puppet Language file to load and evaluate before calling the given block, mutually exclusive
|
749
|
-
# with `code_string`
|
750
|
-
# @param code_string [String] a Puppet Language source string to load and evaluate before calling the given block, mutually
|
751
|
-
# exclusive with `manifest_file`
|
752
|
-
# @param facts [Hash] optional map of fact name to fact value - if not given will initialize the facts (which is a slow operation)
|
753
|
-
# If given at the environment level, the facts given here are merged with higher priority.
|
754
|
-
# @param variables [Hash] optional map of fully qualified variable name to value. If given at the environment level, the variables
|
755
|
-
# given here are merged with higher priority.
|
756
|
-
# @param block [Proc] the block performing operations on compiler
|
757
|
-
# @return [Object] what the block returns
|
758
|
-
# @yieldparam [Puppet::Pal::CatalogCompiler] compiler, a CatalogCompiler to perform operations on.
|
759
|
-
#
|
760
|
-
def self.with_catalog_compiler(
|
761
|
-
configured_by_env: false,
|
762
|
-
manifest_file: nil,
|
763
|
-
code_string: nil,
|
764
|
-
facts: nil,
|
765
|
-
variables: nil,
|
766
|
-
&block
|
767
|
-
)
|
768
|
-
# TRANSLATORS: do not translate variable name strings in these assertions
|
769
|
-
assert_mutually_exclusive(manifest_file, code_string, 'manifest_file', 'code_string')
|
770
|
-
assert_non_empty_string(manifest_file, 'manifest_file', true)
|
771
|
-
assert_non_empty_string(code_string, 'code_string', true)
|
772
|
-
assert_type(T_BOOLEAN, configured_by_env, "configured_by_env", false)
|
773
|
-
|
774
|
-
if configured_by_env
|
775
|
-
unless manifest_file.nil? && code_string.nil?
|
776
|
-
# TRANSLATORS: do not translate the variable names in this error message
|
777
|
-
raise ArgumentError, _("manifest_file or code_string cannot be given when configured_by_env is true")
|
778
|
-
end
|
779
|
-
# Use the manifest setting
|
780
|
-
manifest_file = Puppet[:manifest]
|
781
|
-
else
|
782
|
-
# An "undef" code_string is the only way to override Puppet[:manifest] & Puppet[:code] settings since an
|
783
|
-
# empty string is taken as Puppet[:code] not being set.
|
784
|
-
#
|
785
|
-
if manifest_file.nil? && code_string.nil?
|
786
|
-
code_string = 'undef'
|
787
|
-
end
|
788
|
-
end
|
789
|
-
|
790
|
-
Puppet[:tasks] = false
|
791
|
-
# After the assertions, if code_string is non nil - it has the highest precedence
|
792
|
-
Puppet[:code] = code_string unless code_string.nil?
|
793
|
-
|
794
|
-
# If manifest_file is nil, the #main method will use the env configured manifest
|
795
|
-
# to do things in the block while a Script Compiler is in effect
|
796
|
-
main(manifest_file, facts, variables, :catalog, &block)
|
797
|
-
end
|
798
|
-
|
799
|
-
# Defines the context in which to perform puppet operations (evaluation, etc)
|
800
|
-
# The code to evaluate in this context is given in a block.
|
801
|
-
#
|
802
|
-
# @param env_name [String] a name to use for the temporary environment - this only shows up in errors
|
803
|
-
# @param modulepath [Array<String>] an array of directory paths containing Puppet modules, may be empty, defaults to empty array
|
804
|
-
# @param settings_hash [Hash] a hash of settings - currently not used for anything, defaults to empty hash
|
805
|
-
# @param facts [Hash] optional map of fact name to fact value - if not given will initialize the facts (which is a slow operation)
|
806
|
-
# @param variables [Hash] optional map of fully qualified variable name to value
|
807
|
-
# @return [Object] returns what the given block returns
|
808
|
-
# @yieldparam [Puppet::Pal] context, a context that responds to Puppet::Pal methods
|
809
|
-
#
|
810
|
-
def self.in_tmp_environment(env_name,
|
811
|
-
modulepath: [],
|
812
|
-
settings_hash: {},
|
813
|
-
facts: nil,
|
814
|
-
variables: {},
|
815
|
-
&block
|
816
|
-
)
|
817
|
-
assert_non_empty_string(env_name, _("temporary environment name"))
|
818
|
-
# TRANSLATORS: do not translate variable name string in these assertions
|
819
|
-
assert_optionally_empty_array(modulepath, 'modulepath')
|
820
|
-
|
821
|
-
unless block_given?
|
822
|
-
raise ArgumentError, _("A block must be given to 'in_tmp_environment'") # TRANSLATORS 'in_tmp_environment' is a name, do not translate
|
823
|
-
end
|
824
|
-
|
825
|
-
env = Puppet::Node::Environment.create(env_name, modulepath)
|
826
|
-
|
827
|
-
in_environment_context(
|
828
|
-
Puppet::Environments::Static.new(env), # The tmp env is the only known env
|
829
|
-
env, facts, variables, &block
|
830
|
-
)
|
831
|
-
end
|
832
|
-
|
833
|
-
# Defines the context in which to perform puppet operations (evaluation, etc)
|
834
|
-
# The code to evaluate in this context is given in a block.
|
835
|
-
#
|
836
|
-
# The name of an environment (env_name) is always given. The location of that environment on disk
|
837
|
-
# is then either constructed by:
|
838
|
-
# * searching a given envpath where name is a child of a directory on that path, or
|
839
|
-
# * it is the directory given in env_dir (which must exist).
|
840
|
-
#
|
841
|
-
# The env_dir and envpath options are mutually exclusive.
|
842
|
-
#
|
843
|
-
# @param env_name [String] the name of an existing environment
|
844
|
-
# @param modulepath [Array<String>] an array of directory paths containing Puppet modules, overrides the modulepath of an existing env.
|
845
|
-
# Defaults to `{env_dir}/modules` if `env_dir` is given,
|
846
|
-
# @param pre_modulepath [Array<String>] like modulepath, but is prepended to the modulepath
|
847
|
-
# @param post_modulepath [Array<String>] like modulepath, but is appended to the modulepath
|
848
|
-
# @param settings_hash [Hash] a hash of settings - currently not used for anything, defaults to empty hash
|
849
|
-
# @param env_dir [String] a reference to a directory being the named environment (mutually exclusive with `envpath`)
|
850
|
-
# @param envpath [String] a path of directories in which there are environments to search for `env_name` (mutually exclusive with `env_dir`).
|
851
|
-
# Should be a single directory, or several directories separated with platform specific `File::PATH_SEPARATOR` character.
|
852
|
-
# @param facts [Hash] optional map of fact name to fact value - if not given will initialize the facts (which is a slow operation)
|
853
|
-
# @param variables [Hash] optional map of fully qualified variable name to value
|
854
|
-
# @return [Object] returns what the given block returns
|
855
|
-
# @yieldparam [Puppet::Pal] context, a context that responds to Puppet::Pal methods
|
856
|
-
#
|
857
|
-
def self.in_environment(env_name,
|
858
|
-
modulepath: nil,
|
859
|
-
pre_modulepath: [],
|
860
|
-
post_modulepath: [],
|
861
|
-
settings_hash: {},
|
862
|
-
env_dir: nil,
|
863
|
-
envpath: nil,
|
864
|
-
facts: nil,
|
865
|
-
variables: {},
|
866
|
-
&block
|
867
|
-
)
|
868
|
-
# TRANSLATORS terms in the assertions below are names of terms in code
|
869
|
-
assert_non_empty_string(env_name, 'env_name')
|
870
|
-
assert_optionally_empty_array(modulepath, 'modulepath', true)
|
871
|
-
assert_optionally_empty_array(pre_modulepath, 'pre_modulepath', false)
|
872
|
-
assert_optionally_empty_array(post_modulepath, 'post_modulepath', false)
|
873
|
-
assert_mutually_exclusive(env_dir, envpath, 'env_dir', 'envpath')
|
874
|
-
|
875
|
-
unless block_given?
|
876
|
-
raise ArgumentError, _("A block must be given to 'in_environment'") # TRANSLATORS 'in_environment' is a name, do not translate
|
877
|
-
end
|
878
|
-
|
879
|
-
if env_dir
|
880
|
-
unless Puppet::FileSystem.exist?(env_dir)
|
881
|
-
raise ArgumentError, _("The environment directory '%{env_dir}' does not exist") % { env_dir: env_dir }
|
882
|
-
end
|
883
|
-
|
884
|
-
# a nil modulepath for env_dir means it should use its ./modules directory
|
885
|
-
mid_modulepath = modulepath.nil? ? [Puppet::FileSystem.expand_path(File.join(env_dir, 'modules'))] : modulepath
|
886
|
-
|
887
|
-
env = Puppet::Node::Environment.create(env_name, pre_modulepath + mid_modulepath + post_modulepath)
|
888
|
-
environments = Puppet::Environments::StaticDirectory.new(env_name, env_dir, env) # The env being used is the only one...
|
889
|
-
else
|
890
|
-
assert_non_empty_string(envpath, 'envpath')
|
891
|
-
|
892
|
-
# The environment is resolved against the envpath. This is setup without a basemodulepath
|
893
|
-
# The modulepath defaults to the 'modulepath' in the found env when "Directories" is used
|
894
|
-
#
|
895
|
-
if envpath.is_a?(String) && envpath.include?(File::PATH_SEPARATOR)
|
896
|
-
# potentially more than one directory to search
|
897
|
-
env_loaders = Puppet::Environments::Directories.from_path(envpath, [])
|
898
|
-
environments = Puppet::Environments::Combined.new(*env_loaders)
|
899
|
-
else
|
900
|
-
environments = Puppet::Environments::Directories.new(envpath, [])
|
901
|
-
end
|
902
|
-
env = environments.get(env_name)
|
903
|
-
if env.nil?
|
904
|
-
raise ArgumentError, _("No directory found for the environment '%{env_name}' on the path '%{envpath}'") % { env_name: env_name, envpath: envpath }
|
905
|
-
end
|
906
|
-
# A given modulepath should override the default
|
907
|
-
mid_modulepath = modulepath.nil? ? env.modulepath : modulepath
|
908
|
-
env_path = env.configuration.path_to_env
|
909
|
-
env = env.override_with(:modulepath => pre_modulepath + mid_modulepath + post_modulepath)
|
910
|
-
# must configure this in case logic looks up the env by name again (otherwise the looked up env does
|
911
|
-
# not have the same effective modulepath).
|
912
|
-
environments = Puppet::Environments::StaticDirectory.new(env_name, env_path, env) # The env being used is the only one...
|
913
|
-
end
|
914
|
-
in_environment_context(environments, env, facts, variables, &block)
|
915
|
-
end
|
916
|
-
|
917
|
-
# Prepares the puppet context with pal information - and delegates to the block
|
918
|
-
# No set up is performed at this step - it is delayed until it is known what the
|
919
|
-
# operation is going to be (for example - using a ScriptCompiler).
|
920
|
-
#
|
921
|
-
def self.in_environment_context(environments, env, facts, variables, &block)
|
922
|
-
# Create a default node to use (may be overridden later)
|
923
|
-
node = Puppet::Node.new(Puppet[:node_name_value], :environment => env)
|
924
|
-
|
925
|
-
Puppet.override(
|
926
|
-
environments: environments, # The env being used is the only one...
|
927
|
-
pal_env: env, # provide as convenience
|
928
|
-
pal_current_node: node, # to allow it to be picked up instead of created
|
929
|
-
pal_variables: variables, # common set of variables across several inner contexts
|
930
|
-
pal_facts: facts # common set of facts across several inner contexts (or nil)
|
931
|
-
) do
|
932
|
-
# DELAY: prepare_node_facts(node, facts)
|
933
|
-
return block.call(self)
|
934
|
-
end
|
935
|
-
end
|
936
|
-
private_class_method :in_environment_context
|
937
|
-
|
938
|
-
# Prepares the node for use by giving it node_facts (if given)
|
939
|
-
# If a hash of facts values is given, then the operation of creating a node with facts is much
|
940
|
-
# speeded up (as getting a fresh set of facts is avoided in a later step).
|
941
|
-
#
|
942
|
-
def self.prepare_node_facts(node, facts)
|
943
|
-
# Prepare the node with facts if it does not already have them
|
944
|
-
if node.facts.nil?
|
945
|
-
node_facts = facts.nil? ? nil : Puppet::Node::Facts.new(Puppet[:node_name_value], facts)
|
946
|
-
node.fact_merge(node_facts)
|
947
|
-
# Add server facts so $server_facts[environment] exists when doing a puppet script
|
948
|
-
# SCRIPT TODO: May be needed when running scripts under orchestrator. Leave it for now.
|
949
|
-
#
|
950
|
-
node.add_server_facts({})
|
951
|
-
end
|
952
|
-
end
|
953
|
-
private_class_method :prepare_node_facts
|
954
|
-
|
955
|
-
def self.add_variables(scope, variables)
|
956
|
-
return if variables.nil?
|
957
|
-
unless variables.is_a?(Hash)
|
958
|
-
raise ArgumentError, _("Given variables must be a hash, got %{type}") % { type: variables.class }
|
959
|
-
end
|
960
|
-
|
961
|
-
rich_data_t = Puppet::Pops::Types::TypeFactory.rich_data
|
962
|
-
variables.each_pair do |k,v|
|
963
|
-
unless k =~ Puppet::Pops::Patterns::VAR_NAME
|
964
|
-
raise ArgumentError, _("Given variable '%{varname}' has illegal name") % { varname: k }
|
965
|
-
end
|
966
|
-
|
967
|
-
unless rich_data_t.instance?(v)
|
968
|
-
raise ArgumentError, _("Given value for '%{varname}' has illegal type - got: %{type}") % { varname: k, type: v.class }
|
969
|
-
end
|
970
|
-
|
971
|
-
scope.setvar(k, v)
|
972
|
-
end
|
973
|
-
end
|
974
|
-
private_class_method :add_variables
|
975
|
-
|
976
|
-
# The main routine for script compiler
|
977
|
-
# Picks up information from the puppet context and configures a script compiler which is given to
|
978
|
-
# the provided block
|
979
|
-
#
|
980
|
-
def self.main(manifest, facts, variables, internal_compiler_class)
|
981
|
-
# Configure the load path
|
982
|
-
env = Puppet.lookup(:pal_env)
|
983
|
-
env.each_plugin_directory do |dir|
|
984
|
-
$LOAD_PATH << dir unless $LOAD_PATH.include?(dir)
|
985
|
-
end
|
986
|
-
|
987
|
-
# Puppet requires Facter, which initializes its lookup paths. Reset Facter to
|
988
|
-
# pickup the new $LOAD_PATH.
|
989
|
-
Facter.reset
|
990
|
-
|
991
|
-
node = Puppet.lookup(:pal_current_node)
|
992
|
-
pal_facts = Puppet.lookup(:pal_facts)
|
993
|
-
pal_variables = Puppet.lookup(:pal_variables)
|
994
|
-
|
995
|
-
overrides = {}
|
996
|
-
unless facts.nil? || facts.empty?
|
997
|
-
pal_facts = pal_facts.merge(facts)
|
998
|
-
overrides[:pal_facts] = pal_facts
|
999
|
-
end
|
1000
|
-
unless variables.nil? || variables.empty?
|
1001
|
-
pal_variables = pal_variables.merge(variables)
|
1002
|
-
overrides[:pal_variables] = pal_variables
|
1003
|
-
end
|
1004
|
-
|
1005
|
-
prepare_node_facts(node, pal_facts)
|
1006
|
-
|
1007
|
-
configured_environment = node.environment || Puppet.lookup(:current_environment)
|
1008
|
-
|
1009
|
-
apply_environment = manifest ?
|
1010
|
-
configured_environment.override_with(:manifest => manifest) :
|
1011
|
-
configured_environment
|
1012
|
-
|
1013
|
-
# Modify the node descriptor to use the special apply_environment.
|
1014
|
-
# It is based on the actual environment from the node, or the locally
|
1015
|
-
# configured environment if the node does not specify one.
|
1016
|
-
# If a manifest file is passed on the command line, it overrides
|
1017
|
-
# the :manifest setting of the apply_environment.
|
1018
|
-
node.environment = apply_environment
|
1019
|
-
|
1020
|
-
# TRANSLATORS, the string "For puppet PAL" is not user facing
|
1021
|
-
Puppet.override({:current_environment => apply_environment}, "For puppet PAL") do
|
1022
|
-
begin
|
1023
|
-
# support the following features when evaluating puppet code
|
1024
|
-
# * $facts with facts from host running the script
|
1025
|
-
# * $settings with 'settings::*' namespace populated, and '$settings::all_local' hash
|
1026
|
-
# * $trusted as setup when using puppet apply
|
1027
|
-
# * an environment
|
1028
|
-
#
|
1029
|
-
|
1030
|
-
# fixup trusted information
|
1031
|
-
node.sanitize()
|
1032
|
-
|
1033
|
-
compiler = create_internal_compiler(internal_compiler_class, node)
|
1034
|
-
# compiler = Puppet::Parser::ScriptCompiler.new(node.environment, node.name)
|
1035
|
-
topscope = compiler.topscope
|
1036
|
-
|
1037
|
-
# When scripting the trusted data are always local, but set them anyway
|
1038
|
-
# When compiling for a catalog, the catalog compiler does this
|
1039
|
-
unless internal_compiler_class == :catalog
|
1040
|
-
topscope.set_trusted(node.trusted_data)
|
1041
|
-
|
1042
|
-
# Server facts are always about the local node's version etc.
|
1043
|
-
topscope.set_server_facts(node.server_facts)
|
1044
|
-
|
1045
|
-
# Set $facts for the node running the script
|
1046
|
-
facts_hash = node.facts.nil? ? {} : node.facts.values
|
1047
|
-
topscope.set_facts(facts_hash)
|
1048
|
-
|
1049
|
-
# create the $settings:: variables
|
1050
|
-
topscope.merge_settings(node.environment.name, false)
|
1051
|
-
end
|
1052
|
-
|
1053
|
-
add_variables(topscope, pal_variables)
|
1054
|
-
|
1055
|
-
case internal_compiler_class
|
1056
|
-
when :script
|
1057
|
-
pal_compiler = ScriptCompiler.new(compiler)
|
1058
|
-
overrides[:pal_script_compiler] = overrides[:pal_compiler] = pal_compiler
|
1059
|
-
when :catalog
|
1060
|
-
pal_compiler = CatalogCompiler.new(compiler)
|
1061
|
-
overrides[:pal_catalog_compiler] = overrides[:pal_compiler] = pal_compiler
|
1062
|
-
end
|
1063
|
-
|
1064
|
-
# Make compiler available to Puppet#lookup and injection in functions
|
1065
|
-
# TODO: The compiler instances should be available under non PAL use as well!
|
1066
|
-
# TRANSLATORS: Do not translate, symbolic name
|
1067
|
-
Puppet.override(overrides, "PAL::with_#{internal_compiler_class}_compiler") do
|
1068
|
-
compiler.compile do | compiler_yield |
|
1069
|
-
# wrap the internal compiler to prevent it from leaking in the PAL API
|
1070
|
-
if block_given?
|
1071
|
-
yield(pal_compiler)
|
1072
|
-
end
|
1073
|
-
end
|
1074
|
-
end
|
1075
|
-
|
1076
|
-
rescue Puppet::ParseErrorWithIssue, Puppet::Error
|
1077
|
-
# already logged and handled by the compiler for these two cases
|
1078
|
-
raise
|
1079
|
-
|
1080
|
-
rescue => detail
|
1081
|
-
Puppet.log_exception(detail)
|
1082
|
-
raise
|
1083
|
-
end
|
1084
|
-
end
|
1085
|
-
end
|
1086
|
-
private_class_method :main
|
1087
|
-
|
1088
|
-
def self.create_internal_compiler(compiler_class_reference, node)
|
1089
|
-
case compiler_class_reference
|
1090
|
-
when :script
|
1091
|
-
Puppet::Parser::ScriptCompiler.new(node.environment, node.name)
|
1092
|
-
when :catalog
|
1093
|
-
Puppet::Parser::CatalogCompiler.new(node)
|
1094
|
-
else
|
1095
|
-
raise ArgumentError, "Internal Error: Invalid compiler type requested."
|
1096
|
-
end
|
1097
|
-
end
|
1098
|
-
|
1099
|
-
T_STRING = Puppet::Pops::Types::PStringType::NON_EMPTY
|
1100
|
-
T_STRING_ARRAY = Puppet::Pops::Types::TypeFactory.array_of(T_STRING)
|
1101
|
-
T_ANY_ARRAY = Puppet::Pops::Types::TypeFactory.array_of_any
|
1102
|
-
T_BOOLEAN = Puppet::Pops::Types::PBooleanType::DEFAULT
|
1103
|
-
|
1104
|
-
T_GENERIC_TASK_HASH = Puppet::Pops::Types::TypeFactory.hash_kv(
|
1105
|
-
Puppet::Pops::Types::TypeFactory.pattern(/\A[a-z][a-z0-9_]*\z/), Puppet::Pops::Types::TypeFactory.data)
|
1106
|
-
|
1107
|
-
def self.assert_type(type, value, what, allow_nil=false)
|
1108
|
-
Puppet::Pops::Types::TypeAsserter.assert_instance_of(nil, type, value, allow_nil) { _('Puppet Pal: %{what}') % {what: what} }
|
1109
|
-
end
|
1110
|
-
|
1111
|
-
def self.assert_non_empty_string(s, what, allow_nil=false)
|
1112
|
-
assert_type(T_STRING, s, what, allow_nil)
|
1113
|
-
end
|
1114
|
-
|
1115
|
-
def self.assert_optionally_empty_array(a, what, allow_nil=false)
|
1116
|
-
assert_type(T_STRING_ARRAY, a, what, allow_nil)
|
1117
|
-
end
|
1118
|
-
private_class_method :assert_optionally_empty_array
|
1119
|
-
|
1120
|
-
def self.assert_mutually_exclusive(a, b, a_term, b_term)
|
1121
|
-
if a && b
|
1122
|
-
raise ArgumentError, _("Cannot use '%{a_term}' and '%{b_term}' at the same time") % { a_term: a_term, b_term: b_term }
|
1123
|
-
end
|
1124
|
-
end
|
1125
|
-
private_class_method :assert_mutually_exclusive
|
1126
|
-
|
1127
|
-
def self.assert_block_given(block)
|
1128
|
-
if block.nil?
|
1129
|
-
raise ArgumentError, _("A block must be given")
|
1130
|
-
end
|
1131
|
-
end
|
1132
|
-
private_class_method :assert_block_given
|
1133
|
-
end
|
1134
|
-
end
|
1135
|
-
|
7
|
+
require 'puppet'
|
8
|
+
require 'puppet/pal/pal_api'
|