puppet 6.14.0 → 6.19.0
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/CODEOWNERS +2 -7
- data/Gemfile +4 -2
- data/Gemfile.lock +36 -34
- data/README.md +3 -4
- data/Rakefile +4 -12
- data/ext/windows/service/daemon.rb +3 -3
- data/lib/puppet.rb +33 -9
- data/lib/puppet/agent.rb +20 -14
- data/lib/puppet/agent/locker.rb +0 -7
- data/lib/puppet/application/agent.rb +25 -9
- data/lib/puppet/application/apply.rb +18 -20
- data/lib/puppet/application/device.rb +1 -1
- data/lib/puppet/application/doc.rb +1 -1
- data/lib/puppet/application/filebucket.rb +5 -14
- data/lib/puppet/application/lookup.rb +16 -4
- data/lib/puppet/application/plugin.rb +1 -0
- data/lib/puppet/application/ssl.rb +3 -3
- data/lib/puppet/configurer.rb +68 -24
- data/lib/puppet/configurer/downloader.rb +31 -10
- data/lib/puppet/configurer/plugin_handler.rb +1 -1
- data/lib/puppet/confine.rb +2 -2
- data/lib/puppet/confine/any.rb +1 -1
- data/lib/puppet/context/trusted_information.rb +14 -8
- data/lib/puppet/daemon.rb +13 -27
- data/lib/puppet/defaults.rb +141 -41
- data/lib/puppet/environments.rb +55 -15
- data/lib/puppet/face/catalog.rb +1 -1
- data/lib/puppet/face/config.rb +46 -16
- data/lib/puppet/face/facts.rb +1 -1
- data/lib/puppet/face/help.rb +29 -3
- data/lib/puppet/face/module/search.rb +5 -0
- data/lib/puppet/face/node.rb +3 -3
- data/lib/puppet/face/node/clean.rb +2 -2
- data/lib/puppet/face/plugin.rb +2 -2
- data/lib/puppet/face/status.rb +1 -1
- data/lib/puppet/feature/base.rb +1 -1
- data/lib/puppet/file_bucket/dipper.rb +1 -1
- data/lib/puppet/file_serving/http_metadata.rb +14 -2
- data/lib/puppet/file_serving/metadata.rb +4 -1
- data/lib/puppet/file_serving/mount/locales.rb +1 -2
- data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
- data/lib/puppet/file_serving/mount/plugins.rb +1 -2
- data/lib/puppet/file_serving/terminus_selector.rb +7 -8
- data/lib/puppet/file_system/file_impl.rb +17 -13
- data/lib/puppet/file_system/uniquefile.rb +12 -16
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/forge/cache.rb +1 -1
- data/lib/puppet/forge/repository.rb +4 -7
- data/lib/puppet/functions/call.rb +1 -1
- data/lib/puppet/functions/filter.rb +1 -0
- data/lib/puppet/functions/lstrip.rb +4 -4
- data/lib/puppet/functions/new.rb +8 -3
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/functions/reverse_each.rb +1 -1
- data/lib/puppet/functions/rstrip.rb +4 -4
- data/lib/puppet/functions/step.rb +1 -1
- data/lib/puppet/functions/strip.rb +4 -4
- data/lib/puppet/gettext/config.rb +5 -5
- data/lib/puppet/gettext/module_translations.rb +4 -4
- data/lib/puppet/http.rb +3 -0
- data/lib/puppet/http/client.rb +215 -60
- data/lib/puppet/http/external_client.rb +90 -0
- data/lib/puppet/http/redirector.rb +43 -7
- data/lib/puppet/http/resolver.rb +43 -3
- data/lib/puppet/http/resolver/server_list.rb +66 -24
- data/lib/puppet/http/resolver/settings.rb +21 -1
- data/lib/puppet/http/resolver/srv.rb +28 -2
- data/lib/puppet/http/response.rb +82 -1
- data/lib/puppet/http/retry_after_handler.rb +39 -0
- data/lib/puppet/http/service.rb +70 -2
- data/lib/puppet/http/service/ca.rb +71 -9
- data/lib/puppet/http/service/compiler.rb +214 -12
- data/lib/puppet/http/service/file_server.rb +106 -5
- data/lib/puppet/http/service/puppetserver.rb +39 -0
- data/lib/puppet/http/service/report.rb +36 -3
- data/lib/puppet/http/session.rb +60 -8
- data/lib/puppet/indirector.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +1 -1
- data/lib/puppet/indirector/catalog/rest.rb +2 -1
- data/lib/puppet/indirector/exec.rb +1 -1
- data/lib/puppet/indirector/facts/facter.rb +3 -3
- data/lib/puppet/indirector/facts/rest.rb +2 -1
- data/lib/puppet/indirector/facts/yaml.rb +1 -1
- data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
- data/lib/puppet/indirector/file_content/http.rb +5 -0
- data/lib/puppet/indirector/file_content/rest.rb +1 -1
- data/lib/puppet/indirector/file_metadata/http.rb +28 -8
- data/lib/puppet/indirector/file_metadata/rest.rb +6 -4
- data/lib/puppet/indirector/hiera.rb +4 -0
- data/lib/puppet/indirector/indirection.rb +1 -1
- data/lib/puppet/indirector/json.rb +1 -1
- data/lib/puppet/indirector/msgpack.rb +1 -1
- data/lib/puppet/indirector/node/rest.rb +2 -1
- data/lib/puppet/indirector/report/processor.rb +2 -2
- data/lib/puppet/indirector/report/yaml.rb +23 -0
- data/lib/puppet/indirector/request.rb +5 -5
- data/lib/puppet/indirector/rest.rb +7 -1
- data/lib/puppet/indirector/status/rest.rb +2 -1
- data/lib/puppet/indirector/yaml.rb +1 -1
- data/lib/puppet/metatype/manager.rb +80 -80
- data/lib/puppet/module.rb +1 -2
- data/lib/puppet/network/format_support.rb +2 -2
- data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
- data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
- data/lib/puppet/network/http/base_pool.rb +6 -1
- data/lib/puppet/network/http/compression.rb +7 -0
- data/lib/puppet/network/http/connection.rb +2 -0
- data/lib/puppet/network/http/connection_adapter.rb +184 -0
- data/lib/puppet/network/http/nocache_pool.rb +1 -0
- data/lib/puppet/network/http/pool.rb +2 -4
- data/lib/puppet/network/http/route.rb +2 -2
- data/lib/puppet/network/http_pool.rb +2 -1
- data/lib/puppet/node/environment.rb +22 -5
- data/lib/puppet/node/facts.rb +17 -0
- data/lib/puppet/pal/catalog_compiler.rb +5 -0
- data/lib/puppet/pal/pal_impl.rb +30 -31
- data/lib/puppet/parameter.rb +1 -1
- data/lib/puppet/parser/ast/leaf.rb +5 -5
- data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
- data/lib/puppet/parser/compiler.rb +43 -33
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
- data/lib/puppet/parser/environment_compiler.rb +4 -1
- data/lib/puppet/parser/functions.rb +18 -9
- data/lib/puppet/parser/functions/create_resources.rb +11 -7
- data/lib/puppet/parser/functions/filter.rb +1 -0
- data/lib/puppet/parser/resource.rb +3 -2
- data/lib/puppet/parser/resource/param.rb +6 -0
- data/lib/puppet/parser/type_loader.rb +2 -2
- data/lib/puppet/pops/adaptable.rb +7 -13
- data/lib/puppet/pops/adapters.rb +8 -4
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
- data/lib/puppet/pops/issues.rb +5 -0
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
- data/lib/puppet/pops/loaders.rb +24 -15
- data/lib/puppet/pops/lookup/context.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
- data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
- data/lib/puppet/pops/types/iterable.rb +34 -8
- data/lib/puppet/pops/types/p_meta_type.rb +1 -1
- data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
- data/lib/puppet/pops/validation/checker4_0.rb +29 -15
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- data/lib/puppet/provider/file/windows.rb +1 -1
- data/lib/puppet/provider/group/windows_adsi.rb +3 -3
- data/lib/puppet/provider/package/aix.rb +17 -2
- data/lib/puppet/provider/package/apt.rb +98 -1
- data/lib/puppet/provider/package/aptitude.rb +1 -1
- data/lib/puppet/provider/package/dnfmodule.rb +61 -14
- data/lib/puppet/provider/package/dpkg.rb +1 -1
- data/lib/puppet/provider/package/gem.rb +45 -9
- data/lib/puppet/provider/package/pacman.rb +2 -5
- data/lib/puppet/provider/package/pip.rb +143 -48
- data/lib/puppet/provider/package/pip2.rb +17 -0
- data/lib/puppet/provider/package/pip3.rb +0 -2
- data/lib/puppet/provider/package/pkgdmg.rb +1 -1
- data/lib/puppet/provider/package/pkgng.rb +16 -4
- data/lib/puppet/provider/package/portage.rb +2 -2
- data/lib/puppet/provider/package/puppet_gem.rb +11 -2
- data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
- data/lib/puppet/provider/package/rpm.rb +6 -213
- data/lib/puppet/provider/package/yum.rb +101 -20
- data/lib/puppet/provider/package/zypper.rb +62 -1
- data/lib/puppet/provider/service/systemd.rb +22 -4
- data/lib/puppet/provider/service/windows.rb +23 -7
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +16 -5
- data/lib/puppet/provider/user/windows_adsi.rb +18 -1
- data/lib/puppet/reports/http.rb +15 -9
- data/lib/puppet/resource.rb +2 -1
- data/lib/puppet/resource/type.rb +10 -1
- data/lib/puppet/resource/type_collection.rb +20 -16
- data/lib/puppet/rest/route.rb +2 -2
- data/lib/puppet/runtime.rb +25 -2
- data/lib/puppet/settings.rb +20 -6
- data/lib/puppet/ssl.rb +1 -0
- data/lib/puppet/ssl/host.rb +4 -4
- data/lib/puppet/ssl/oids.rb +1 -0
- data/lib/puppet/ssl/ssl_context.rb +2 -2
- data/lib/puppet/ssl/ssl_provider.rb +20 -1
- data/lib/puppet/ssl/state_machine.rb +79 -37
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/ssl/verifier_adapter.rb +9 -1
- data/lib/puppet/test/test_helper.rb +19 -14
- data/lib/puppet/transaction.rb +2 -2
- data/lib/puppet/transaction/persistence.rb +1 -1
- data/lib/puppet/transaction/report.rb +14 -10
- data/lib/puppet/trusted_external.rb +29 -1
- data/lib/puppet/type.rb +21 -8
- data/lib/puppet/type/file.rb +40 -15
- data/lib/puppet/type/file/checksum.rb +4 -4
- data/lib/puppet/type/file/source.rb +35 -13
- data/lib/puppet/type/filebucket.rb +1 -1
- data/lib/puppet/type/notify.rb +2 -2
- data/lib/puppet/type/package.rb +41 -3
- data/lib/puppet/type/service.rb +59 -8
- data/lib/puppet/type/user.rb +19 -29
- data/lib/puppet/util.rb +41 -3
- data/lib/puppet/util/at_fork.rb +1 -1
- data/lib/puppet/util/autoload.rb +13 -25
- data/lib/puppet/util/character_encoding.rb +9 -5
- data/lib/puppet/util/checksums.rb +19 -4
- data/lib/puppet/util/connection.rb +8 -8
- data/lib/puppet/util/execution.rb +2 -2
- data/lib/puppet/util/fileparsing.rb +2 -2
- data/lib/puppet/util/instance_loader.rb +14 -10
- data/lib/puppet/util/log/destinations.rb +1 -10
- data/lib/puppet/util/package/version/debian.rb +175 -0
- data/lib/puppet/util/package/version/gem.rb +15 -0
- data/lib/puppet/util/package/version/pip.rb +167 -0
- data/lib/puppet/util/package/version/range.rb +53 -0
- data/lib/puppet/util/package/version/range/eq.rb +14 -0
- data/lib/puppet/util/package/version/range/gt.rb +14 -0
- data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/lt.rb +14 -0
- data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/min_max.rb +21 -0
- data/lib/puppet/util/package/version/range/simple.rb +11 -0
- data/lib/puppet/util/package/version/rpm.rb +73 -0
- data/lib/puppet/util/pidlock.rb +13 -7
- data/lib/puppet/util/platform.rb +5 -0
- data/lib/puppet/util/provider_features.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/rpm_compare.rb +193 -0
- data/lib/puppet/util/run_mode.rb +5 -1
- data/lib/puppet/util/windows.rb +1 -0
- data/lib/puppet/util/windows/adsi.rb +2 -2
- data/lib/puppet/util/windows/api_types.rb +60 -33
- data/lib/puppet/util/windows/eventlog.rb +1 -6
- data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
- data/lib/puppet/util/windows/principal.rb +8 -6
- data/lib/puppet/util/windows/process.rb +15 -14
- data/lib/puppet/util/windows/registry.rb +11 -11
- data/lib/puppet/util/windows/security.rb +5 -4
- data/lib/puppet/util/windows/service.rb +43 -26
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/util/windows/user.rb +242 -8
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +627 -507
- data/man/man5/puppet.conf.5 +93 -20
- data/man/man8/puppet-agent.8 +7 -4
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +6 -6
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +6 -3
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +2 -2
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +4 -1
- data/man/man8/puppet-node.8 +4 -4
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +2 -2
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
- data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
- data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
- data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-ca.pem +59 -0
- data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
- data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
- data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
- data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
- data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
- data/spec/integration/application/agent_spec.rb +479 -0
- data/spec/integration/application/apply_spec.rb +279 -150
- data/spec/integration/application/config_spec.rb +74 -0
- data/spec/integration/application/doc_spec.rb +16 -6
- data/spec/integration/application/filebucket_spec.rb +239 -0
- data/spec/integration/application/help_spec.rb +42 -0
- data/spec/integration/application/lookup_spec.rb +13 -0
- data/spec/integration/application/module_spec.rb +68 -0
- data/spec/integration/application/plugin_spec.rb +123 -0
- data/spec/integration/configurer_spec.rb +14 -0
- data/spec/integration/data_binding_spec.rb +82 -0
- data/spec/integration/defaults_spec.rb +27 -3
- data/spec/integration/directory_environments_spec.rb +17 -17
- data/spec/integration/http/client_spec.rb +39 -40
- data/spec/integration/indirector/facts/facter_spec.rb +8 -6
- data/spec/integration/indirector/report/yaml.rb +83 -0
- data/spec/integration/network/http_pool_spec.rb +84 -19
- data/spec/integration/node/environment_spec.rb +15 -0
- data/spec/integration/parser/compiler_spec.rb +11 -0
- data/spec/integration/type/file_spec.rb +1 -1
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/windows/adsi_spec.rb +8 -3
- data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
- data/spec/integration/util/windows/process_spec.rb +26 -32
- data/spec/integration/util/windows/registry_spec.rb +7 -7
- data/spec/integration/util/windows/user_spec.rb +47 -5
- data/spec/integration/util_spec.rb +7 -33
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/https.rb +16 -7
- data/spec/lib/puppet_spec/matchers.rb +0 -80
- data/spec/lib/puppet_spec/puppetserver.rb +127 -0
- data/spec/shared_contexts/https.rb +29 -0
- data/spec/shared_contexts/types_setup.rb +2 -0
- data/spec/unit/agent_spec.rb +80 -26
- data/spec/unit/application/agent_spec.rb +12 -9
- data/spec/unit/application/device_spec.rb +2 -2
- data/spec/unit/application/doc_spec.rb +2 -2
- data/spec/unit/application/face_base_spec.rb +6 -4
- data/spec/unit/application/facts_spec.rb +41 -10
- data/spec/unit/application/filebucket_spec.rb +22 -2
- data/spec/unit/application/man_spec.rb +52 -0
- data/spec/unit/application/resource_spec.rb +3 -1
- data/spec/unit/application/ssl_spec.rb +15 -2
- data/spec/unit/application_spec.rb +9 -4
- data/spec/unit/configurer/downloader_spec.rb +10 -0
- data/spec/unit/configurer/fact_handler_spec.rb +4 -4
- data/spec/unit/configurer_spec.rb +87 -38
- data/spec/unit/confine_spec.rb +2 -1
- data/spec/unit/context/trusted_information_spec.rb +25 -2
- data/spec/unit/daemon_spec.rb +5 -64
- data/spec/unit/defaults_spec.rb +24 -1
- data/spec/unit/environments_spec.rb +107 -32
- data/spec/unit/face/config_spec.rb +59 -1
- data/spec/unit/face/module/search_spec.rb +17 -0
- data/spec/unit/face/node_spec.rb +2 -2
- data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
- data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
- data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
- data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
- data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
- data/spec/unit/file_system/uniquefile_spec.rb +29 -0
- data/spec/unit/file_system_spec.rb +11 -2
- data/spec/unit/http/client_spec.rb +173 -59
- data/spec/unit/http/external_client_spec.rb +201 -0
- data/spec/unit/http/resolver_spec.rb +44 -5
- data/spec/unit/http/response_spec.rb +6 -0
- data/spec/unit/http/service/ca_spec.rb +27 -5
- data/spec/unit/http/service/compiler_spec.rb +186 -9
- data/spec/unit/http/service/file_server_spec.rb +37 -6
- data/spec/unit/http/service/puppetserver_spec.rb +82 -0
- data/spec/unit/http/service/report_spec.rb +5 -4
- data/spec/unit/http/service_spec.rb +3 -4
- data/spec/unit/http/session_spec.rb +48 -12
- data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
- data/spec/unit/indirector/catalog/json_spec.rb +1 -1
- data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
- data/spec/unit/indirector/facts/rest_spec.rb +1 -1
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
- data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
- data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
- data/spec/unit/indirector/json_spec.rb +8 -8
- data/spec/unit/indirector/msgpack_spec.rb +8 -8
- data/spec/unit/indirector/node/rest_spec.rb +1 -1
- data/spec/unit/indirector/request_spec.rb +5 -5
- data/spec/unit/indirector/rest_spec.rb +14 -1
- data/spec/unit/indirector/status/rest_spec.rb +1 -1
- data/spec/unit/indirector/yaml_spec.rb +7 -7
- data/spec/unit/interface_spec.rb +3 -3
- data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
- data/spec/unit/network/format_support_spec.rb +3 -2
- data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
- data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
- data/spec/unit/network/http/connection_spec.rb +552 -190
- data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
- data/spec/unit/network/http/pool_spec.rb +3 -3
- data/spec/unit/network/http_pool_spec.rb +63 -57
- data/spec/unit/network/http_spec.rb +1 -1
- data/spec/unit/node/environment_spec.rb +33 -0
- data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
- data/spec/unit/parser/environment_compiler_spec.rb +7 -0
- data/spec/unit/parser/scope_spec.rb +1 -1
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
- data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
- data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
- data/spec/unit/provider/exec_spec.rb +4 -3
- data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
- data/spec/unit/provider/package/aix_spec.rb +29 -0
- data/spec/unit/provider/package/apt_spec.rb +107 -0
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
- data/spec/unit/provider/package/dpkg_spec.rb +22 -7
- data/spec/unit/provider/package/gem_spec.rb +40 -0
- data/spec/unit/provider/package/openbsd_spec.rb +2 -0
- data/spec/unit/provider/package/pacman_spec.rb +6 -21
- data/spec/unit/provider/package/pip2_spec.rb +36 -0
- data/spec/unit/provider/package/pip_spec.rb +68 -19
- data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
- data/spec/unit/provider/package/pkgng_spec.rb +38 -0
- data/spec/unit/provider/package/portage_spec.rb +5 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
- data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
- data/spec/unit/provider/package/rpm_spec.rb +0 -212
- data/spec/unit/provider/package/yum_spec.rb +274 -1
- data/spec/unit/provider/package/zypper_spec.rb +98 -0
- data/spec/unit/provider/service/base_spec.rb +2 -4
- data/spec/unit/provider/service/bsd_spec.rb +5 -1
- data/spec/unit/provider/service/daemontools_spec.rb +1 -1
- data/spec/unit/provider/service/debian_spec.rb +3 -5
- data/spec/unit/provider/service/freebsd_spec.rb +1 -1
- data/spec/unit/provider/service/gentoo_spec.rb +4 -5
- data/spec/unit/provider/service/init_spec.rb +46 -5
- data/spec/unit/provider/service/launchd_spec.rb +5 -6
- data/spec/unit/provider/service/openbsd_spec.rb +9 -0
- data/spec/unit/provider/service/openrc_spec.rb +4 -5
- data/spec/unit/provider/service/openwrt_spec.rb +2 -1
- data/spec/unit/provider/service/redhat_spec.rb +10 -1
- data/spec/unit/provider/service/runit_spec.rb +2 -1
- data/spec/unit/provider/service/smf_spec.rb +1 -1
- data/spec/unit/provider/service/src_spec.rb +3 -5
- data/spec/unit/provider/service/systemd_spec.rb +95 -18
- data/spec/unit/provider/service/upstart_spec.rb +4 -5
- data/spec/unit/provider/service/windows_spec.rb +50 -14
- data/spec/unit/provider/user/openbsd_spec.rb +1 -0
- data/spec/unit/provider/user/useradd_spec.rb +30 -16
- data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
- data/spec/unit/puppet_pal_2pec.rb +11 -0
- data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
- data/spec/unit/puppet_spec.rb +33 -0
- data/spec/unit/reports/http_spec.rb +70 -52
- data/spec/unit/reports/store_spec.rb +17 -13
- data/spec/unit/resource_spec.rb +3 -3
- data/spec/unit/rest/route_spec.rb +4 -4
- data/spec/unit/settings_spec.rb +44 -22
- data/spec/unit/ssl/host_spec.rb +4 -2
- data/spec/unit/ssl/oids_spec.rb +1 -0
- data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
- data/spec/unit/ssl/state_machine_spec.rb +90 -14
- data/spec/unit/test/test_helper_spec.rb +17 -0
- data/spec/unit/transaction/persistence_spec.rb +15 -0
- data/spec/unit/transaction/report_spec.rb +7 -1
- data/spec/unit/type/file/source_spec.rb +4 -4
- data/spec/unit/type/file_spec.rb +122 -96
- data/spec/unit/type/filebucket_spec.rb +1 -1
- data/spec/unit/type/service_spec.rb +218 -8
- data/spec/unit/type/user_spec.rb +32 -3
- data/spec/unit/type_spec.rb +50 -0
- data/spec/unit/util/at_fork_spec.rb +2 -2
- data/spec/unit/util/autoload_spec.rb +2 -1
- data/spec/unit/util/character_encoding_spec.rb +4 -4
- data/spec/unit/util/checksums_spec.rb +16 -0
- data/spec/unit/util/command_line_spec.rb +11 -6
- data/spec/unit/util/log/destinations_spec.rb +1 -29
- data/spec/unit/util/package/version/debian_spec.rb +83 -0
- data/spec/unit/util/package/version/pip_spec.rb +464 -0
- data/spec/unit/util/package/version/range_spec.rb +175 -0
- data/spec/unit/util/package/version/rpm_spec.rb +121 -0
- data/spec/unit/util/pidlock_spec.rb +83 -47
- data/spec/unit/util/rpm_compare_spec.rb +196 -0
- data/spec/unit/util/run_mode_spec.rb +6 -6
- data/spec/unit/util/windows/adsi_spec.rb +4 -4
- data/spec/unit/util/windows/api_types_spec.rb +104 -40
- data/spec/unit/util/windows/service_spec.rb +4 -4
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/spec/unit/util_spec.rb +3 -3
- data/spec/unit/x509/cert_provider_spec.rb +1 -1
- data/tasks/generate_cert_fixtures.rake +15 -1
- data/tasks/manpages.rake +5 -35
- metadata +90 -51
- data/spec/integration/faces/config_spec.rb +0 -91
- data/spec/integration/faces/documentation_spec.rb +0 -57
- data/spec/integration/faces/plugin_spec.rb +0 -63
- data/spec/integration/file_bucket/file_spec.rb +0 -50
- data/spec/integration/file_serving/content_spec.rb +0 -7
- data/spec/integration/file_serving/fileset_spec.rb +0 -12
- data/spec/integration/file_serving/metadata_spec.rb +0 -8
- data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
- data/spec/integration/file_system/uniquefile_spec.rb +0 -26
- data/spec/integration/module_tool/forge_spec.rb +0 -64
- data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
- data/spec/integration/provider/service/init_spec.rb +0 -48
- data/spec/integration/provider/service/systemd_spec.rb +0 -25
- data/spec/integration/provider/service/windows_spec.rb +0 -50
- data/spec/integration/reference/providers_spec.rb +0 -21
- data/spec/integration/reports_spec.rb +0 -13
- data/spec/integration/ssl/certificate_request_spec.rb +0 -44
- data/spec/integration/ssl/host_spec.rb +0 -72
- data/spec/integration/ssl/key_spec.rb +0 -99
- data/spec/integration/test/test_helper_spec.rb +0 -31
- data/spec/shared_behaviours/file_serving_model.rb +0 -51
- data/spec/unit/face/man_spec.rb +0 -25
- data/spec/unit/man_spec.rb +0 -31
@@ -45,6 +45,19 @@ shared_examples_for "a REST terminus method" do |terminus_method|
|
|
45
45
|
|
46
46
|
expect(Puppet[:preferred_serialization_format]).to eq("pson")
|
47
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
|
48
61
|
end
|
49
62
|
|
50
63
|
HTTP_ERROR_CODES.each do |code|
|
@@ -236,7 +249,7 @@ describe Puppet::Indirector::REST do
|
|
236
249
|
|
237
250
|
it "should default to :port for the port setting" do
|
238
251
|
expect(terminus_class).to receive(:port_setting).and_return(nil)
|
239
|
-
Puppet[:
|
252
|
+
Puppet[:serverport] = "543"
|
240
253
|
expect(terminus_class.port).to eq(543)
|
241
254
|
end
|
242
255
|
|
@@ -38,30 +38,30 @@ describe Puppet::Indirector::Yaml do
|
|
38
38
|
|
39
39
|
before :each do
|
40
40
|
Puppet[:clientyamldir] = dir
|
41
|
-
allow(Puppet.run_mode).to receive(:
|
41
|
+
allow(Puppet.run_mode).to receive(:server?).and_return(false)
|
42
42
|
end
|
43
43
|
|
44
44
|
describe "when choosing file location" do
|
45
|
-
it "should use the server_datadir if the run_mode is
|
46
|
-
allow(Puppet.run_mode).to receive(:
|
45
|
+
it "should use the server_datadir if the run_mode is server" do
|
46
|
+
allow(Puppet.run_mode).to receive(:server?).and_return(true)
|
47
47
|
Puppet[:yamldir] = serverdir
|
48
48
|
expect(terminus.path(:me)).to match(/^#{serverdir}/)
|
49
49
|
end
|
50
50
|
|
51
|
-
it "should use the client yamldir if the run_mode is not
|
52
|
-
allow(Puppet.run_mode).to receive(:
|
51
|
+
it "should use the client yamldir if the run_mode is not server" do
|
52
|
+
allow(Puppet.run_mode).to receive(:server?).and_return(false)
|
53
53
|
Puppet[:clientyamldir] = clientdir
|
54
54
|
expect(terminus.path(:me)).to match(/^#{clientdir}/)
|
55
55
|
end
|
56
56
|
|
57
57
|
it "should use the extension if one is specified" do
|
58
|
-
allow(Puppet.run_mode).to receive(:
|
58
|
+
allow(Puppet.run_mode).to receive(:server?).and_return(true)
|
59
59
|
Puppet[:yamldir] = serverdir
|
60
60
|
expect(terminus.path(:me,'.farfignewton')).to match(%r{\.farfignewton$})
|
61
61
|
end
|
62
62
|
|
63
63
|
it "should assume an extension of .yaml if none is specified" do
|
64
|
-
allow(Puppet.run_mode).to receive(:
|
64
|
+
allow(Puppet.run_mode).to receive(:server?).and_return(true)
|
65
65
|
Puppet[:yamldir] = serverdir
|
66
66
|
expect(terminus.path(:me)).to match(%r{\.yaml$})
|
67
67
|
end
|
data/spec/unit/interface_spec.rb
CHANGED
@@ -180,7 +180,7 @@ describe Puppet::Interface do
|
|
180
180
|
display_global_options "modulepath"
|
181
181
|
end
|
182
182
|
end
|
183
|
-
face.display_global_options
|
183
|
+
expect(face.display_global_options).to match(["environment"])
|
184
184
|
end
|
185
185
|
|
186
186
|
it "should not fail when a face d_g_o duplicates an action d_g_o" do
|
@@ -200,8 +200,8 @@ describe Puppet::Interface do
|
|
200
200
|
action :foo do when_invoked {|_| true} ; display_global_options "environment" end
|
201
201
|
action :bar do when_invoked {|_| true} ; display_global_options "environment" end
|
202
202
|
end
|
203
|
-
face.get_action(:foo).display_global_options
|
204
|
-
face.get_action(:bar).display_global_options
|
203
|
+
expect(face.get_action(:foo).display_global_options).to match(["environment"])
|
204
|
+
expect(face.get_action(:bar).display_global_options).to match(["environment"])
|
205
205
|
end
|
206
206
|
|
207
207
|
end
|
@@ -86,4 +86,24 @@ describe Puppet::ModuleTool::Tar::Mini, :if => (Puppet.features.minitar? and Pup
|
|
86
86
|
and_yield(type, name, {:entry => entry})
|
87
87
|
entry
|
88
88
|
end
|
89
|
+
|
90
|
+
describe "Extracts tars with long and short pathnames" do
|
91
|
+
let (:sourcetar) { fixtures('module.tar.gz') }
|
92
|
+
let (:longfilepath) { "puppetlabs-dsc-1.0.0/lib/puppet_x/dsc_resources/xWebAdministration/DSCResources/MSFT_xWebAppPoolDefaults/MSFT_xWebAppPoolDefaults.schema.mof" }
|
93
|
+
let (:shortfilepath) { "puppetlabs-dsc-1.0.0/README.md" }
|
94
|
+
|
95
|
+
it "unpacks a tar with a short path length" do
|
96
|
+
extractdir = PuppetSpec::Files.tmpdir('minitar')
|
97
|
+
|
98
|
+
minitar.unpack(sourcetar,extractdir,'module')
|
99
|
+
expect(File).to exist(File.expand_path("#{extractdir}/#{shortfilepath}"))
|
100
|
+
end
|
101
|
+
|
102
|
+
it "unpacks a tar with a long path length" do
|
103
|
+
extractdir = PuppetSpec::Files.tmpdir('minitar')
|
104
|
+
|
105
|
+
minitar.unpack(sourcetar,extractdir,'module')
|
106
|
+
expect(File).to exist(File.expand_path("#{extractdir}/#{longfilepath}"))
|
107
|
+
end
|
108
|
+
end
|
89
109
|
end
|
@@ -67,8 +67,9 @@ describe Puppet::Network::FormatHandler do
|
|
67
67
|
end
|
68
68
|
|
69
69
|
it "should log a debug message" do
|
70
|
-
|
71
|
-
expect(Puppet).to receive(:debug).
|
70
|
+
Puppet[:log_level] = 'debug'
|
71
|
+
expect(Puppet).to receive(:debug) { |&b| expect(b.call).to eq("Value of 'preferred_serialization_format' (unsupported) is invalid for FormatTester, using default (two)") }
|
72
|
+
expect(Puppet).to receive(:debug) { |&b| expect(b.call).to eq("FormatTester supports formats: two one") }
|
72
73
|
FormatTester.supported_formats
|
73
74
|
end
|
74
75
|
end
|
@@ -344,7 +344,8 @@ describe Puppet::Network::HTTP::API::IndirectedRoutes do
|
|
344
344
|
|
345
345
|
expect {
|
346
346
|
handler.call(request, response)
|
347
|
-
}.to raise_error(Puppet::Network::HTTP::Error::HTTPNotAcceptableError,
|
347
|
+
}.to raise_error(Puppet::Network::HTTP::Error::HTTPNotAcceptableError,
|
348
|
+
%r{No supported formats are acceptable \(Accept: application/json, text/pson\)})
|
348
349
|
end
|
349
350
|
|
350
351
|
it "should return [] when searching returns an empty array" do
|
@@ -7,13 +7,14 @@ require 'matchers/json'
|
|
7
7
|
describe Puppet::Network::HTTP::API::Master::V3::Environments do
|
8
8
|
include JSONMatchers
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
let(:environment) { Puppet::Node::Environment.create(:production, ["/first", "/second"], '/manifests') }
|
11
|
+
let(:loader) { Puppet::Environments::Static.new(environment) }
|
12
|
+
let(:handler) { Puppet::Network::HTTP::API::Master::V3::Environments.new(loader) }
|
13
|
+
let(:request) { Puppet::Network::HTTP::Request.from_hash(:headers => { 'accept' => 'application/json' }) }
|
14
|
+
let(:response) { Puppet::Network::HTTP::MemoryResponse.new }
|
15
15
|
|
16
|
-
|
16
|
+
it "responds with all of the available environments" do
|
17
|
+
handler.call(request, response)
|
17
18
|
|
18
19
|
expect(response.code).to eq(200)
|
19
20
|
expect(response.type).to eq("application/json")
|
@@ -33,29 +34,17 @@ describe Puppet::Network::HTTP::API::Master::V3::Environments do
|
|
33
34
|
end
|
34
35
|
|
35
36
|
it "the response conforms to the environments schema for unlimited timeout" do
|
36
|
-
|
37
|
-
expect(conf_stub).to receive(:environment_timeout).and_return(Float::INFINITY)
|
38
|
-
environment = Puppet::Node::Environment.create(:production, [])
|
39
|
-
env_loader = Puppet::Environments::Static.new(environment)
|
40
|
-
expect(env_loader).to receive(:get_conf).with(:production).and_return(conf_stub)
|
41
|
-
handler = Puppet::Network::HTTP::API::Master::V3::Environments.new(env_loader)
|
42
|
-
response = Puppet::Network::HTTP::MemoryResponse.new
|
37
|
+
Puppet[:environment_timeout] = 'unlimited'
|
43
38
|
|
44
|
-
handler.call(
|
39
|
+
handler.call(request, response)
|
45
40
|
|
46
41
|
expect(response.body).to validate_against('api/schemas/environments.json')
|
47
42
|
end
|
48
43
|
|
49
44
|
it "the response conforms to the environments schema for integer timeout" do
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
env_loader = Puppet::Environments::Static.new(environment)
|
54
|
-
expect(env_loader).to receive(:get_conf).with(:production).and_return(conf_stub)
|
55
|
-
handler = Puppet::Network::HTTP::API::Master::V3::Environments.new(env_loader)
|
56
|
-
response = Puppet::Network::HTTP::MemoryResponse.new
|
57
|
-
|
58
|
-
handler.call(Puppet::Network::HTTP::Request.from_hash(:headers => { 'accept' => 'application/json' }), response)
|
45
|
+
Puppet[:environment_timeout] = 1
|
46
|
+
|
47
|
+
handler.call(request, response)
|
59
48
|
|
60
49
|
expect(response.body).to validate_against('api/schemas/environments.json')
|
61
50
|
end
|
@@ -1,296 +1,658 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'puppet/network/http/connection'
|
3
|
+
require 'puppet/network/http/connection_adapter'
|
3
4
|
require 'puppet/test_ca'
|
4
5
|
|
5
6
|
describe Puppet::Network::HTTP::Connection do
|
6
|
-
let
|
7
|
-
let
|
8
|
-
let
|
7
|
+
let(:host) { "me.example.com" }
|
8
|
+
let(:port) { 8140 }
|
9
|
+
let(:path) { '/foo' }
|
10
|
+
let(:url) { "https://#{host}:#{port}#{path}" }
|
11
|
+
let(:params) { { 'key' => 'a value' } }
|
12
|
+
let(:encoded_url_with_params) { "#{url}?%7B%22key%22:%22a%20value%22%7D" }
|
9
13
|
|
10
|
-
|
14
|
+
shared_examples_for "an HTTP connection" do |klass, legacy_api|
|
15
|
+
subject { klass.new(host, port, :verify => Puppet::SSL::Validator.no_validator) }
|
11
16
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
17
|
+
context "when providing HTTP connections" do
|
18
|
+
context "when initializing http instances" do
|
19
|
+
it "should return an http instance created with the passed host and port" do
|
20
|
+
conn = klass.new(host, port, :verify => Puppet::SSL::Validator.no_validator)
|
16
21
|
|
17
|
-
|
18
|
-
|
22
|
+
expect(conn.address).to eq(host)
|
23
|
+
expect(conn.port).to eq(port)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should enable ssl on the http instance by default" do
|
27
|
+
conn = klass.new(host, port, :verify => Puppet::SSL::Validator.no_validator)
|
28
|
+
|
29
|
+
expect(conn).to be_use_ssl
|
30
|
+
end
|
31
|
+
|
32
|
+
it "can disable ssl using an option and ignore the verify" do
|
33
|
+
conn = klass.new(host, port, :use_ssl => false)
|
34
|
+
|
35
|
+
expect(conn).to_not be_use_ssl
|
36
|
+
end
|
37
|
+
|
38
|
+
it "can enable ssl using an option" do
|
39
|
+
conn = klass.new(host, port, :use_ssl => true, :verify => Puppet::SSL::Validator.no_validator)
|
40
|
+
|
41
|
+
expect(conn).to be_use_ssl
|
42
|
+
end
|
43
|
+
|
44
|
+
it "ignores the ':verify' option when ssl is disabled" do
|
45
|
+
conn = klass.new(host, port, :use_ssl => false, :verify => Puppet::SSL::Validator.no_validator)
|
46
|
+
|
47
|
+
expect(conn.verifier).to be_nil
|
48
|
+
end
|
49
|
+
|
50
|
+
it "wraps the validator in an adapter" do
|
51
|
+
conn = klass.new(host, port, :verify => Puppet::SSL::Validator.no_validator)
|
52
|
+
|
53
|
+
expect(conn.verifier).to be_a_kind_of(Puppet::SSL::VerifierAdapter)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should raise Puppet::Error when invalid options are specified" do
|
57
|
+
expect { klass.new(host, port, :invalid_option => nil) }.to raise_error(Puppet::Error, 'Unrecognized option(s): :invalid_option')
|
58
|
+
end
|
59
|
+
|
60
|
+
it "accepts a verifier" do
|
61
|
+
verifier = Puppet::SSL::Verifier.new(host, double('ssl_context'))
|
62
|
+
conn = klass.new(host, port, :use_ssl => true, :verifier => verifier)
|
63
|
+
|
64
|
+
expect(conn.verifier).to eq(verifier)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "raises if the wrong verifier class is specified" do
|
68
|
+
expect {
|
69
|
+
klass.new(host, port, :verifier => Puppet::SSL::Validator.default_validator)
|
70
|
+
}.to raise_error(ArgumentError,
|
71
|
+
"Expected an instance of Puppet::SSL::Verifier but was passed a Puppet::SSL::Validator::DefaultValidator")
|
72
|
+
end
|
19
73
|
end
|
74
|
+
end
|
20
75
|
|
21
|
-
|
22
|
-
|
76
|
+
context "for streaming GET requests" do
|
77
|
+
it 'yields the response' do
|
78
|
+
stub_request(:get, url)
|
23
79
|
|
24
|
-
expect
|
80
|
+
expect { |b|
|
81
|
+
subject.request_get('/foo', {}, &b)
|
82
|
+
}.to yield_with_args(Net::HTTPResponse)
|
25
83
|
end
|
26
84
|
|
27
|
-
it "
|
28
|
-
|
85
|
+
it "stringifies keys and encodes values in the query" do
|
86
|
+
stub_request(:get, encoded_url_with_params)
|
29
87
|
|
30
|
-
|
88
|
+
subject.request_get("#{path}?#{params.to_json}") { |_| }
|
31
89
|
end
|
32
90
|
|
33
|
-
it "
|
34
|
-
|
91
|
+
it "merges custom headers with default ones" do
|
92
|
+
stub_request(:get, url).with(headers: { 'X-Foo' => 'Bar', 'User-Agent' => /./ })
|
35
93
|
|
36
|
-
|
94
|
+
subject.request_get(path, {'X-Foo' => 'Bar'}) { |_| }
|
37
95
|
end
|
38
96
|
|
39
|
-
it "
|
40
|
-
|
97
|
+
it "returns the response" do
|
98
|
+
stub_request(:get, url)
|
41
99
|
|
42
|
-
|
100
|
+
response = subject.request_get(path) { |_| }
|
101
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
102
|
+
expect(response.code).to eq("200")
|
43
103
|
end
|
44
104
|
|
45
|
-
it "
|
46
|
-
|
105
|
+
it "accepts a URL string as the path" do
|
106
|
+
url_with_query = "#{url}?foo=bar"
|
107
|
+
stub_request(:get, url_with_query)
|
47
108
|
|
48
|
-
|
109
|
+
response = subject.request_get(url_with_query) { |_| }
|
110
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
49
111
|
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context "for streaming head requests" do
|
115
|
+
it 'yields the response when request_head is called' do
|
116
|
+
stub_request(:head, url)
|
50
117
|
|
51
|
-
|
52
|
-
|
118
|
+
expect { |b|
|
119
|
+
subject.request_head('/foo', {}, &b)
|
120
|
+
}.to yield_with_args(Net::HTTPResponse)
|
53
121
|
end
|
54
122
|
|
55
|
-
it "
|
56
|
-
|
57
|
-
conn = Puppet::Network::HTTP::Connection.new(host, port, :use_ssl => true, :verifier => verifier)
|
123
|
+
it "stringifies keys and encodes values in the query" do
|
124
|
+
stub_request(:head, encoded_url_with_params)
|
58
125
|
|
59
|
-
|
126
|
+
subject.request_head("#{path}?#{params.to_json}") { |_| }
|
60
127
|
end
|
61
128
|
|
62
|
-
it "
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
"Expected an instance of Puppet::SSL::Verifier but was passed a Puppet::SSL::Validator::DefaultValidator")
|
129
|
+
it "merges custom headers with default ones" do
|
130
|
+
stub_request(:head, url).with(headers: { 'X-Foo' => 'Bar', 'User-Agent' => /./ })
|
131
|
+
|
132
|
+
subject.request_head(path, {'X-Foo' => 'Bar'}) { |_| }
|
67
133
|
end
|
68
|
-
end
|
69
|
-
end
|
70
134
|
|
71
|
-
|
72
|
-
|
73
|
-
stub_request(:get, url)
|
135
|
+
it "returns the response" do
|
136
|
+
stub_request(:head, url)
|
74
137
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
138
|
+
response = subject.request_head(path) { |_| }
|
139
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
140
|
+
expect(response.code).to eq("200")
|
141
|
+
end
|
79
142
|
|
80
|
-
|
81
|
-
|
143
|
+
it "accepts a URL string as the path" do
|
144
|
+
url_with_query = "#{url}?foo=bar"
|
145
|
+
stub_request(:head, url_with_query)
|
82
146
|
|
83
|
-
|
84
|
-
|
85
|
-
|
147
|
+
response = subject.request_head(url_with_query) { |_| }
|
148
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
149
|
+
end
|
86
150
|
end
|
87
151
|
|
88
|
-
|
89
|
-
|
152
|
+
context "for streaming post requests" do
|
153
|
+
it 'yields the response when request_post is called' do
|
154
|
+
stub_request(:post, url)
|
90
155
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
end
|
156
|
+
expect { |b|
|
157
|
+
subject.request_post('/foo', "param: value", &b)
|
158
|
+
}.to yield_with_args(Net::HTTPResponse)
|
159
|
+
end
|
96
160
|
|
97
|
-
|
98
|
-
|
99
|
-
options[:use_ssl] = false
|
100
|
-
options[:verify] = Puppet::SSL::Validator.no_validator
|
101
|
-
Puppet::Network::HTTP::Connection.new(host, port, options)
|
102
|
-
end
|
161
|
+
it "stringifies keys and encodes values in the query" do
|
162
|
+
stub_request(:post, encoded_url_with_params)
|
103
163
|
|
104
|
-
|
105
|
-
|
106
|
-
end
|
164
|
+
subject.request_post("#{path}?#{params.to_json}", "") { |_| }
|
165
|
+
end
|
107
166
|
|
108
|
-
|
109
|
-
|
110
|
-
stub_request(:get, "http://me.example.com:8140/bar").to_return(status: 200)
|
167
|
+
it "merges custom headers with default ones" do
|
168
|
+
stub_request(:post, url).with(headers: { 'X-Foo' => 'Bar', 'User-Agent' => /./ })
|
111
169
|
|
112
|
-
|
113
|
-
|
170
|
+
subject.request_post(path, "", {'X-Foo' => 'Bar'}) { |_| }
|
171
|
+
end
|
114
172
|
|
115
|
-
|
116
|
-
|
117
|
-
conn.get('/')
|
118
|
-
}.to raise_error(Puppet::Network::HTTP::RedirectionLimitExceededException)
|
119
|
-
end
|
173
|
+
it "returns the response" do
|
174
|
+
stub_request(:post, url)
|
120
175
|
|
121
|
-
|
122
|
-
|
176
|
+
response = subject.request_post(path, "") { |_| }
|
177
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
178
|
+
expect(response.code).to eq("200")
|
179
|
+
end
|
180
|
+
|
181
|
+
it "accepts a URL string as the path" do
|
182
|
+
url_with_query = "#{url}?foo=bar"
|
183
|
+
stub_request(:post, url_with_query)
|
123
184
|
|
124
|
-
|
125
|
-
|
185
|
+
response = subject.request_post(url_with_query, "") { |_| }
|
186
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
187
|
+
end
|
126
188
|
end
|
127
189
|
|
128
|
-
|
129
|
-
|
130
|
-
|
190
|
+
context "for GET requests" do
|
191
|
+
it "includes default HTTP headers" do
|
192
|
+
stub_request(:get, url).with(headers: {'User-Agent' => /./})
|
131
193
|
|
132
|
-
|
133
|
-
|
134
|
-
end
|
194
|
+
subject.get(path)
|
195
|
+
end
|
135
196
|
|
136
|
-
|
137
|
-
|
138
|
-
stub_request(:get, "http://me.example.com:8140/foo").to_return(redirect_to("http://me.example.com:8140/bar"))
|
139
|
-
stub_request(:get, "http://me.example.com:8140/bar").to_return(redirect_to("http://me.example.com:8140/baz"))
|
140
|
-
stub_request(:get, "http://me.example.com:8140/baz").to_return(redirect_to("http://me.example.com:8140/qux"))
|
197
|
+
it "stringifies keys and encodes values in the query" do
|
198
|
+
stub_request(:get, encoded_url_with_params)
|
141
199
|
|
142
|
-
|
143
|
-
|
144
|
-
end
|
145
|
-
end
|
200
|
+
subject.get("#{path}?#{params.to_json}")
|
201
|
+
end
|
146
202
|
|
147
|
-
|
148
|
-
|
149
|
-
stub_request(:get, url)
|
150
|
-
.to_return(status: [503, 'Service Unavailable'], headers: {'Retry-After' => datetime}).then
|
151
|
-
.to_return(status: 200)
|
152
|
-
end
|
203
|
+
it "merges custom headers with default ones" do
|
204
|
+
stub_request(:get, url).with(headers: { 'X-Foo' => 'Bar', 'User-Agent' => /./ })
|
153
205
|
|
154
|
-
|
155
|
-
|
206
|
+
subject.get(path, {'X-Foo' => 'Bar'})
|
207
|
+
end
|
156
208
|
|
157
|
-
|
158
|
-
|
159
|
-
|
209
|
+
it "returns the response" do
|
210
|
+
stub_request(:get, url)
|
211
|
+
|
212
|
+
response = subject.get(path)
|
213
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
214
|
+
expect(response.code).to eq("200")
|
215
|
+
end
|
216
|
+
|
217
|
+
it "returns the entire response body" do
|
218
|
+
stub_request(:get, url).to_return(body: "abc")
|
219
|
+
|
220
|
+
response = subject.get(path)
|
221
|
+
expect(response.body).to eq("abc")
|
222
|
+
end
|
160
223
|
|
161
|
-
|
162
|
-
|
224
|
+
it "accepts a URL string as the path" do
|
225
|
+
url_with_query = "#{url}?foo=bar"
|
226
|
+
stub_request(:get, url_with_query)
|
163
227
|
|
164
|
-
|
165
|
-
|
228
|
+
response = subject.get(url_with_query)
|
229
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
230
|
+
end
|
166
231
|
end
|
167
232
|
|
168
|
-
|
169
|
-
|
233
|
+
context "for HEAD requests" do
|
234
|
+
it "includes default HTTP headers" do
|
235
|
+
stub_request(:head, url).with(headers: {'User-Agent' => /./})
|
170
236
|
|
171
|
-
|
172
|
-
|
173
|
-
allow(http1).to receive(:started?).and_return(true)
|
237
|
+
subject.head(path)
|
238
|
+
end
|
174
239
|
|
175
|
-
|
176
|
-
|
177
|
-
allow(http1).to receive(:started?).and_return(true)
|
240
|
+
it "stringifies keys and encodes values in the query" do
|
241
|
+
stub_request(:head, encoded_url_with_params)
|
178
242
|
|
179
|
-
|
180
|
-
|
181
|
-
allow(pool).to receive(:with_connection).and_yield(http1).and_yield(http2)
|
243
|
+
subject.head("#{path}?#{params.to_json}")
|
244
|
+
end
|
182
245
|
|
183
|
-
|
184
|
-
|
246
|
+
it "merges custom headers with default ones" do
|
247
|
+
stub_request(:head, url).with(headers: { 'X-Foo' => 'Bar', 'User-Agent' => /./ })
|
185
248
|
|
186
|
-
|
187
|
-
|
249
|
+
subject.head(path, {'X-Foo' => 'Bar'})
|
250
|
+
end
|
251
|
+
|
252
|
+
it "returns the response" do
|
253
|
+
stub_request(:head, url)
|
188
254
|
|
189
|
-
|
190
|
-
|
255
|
+
response = subject.head(path)
|
256
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
257
|
+
expect(response.code).to eq("200")
|
258
|
+
end
|
191
259
|
|
192
|
-
|
260
|
+
it "accepts a URL string as the path" do
|
261
|
+
url_with_query = "#{url}?foo=bar"
|
262
|
+
stub_request(:head, url_with_query)
|
193
263
|
|
194
|
-
|
195
|
-
|
264
|
+
response = subject.head(url_with_query)
|
265
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
266
|
+
end
|
196
267
|
end
|
197
268
|
|
198
|
-
|
199
|
-
|
269
|
+
context "for PUT requests" do
|
270
|
+
it "includes default HTTP headers" do
|
271
|
+
stub_request(:put, url).with(headers: {'User-Agent' => /./})
|
200
272
|
|
201
|
-
|
202
|
-
|
273
|
+
subject.put(path, "", {'Content-Type' => 'text/plain'})
|
274
|
+
end
|
203
275
|
|
204
|
-
|
276
|
+
it "stringifies keys and encodes values in the query" do
|
277
|
+
stub_request(:put, encoded_url_with_params)
|
205
278
|
|
206
|
-
|
207
|
-
|
208
|
-
end
|
279
|
+
subject.put("#{path}?#{params.to_json}", "")
|
280
|
+
end
|
209
281
|
|
210
|
-
|
211
|
-
|
282
|
+
it "includes custom headers" do
|
283
|
+
stub_request(:put, url).with(headers: { 'X-Foo' => 'Bar' })
|
212
284
|
|
213
|
-
|
285
|
+
subject.put(path, "", {'X-Foo' => 'Bar', 'Content-Type' => 'text/plain'})
|
286
|
+
end
|
214
287
|
|
215
|
-
|
288
|
+
it "returns the response" do
|
289
|
+
stub_request(:put, url)
|
216
290
|
|
217
|
-
|
218
|
-
|
291
|
+
response = subject.put(path, "", {'Content-Type' => 'text/plain'})
|
292
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
293
|
+
expect(response.code).to eq("200")
|
294
|
+
end
|
295
|
+
|
296
|
+
it "sets content-type for the body" do
|
297
|
+
stub_request(:put, url).with(headers: {"Content-Type" => "text/plain"})
|
219
298
|
|
220
|
-
|
221
|
-
|
299
|
+
subject.put(path, "hello", {'Content-Type' => 'text/plain'})
|
300
|
+
end
|
222
301
|
|
223
|
-
|
302
|
+
it 'sends an empty body' do
|
303
|
+
stub_request(:put, url).with(body: '')
|
224
304
|
|
225
|
-
|
226
|
-
|
227
|
-
|
305
|
+
subject.put(path, nil)
|
306
|
+
end
|
307
|
+
|
308
|
+
it 'defaults content-type to application/x-www-form-urlencoded' do
|
309
|
+
skip("Net::HTTP sends a default content-type header, but it's not visible to webmock") if legacy_api
|
228
310
|
|
229
|
-
|
230
|
-
let(:auth) { { :user => 'user', :password => 'password' } }
|
231
|
-
let(:creds) { [ 'user', 'password'] }
|
311
|
+
stub_request(:put, url).with(headers: {'Content-Type' => 'application/x-www-form-urlencoded'})
|
232
312
|
|
233
|
-
|
234
|
-
|
313
|
+
subject.put(path, '')
|
314
|
+
end
|
315
|
+
|
316
|
+
it "accepts a URL string as the path" do
|
317
|
+
url_with_query = "#{url}?foo=bar"
|
318
|
+
stub_request(:put, url_with_query)
|
235
319
|
|
236
|
-
|
320
|
+
response = subject.put(url_with_query, '')
|
321
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
322
|
+
end
|
237
323
|
end
|
238
324
|
|
239
|
-
|
240
|
-
|
325
|
+
context "for POST requests" do
|
326
|
+
it "includes default HTTP headers" do
|
327
|
+
stub_request(:post, url).with(headers: {'User-Agent' => /./})
|
328
|
+
|
329
|
+
subject.post(path, "", {'Content-Type' => 'text/plain'})
|
330
|
+
end
|
331
|
+
|
332
|
+
it "stringifies keys and encodes values in the query" do
|
333
|
+
stub_request(:post, encoded_url_with_params)
|
334
|
+
|
335
|
+
subject.post("#{path}?#{params.to_json}", "", {'Content-Type' => 'text/plain'})
|
336
|
+
end
|
337
|
+
|
338
|
+
it "includes custom headers" do
|
339
|
+
stub_request(:post, url).with(headers: { 'X-Foo' => 'Bar' })
|
340
|
+
|
341
|
+
subject.post(path, "", {'X-Foo' => 'Bar', 'Content-Type' => 'text/plain'})
|
342
|
+
end
|
343
|
+
|
344
|
+
it "returns the response" do
|
345
|
+
stub_request(:post, url)
|
346
|
+
|
347
|
+
response = subject.post(path, "", {'Content-Type' => 'text/plain'})
|
348
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
349
|
+
expect(response.code).to eq("200")
|
350
|
+
end
|
351
|
+
|
352
|
+
it "sets content-type for the body" do
|
353
|
+
stub_request(:post, url).with(headers: {"Content-Type" => "text/plain"})
|
354
|
+
|
355
|
+
subject.post(path, "hello", {'Content-Type' => 'text/plain'})
|
356
|
+
end
|
357
|
+
|
358
|
+
it 'sends an empty body' do
|
359
|
+
stub_request(:post, url).with(body: '')
|
360
|
+
|
361
|
+
subject.post(path, nil)
|
362
|
+
end
|
363
|
+
|
364
|
+
it 'defaults content-type to application/x-www-form-urlencoded' do
|
365
|
+
skip("Net::HTTP sends a default content-type header, but it's not visible to webmock") if legacy_api
|
366
|
+
|
367
|
+
stub_request(:post, url).with(headers: {'Content-Type' => 'application/x-www-form-urlencoded'})
|
368
|
+
|
369
|
+
subject.post(path, "")
|
370
|
+
end
|
241
371
|
|
242
|
-
|
372
|
+
it "accepts a URL string as the path" do
|
373
|
+
url_with_query = "#{url}?foo=bar"
|
374
|
+
stub_request(:post, url_with_query)
|
375
|
+
|
376
|
+
response = subject.post(url_with_query, '')
|
377
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
378
|
+
end
|
243
379
|
end
|
244
380
|
|
245
|
-
|
246
|
-
|
381
|
+
context "for DELETE requests" do
|
382
|
+
it "includes default HTTP headers" do
|
383
|
+
stub_request(:delete, url).with(headers: {'User-Agent' => /./})
|
384
|
+
|
385
|
+
subject.delete(path)
|
386
|
+
end
|
387
|
+
|
388
|
+
it "merges custom headers with default ones" do
|
389
|
+
stub_request(:delete, url).with(headers: { 'X-Foo' => 'Bar', 'User-Agent' => /./ })
|
390
|
+
|
391
|
+
subject.delete(path, {'X-Foo' => 'Bar'})
|
392
|
+
end
|
393
|
+
|
394
|
+
it "stringifies keys and encodes values in the query" do
|
395
|
+
stub_request(:delete, encoded_url_with_params)
|
396
|
+
|
397
|
+
subject.delete("#{path}?#{params.to_json}")
|
398
|
+
end
|
399
|
+
|
400
|
+
it "returns the response" do
|
401
|
+
stub_request(:delete, url)
|
402
|
+
|
403
|
+
response = subject.delete(path)
|
404
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
405
|
+
expect(response.code).to eq("200")
|
406
|
+
end
|
407
|
+
|
408
|
+
it "returns the entire response body" do
|
409
|
+
stub_request(:delete, url).to_return(body: "abc")
|
410
|
+
|
411
|
+
expect(subject.delete(path).body).to eq("abc")
|
412
|
+
end
|
413
|
+
|
414
|
+
it "accepts a URL string as the path" do
|
415
|
+
url_with_query = "#{url}?foo=bar"
|
416
|
+
stub_request(:delete, url_with_query)
|
247
417
|
|
248
|
-
|
418
|
+
response = subject.delete(url_with_query)
|
419
|
+
expect(response).to be_an_instance_of(Net::HTTPOK)
|
420
|
+
end
|
249
421
|
end
|
250
422
|
|
251
|
-
|
252
|
-
|
423
|
+
context "when response is a redirect" do
|
424
|
+
subject { klass }
|
425
|
+
|
426
|
+
def create_connection(options = {})
|
427
|
+
options[:use_ssl] = false
|
428
|
+
options[:verify] = Puppet::SSL::Validator.no_validator
|
429
|
+
subject.new(host, port, options)
|
430
|
+
end
|
431
|
+
|
432
|
+
def redirect_to(url)
|
433
|
+
{ status: 302, headers: { 'Location' => url } }
|
434
|
+
end
|
435
|
+
|
436
|
+
it "should follow the redirect to the final resource location" do
|
437
|
+
stub_request(:get, "http://me.example.com:8140/foo").to_return(redirect_to("http://me.example.com:8140/bar"))
|
438
|
+
stub_request(:get, "http://me.example.com:8140/bar").to_return(status: 200)
|
439
|
+
|
440
|
+
create_connection.get('/foo')
|
441
|
+
end
|
442
|
+
|
443
|
+
def expects_limit_exceeded(conn)
|
444
|
+
expect {
|
445
|
+
conn.get('/')
|
446
|
+
}.to raise_error(Puppet::Network::HTTP::RedirectionLimitExceededException)
|
447
|
+
end
|
448
|
+
|
449
|
+
it "should not follow any redirects when the limit is 0" do
|
450
|
+
stub_request(:get, "http://me.example.com:8140/").to_return(redirect_to("http://me.example.com:8140/foo"))
|
451
|
+
|
452
|
+
conn = create_connection(:redirect_limit => 0)
|
453
|
+
expects_limit_exceeded(conn)
|
454
|
+
end
|
455
|
+
|
456
|
+
it "should follow the redirect once" do
|
457
|
+
stub_request(:get, "http://me.example.com:8140/").to_return(redirect_to("http://me.example.com:8140/foo"))
|
458
|
+
stub_request(:get, "http://me.example.com:8140/foo").to_return(redirect_to("http://me.example.com:8140/bar"))
|
459
|
+
|
460
|
+
conn = create_connection(:redirect_limit => 1)
|
461
|
+
expects_limit_exceeded(conn)
|
462
|
+
end
|
463
|
+
|
464
|
+
it "should raise an exception when the redirect limit is exceeded" do
|
465
|
+
stub_request(:get, "http://me.example.com:8140/").to_return(redirect_to("http://me.example.com:8140/foo"))
|
466
|
+
stub_request(:get, "http://me.example.com:8140/foo").to_return(redirect_to("http://me.example.com:8140/bar"))
|
467
|
+
stub_request(:get, "http://me.example.com:8140/bar").to_return(redirect_to("http://me.example.com:8140/baz"))
|
468
|
+
stub_request(:get, "http://me.example.com:8140/baz").to_return(redirect_to("http://me.example.com:8140/qux"))
|
469
|
+
|
470
|
+
conn = create_connection(:redirect_limit => 3)
|
471
|
+
expects_limit_exceeded(conn)
|
472
|
+
end
|
253
473
|
|
254
|
-
|
474
|
+
it 'raises an exception when the location header is missing' do
|
475
|
+
stub_request(:get, "http://me.example.com:8140/").to_return(status: 302)
|
476
|
+
|
477
|
+
if legacy_api
|
478
|
+
expect {
|
479
|
+
create_connection.get('/')
|
480
|
+
}.to raise_error(URI::InvalidURIError, /bad URI/)
|
481
|
+
else
|
482
|
+
expect {
|
483
|
+
create_connection.get('/')
|
484
|
+
}.to raise_error(Puppet::HTTP::ProtocolError, /Location response header is missing/)
|
485
|
+
end
|
486
|
+
end
|
255
487
|
end
|
256
488
|
|
257
|
-
|
258
|
-
|
489
|
+
context "when response indicates an overloaded server" do
|
490
|
+
def retry_after(datetime)
|
491
|
+
stub_request(:get, url)
|
492
|
+
.to_return(status: [503, 'Service Unavailable'], headers: {'Retry-After' => datetime}).then
|
493
|
+
.to_return(status: 200)
|
494
|
+
end
|
495
|
+
|
496
|
+
it "should return a 503 response if Retry-After is not set" do
|
497
|
+
stub_request(:get, url).to_return(status: [503, 'Service Unavailable'])
|
498
|
+
|
499
|
+
result = subject.get('/foo')
|
500
|
+
expect(result.code).to eq("503")
|
501
|
+
end
|
502
|
+
|
503
|
+
it "should return a 503 response if Retry-After is not convertible to an Integer or RFC 2822 Date" do
|
504
|
+
retry_after('foo')
|
505
|
+
|
506
|
+
if legacy_api
|
507
|
+
result = subject.get('/foo')
|
508
|
+
expect(result.code).to eq("503")
|
509
|
+
else
|
510
|
+
expect {
|
511
|
+
subject.get('/foo')
|
512
|
+
}.to raise_error(Puppet::HTTP::ProtocolError, /Failed to parse Retry-After header 'foo'/)
|
513
|
+
end
|
514
|
+
end
|
515
|
+
|
516
|
+
it "should close the connection before sleeping" do
|
517
|
+
retry_after('42')
|
518
|
+
|
519
|
+
http1 = Net::HTTP.new(host, port)
|
520
|
+
http1.use_ssl = true
|
521
|
+
allow(http1).to receive(:started?).and_return(true)
|
522
|
+
|
523
|
+
http2 = Net::HTTP.new(host, port)
|
524
|
+
http2.use_ssl = true
|
525
|
+
allow(http1).to receive(:started?).and_return(true)
|
526
|
+
|
527
|
+
# The "with_connection" method is required to yield started connections
|
528
|
+
pool = if legacy_api
|
529
|
+
Puppet.lookup(:http_pool)
|
530
|
+
else
|
531
|
+
Puppet.runtime[:http].pool
|
532
|
+
end
|
259
533
|
|
260
|
-
|
534
|
+
allow(pool).to receive(:with_connection).and_yield(http1).and_yield(http2)
|
535
|
+
|
536
|
+
expect(http1).to receive(:finish).ordered
|
537
|
+
expect(::Kernel).to receive(:sleep).with(42).ordered
|
538
|
+
|
539
|
+
subject.get('/foo')
|
540
|
+
end
|
541
|
+
|
542
|
+
it "should sleep and retry if Retry-After is an Integer" do
|
543
|
+
retry_after('42')
|
544
|
+
|
545
|
+
expect(::Kernel).to receive(:sleep).with(42)
|
546
|
+
|
547
|
+
result = subject.get('/foo')
|
548
|
+
expect(result.code).to eq("200")
|
549
|
+
end
|
550
|
+
|
551
|
+
it "should sleep and retry if Retry-After is an RFC 2822 Date" do
|
552
|
+
retry_after('Wed, 13 Apr 2005 15:18:05 GMT')
|
553
|
+
|
554
|
+
now = DateTime.new(2005, 4, 13, 8, 17, 5, '-07:00')
|
555
|
+
allow(DateTime).to receive(:now).and_return(now)
|
556
|
+
|
557
|
+
expect(::Kernel).to receive(:sleep).with(60)
|
558
|
+
|
559
|
+
result = subject.get('/foo')
|
560
|
+
expect(result.code).to eq("200")
|
561
|
+
end
|
562
|
+
|
563
|
+
it "should sleep for no more than the Puppet runinterval" do
|
564
|
+
retry_after('60')
|
565
|
+
|
566
|
+
Puppet[:runinterval] = 30
|
567
|
+
|
568
|
+
expect(::Kernel).to receive(:sleep).with(30)
|
569
|
+
|
570
|
+
subject.get('/foo')
|
571
|
+
end
|
572
|
+
|
573
|
+
it "should sleep for 0 seconds if the RFC 2822 date has past" do
|
574
|
+
retry_after('Wed, 13 Apr 2005 15:18:05 GMT')
|
575
|
+
|
576
|
+
expect(::Kernel).to receive(:sleep).with(0)
|
577
|
+
|
578
|
+
subject.get('/foo')
|
579
|
+
end
|
261
580
|
end
|
262
|
-
end
|
263
581
|
|
264
|
-
|
265
|
-
|
266
|
-
|
582
|
+
context "basic auth" do
|
583
|
+
let(:auth) { { :user => 'user', :password => 'password' } }
|
584
|
+
let(:creds) { [ 'user', 'password'] }
|
267
585
|
|
268
|
-
|
269
|
-
|
586
|
+
it "is allowed in get requests" do
|
587
|
+
stub_request(:get, url).with(basic_auth: creds)
|
270
588
|
|
271
|
-
|
272
|
-
|
273
|
-
generic_error = Net::HTTPError.new('generic error', double("response"))
|
274
|
-
stub_request(:get, url).to_raise(generic_error)
|
589
|
+
subject.get('/foo', nil, :basic_auth => auth)
|
590
|
+
end
|
275
591
|
|
276
|
-
|
277
|
-
|
592
|
+
it "is allowed in post requests" do
|
593
|
+
stub_request(:post, url).with(basic_auth: creds)
|
594
|
+
|
595
|
+
subject.post('/foo', 'data', nil, :basic_auth => auth)
|
596
|
+
end
|
597
|
+
|
598
|
+
it "is allowed in head requests" do
|
599
|
+
stub_request(:head, url).with(basic_auth: creds)
|
600
|
+
|
601
|
+
subject.head('/foo', nil, :basic_auth => auth)
|
602
|
+
end
|
603
|
+
|
604
|
+
it "is allowed in delete requests" do
|
605
|
+
stub_request(:delete, url).with(basic_auth: creds)
|
606
|
+
|
607
|
+
subject.delete('/foo', nil, :basic_auth => auth)
|
608
|
+
end
|
609
|
+
|
610
|
+
it "is allowed in put requests" do
|
611
|
+
stub_request(:put, url).with(basic_auth: creds)
|
612
|
+
|
613
|
+
subject.put('/foo', 'data', nil, :basic_auth => auth)
|
614
|
+
end
|
278
615
|
end
|
279
616
|
|
280
|
-
it "
|
281
|
-
|
282
|
-
stub_request(:get, url).
|
617
|
+
it "sets HTTP User-Agent header" do
|
618
|
+
puppet_ua = "Puppet/#{Puppet.version} Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} (#{RUBY_PLATFORM})"
|
619
|
+
stub_request(:get, url).with(headers: { 'User-Agent' => puppet_ua })
|
283
620
|
|
284
|
-
|
285
|
-
expect { subject.get('/foo') }.to raise_error(timeout_error)
|
621
|
+
subject.get('/foo')
|
286
622
|
end
|
287
623
|
|
288
|
-
|
289
|
-
|
290
|
-
|
624
|
+
describe 'connection request errors' do
|
625
|
+
it "logs and raises generic http errors" do
|
626
|
+
generic_error = Net::HTTPError.new('generic error', double("response"))
|
627
|
+
stub_request(:get, url).to_raise(generic_error)
|
291
628
|
|
292
|
-
|
293
|
-
|
629
|
+
expect(Puppet).to receive(:log_exception).with(anything, /^.*failed.*: generic error$/)
|
630
|
+
expect { subject.get('/foo') }.to raise_error(generic_error)
|
631
|
+
end
|
632
|
+
|
633
|
+
it "logs and raises timeout errors" do
|
634
|
+
timeout_error = Net::OpenTimeout.new
|
635
|
+
stub_request(:get, url).to_raise(timeout_error)
|
636
|
+
|
637
|
+
expect(Puppet).to receive(:log_exception).with(anything, /^.*timed out .*after .* seconds/)
|
638
|
+
expect { subject.get('/foo') }.to raise_error(timeout_error)
|
639
|
+
end
|
640
|
+
|
641
|
+
it "logs and raises eof errors" do
|
642
|
+
eof_error = EOFError
|
643
|
+
stub_request(:get, url).to_raise(eof_error)
|
644
|
+
|
645
|
+
expect(Puppet).to receive(:log_exception).with(anything, /^.*interrupted after .* seconds$/)
|
646
|
+
expect { subject.get('/foo') }.to raise_error(eof_error)
|
647
|
+
end
|
294
648
|
end
|
295
649
|
end
|
650
|
+
|
651
|
+
describe Puppet::Network::HTTP::Connection do
|
652
|
+
it_behaves_like "an HTTP connection", described_class, true
|
653
|
+
end
|
654
|
+
|
655
|
+
describe Puppet::Network::HTTP::ConnectionAdapter do
|
656
|
+
it_behaves_like "an HTTP connection", described_class, false
|
657
|
+
end
|
296
658
|
end
|