puppet 6.20.0-x64-mingw32 → 7.4.0-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +1 -4
- data/Gemfile.lock +13 -13
- data/README.md +1 -1
- data/conf/fileserver.conf +5 -10
- data/ext/build_defaults.yaml +1 -2
- data/ext/osx/file_mapping.yaml +0 -5
- data/ext/project_data.yaml +2 -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 +13 -9
- data/lib/puppet/application/ssl.rb +1 -1
- data/lib/puppet/configurer.rb +27 -29
- data/lib/puppet/configurer/plugin_handler.rb +21 -19
- data/lib/puppet/defaults.rb +57 -162
- data/lib/puppet/environments.rb +8 -23
- data/lib/puppet/face/facts.rb +73 -49
- data/lib/puppet/face/help.rb +1 -1
- data/lib/puppet/face/node/clean.rb +8 -0
- 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 +6 -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/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/facts/facter.rb +25 -3
- data/lib/puppet/indirector/facts/rest.rb +3 -22
- 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/node/rest.rb +2 -4
- 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 +67 -0
- 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 +3 -1
- 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 +0 -5
- 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/property/list.rb +1 -1
- data/lib/puppet/provider.rb +0 -13
- data/lib/puppet/provider/group/groupadd.rb +13 -8
- data/lib/puppet/provider/nameservice.rb +0 -18
- data/lib/puppet/provider/package/apt.rb +30 -2
- data/lib/puppet/provider/package/aptitude.rb +6 -0
- 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/debian.rb +2 -0
- data/lib/puppet/provider/service/smf.rb +191 -73
- data/lib/puppet/provider/user/directoryservice.rb +0 -10
- data/lib/puppet/provider/user/useradd.rb +55 -8
- data/lib/puppet/reference/configuration.rb +7 -5
- 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/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 +8 -16
- data/lib/puppet/type/user.rb +1 -1
- 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/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 +521 -1226
- data/man/man5/puppet.conf.5 +35 -95
- 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 +57 -36
- data/man/man8/puppet-filebucket.8 +4 -4
- 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 +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.8 +2 -2
- data/spec/fixtures/unit/provider/service/smf/{svcs.out → svcs_instances.out} +0 -0
- data/spec/integration/application/agent_spec.rb +57 -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/indirector/file_content/file_server_spec.rb +0 -2
- data/spec/integration/indirector/file_metadata/file_server_spec.rb +0 -2
- 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 +1 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/unit/agent_spec.rb +0 -2
- data/spec/unit/application/facts_spec.rb +86 -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 +22 -47
- data/spec/unit/environments_spec.rb +0 -3
- data/spec/unit/face/facts_spec.rb +4 -0
- data/spec/unit/face/node_spec.rb +14 -2
- 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 +22 -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/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 +0 -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 +0 -1
- 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 +113 -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/report/rest_spec.rb +2 -17
- 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 -129
- data/spec/unit/network/authorization_spec.rb +2 -55
- data/spec/unit/network/formats_spec.rb +45 -4
- data/spec/unit/network/http/api/indirected_routes_spec.rb +1 -92
- 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 -1
- 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/group/groupadd_spec.rb +5 -2
- data/spec/unit/provider/nameservice_spec.rb +0 -57
- data/spec/unit/provider/package/apt_spec.rb +24 -15
- data/spec/unit/provider/package/aptitude_spec.rb +1 -1
- 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/user/useradd_spec.rb +55 -3
- data/spec/unit/provider_spec.rb +0 -12
- 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 +17 -0
- data/spec/unit/ssl/base_spec.rb +36 -3
- data/spec/unit/ssl/certificate_request_spec.rb +19 -55
- data/spec/unit/ssl/certificate_spec.rb +2 -11
- 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/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 +48 -219
- 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/fact_dif.rb +0 -62
- 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/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/key_spec.rb +0 -9
- data/spec/unit/face/module/search_spec.rb +0 -231
- 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 -78
- 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 -148
- data/spec/unit/rest/route_spec.rb +0 -132
- data/spec/unit/ssl/host_spec.rb +0 -645
- 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
@@ -57,8 +57,4 @@ describe Puppet::Indirector::FileContent::Rest do
|
|
57
57
|
|
58
58
|
described_class.indirection.find("puppet://example.com:8140/:mount/path/to/file")
|
59
59
|
end
|
60
|
-
|
61
|
-
it "should use the :fileserver SRV service" do
|
62
|
-
expect(Puppet::Indirector::FileContent::Rest.srv_service).to eq(:fileserver)
|
63
|
-
end
|
64
60
|
end
|
@@ -113,8 +113,4 @@ describe Puppet::Indirector::FileMetadata::Rest do
|
|
113
113
|
model.indirection.search("puppet://example.com:8140/:mount/path/to/dir")
|
114
114
|
end
|
115
115
|
end
|
116
|
-
|
117
|
-
it "should use the :fileserver SRV service" do
|
118
|
-
expect(Puppet::Indirector::FileMetadata::Rest.srv_service).to eq(:fileserver)
|
119
|
-
end
|
120
116
|
end
|
@@ -246,7 +246,7 @@ describe Puppet::Indirector::FileServer do
|
|
246
246
|
end
|
247
247
|
|
248
248
|
describe "when checking authorization" do
|
249
|
-
let(:mount) { double('mount'
|
249
|
+
let(:mount) { double('mount') }
|
250
250
|
let(:request) { Puppet::Indirector::Request.new(:myind, :mymethod, uri, :environment => "myenv") }
|
251
251
|
|
252
252
|
before(:each) do
|
@@ -282,21 +282,7 @@ describe Puppet::Indirector::FileServer do
|
|
282
282
|
end
|
283
283
|
|
284
284
|
it "should return true when no auth directives are defined for the mount point" do
|
285
|
-
allow(mount).to receive(:empty?).and_return(true)
|
286
|
-
allow(mount).to receive(:globalallow?).and_return(nil)
|
287
285
|
expect(terminus).to be_authorized(request)
|
288
286
|
end
|
289
|
-
|
290
|
-
it "should return true when a global allow directive is defined for the mount point" do
|
291
|
-
allow(mount).to receive(:empty?).and_return(false)
|
292
|
-
allow(mount).to receive(:globalallow?).and_return(true)
|
293
|
-
expect(terminus).to be_authorized(request)
|
294
|
-
end
|
295
|
-
|
296
|
-
it "should return false when a non-global allow directive is defined for the mount point" do
|
297
|
-
allow(mount).to receive(:empty?).and_return(false)
|
298
|
-
allow(mount).to receive(:globalallow?).and_return(false)
|
299
|
-
expect(terminus).not_to be_authorized(request)
|
300
|
-
end
|
301
287
|
end
|
302
288
|
end
|
@@ -20,21 +20,6 @@ describe Puppet::Transaction::Report::Rest do
|
|
20
20
|
{ body: formatter.render(["store", "http"]), headers: {'Content-Type' => formatter.mime } }
|
21
21
|
end
|
22
22
|
|
23
|
-
it "should use the :report_server setting in preference to :server" do
|
24
|
-
Puppet.settings[:server] = "server"
|
25
|
-
Puppet.settings[:report_server] = "report_server"
|
26
|
-
expect(Puppet::Transaction::Report::Rest.server).to eq("report_server")
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should have a value for report_server and report_port" do
|
30
|
-
expect(Puppet::Transaction::Report::Rest.server).not_to be_nil
|
31
|
-
expect(Puppet::Transaction::Report::Rest.port).not_to be_nil
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should use the :report SRV service" do
|
35
|
-
expect(Puppet::Transaction::Report::Rest.srv_service).to eq(:report)
|
36
|
-
end
|
37
|
-
|
38
23
|
it "saves a report " do
|
39
24
|
stub_request(:put, uri)
|
40
25
|
.to_return(status: 200, **report_response)
|
@@ -77,7 +62,7 @@ describe Puppet::Transaction::Report::Rest do
|
|
77
62
|
|
78
63
|
stub_request(:put, uri)
|
79
64
|
.to_return(status: 500,
|
80
|
-
headers: { 'Content-Type' => 'text/pson', Puppet::
|
65
|
+
headers: { 'Content-Type' => 'text/pson', Puppet::HTTP::HEADER_PUPPET_VERSION => '4.10.1' })
|
81
66
|
|
82
67
|
expect {
|
83
68
|
described_class.indirection.save(report)
|
@@ -89,7 +74,7 @@ describe Puppet::Transaction::Report::Rest do
|
|
89
74
|
|
90
75
|
stub_request(:put, uri)
|
91
76
|
.to_return(status: 500,
|
92
|
-
headers: { 'Content-Type' => 'text/pson', Puppet::
|
77
|
+
headers: { 'Content-Type' => 'text/pson', Puppet::HTTP::HEADER_PUPPET_VERSION => '4.10.1' })
|
93
78
|
|
94
79
|
expect {
|
95
80
|
described_class.indirection.save(report)
|
@@ -271,229 +271,6 @@ describe Puppet::Indirector::Request do
|
|
271
271
|
expect(Puppet::Indirector::Request.new(:myind, :find, "my key", nil, :node => 'foo').to_hash[:node]).to eq('foo')
|
272
272
|
end
|
273
273
|
|
274
|
-
describe "when building a query string from its options" do
|
275
|
-
def a_request_with_options(options)
|
276
|
-
Puppet::Indirector::Request.new(:myind, :find, "my key", nil, options)
|
277
|
-
end
|
278
|
-
|
279
|
-
def the_parsed_query_string_from(request)
|
280
|
-
CGI.parse(request.query_string.sub(/^\?/, ''))
|
281
|
-
end
|
282
|
-
|
283
|
-
it "should return an empty query string if there are no options" do
|
284
|
-
request = a_request_with_options(nil)
|
285
|
-
|
286
|
-
expect(request.query_string).to eq("")
|
287
|
-
end
|
288
|
-
|
289
|
-
it "should return an empty query string if the options are empty" do
|
290
|
-
request = a_request_with_options({})
|
291
|
-
|
292
|
-
expect(request.query_string).to eq("")
|
293
|
-
end
|
294
|
-
|
295
|
-
it "should include all options in the query string, separated by '&'" do
|
296
|
-
request = a_request_with_options(:one => "two", :three => "four")
|
297
|
-
|
298
|
-
expect(the_parsed_query_string_from(request)).to eq({
|
299
|
-
"one" => ["two"],
|
300
|
-
"three" => ["four"]
|
301
|
-
})
|
302
|
-
end
|
303
|
-
|
304
|
-
it "should ignore nil options" do
|
305
|
-
request = a_request_with_options(:one => "two", :three => nil)
|
306
|
-
|
307
|
-
expect(the_parsed_query_string_from(request)).to eq({
|
308
|
-
"one" => ["two"]
|
309
|
-
})
|
310
|
-
end
|
311
|
-
|
312
|
-
it "should convert 'true' option values into strings" do
|
313
|
-
request = a_request_with_options(:one => true)
|
314
|
-
|
315
|
-
expect(the_parsed_query_string_from(request)).to eq({
|
316
|
-
"one" => ["true"]
|
317
|
-
})
|
318
|
-
end
|
319
|
-
|
320
|
-
it "should convert 'false' option values into strings" do
|
321
|
-
request = a_request_with_options(:one => false)
|
322
|
-
|
323
|
-
expect(the_parsed_query_string_from(request)).to eq({
|
324
|
-
"one" => ["false"]
|
325
|
-
})
|
326
|
-
end
|
327
|
-
|
328
|
-
it "should convert to a string all option values that are integers" do
|
329
|
-
request = a_request_with_options(:one => 50)
|
330
|
-
|
331
|
-
expect(the_parsed_query_string_from(request)).to eq({
|
332
|
-
"one" => ["50"]
|
333
|
-
})
|
334
|
-
end
|
335
|
-
|
336
|
-
it "should convert to a string all option values that are floating point numbers" do
|
337
|
-
request = a_request_with_options(:one => 1.2)
|
338
|
-
|
339
|
-
expect(the_parsed_query_string_from(request)).to eq({
|
340
|
-
"one" => ["1.2"]
|
341
|
-
})
|
342
|
-
end
|
343
|
-
|
344
|
-
it "should CGI-escape all option values that are strings" do
|
345
|
-
request = a_request_with_options(:one => "one two")
|
346
|
-
|
347
|
-
expect(the_parsed_query_string_from(request)).to eq({
|
348
|
-
"one" => ["one two"]
|
349
|
-
})
|
350
|
-
end
|
351
|
-
|
352
|
-
it "should convert an array of values into multiple entries for the same key" do
|
353
|
-
request = a_request_with_options(:one => %w{one two})
|
354
|
-
|
355
|
-
expect(the_parsed_query_string_from(request)).to eq({
|
356
|
-
"one" => ["one", "two"]
|
357
|
-
})
|
358
|
-
end
|
359
|
-
|
360
|
-
it "should stringify simple data types inside an array" do
|
361
|
-
request = a_request_with_options(:one => ['one', nil])
|
362
|
-
|
363
|
-
expect(the_parsed_query_string_from(request)).to eq({
|
364
|
-
"one" => ["one"]
|
365
|
-
})
|
366
|
-
end
|
367
|
-
|
368
|
-
it "should error if an array contains another array" do
|
369
|
-
request = a_request_with_options(:one => ['one', ["not allowed"]])
|
370
|
-
|
371
|
-
expect { request.query_string }.to raise_error(ArgumentError)
|
372
|
-
end
|
373
|
-
|
374
|
-
it "should error if an array contains illegal data" do
|
375
|
-
request = a_request_with_options(:one => ['one', { :not => "allowed" }])
|
376
|
-
|
377
|
-
expect { request.query_string }.to raise_error(ArgumentError)
|
378
|
-
end
|
379
|
-
|
380
|
-
it "should convert to a string and CGI-escape all option values that are symbols" do
|
381
|
-
request = a_request_with_options(:one => :"sym bol")
|
382
|
-
|
383
|
-
expect(the_parsed_query_string_from(request)).to eq({
|
384
|
-
"one" => ["sym bol"]
|
385
|
-
})
|
386
|
-
end
|
387
|
-
|
388
|
-
it "should fail if options other than booleans or strings are provided" do
|
389
|
-
request = a_request_with_options(:one => { :one => :two })
|
390
|
-
|
391
|
-
expect { request.query_string }.to raise_error(ArgumentError)
|
392
|
-
end
|
393
|
-
end
|
394
|
-
|
395
|
-
context '#do_request' do
|
396
|
-
before :each do
|
397
|
-
@request = Puppet::Indirector::Request.new(:myind, :find, "my key", nil)
|
398
|
-
end
|
399
|
-
|
400
|
-
context 'when not using SRV records' do
|
401
|
-
before :each do
|
402
|
-
Puppet.settings[:use_srv_records] = false
|
403
|
-
end
|
404
|
-
|
405
|
-
it "yields the request with the default server and port when no server or port were specified on the original request" do
|
406
|
-
count = 0
|
407
|
-
rval = @request.do_request(:puppet, 'puppet.example.com', '90210') do |got|
|
408
|
-
count += 1
|
409
|
-
expect(got.server).to eq('puppet.example.com')
|
410
|
-
expect(got.port).to eq('90210')
|
411
|
-
'Block return value'
|
412
|
-
end
|
413
|
-
expect(count).to eq(1)
|
414
|
-
|
415
|
-
expect(rval).to eq('Block return value')
|
416
|
-
end
|
417
|
-
end
|
418
|
-
|
419
|
-
context 'when using SRV records' do
|
420
|
-
before :each do
|
421
|
-
Puppet.settings[:use_srv_records] = true
|
422
|
-
Puppet.settings[:srv_domain] = 'example.com'
|
423
|
-
end
|
424
|
-
|
425
|
-
it "yields the request with the original server and port unmodified" do
|
426
|
-
@request.server = 'puppet.example.com'
|
427
|
-
@request.port = '90210'
|
428
|
-
|
429
|
-
count = 0
|
430
|
-
rval = @request.do_request do |got|
|
431
|
-
count += 1
|
432
|
-
expect(got.server).to eq('puppet.example.com')
|
433
|
-
expect(got.port).to eq('90210')
|
434
|
-
'Block return value'
|
435
|
-
end
|
436
|
-
expect(count).to eq(1)
|
437
|
-
|
438
|
-
expect(rval).to eq('Block return value')
|
439
|
-
end
|
440
|
-
|
441
|
-
context "when SRV returns servers" do
|
442
|
-
before :each do
|
443
|
-
@dns_mock = double('dns')
|
444
|
-
expect(Resolv::DNS).to receive(:new).and_return(@dns_mock)
|
445
|
-
|
446
|
-
@port = 7205
|
447
|
-
@target = 'example.com'
|
448
|
-
record = Resolv::DNS::Resource::IN::SRV.new(0, 0, @port, @target)
|
449
|
-
record.instance_variable_set(:@ttl, 10)
|
450
|
-
@srv_records = [record]
|
451
|
-
|
452
|
-
expect(@dns_mock).to receive(:getresources).
|
453
|
-
with("_x-puppet._tcp.#{Puppet.settings[:srv_domain]}", Resolv::DNS::Resource::IN::SRV).
|
454
|
-
and_return(@srv_records)
|
455
|
-
end
|
456
|
-
|
457
|
-
it "yields a request using the server and port from the SRV record" do
|
458
|
-
count = 0
|
459
|
-
rval = @request.do_request do |got|
|
460
|
-
count += 1
|
461
|
-
expect(got.server).to eq('example.com')
|
462
|
-
expect(got.port).to eq(7205)
|
463
|
-
|
464
|
-
@block_return
|
465
|
-
end
|
466
|
-
expect(count).to eq(1)
|
467
|
-
|
468
|
-
expect(rval).to eq(@block_return)
|
469
|
-
end
|
470
|
-
|
471
|
-
it "should fall back to the default server when the block raises a SystemCallError" do
|
472
|
-
count = 0
|
473
|
-
second_pass = nil
|
474
|
-
|
475
|
-
rval = @request.do_request(:puppet, 'puppet', 8140) do |got|
|
476
|
-
count += 1
|
477
|
-
|
478
|
-
if got.server == 'example.com' then
|
479
|
-
raise SystemCallError, "example failure"
|
480
|
-
else
|
481
|
-
second_pass = got
|
482
|
-
end
|
483
|
-
|
484
|
-
@block_return
|
485
|
-
end
|
486
|
-
|
487
|
-
expect(second_pass.server).to eq('puppet')
|
488
|
-
expect(second_pass.port).to eq(8140)
|
489
|
-
expect(count).to eq(2)
|
490
|
-
|
491
|
-
expect(rval).to eq(@block_return)
|
492
|
-
end
|
493
|
-
end
|
494
|
-
end
|
495
|
-
end
|
496
|
-
|
497
274
|
describe "#remote?" do
|
498
275
|
def request(options = {})
|
499
276
|
Puppet::Indirector::Request.new('node', 'find', 'localhost', nil, options)
|
@@ -515,45 +292,4 @@ describe Puppet::Indirector::Request do
|
|
515
292
|
expect(request(:node => 'example.com', :ip => '127.0.0.1')).to be_remote
|
516
293
|
end
|
517
294
|
end
|
518
|
-
|
519
|
-
describe "failover" do
|
520
|
-
it "should use the provided failover host and port" do
|
521
|
-
Puppet.override(:server => 'myhost', :serverport => 666) do
|
522
|
-
req = Puppet::Indirector::Request.new('node', 'find', 'localhost', nil)
|
523
|
-
req.do_request() do |request|
|
524
|
-
expect(request.server).to eq('myhost')
|
525
|
-
expect(request.port).to eq(666)
|
526
|
-
end
|
527
|
-
end
|
528
|
-
end
|
529
|
-
|
530
|
-
it "should not use raw settings when failover fails" do
|
531
|
-
Puppet.override(:server => nil, :serverport => nil) do
|
532
|
-
req = Puppet::Indirector::Request.new('node', 'find', 'localhost', nil)
|
533
|
-
req.do_request() do |request|
|
534
|
-
expect(request.server).to be_nil
|
535
|
-
expect(request.port).to be_nil
|
536
|
-
expect(Puppet.settings[:server]).not_to be_nil
|
537
|
-
expect(Puppet.settings[:serverport]).not_to be_nil
|
538
|
-
end
|
539
|
-
end
|
540
|
-
end
|
541
|
-
|
542
|
-
it "should use server_list when set and failover has not occured" do
|
543
|
-
Puppet.settings[:server_list] = [['myhost',666]]
|
544
|
-
req = Puppet::Indirector::Request.new('node', 'find', 'localhost', nil)
|
545
|
-
req.do_request() do |request|
|
546
|
-
expect(request.server).to eq('myhost')
|
547
|
-
expect(request.port).to eq(666)
|
548
|
-
end
|
549
|
-
end
|
550
|
-
|
551
|
-
it "should use server when server_list is not set" do
|
552
|
-
req = Puppet::Indirector::Request.new('node', 'find', 'localhost', nil)
|
553
|
-
req.do_request() do |request|
|
554
|
-
expect(request.server).to eq(Puppet.settings[:server])
|
555
|
-
expect(request.port).to eq(Puppet.settings[:serverport])
|
556
|
-
end
|
557
|
-
end
|
558
|
-
end
|
559
295
|
end
|
@@ -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
|