puppet 6.19.1-universal-darwin → 7.0.0-universal-darwin
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 -1
- data/Gemfile.lock +19 -20
- data/README.md +1 -1
- data/conf/fileserver.conf +5 -10
- data/ext/build_defaults.yaml +1 -1
- data/ext/osx/file_mapping.yaml +0 -5
- data/ext/project_data.yaml +1 -14
- data/ext/redhat/puppet.spec.erb +0 -1
- data/ext/windows/service/daemon.rb +6 -5
- data/install.rb +21 -17
- data/lib/puppet.rb +11 -20
- data/lib/puppet/application.rb +172 -98
- data/lib/puppet/application/device.rb +100 -104
- data/lib/puppet/application/filebucket.rb +15 -11
- data/lib/puppet/application/ssl.rb +1 -1
- data/lib/puppet/configurer.rb +28 -33
- data/lib/puppet/configurer/plugin_handler.rb +21 -19
- data/lib/puppet/defaults.rb +95 -159
- data/lib/puppet/environments.rb +10 -25
- data/lib/puppet/face/config.rb +10 -0
- data/lib/puppet/face/epp.rb +12 -2
- data/lib/puppet/face/facts.rb +66 -6
- data/lib/puppet/face/help.rb +1 -1
- data/lib/puppet/face/plugin.rb +5 -8
- data/lib/puppet/ffi/windows.rb +12 -0
- data/lib/puppet/ffi/windows/api_types.rb +311 -0
- data/lib/puppet/ffi/windows/constants.rb +404 -0
- data/lib/puppet/ffi/windows/functions.rb +628 -0
- data/lib/puppet/ffi/windows/structs.rb +338 -0
- data/lib/puppet/file_serving/configuration.rb +0 -5
- data/lib/puppet/file_serving/configuration/parser.rb +3 -32
- data/lib/puppet/file_serving/http_metadata.rb +1 -1
- data/lib/puppet/file_serving/mount.rb +1 -2
- data/lib/puppet/forge/repository.rb +0 -1
- data/lib/puppet/functions/epp.rb +1 -0
- data/lib/puppet/functions/inline_epp.rb +1 -0
- data/lib/puppet/generate/models/type/type.rb +4 -1
- data/lib/puppet/http.rb +22 -13
- data/lib/puppet/http/client.rb +164 -114
- data/lib/puppet/{network/resolver.rb → http/dns.rb} +2 -2
- data/lib/puppet/http/errors.rb +16 -0
- data/lib/puppet/http/external_client.rb +5 -7
- data/lib/puppet/{network/http → http}/factory.rb +8 -11
- data/lib/puppet/{network/http → http}/pool.rb +61 -26
- data/lib/puppet/{network/http/session.rb → http/pool_entry.rb} +2 -3
- data/lib/puppet/http/proxy.rb +137 -0
- data/lib/puppet/http/redirector.rb +4 -12
- data/lib/puppet/http/resolver.rb +5 -15
- data/lib/puppet/http/resolver/server_list.rb +6 -10
- data/lib/puppet/http/resolver/settings.rb +4 -7
- data/lib/puppet/http/resolver/srv.rb +7 -11
- data/lib/puppet/http/response.rb +36 -54
- data/lib/puppet/http/response_converter.rb +24 -0
- data/lib/puppet/http/response_net_http.rb +42 -0
- data/lib/puppet/http/retry_after_handler.rb +4 -13
- data/lib/puppet/http/service.rb +12 -26
- data/lib/puppet/http/service/ca.rb +11 -22
- data/lib/puppet/http/service/compiler.rb +22 -69
- data/lib/puppet/http/service/file_server.rb +18 -27
- data/lib/puppet/http/service/puppetserver.rb +26 -12
- data/lib/puppet/http/service/report.rb +8 -10
- data/lib/puppet/http/session.rb +11 -20
- data/lib/puppet/{network/http → http}/site.rb +1 -2
- data/lib/puppet/indirector/catalog/rest.rb +2 -4
- data/lib/puppet/indirector/fact_search.rb +60 -0
- data/lib/puppet/indirector/facts/facter.rb +24 -3
- data/lib/puppet/indirector/facts/json.rb +27 -0
- data/lib/puppet/indirector/facts/rest.rb +3 -22
- data/lib/puppet/indirector/facts/yaml.rb +3 -58
- data/lib/puppet/indirector/file_bucket_file/rest.rb +3 -9
- data/lib/puppet/indirector/file_content/rest.rb +2 -6
- data/lib/puppet/indirector/file_metadata/rest.rb +3 -9
- data/lib/puppet/indirector/file_server.rb +1 -8
- data/lib/puppet/indirector/generic_http.rb +0 -11
- data/lib/puppet/indirector/json.rb +5 -1
- data/lib/puppet/indirector/node/json.rb +8 -0
- data/lib/puppet/indirector/node/rest.rb +2 -4
- data/lib/puppet/indirector/report/json.rb +34 -0
- data/lib/puppet/indirector/report/rest.rb +3 -8
- data/lib/puppet/indirector/request.rb +0 -101
- data/lib/puppet/indirector/rest.rb +12 -263
- data/lib/puppet/module_tool/applications.rb +0 -1
- data/lib/puppet/network/authconfig.rb +2 -96
- data/lib/puppet/network/authorization.rb +13 -35
- data/lib/puppet/network/formats.rb +2 -1
- data/lib/puppet/network/http.rb +3 -3
- data/lib/puppet/network/http/api/indirected_routes.rb +2 -20
- data/lib/puppet/network/http/api/master/v3.rb +11 -13
- data/lib/puppet/network/http/connection.rb +247 -316
- data/lib/puppet/network/http/handler.rb +0 -1
- data/lib/puppet/network/http_pool.rb +16 -34
- data/lib/puppet/node.rb +1 -30
- data/lib/puppet/pal/json_catalog_encoder.rb +4 -0
- data/lib/puppet/pal/pal_impl.rb +73 -18
- data/lib/puppet/parser/ast/pops_bridge.rb +0 -38
- data/lib/puppet/parser/compiler.rb +0 -198
- data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +14 -39
- data/lib/puppet/parser/resource.rb +0 -69
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -8
- data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +3 -3
- data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
- data/lib/puppet/pops/issues.rb +0 -5
- data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +6 -8
- data/lib/puppet/pops/model/ast.pp +0 -42
- data/lib/puppet/pops/model/ast.rb +0 -290
- data/lib/puppet/pops/model/factory.rb +0 -45
- data/lib/puppet/pops/model/model_label_provider.rb +0 -5
- data/lib/puppet/pops/model/model_tree_dumper.rb +0 -22
- data/lib/puppet/pops/model/pn_transformer.rb +0 -16
- data/lib/puppet/pops/parser/egrammar.ra +0 -56
- data/lib/puppet/pops/parser/eparser.rb +1520 -1712
- data/lib/puppet/pops/parser/lexer2.rb +4 -4
- data/lib/puppet/pops/parser/parser_support.rb +0 -5
- data/lib/puppet/pops/resource/resource_type_impl.rb +2 -24
- data/lib/puppet/pops/types/type_calculator.rb +0 -7
- data/lib/puppet/pops/types/type_parser.rb +0 -4
- data/lib/puppet/pops/types/types.rb +0 -1
- data/lib/puppet/pops/validation/checker4_0.rb +9 -37
- data/lib/puppet/pops/validation/tasks_checker.rb +0 -12
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -2
- data/lib/puppet/provider.rb +0 -13
- data/lib/puppet/provider/nameservice.rb +0 -18
- data/lib/puppet/provider/package/dpkg.rb +0 -10
- data/lib/puppet/provider/package/gem.rb +23 -3
- data/lib/puppet/provider/package/pip.rb +0 -1
- data/lib/puppet/provider/package/pkg.rb +0 -4
- data/lib/puppet/provider/package/portage.rb +1 -1
- data/lib/puppet/provider/package/puppet_gem.rb +1 -4
- data/lib/puppet/provider/service/smf.rb +191 -73
- data/lib/puppet/provider/user/directoryservice.rb +0 -10
- data/lib/puppet/reference/configuration.rb +2 -0
- data/lib/puppet/reference/indirection.rb +1 -1
- data/lib/puppet/resource.rb +1 -89
- data/lib/puppet/resource/catalog.rb +1 -14
- data/lib/puppet/resource/type.rb +3 -119
- data/lib/puppet/resource/type_collection.rb +3 -48
- data/lib/puppet/runtime.rb +1 -2
- data/lib/puppet/settings.rb +45 -33
- data/lib/puppet/settings/base_setting.rb +26 -2
- data/lib/puppet/settings/integer_setting.rb +17 -0
- data/lib/puppet/settings/port_setting.rb +15 -0
- data/lib/puppet/settings/priority_setting.rb +5 -4
- data/lib/puppet/ssl.rb +10 -6
- data/lib/puppet/ssl/base.rb +3 -5
- data/lib/puppet/ssl/certificate.rb +0 -6
- data/lib/puppet/ssl/certificate_request.rb +1 -12
- data/lib/puppet/ssl/certificate_signer.rb +6 -0
- data/lib/puppet/ssl/oids.rb +3 -1
- data/lib/puppet/ssl/ssl_provider.rb +17 -0
- data/lib/puppet/ssl/state_machine.rb +3 -1
- data/lib/puppet/ssl/verifier.rb +2 -0
- data/lib/puppet/test/test_helper.rb +1 -3
- data/lib/puppet/transaction.rb +1 -7
- data/lib/puppet/transaction/report.rb +2 -4
- data/lib/puppet/type.rb +0 -76
- data/lib/puppet/type/file.rb +5 -7
- data/lib/puppet/type/file/checksum.rb +1 -1
- data/lib/puppet/type/file/source.rb +1 -1
- data/lib/puppet/type/filebucket.rb +3 -3
- data/lib/puppet/type/package.rb +5 -13
- data/lib/puppet/util/execution.rb +0 -11
- data/lib/puppet/util/http_proxy.rb +2 -215
- data/lib/puppet/util/monkey_patches.rb +0 -46
- data/lib/puppet/util/rdoc.rb +0 -7
- data/lib/puppet/util/retry_action.rb +1 -1
- data/lib/puppet/util/rubygems.rb +5 -1
- data/lib/puppet/util/run_mode.rb +9 -1
- data/lib/puppet/util/windows.rb +3 -8
- data/lib/puppet/util/windows/daemon.rb +360 -0
- data/lib/puppet/util/windows/error.rb +1 -0
- data/lib/puppet/util/windows/eventlog.rb +4 -9
- data/lib/puppet/util/windows/file.rb +8 -242
- data/lib/puppet/util/windows/monkey_patches/process.rb +414 -0
- data/lib/puppet/util/windows/process.rb +4 -226
- data/lib/puppet/util/windows/service.rb +9 -460
- data/lib/puppet/util/windows/string.rb +12 -13
- data/lib/puppet/util/yaml.rb +0 -22
- data/lib/puppet/vendor/require_vendored.rb +0 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet/x509.rb +5 -1
- data/lib/puppet/x509/cert_provider.rb +29 -1
- data/locales/puppet.pot +531 -1232
- data/man/man5/puppet.conf.5 +37 -97
- 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 +55 -9
- data/man/man8/puppet-filebucket.8 +6 -6
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-lookup.8 +1 -1
- data/man/man8/puppet-module.8 +1 -58
- data/man/man8/puppet-node.8 +4 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +4 -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.8 +2 -2
- data/spec/fixtures/unit/provider/service/smf/{svcs.out → svcs_instances.out} +0 -0
- data/spec/integration/application/agent_spec.rb +24 -11
- data/spec/integration/application/apply_spec.rb +1 -1
- data/spec/integration/application/filebucket_spec.rb +16 -16
- data/spec/integration/application/help_spec.rb +2 -0
- data/spec/integration/application/plugin_spec.rb +23 -1
- data/spec/integration/defaults_spec.rb +7 -3
- data/spec/integration/environments/setting_hooks_spec.rb +1 -1
- data/spec/integration/network/http_pool_spec.rb +3 -21
- data/spec/integration/parser/catalog_spec.rb +0 -38
- data/spec/integration/parser/node_spec.rb +0 -9
- data/spec/integration/parser/pcore_resource_spec.rb +0 -37
- data/spec/integration/type/file_spec.rb +5 -4
- data/spec/integration/util/windows/monkey_patches/process_spec.rb +231 -0
- data/spec/integration/util/windows/security_spec.rb +1 -1
- data/spec/lib/puppet_spec/puppetserver.rb +1 -1
- data/spec/lib/puppet_spec/settings.rb +7 -1
- data/spec/spec_helper.rb +2 -0
- data/spec/unit/agent_spec.rb +0 -2
- data/spec/unit/application/config_spec.rb +224 -4
- data/spec/unit/application/facts_spec.rb +35 -0
- data/spec/unit/application/filebucket_spec.rb +41 -39
- data/spec/unit/application/ssl_spec.rb +2 -2
- data/spec/unit/certificate_factory_spec.rb +1 -1
- data/spec/unit/configurer/downloader_spec.rb +6 -2
- data/spec/unit/configurer/plugin_handler_spec.rb +56 -18
- data/spec/unit/configurer_spec.rb +12 -9
- data/spec/unit/context/trusted_information_spec.rb +2 -6
- data/spec/unit/defaults_spec.rb +77 -28
- data/spec/unit/environments_spec.rb +0 -3
- data/spec/unit/face/config_spec.rb +27 -32
- data/spec/unit/face/facts_spec.rb +4 -0
- data/spec/unit/face/plugin_spec.rb +73 -33
- data/spec/unit/file_bucket/file_spec.rb +1 -1
- data/spec/unit/file_serving/configuration/parser_spec.rb +14 -18
- data/spec/unit/file_serving/configuration_spec.rb +6 -12
- data/spec/unit/functions/camelcase_spec.rb +1 -1
- data/spec/unit/functions/capitalize_spec.rb +1 -1
- data/spec/unit/functions/downcase_spec.rb +1 -1
- data/spec/unit/functions/inline_epp_spec.rb +26 -1
- data/spec/unit/functions/upcase_spec.rb +1 -1
- data/spec/unit/http/client_spec.rb +7 -8
- data/spec/unit/{network/resolver_spec.rb → http/dns_spec.rb} +3 -3
- data/spec/unit/http/external_client_spec.rb +4 -4
- data/spec/unit/{network/http → http}/factory_spec.rb +5 -11
- data/spec/unit/{network/http/session_spec.rb → http/pool_entry_spec.rb} +3 -3
- data/spec/unit/{network/http → http}/pool_spec.rb +12 -17
- data/spec/unit/{util/http_proxy_spec.rb → http/proxy_spec.rb} +2 -69
- data/spec/unit/http/resolver_spec.rb +13 -13
- data/spec/unit/http/service/compiler_spec.rb +49 -62
- data/spec/unit/http/service/file_server_spec.rb +3 -3
- data/spec/unit/http/service/puppetserver_spec.rb +34 -4
- data/spec/unit/http/service_spec.rb +1 -2
- data/spec/unit/http/session_spec.rb +16 -14
- data/spec/unit/{network/http → http}/site_spec.rb +3 -3
- data/spec/unit/indirector/facts/facter_spec.rb +97 -0
- data/spec/unit/indirector/facts/json_spec.rb +255 -0
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +5 -3
- data/spec/unit/indirector/file_content/rest_spec.rb +0 -4
- data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -4
- data/spec/unit/indirector/file_server_spec.rb +1 -15
- data/spec/unit/indirector/node/json_spec.rb +33 -0
- data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
- data/spec/unit/indirector/report/rest_spec.rb +2 -17
- data/spec/unit/indirector/report/yaml_spec.rb +72 -8
- data/spec/unit/indirector/request_spec.rb +0 -264
- data/spec/unit/indirector/rest_spec.rb +98 -752
- data/spec/unit/network/authconfig_spec.rb +2 -132
- data/spec/unit/network/authorization_spec.rb +2 -55
- data/spec/unit/network/formats_spec.rb +4 -4
- data/spec/unit/network/http/api/indirected_routes_spec.rb +1 -97
- data/spec/unit/network/http/api/master/v3_spec.rb +28 -7
- data/spec/unit/network/http/api_spec.rb +10 -0
- data/spec/unit/network/http/connection_spec.rb +19 -41
- data/spec/unit/network/http/handler_spec.rb +0 -6
- data/spec/unit/network/http_pool_spec.rb +0 -4
- data/spec/unit/node/environment_spec.rb +33 -21
- data/spec/unit/node_spec.rb +2 -54
- data/spec/unit/parser/functions/create_resources_spec.rb +2 -20
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +4 -7
- data/spec/unit/pops/loaders/loaders_spec.rb +6 -21
- data/spec/unit/pops/parser/parse_application_spec.rb +4 -22
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +0 -1
- data/spec/unit/pops/parser/parse_capabilities_spec.rb +8 -21
- data/spec/unit/pops/parser/parse_site_spec.rb +20 -24
- data/spec/unit/pops/resource/resource_type_impl_spec.rb +0 -71
- data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
- data/spec/unit/pops/types/type_calculator_spec.rb +6 -6
- data/spec/unit/pops/types/type_factory_spec.rb +1 -1
- data/spec/unit/pops/validator/validator_spec.rb +61 -46
- data/spec/unit/pops/visitor_spec.rb +1 -1
- data/spec/unit/provider/nameservice_spec.rb +0 -57
- data/spec/unit/provider/package/dpkg_spec.rb +0 -48
- data/spec/unit/provider/package/gem_spec.rb +32 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +3 -2
- data/spec/unit/provider/service/smf_spec.rb +401 -165
- data/spec/unit/provider/service/windows_spec.rb +0 -1
- data/spec/unit/provider_spec.rb +0 -12
- data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
- data/spec/unit/resource/type_collection_spec.rb +2 -22
- data/spec/unit/resource_spec.rb +0 -56
- data/spec/unit/settings/http_extra_headers_spec.rb +2 -4
- data/spec/unit/settings/integer_setting_spec.rb +42 -0
- data/spec/unit/settings/port_setting_spec.rb +31 -0
- data/spec/unit/settings/priority_setting_spec.rb +4 -4
- data/spec/unit/settings_spec.rb +423 -236
- data/spec/unit/ssl/base_spec.rb +36 -3
- data/spec/unit/ssl/certificate_request_spec.rb +15 -45
- data/spec/unit/ssl/certificate_spec.rb +2 -11
- data/spec/unit/ssl/ssl_provider_spec.rb +11 -8
- data/spec/unit/ssl/state_machine_spec.rb +0 -1
- data/spec/unit/ssl/verifier_spec.rb +0 -21
- data/spec/unit/transaction/report_spec.rb +0 -2
- data/spec/unit/transaction/resource_harness_spec.rb +2 -2
- data/spec/unit/transaction_spec.rb +45 -79
- data/spec/unit/type/file/checksum_spec.rb +6 -6
- data/spec/unit/type/file/content_spec.rb +1 -1
- data/spec/unit/type/file/ensure_spec.rb +1 -1
- data/spec/unit/type/file/mode_spec.rb +1 -1
- data/spec/unit/type/file/source_spec.rb +0 -1
- data/spec/unit/type/file_spec.rb +12 -6
- data/spec/unit/type/package_spec.rb +1 -1
- data/spec/unit/type_spec.rb +20 -0
- data/spec/unit/util/backups_spec.rb +0 -2
- data/spec/unit/util/execution_spec.rb +0 -29
- data/spec/unit/util/monkey_patches_spec.rb +0 -6
- data/spec/unit/util/rubygems_spec.rb +2 -2
- data/spec/unit/util/run_mode_spec.rb +21 -121
- data/spec/unit/util/windows/string_spec.rb +1 -3
- data/spec/unit/util/yaml_spec.rb +0 -54
- data/spec/unit/util_spec.rb +0 -18
- metadata +50 -176
- data/conf/auth.conf +0 -150
- data/lib/puppet/application/cert.rb +0 -76
- data/lib/puppet/application/key.rb +0 -4
- data/lib/puppet/application/man.rb +0 -4
- data/lib/puppet/application/status.rb +0 -4
- data/lib/puppet/face/key.rb +0 -16
- data/lib/puppet/face/man.rb +0 -145
- data/lib/puppet/face/module/build.rb +0 -14
- data/lib/puppet/face/module/generate.rb +0 -14
- data/lib/puppet/face/module/search.rb +0 -103
- data/lib/puppet/face/status.rb +0 -51
- data/lib/puppet/indirector/certificate/file.rb +0 -9
- data/lib/puppet/indirector/certificate/rest.rb +0 -18
- data/lib/puppet/indirector/certificate_request/file.rb +0 -9
- data/lib/puppet/indirector/certificate_request/memory.rb +0 -7
- data/lib/puppet/indirector/certificate_request/rest.rb +0 -11
- data/lib/puppet/indirector/file_content/http.rb +0 -22
- data/lib/puppet/indirector/key/file.rb +0 -46
- data/lib/puppet/indirector/key/memory.rb +0 -7
- data/lib/puppet/indirector/ssl_file.rb +0 -162
- data/lib/puppet/indirector/status.rb +0 -3
- data/lib/puppet/indirector/status/local.rb +0 -12
- data/lib/puppet/indirector/status/rest.rb +0 -27
- data/lib/puppet/module_tool/applications/searcher.rb +0 -29
- data/lib/puppet/network/auth_config_parser.rb +0 -90
- data/lib/puppet/network/authstore.rb +0 -283
- data/lib/puppet/network/http/api/master/v3/authorization.rb +0 -18
- data/lib/puppet/network/http/api/master/v3/environment.rb +0 -88
- data/lib/puppet/network/http/base_pool.rb +0 -36
- data/lib/puppet/network/http/compression.rb +0 -127
- data/lib/puppet/network/http/connection_adapter.rb +0 -184
- data/lib/puppet/network/http/nocache_pool.rb +0 -28
- data/lib/puppet/network/rest_controller.rb +0 -2
- data/lib/puppet/network/rights.rb +0 -210
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +0 -66
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +0 -22
- data/lib/puppet/parser/environment_compiler.rb +0 -202
- data/lib/puppet/pops/types/enumeration.rb +0 -16
- data/lib/puppet/resource/capability_finder.rb +0 -154
- data/lib/puppet/rest/errors.rb +0 -15
- data/lib/puppet/rest/response.rb +0 -35
- data/lib/puppet/rest/route.rb +0 -85
- data/lib/puppet/rest/routes.rb +0 -135
- data/lib/puppet/ssl/host.rb +0 -505
- data/lib/puppet/ssl/key.rb +0 -61
- data/lib/puppet/ssl/validator.rb +0 -61
- data/lib/puppet/ssl/validator/default_validator.rb +0 -209
- data/lib/puppet/ssl/validator/no_validator.rb +0 -22
- data/lib/puppet/ssl/verifier_adapter.rb +0 -58
- data/lib/puppet/status.rb +0 -40
- data/lib/puppet/util/connection.rb +0 -88
- data/lib/puppet/util/ssl.rb +0 -83
- data/lib/puppet/util/windows/api_types.rb +0 -309
- data/lib/puppet/util/windows/monkey_patches/dir.rb +0 -40
- data/lib/puppet/vendor/load_pathspec.rb +0 -1
- data/lib/puppet/vendor/pathspec/CHANGELOG.md +0 -2
- data/lib/puppet/vendor/pathspec/LICENSE +0 -201
- data/lib/puppet/vendor/pathspec/PUPPET_README.md +0 -6
- data/lib/puppet/vendor/pathspec/README.md +0 -53
- data/lib/puppet/vendor/pathspec/lib/pathspec.rb +0 -122
- data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +0 -275
- data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +0 -17
- data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +0 -14
- data/man/man8/puppet-key.8 +0 -126
- data/man/man8/puppet-man.8 +0 -76
- data/man/man8/puppet-status.8 +0 -108
- data/spec/integration/application/config_spec.rb +0 -74
- data/spec/integration/network/authconfig_spec.rb +0 -256
- data/spec/integration/util/windows/monkey_patches/dir_spec.rb +0 -11
- data/spec/unit/application/man_spec.rb +0 -52
- data/spec/unit/capability_spec.rb +0 -414
- data/spec/unit/face/catalog_spec.rb +0 -6
- data/spec/unit/face/key_spec.rb +0 -9
- data/spec/unit/face/module/search_spec.rb +0 -231
- data/spec/unit/face/module_spec.rb +0 -3
- data/spec/unit/face/status_spec.rb +0 -9
- data/spec/unit/indirector/certificate/file_spec.rb +0 -14
- data/spec/unit/indirector/certificate/rest_spec.rb +0 -61
- data/spec/unit/indirector/certificate_request/file_spec.rb +0 -14
- data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -25
- data/spec/unit/indirector/key/file_spec.rb +0 -79
- data/spec/unit/indirector/ssl_file_spec.rb +0 -305
- data/spec/unit/indirector/status/local_spec.rb +0 -10
- data/spec/unit/indirector/status/rest_spec.rb +0 -50
- data/spec/unit/module_tool/applications/searcher_spec.rb +0 -38
- data/spec/unit/network/auth_config_parser_spec.rb +0 -115
- data/spec/unit/network/authstore_spec.rb +0 -422
- data/spec/unit/network/http/api/master/v3/authorization_spec.rb +0 -57
- data/spec/unit/network/http/api/master/v3/environment_spec.rb +0 -185
- data/spec/unit/network/http/compression_spec.rb +0 -240
- data/spec/unit/network/http/nocache_pool_spec.rb +0 -64
- data/spec/unit/network/http_spec.rb +0 -9
- data/spec/unit/network/rights_spec.rb +0 -439
- data/spec/unit/parser/environment_compiler_spec.rb +0 -730
- data/spec/unit/pops/types/enumeration_spec.rb +0 -51
- data/spec/unit/resource/capability_finder_spec.rb +0 -143
- data/spec/unit/rest/route_spec.rb +0 -132
- data/spec/unit/ssl/host_spec.rb +0 -650
- data/spec/unit/ssl/key_spec.rb +0 -173
- data/spec/unit/ssl/validator_spec.rb +0 -278
- data/spec/unit/status_spec.rb +0 -45
- data/spec/unit/util/ssl_spec.rb +0 -91
@@ -1,803 +1,149 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'puppet/util/json'
|
3
|
-
require 'puppet/indirector'
|
4
|
-
require 'puppet/indirector/errors'
|
5
2
|
require 'puppet/indirector/rest'
|
6
|
-
require 'puppet/util/psych_support'
|
7
3
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
describe "when handling the response" do
|
14
|
-
let(:response) do
|
15
|
-
mock_response(200, 'OK')
|
16
|
-
end
|
17
|
-
|
18
|
-
it "falls back to pson for future requests" do
|
19
|
-
allow(response).to receive(:[]).with(Puppet::Network::HTTP::HEADER_PUPPET_VERSION).and_return("4.10.1")
|
20
|
-
terminus.send(terminus_method, request)
|
21
|
-
|
22
|
-
expect(Puppet[:preferred_serialization_format]).to eq("pson")
|
23
|
-
end
|
24
|
-
|
25
|
-
it "doesn't change the serialization format if the X-Puppet-Version header is missing" do
|
26
|
-
allow(response).to receive(:[]).with(Puppet::Network::HTTP::HEADER_PUPPET_VERSION).and_return(nil)
|
27
|
-
|
28
|
-
terminus.send(terminus_method, request)
|
29
|
-
|
30
|
-
expect(Puppet[:preferred_serialization_format]).to eq("json")
|
31
|
-
end
|
32
|
-
|
33
|
-
it "doesn't change the serialization format if the server major version is 5" do
|
34
|
-
allow(response).to receive(:[]).with(Puppet::Network::HTTP::HEADER_PUPPET_VERSION).and_return("5.0.3")
|
35
|
-
|
36
|
-
terminus.send(terminus_method, request)
|
37
|
-
|
38
|
-
expect(Puppet[:preferred_serialization_format]).to eq("json")
|
39
|
-
end
|
40
|
-
|
41
|
-
it "doesn't change the serialization format if the current format is already pson" do
|
42
|
-
allow(response).to receive(:[]).with(Puppet::Network::HTTP::HEADER_PUPPET_VERSION).and_return("4.10.1")
|
43
|
-
Puppet[:preferred_serialization_format] = "pson"
|
44
|
-
terminus.send(terminus_method, request)
|
45
|
-
|
46
|
-
expect(Puppet[:preferred_serialization_format]).to eq("pson")
|
47
|
-
end
|
48
|
-
|
49
|
-
it "logs a deprecation warning" do
|
50
|
-
terminus.send(terminus_method, request)
|
51
|
-
|
52
|
-
expect(@logs).to include(an_object_having_attributes(level: :warning, message: /Puppet::Indirector::Rest##{terminus_method} is deprecated. Use Puppet::HTTP::Client instead./))
|
53
|
-
end
|
54
|
-
|
55
|
-
it "omits the warning when deprecations are disabled" do
|
56
|
-
Puppet[:disable_warnings] = 'deprecations'
|
57
|
-
terminus.send(terminus_method, request)
|
58
|
-
|
59
|
-
expect(@logs).to eq([])
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
HTTP_ERROR_CODES.each do |code|
|
64
|
-
describe "when the response code is #{code}" do
|
65
|
-
let(:message) { 'error messaged!!!' }
|
66
|
-
let(:body) do
|
67
|
-
Puppet::Util::Json.dump({
|
68
|
-
:issue_kind => 'server-error',
|
69
|
-
:message => message
|
70
|
-
})
|
71
|
-
end
|
72
|
-
let(:response) { mock_response(code, body, 'application/json') }
|
73
|
-
|
74
|
-
describe "when the response is plain text" do
|
75
|
-
let(:response) { mock_response(code, message) }
|
76
|
-
|
77
|
-
it "raises an http error with the body of the response when plain text" do
|
78
|
-
|
79
|
-
expect {
|
80
|
-
terminus.send(terminus_method, request)
|
81
|
-
}.to raise_error(Net::HTTPError, "Error #{code} on SERVER: #{message}")
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
it "raises an http error with the body's message field when json" do
|
86
|
-
expect {
|
87
|
-
terminus.send(terminus_method, request)
|
88
|
-
}.to raise_error(Net::HTTPError, "Error #{code} on SERVER: #{message}")
|
89
|
-
end
|
90
|
-
|
91
|
-
it "does not attempt to deserialize the response into a model" do
|
92
|
-
expect(model).not_to receive(:convert_from)
|
93
|
-
|
94
|
-
expect {
|
95
|
-
terminus.send(terminus_method, request)
|
96
|
-
}.to raise_error(Net::HTTPError)
|
97
|
-
end
|
98
|
-
|
99
|
-
# I'm not sure what this means or if it's used
|
100
|
-
it "if the body is empty raises an http error with the response header" do
|
101
|
-
allow(response).to receive(:body).and_return("")
|
102
|
-
allow(response).to receive(:message).and_return("fhqwhgads")
|
103
|
-
|
104
|
-
expect {
|
105
|
-
terminus.send(terminus_method, request)
|
106
|
-
}.to raise_error(Net::HTTPError, "Error #{code} on SERVER: #{response.message}")
|
107
|
-
end
|
108
|
-
|
109
|
-
describe "and the body is compressed" do
|
110
|
-
it "raises an http error with the decompressed body of the response" do
|
111
|
-
compressed_body = Zlib::Deflate.deflate(body)
|
4
|
+
class Puppet::TestModel
|
5
|
+
extend Puppet::Indirector
|
6
|
+
indirects :test_model
|
7
|
+
end
|
112
8
|
|
113
|
-
|
114
|
-
|
9
|
+
# The subclass must not be all caps even though the superclass is
|
10
|
+
class Puppet::TestModel::Rest < Puppet::Indirector::REST
|
11
|
+
end
|
115
12
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
13
|
+
class Puppet::FailingTestModel
|
14
|
+
extend Puppet::Indirector
|
15
|
+
indirects :failing_test_model
|
123
16
|
end
|
124
17
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
terminus.send(terminus_method, request)
|
131
|
-
}.to raise_error(RuntimeError, "No content type in http response; cannot parse")
|
132
|
-
end
|
133
|
-
end
|
18
|
+
# The subclass must not be all caps even though the superclass is
|
19
|
+
class Puppet::FailingTestModel::Rest < Puppet::Indirector::REST
|
20
|
+
def find(request)
|
21
|
+
http = Puppet.runtime[:http]
|
22
|
+
response = http.get(URI('http://puppet.example.com:8140/puppet/v3/failing_test_model'))
|
134
23
|
|
135
|
-
|
136
|
-
|
24
|
+
if response.code == 404
|
25
|
+
return nil unless request.options[:fail_on_404]
|
137
26
|
|
138
|
-
|
27
|
+
_, body = parse_response(response)
|
28
|
+
msg = _("Find %{uri} resulted in 404 with the message: %{body}") % { uri: elide(response.url.path, 100), body: body }
|
29
|
+
raise Puppet::Error, msg
|
30
|
+
else
|
31
|
+
raise convert_to_http_error(response)
|
32
|
+
end
|
139
33
|
end
|
140
34
|
end
|
141
35
|
|
142
36
|
describe Puppet::Indirector::REST do
|
143
|
-
before :
|
144
|
-
class Puppet::TestModel
|
145
|
-
include Puppet::Util::PsychSupport
|
146
|
-
extend Puppet::Indirector
|
147
|
-
indirects :test_model
|
148
|
-
attr_accessor :name, :data
|
149
|
-
def initialize(name = "name", data = '')
|
150
|
-
@name = name
|
151
|
-
@data = data
|
152
|
-
end
|
153
|
-
|
154
|
-
def self.convert_from(format, string)
|
155
|
-
new('', string)
|
156
|
-
end
|
157
|
-
|
158
|
-
def self.convert_from_multiple(format, string)
|
159
|
-
string.split(',').collect { |s| convert_from(format, s) }
|
160
|
-
end
|
161
|
-
|
162
|
-
def to_data_hash
|
163
|
-
{ 'name' => @name, 'data' => @data }
|
164
|
-
end
|
165
|
-
|
166
|
-
def ==(other)
|
167
|
-
other.is_a? Puppet::TestModel and other.name == name and other.data == data
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
# The subclass must not be all caps even though the superclass is
|
172
|
-
class Puppet::TestModel::Rest < Puppet::Indirector::REST
|
173
|
-
end
|
174
|
-
|
37
|
+
before :each do
|
175
38
|
Puppet::TestModel.indirection.terminus_class = :rest
|
176
39
|
end
|
177
40
|
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
end
|
183
|
-
|
184
|
-
let(:terminus_class) { Puppet::TestModel::Rest }
|
185
|
-
let(:terminus) { Puppet::TestModel.indirection.terminus(:rest) }
|
186
|
-
let(:indirection) { Puppet::TestModel.indirection }
|
187
|
-
let(:model) { Puppet::TestModel }
|
188
|
-
let(:url_prefix) { "#{Puppet::Network::HTTP::MASTER_URL_PREFIX}/v3"}
|
189
|
-
|
190
|
-
around(:each) do |example|
|
191
|
-
Puppet.override(:current_environment => Puppet::Node::Environment.create(:production, [])) do
|
192
|
-
example.run
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
def mock_response(code, body, content_type='text/plain', encoding=nil)
|
197
|
-
obj = double('http 200 ok', :code => code.to_s, :body => body)
|
198
|
-
allow(obj).to receive(:[]).with('content-type').and_return(content_type)
|
199
|
-
allow(obj).to receive(:[]).with('content-encoding').and_return(encoding)
|
200
|
-
allow(obj).to receive(:[]).with(Puppet::Network::HTTP::HEADER_PUPPET_VERSION).and_return(Puppet.version)
|
201
|
-
obj
|
202
|
-
end
|
203
|
-
|
204
|
-
def find_request(key, options={})
|
205
|
-
Puppet::Indirector::Request.new(:test_model, :find, key, nil, options)
|
206
|
-
end
|
207
|
-
|
208
|
-
def head_request(key, options={})
|
209
|
-
Puppet::Indirector::Request.new(:test_model, :head, key, nil, options)
|
210
|
-
end
|
211
|
-
|
212
|
-
def search_request(key, options={})
|
213
|
-
Puppet::Indirector::Request.new(:test_model, :search, key, nil, options)
|
214
|
-
end
|
215
|
-
|
216
|
-
def delete_request(key, options={})
|
217
|
-
Puppet::Indirector::Request.new(:test_model, :destroy, key, nil, options)
|
218
|
-
end
|
219
|
-
|
220
|
-
def save_request(key, instance, options={})
|
221
|
-
Puppet::Indirector::Request.new(:test_model, :save, key, instance, options)
|
222
|
-
end
|
223
|
-
|
224
|
-
it "should have a method for specifying what setting a subclass should use to retrieve its server" do
|
225
|
-
expect(terminus_class).to respond_to(:use_server_setting)
|
41
|
+
it "raises when find is called" do
|
42
|
+
expect {
|
43
|
+
Puppet::TestModel.indirection.find('foo')
|
44
|
+
}.to raise_error(NotImplementedError)
|
226
45
|
end
|
227
46
|
|
228
|
-
it "
|
229
|
-
expect
|
230
|
-
|
231
|
-
|
232
|
-
end
|
233
|
-
|
234
|
-
it "should default to :server for the server setting" do
|
235
|
-
expect(terminus_class).to receive(:server_setting).and_return(nil)
|
236
|
-
Puppet[:server] = "myserver"
|
237
|
-
expect(terminus_class.server).to eq("myserver")
|
238
|
-
end
|
239
|
-
|
240
|
-
it "should have a method for specifying what setting a subclass should use to retrieve its port" do
|
241
|
-
expect(terminus_class).to respond_to(:use_port_setting)
|
242
|
-
end
|
243
|
-
|
244
|
-
it "should use any specified setting to pick the port" do
|
245
|
-
expect(terminus_class).to receive(:port_setting).and_return(:ca_port)
|
246
|
-
Puppet[:ca_port] = "321"
|
247
|
-
expect(terminus_class.port).to eq(321)
|
248
|
-
end
|
249
|
-
|
250
|
-
it "should default to :port for the port setting" do
|
251
|
-
expect(terminus_class).to receive(:port_setting).and_return(nil)
|
252
|
-
Puppet[:serverport] = "543"
|
253
|
-
expect(terminus_class.port).to eq(543)
|
254
|
-
end
|
255
|
-
|
256
|
-
it "should use a failover-selected server if set" do
|
257
|
-
expect(terminus_class).to receive(:server_setting).and_return(nil)
|
258
|
-
Puppet.override(:server => "myserver") do
|
259
|
-
expect(terminus_class.server).to eq("myserver")
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
it "should use a failover-selected port if set" do
|
264
|
-
expect(terminus_class).to receive(:port_setting).and_return(nil)
|
265
|
-
Puppet.override(:serverport => 321) do
|
266
|
-
expect(terminus_class.port).to eq(321)
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
it "should use server_list for server when available" do
|
271
|
-
expect(terminus_class).to receive(:server_setting).and_return(nil)
|
272
|
-
Puppet[:server_list] = [["foo", "123"]]
|
273
|
-
expect(terminus_class.server).to eq("foo")
|
274
|
-
end
|
275
|
-
|
276
|
-
it "should prefer failover-selected server from server list" do
|
277
|
-
expect(terminus_class).to receive(:server_setting).and_return(nil)
|
278
|
-
Puppet[:server_list] = [["foo", "123"],["bar", "321"]]
|
279
|
-
Puppet.override(:server => "bar") do
|
280
|
-
expect(terminus_class.server).to eq("bar")
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
it "should use server_list for port when available" do
|
285
|
-
expect(terminus_class).to receive(:port_setting).and_return(nil)
|
286
|
-
Puppet[:server_list] = [["foo", "123"]]
|
287
|
-
expect(terminus_class.port).to eq(123)
|
288
|
-
end
|
289
|
-
|
290
|
-
it "should prefer failover-selected port from server list" do
|
291
|
-
expect(terminus_class).to receive(:port_setting).and_return(nil)
|
292
|
-
Puppet[:server_list] = [["foo", "123"],["bar", "321"]]
|
293
|
-
Puppet.override(:serverport => "321") do
|
294
|
-
expect(terminus_class.port).to eq(321)
|
295
|
-
end
|
296
|
-
end
|
297
|
-
|
298
|
-
it "should use an explicitly specified more-speciic server when failover is active" do
|
299
|
-
expect(terminus_class).to receive(:server_setting).and_return(:ca_server)
|
300
|
-
Puppet[:ca_server] = "myserver"
|
301
|
-
Puppet.override(:server => "anotherserver") do
|
302
|
-
expect(terminus_class.server).to eq("myserver")
|
303
|
-
end
|
304
|
-
end
|
305
|
-
|
306
|
-
it "should use an explicitly specified more-specific port when failover is active" do
|
307
|
-
expect(terminus_class).to receive(:port_setting).and_return(:ca_port)
|
308
|
-
Puppet[:ca_port] = 321
|
309
|
-
Puppet.override(:serverport => 543) do
|
310
|
-
expect(terminus_class.port).to eq(321)
|
311
|
-
end
|
312
|
-
end
|
313
|
-
|
314
|
-
it "should use a default port when a more-specific server is set" do
|
315
|
-
expect(terminus_class).to receive(:server_setting).and_return(:ca_server)
|
316
|
-
expect(terminus_class).to receive(:port_setting).and_return(:ca_port)
|
317
|
-
Puppet[:ca_server] = "myserver"
|
318
|
-
Puppet.override(:server => "anotherserver", :port => 666) do
|
319
|
-
expect(terminus_class.port).to eq(8140)
|
320
|
-
end
|
321
|
-
end
|
322
|
-
|
323
|
-
it 'should default to :puppet for the srv_service' do
|
324
|
-
expect(Puppet::Indirector::REST.srv_service).to eq(:puppet)
|
325
|
-
end
|
326
|
-
|
327
|
-
it 'excludes yaml from the Accept header' do
|
328
|
-
expect(model).to receive(:supported_formats).and_return([:json, :pson, :yaml, :binary])
|
329
|
-
|
330
|
-
expect(terminus.headers['Accept']).to eq('application/json, text/pson, application/octet-stream')
|
331
|
-
end
|
332
|
-
|
333
|
-
it 'excludes b64_zlib_yaml from the Accept header' do
|
334
|
-
expect(model).to receive(:supported_formats).and_return([:json, :pson, :b64_zlib_yaml])
|
335
|
-
|
336
|
-
expect(terminus.headers['Accept']).to eq('application/json, text/pson')
|
337
|
-
end
|
338
|
-
|
339
|
-
it 'excludes dot from the Accept header' do
|
340
|
-
expect(model).to receive(:supported_formats).and_return([:json, :dot])
|
341
|
-
|
342
|
-
expect(terminus.headers['Accept']).to eq('application/json')
|
343
|
-
end
|
344
|
-
|
345
|
-
describe "when creating an HTTP client" do
|
346
|
-
it "should use the class's server and port if the indirection request provides neither" do
|
347
|
-
@request = double('request', :key => "foo", :server => nil, :port => nil)
|
348
|
-
expect(terminus.class).to receive(:port).and_return(321)
|
349
|
-
expect(terminus.class).to receive(:server).and_return("myserver")
|
350
|
-
expect(Puppet::Network::HttpPool).to receive(:connection).with('myserver', 321, anything).and_return("myconn")
|
351
|
-
expect(terminus.network(@request)).to eq("myconn")
|
352
|
-
end
|
353
|
-
|
354
|
-
it "should use the server from the indirection request if one is present" do
|
355
|
-
@request = double('request', :key => "foo", :server => "myserver", :port => nil)
|
356
|
-
allow(terminus.class).to receive(:port).and_return(321)
|
357
|
-
expect(Puppet::Network::HttpPool).to receive(:connection).with('myserver', 321, anything).and_return("myconn")
|
358
|
-
expect(terminus.network(@request)).to eq("myconn")
|
359
|
-
end
|
360
|
-
|
361
|
-
it "should use the port from the indirection request if one is present" do
|
362
|
-
@request = double('request', :key => "foo", :server => nil, :port => 321)
|
363
|
-
allow(terminus.class).to receive(:server).and_return("myserver")
|
364
|
-
expect(Puppet::Network::HttpPool).to receive(:connection).with('myserver', 321, anything).and_return("myconn")
|
365
|
-
expect(terminus.network(@request)).to eq("myconn")
|
366
|
-
end
|
367
|
-
end
|
368
|
-
|
369
|
-
describe "#find" do
|
370
|
-
let(:http_method) { :get }
|
371
|
-
let(:response) { mock_response(200, 'body') }
|
372
|
-
let(:connection) { double('mock http connection', :get => response, :verify_callback= => nil) }
|
373
|
-
let(:request) { find_request('foo') }
|
374
|
-
|
375
|
-
before :each do
|
376
|
-
allow(terminus).to receive(:network).and_return(connection)
|
377
|
-
end
|
378
|
-
|
379
|
-
it_behaves_like 'a REST terminus method', :find
|
380
|
-
it_behaves_like 'a deserializing terminus method', :find
|
381
|
-
|
382
|
-
describe "with a long set of parameters" do
|
383
|
-
it "calls post on the connection with the query params in the body" do
|
384
|
-
params = {}
|
385
|
-
'aa'.upto('zz') do |s|
|
386
|
-
params[s] = 'foo'
|
387
|
-
end
|
388
|
-
|
389
|
-
# The request special-cases this parameter, and it
|
390
|
-
# won't be passed on to the server, so we remove it here
|
391
|
-
# to avoid a failure.
|
392
|
-
params.delete('ip')
|
393
|
-
|
394
|
-
params["environment"] = "production"
|
395
|
-
|
396
|
-
request = find_request('whoa', params)
|
397
|
-
|
398
|
-
expect(connection).to receive(:post) do |_,req,_|
|
399
|
-
expect(req.split("&").flatten).to match_array(params.map {|key,value| "#{key}=#{value}"})
|
400
|
-
|
401
|
-
mock_response(200, 'body')
|
402
|
-
end
|
403
|
-
|
404
|
-
terminus.find(request)
|
405
|
-
end
|
406
|
-
end
|
407
|
-
|
408
|
-
describe "with no parameters" do
|
409
|
-
it "calls get on the connection" do
|
410
|
-
request = find_request('foo bar')
|
411
|
-
|
412
|
-
expect(connection).to receive(:get).with("#{url_prefix}/test_model/foo%20bar?environment=production&", anything).and_return(mock_response('200', 'response body'))
|
413
|
-
|
414
|
-
expect(terminus.find(request)).to eq(model.new('foo bar', 'response body'))
|
415
|
-
end
|
416
|
-
end
|
417
|
-
|
418
|
-
it "returns nil on 404" do
|
419
|
-
response = mock_response('404', nil)
|
420
|
-
|
421
|
-
expect(connection).to receive(:get).and_return(response)
|
422
|
-
|
423
|
-
expect(terminus.find(request)).to eq(nil)
|
424
|
-
end
|
425
|
-
|
426
|
-
it 'raises no warning for a 404 (when not asked to do so)' do
|
427
|
-
response = mock_response('404', 'this is the notfound you are looking for')
|
428
|
-
expect(connection).to receive(:get).and_return(response)
|
429
|
-
expect{terminus.find(request)}.to_not raise_error()
|
430
|
-
end
|
431
|
-
|
432
|
-
context 'when fail_on_404 is used in request' do
|
433
|
-
it 'raises an error for a 404 when asked to do so' do
|
434
|
-
request = find_request('foo', :fail_on_404 => true)
|
435
|
-
response = mock_response('404', 'this is the notfound you are looking for')
|
436
|
-
expect(connection).to receive(:get).and_return(response)
|
437
|
-
|
438
|
-
expect do
|
439
|
-
terminus.find(request)
|
440
|
-
end.to raise_error(
|
441
|
-
Puppet::Error,
|
442
|
-
"Find #{url_prefix}/test_model/foo?environment=production&fail_on_404=true resulted in 404 with the message: this is the notfound you are looking for")
|
443
|
-
end
|
444
|
-
|
445
|
-
it 'truncates the URI when it is very long' do
|
446
|
-
request = find_request('foo', :fail_on_404 => true, :long_param => ('A' * 100) + 'B')
|
447
|
-
response = mock_response('404', 'this is the notfound you are looking for')
|
448
|
-
expect(connection).to receive(:get).and_return(response)
|
449
|
-
|
450
|
-
expect do
|
451
|
-
terminus.find(request)
|
452
|
-
end.to raise_error(
|
453
|
-
Puppet::Error,
|
454
|
-
/\/test_model\/foo.*\?environment=production&.*long_param=A+\.\.\..*resulted in 404 with the message/)
|
455
|
-
end
|
456
|
-
|
457
|
-
it 'does not truncate the URI when logging debug information' do
|
458
|
-
Puppet.debug = true
|
459
|
-
request = find_request('foo', :fail_on_404 => true, :long_param => ('A' * 100) + 'B')
|
460
|
-
response = mock_response('404', 'this is the notfound you are looking for')
|
461
|
-
expect(connection).to receive(:get).and_return(response)
|
462
|
-
|
463
|
-
expect do
|
464
|
-
terminus.find(request)
|
465
|
-
end.to raise_error(
|
466
|
-
Puppet::Error,
|
467
|
-
/\/test_model\/foo.*\?environment=production&.*long_param=A+B.*resulted in 404 with the message/)
|
468
|
-
end
|
469
|
-
end
|
470
|
-
|
471
|
-
it "asks the model to deserialize the response body and sets the name on the resulting object to the find key" do
|
472
|
-
expect(connection).to receive(:get).and_return(response)
|
473
|
-
|
474
|
-
expect(model).to receive(:convert_from).with(response['content-type'], response.body).and_return(
|
475
|
-
model.new('overwritten', 'decoded body')
|
476
|
-
)
|
477
|
-
|
478
|
-
expect(terminus.find(request)).to eq(model.new('foo', 'decoded body'))
|
479
|
-
end
|
480
|
-
|
481
|
-
it "doesn't require the model to support name=" do
|
482
|
-
class Puppet::TestModel2 < Puppet::TestModel
|
483
|
-
undef_method :name=
|
484
|
-
end
|
485
|
-
|
486
|
-
expect(connection).to receive(:get).and_return(response)
|
487
|
-
instance = Puppet::TestModel2.new('name', 'decoded body')
|
488
|
-
|
489
|
-
expect(model).to receive(:convert_from).with(response['content-type'], response.body).and_return(instance)
|
490
|
-
|
491
|
-
expect(terminus.find(request)).to eq(model.new('name', 'decoded body'))
|
492
|
-
end
|
493
|
-
|
494
|
-
it "provides an Accept header containing the list of supported mime types joined with commas" do
|
495
|
-
expect(connection).to receive(:get).with(anything, hash_including("Accept" => "application/json, text/pson")).and_return(response)
|
496
|
-
|
497
|
-
expect(terminus.model).to receive(:supported_formats).and_return([:json, :pson])
|
498
|
-
terminus.find(request)
|
499
|
-
end
|
500
|
-
|
501
|
-
it "provides a version header with the current puppet version" do
|
502
|
-
expect(connection).to receive(:get).with(anything, hash_including(Puppet::Network::HTTP::HEADER_PUPPET_VERSION => Puppet.version)).and_return(response)
|
503
|
-
|
504
|
-
terminus.find(request)
|
505
|
-
end
|
506
|
-
|
507
|
-
it "adds an Accept-Encoding header" do
|
508
|
-
expect(terminus).to receive(:add_accept_encoding).and_return({"accept-encoding" => "gzip"})
|
509
|
-
|
510
|
-
expect(connection).to receive(:get).with(anything, hash_including("accept-encoding" => "gzip")).and_return(response)
|
511
|
-
|
512
|
-
terminus.find(request)
|
513
|
-
end
|
514
|
-
|
515
|
-
it "uses only the mime-type from the content-type header when asking the model to deserialize" do
|
516
|
-
response = mock_response('200', 'mydata', "text/plain; charset=utf-8")
|
517
|
-
expect(connection).to receive(:get).and_return(response)
|
518
|
-
|
519
|
-
expect(model).to receive(:convert_from).with("text/plain", "mydata").and_return("myobject")
|
520
|
-
|
521
|
-
expect(terminus.find(request)).to eq("myobject")
|
522
|
-
end
|
523
|
-
|
524
|
-
it "decompresses the body before passing it to the model for deserialization" do
|
525
|
-
uncompressed_body = "Why hello there"
|
526
|
-
compressed_body = Zlib::Deflate.deflate(uncompressed_body)
|
527
|
-
|
528
|
-
response = mock_response('200', compressed_body, 'text/plain', 'deflate')
|
529
|
-
expect(connection).to receive(:get).and_return(response)
|
530
|
-
|
531
|
-
expect(model).to receive(:convert_from).with("text/plain", uncompressed_body).and_return("myobject")
|
532
|
-
|
533
|
-
expect(terminus.find(request)).to eq("myobject")
|
534
|
-
end
|
47
|
+
it "raises when head is called" do
|
48
|
+
expect {
|
49
|
+
Puppet::TestModel.indirection.head('foo')
|
50
|
+
}.to raise_error(NotImplementedError)
|
535
51
|
end
|
536
52
|
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
let(:request) { head_request('foo') }
|
542
|
-
|
543
|
-
before :each do
|
544
|
-
allow(terminus).to receive(:network).and_return(connection)
|
545
|
-
end
|
546
|
-
|
547
|
-
it_behaves_like 'a REST terminus method', :head
|
548
|
-
|
549
|
-
it "returns true if there was a successful http response" do
|
550
|
-
expect(connection).to receive(:head).and_return(mock_response('200', nil))
|
551
|
-
|
552
|
-
expect(terminus.head(request)).to eq(true)
|
553
|
-
end
|
554
|
-
|
555
|
-
it "returns false on a 404 response" do
|
556
|
-
expect(connection).to receive(:head).and_return(mock_response('404', nil))
|
557
|
-
|
558
|
-
expect(terminus.head(request)).to eq(false)
|
559
|
-
end
|
560
|
-
|
561
|
-
it "provides a version header with the current puppet version" do
|
562
|
-
expect(connection).to receive(:head).with(anything, hash_including(Puppet::Network::HTTP::HEADER_PUPPET_VERSION => Puppet.version)).and_return(response)
|
563
|
-
|
564
|
-
terminus.head(request)
|
565
|
-
end
|
53
|
+
it "raises when search is called" do
|
54
|
+
expect {
|
55
|
+
Puppet::TestModel.indirection.search('foo')
|
56
|
+
}.to raise_error(NotImplementedError)
|
566
57
|
end
|
567
58
|
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
let(:request) { search_request('foo') }
|
573
|
-
|
574
|
-
before :each do
|
575
|
-
allow(terminus).to receive(:network).and_return(connection)
|
576
|
-
end
|
577
|
-
|
578
|
-
it_behaves_like 'a REST terminus method', :search
|
579
|
-
it_behaves_like 'a deserializing terminus method', :search
|
580
|
-
|
581
|
-
it "should call the GET http method on a network connection" do
|
582
|
-
expect(connection).to receive(:get).with("#{url_prefix}/test_models/foo?environment=production&", hash_including('Accept' => anything)).and_return(mock_response(200, 'data3, data4'))
|
583
|
-
|
584
|
-
terminus.search(request)
|
585
|
-
end
|
586
|
-
|
587
|
-
it "returns an empty list on 404" do
|
588
|
-
response = mock_response('404', nil)
|
589
|
-
|
590
|
-
expect(connection).to receive(:get).and_return(response)
|
591
|
-
|
592
|
-
expect(terminus.search(request)).to eq([])
|
593
|
-
end
|
594
|
-
|
595
|
-
it "asks the model to deserialize the response body into multiple instances" do
|
596
|
-
expect(terminus.search(request)).to eq([model.new('', 'data1'), model.new('', 'data2'), model.new('', 'data3')])
|
597
|
-
end
|
598
|
-
|
599
|
-
it "should provide an Accept header containing the list of supported formats joined with commas" do
|
600
|
-
expect(connection).to receive(:get).with(anything, hash_including("Accept" => "application/json, text/pson")).and_return(mock_response(200, ''))
|
601
|
-
|
602
|
-
expect(terminus.model).to receive(:supported_formats).and_return([:json, :pson])
|
603
|
-
terminus.search(request)
|
604
|
-
end
|
605
|
-
|
606
|
-
it "provides a version header with the current puppet version" do
|
607
|
-
expect(connection).to receive(:get).with(anything, hash_including(Puppet::Network::HTTP::HEADER_PUPPET_VERSION => Puppet.version)).and_return(mock_response(200, ''))
|
608
|
-
|
609
|
-
terminus.search(request)
|
610
|
-
end
|
611
|
-
|
612
|
-
it "should return an empty array if serialization returns nil" do
|
613
|
-
allow(model).to receive(:convert_from_multiple).and_return(nil)
|
614
|
-
|
615
|
-
expect(terminus.search(request)).to eq([])
|
616
|
-
end
|
59
|
+
it "raises when save is called" do
|
60
|
+
expect {
|
61
|
+
Puppet::TestModel.indirection.save(Puppet::TestModel.new, 'foo')
|
62
|
+
}.to raise_error(NotImplementedError)
|
617
63
|
end
|
618
64
|
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
let(:request) { delete_request('foo') }
|
624
|
-
|
625
|
-
before :each do
|
626
|
-
allow(terminus).to receive(:network).and_return(connection)
|
627
|
-
end
|
628
|
-
|
629
|
-
it_behaves_like 'a REST terminus method', :destroy
|
630
|
-
it_behaves_like 'a deserializing terminus method', :destroy
|
631
|
-
|
632
|
-
it "should call the DELETE http method on a network connection" do
|
633
|
-
expect(connection).to receive(:delete).with("#{url_prefix}/test_model/foo?environment=production&", hash_including('Accept' => anything)).and_return(response)
|
634
|
-
|
635
|
-
terminus.destroy(request)
|
636
|
-
end
|
637
|
-
|
638
|
-
it "should fail if any options are provided, since DELETE apparently does not support query options" do
|
639
|
-
request = delete_request('foo', :one => "two", :three => "four")
|
640
|
-
|
641
|
-
expect { terminus.destroy(request) }.to raise_error(ArgumentError)
|
642
|
-
end
|
643
|
-
|
644
|
-
it "should deserialize and return the http response" do
|
645
|
-
expect(connection).to receive(:delete).and_return(response)
|
646
|
-
|
647
|
-
expect(terminus.destroy(request)).to eq(model.new('', 'body'))
|
648
|
-
end
|
649
|
-
|
650
|
-
it "returns nil on 404" do
|
651
|
-
response = mock_response('404', nil)
|
652
|
-
|
653
|
-
expect(connection).to receive(:delete).and_return(response)
|
654
|
-
|
655
|
-
expect(terminus.destroy(request)).to eq(nil)
|
656
|
-
end
|
657
|
-
|
658
|
-
it "should provide an Accept header containing the list of supported formats joined with commas" do
|
659
|
-
expect(connection).to receive(:delete).with(anything, hash_including("Accept" => "application/json, text/pson")).and_return(response)
|
660
|
-
|
661
|
-
expect(terminus.model).to receive(:supported_formats).and_return([:json, :pson])
|
662
|
-
terminus.destroy(request)
|
663
|
-
end
|
664
|
-
|
665
|
-
it "provides a version header with the current puppet version" do
|
666
|
-
expect(connection).to receive(:delete).with(anything, hash_including(Puppet::Network::HTTP::HEADER_PUPPET_VERSION => Puppet.version)).and_return(response)
|
667
|
-
|
668
|
-
terminus.destroy(request)
|
669
|
-
end
|
65
|
+
it "raises when destroy is called" do
|
66
|
+
expect {
|
67
|
+
Puppet::TestModel.indirection.destroy('foo')
|
68
|
+
}.to raise_error(NotImplementedError)
|
670
69
|
end
|
671
70
|
|
672
|
-
|
673
|
-
let(:http_method) { :put }
|
674
|
-
let(:response) { mock_response(200, 'body') }
|
675
|
-
let(:connection) { double('mock http connection', :put => response, :verify_callback= => nil) }
|
676
|
-
let(:instance) { model.new('the thing', 'some contents') }
|
677
|
-
let(:request) { save_request(instance.name, instance) }
|
678
|
-
|
71
|
+
context 'when parsing the response error' do
|
679
72
|
before :each do
|
680
|
-
|
681
|
-
end
|
682
|
-
|
683
|
-
it_behaves_like 'a REST terminus method', :save
|
684
|
-
|
685
|
-
it "should call the PUT http method on a network connection" do
|
686
|
-
expect(connection).to receive(:put).with("#{url_prefix}/test_model/the%20thing?environment=production&", anything, hash_including("Content-Type")).and_return(response)
|
687
|
-
|
688
|
-
terminus.save(request)
|
689
|
-
end
|
690
|
-
|
691
|
-
it "should fail if any options are provided, since PUT apparently does not support query options" do
|
692
|
-
request = save_request(instance.name, instance, :one => "two", :three => "four")
|
693
|
-
|
694
|
-
expect { terminus.save(request) }.to raise_error(ArgumentError)
|
695
|
-
end
|
696
|
-
|
697
|
-
it "should serialize the instance using the default format and pass the result as the body of the request" do
|
698
|
-
expect(instance).to receive(:render).and_return("serial_instance")
|
699
|
-
expect(connection).to receive(:put).with(anything, "serial_instance", anything).and_return(response)
|
700
|
-
|
701
|
-
terminus.save(request)
|
702
|
-
end
|
703
|
-
|
704
|
-
it "returns nil on 404" do
|
705
|
-
response = mock_response('404', nil)
|
706
|
-
|
707
|
-
expect(connection).to receive(:put).and_return(response)
|
708
|
-
|
709
|
-
expect(terminus.save(request)).to eq(nil)
|
710
|
-
end
|
711
|
-
|
712
|
-
it "returns nil" do
|
713
|
-
expect(connection).to receive(:put).and_return(response)
|
714
|
-
|
715
|
-
expect(terminus.save(request)).to be_nil
|
716
|
-
end
|
717
|
-
|
718
|
-
it "should provide an Accept header containing the list of supported formats joined with commas" do
|
719
|
-
expect(connection).to receive(:put).with(anything, anything, hash_including("Accept" => "application/json, text/pson")).and_return(response)
|
720
|
-
|
721
|
-
expect(instance).to receive(:render).and_return('')
|
722
|
-
expect(model).to receive(:supported_formats).and_return([:json, :pson])
|
723
|
-
expect(instance).to receive(:mime).and_return("supported")
|
724
|
-
|
725
|
-
terminus.save(request)
|
73
|
+
Puppet::FailingTestModel.indirection.terminus_class = :rest
|
726
74
|
end
|
727
75
|
|
728
|
-
it
|
729
|
-
|
76
|
+
it 'returns nil if 404 is returned and fail_on_404 is omitted' do
|
77
|
+
stub_request(:get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model').to_return(status: 404)
|
730
78
|
|
731
|
-
|
79
|
+
expect(Puppet::FailingTestModel.indirection.find('foo')).to be_nil
|
732
80
|
end
|
733
81
|
|
734
|
-
it
|
735
|
-
|
736
|
-
|
82
|
+
it 'raises if 404 is returned and fail_on_404 is true' do
|
83
|
+
stub_request(
|
84
|
+
:get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model',
|
85
|
+
).to_return(status: 404,
|
86
|
+
headers: { 'Content-Type' => 'text/plain' },
|
87
|
+
body: 'plaintext')
|
737
88
|
|
738
|
-
|
89
|
+
expect {
|
90
|
+
Puppet::FailingTestModel.indirection.find('foo', fail_on_404: true)
|
91
|
+
}.to raise_error(Puppet::Error, 'Find /puppet/v3/failing_test_model resulted in 404 with the message: plaintext')
|
739
92
|
end
|
740
|
-
end
|
741
93
|
|
742
|
-
|
743
|
-
|
744
|
-
let(:response) { mock_response(200, 'body') }
|
745
|
-
let(:connection) { double('mock http connection', :put => response, :verify_callback= => nil) }
|
746
|
-
let(:instance) { model.new('the thing', 'some contents') }
|
747
|
-
let(:request) { save_request(instance.name, instance) }
|
94
|
+
it 'returns the HTTP reason if the response body is empty' do
|
95
|
+
stub_request(:get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model').to_return(status: [500, 'Internal Server Error'])
|
748
96
|
|
749
|
-
|
750
|
-
|
97
|
+
expect {
|
98
|
+
Puppet::FailingTestModel.indirection.find('foo')
|
99
|
+
}.to raise_error(Net::HTTPError, 'Error 500 on SERVER: Internal Server Error')
|
751
100
|
end
|
752
101
|
|
753
|
-
it '
|
754
|
-
|
755
|
-
|
756
|
-
|
102
|
+
it 'parses the response body as text' do
|
103
|
+
stub_request(
|
104
|
+
:get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model'
|
105
|
+
).to_return(status: [500, 'Internal Server Error'],
|
106
|
+
headers: { 'Content-Type' => 'text/plain' },
|
107
|
+
body: 'plaintext')
|
757
108
|
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
terminus.handle_response(request, response)
|
762
|
-
end
|
109
|
+
expect {
|
110
|
+
Puppet::FailingTestModel.indirection.find('foo')
|
111
|
+
}.to raise_error(Net::HTTPError, 'Error 500 on SERVER: plaintext')
|
763
112
|
end
|
764
113
|
|
765
|
-
it '
|
766
|
-
|
767
|
-
|
114
|
+
it 'parses the response body as json and returns the "message"' do
|
115
|
+
stub_request(
|
116
|
+
:get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model'
|
117
|
+
).to_return(status: [500, 'Internal Server Error'],
|
118
|
+
headers: { 'Content-Type' => 'application/json' },
|
119
|
+
body: JSON.dump({'status' => false, 'message' => 'json error'}))
|
768
120
|
|
769
|
-
expect
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
expect(Puppet[:preferred_serialization_format]).to eq('pson')
|
121
|
+
expect {
|
122
|
+
Puppet::FailingTestModel.indirection.find('foo')
|
123
|
+
}.to raise_error(Net::HTTPError, 'Error 500 on SERVER: json error')
|
774
124
|
end
|
775
125
|
|
776
|
-
it '
|
777
|
-
|
778
|
-
|
779
|
-
|
126
|
+
it 'parses the response body as pson and returns the "message"' do
|
127
|
+
stub_request(
|
128
|
+
:get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model'
|
129
|
+
).to_return(status: [500, 'Internal Server Error'],
|
130
|
+
headers: { 'Content-Type' => 'application/pson' },
|
131
|
+
body: PSON.dump({'status' => false, 'message' => 'pson error'}))
|
780
132
|
|
781
|
-
|
133
|
+
expect {
|
134
|
+
Puppet::FailingTestModel.indirection.find('foo')
|
135
|
+
}.to raise_error(Net::HTTPError, 'Error 500 on SERVER: pson error')
|
782
136
|
end
|
783
|
-
end
|
784
137
|
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
:
|
789
|
-
|
790
|
-
:save,
|
791
|
-
:search
|
792
|
-
].each do |method|
|
793
|
-
it "##{method} passes the SRV service, and fall-back server & port to the request's do_request method" do
|
794
|
-
request = Puppet::Indirector::Request.new(:indirection, method, 'key', nil)
|
795
|
-
stub_response = mock_response('200', 'body')
|
138
|
+
it 'returns the response body if no content-type given' do
|
139
|
+
stub_request(
|
140
|
+
:get, 'http://puppet.example.com:8140/puppet/v3/failing_test_model'
|
141
|
+
).to_return(status: [500, 'Internal Server Error'],
|
142
|
+
body: 'unknown text')
|
796
143
|
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
end
|
144
|
+
expect {
|
145
|
+
Puppet::FailingTestModel.indirection.find('foo')
|
146
|
+
}.to raise_error(Net::HTTPError, 'Error 500 on SERVER: unknown text')
|
801
147
|
end
|
802
148
|
end
|
803
149
|
end
|