puppet 6.11.1 → 6.16.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 +3 -8
- data/CONTRIBUTING.md +7 -13
- data/Gemfile +1 -0
- data/Gemfile.lock +39 -36
- data/README.md +17 -24
- data/ext/build_defaults.yaml +1 -0
- data/ext/project_data.yaml +1 -1
- data/ext/windows/service/daemon.rb +25 -20
- data/lib/puppet.rb +52 -13
- data/lib/puppet/agent.rb +20 -14
- data/lib/puppet/application/agent.rb +12 -14
- data/lib/puppet/application/describe.rb +7 -5
- data/lib/puppet/application/device.rb +2 -2
- data/lib/puppet/application/filebucket.rb +19 -15
- data/lib/puppet/application/plugin.rb +1 -0
- data/lib/puppet/application/resource.rb +1 -1
- data/lib/puppet/application/ssl.rb +4 -4
- data/lib/puppet/concurrent.rb +2 -0
- data/lib/puppet/concurrent/lock.rb +16 -0
- data/lib/puppet/concurrent/synchronized.rb +15 -0
- data/lib/puppet/concurrent/thread_local_singleton.rb +14 -0
- data/lib/puppet/configurer.rb +85 -83
- data/lib/puppet/configurer/plugin_handler.rb +10 -1
- data/lib/puppet/context/trusted_information.rb +14 -8
- data/lib/puppet/daemon.rb +13 -27
- data/lib/puppet/defaults.rb +158 -40
- data/lib/puppet/environments.rb +30 -20
- data/lib/puppet/error.rb +9 -1
- data/lib/puppet/face/facts.rb +8 -5
- data/lib/puppet/face/help.rb +29 -3
- data/lib/puppet/face/module/search.rb +5 -0
- data/lib/puppet/face/plugin.rb +2 -2
- data/lib/puppet/file_serving/http_metadata.rb +1 -1
- data/lib/puppet/file_system/file_impl.rb +13 -9
- data/lib/puppet/file_system/memory_file.rb +6 -0
- data/lib/puppet/file_system/memory_impl.rb +13 -0
- data/lib/puppet/file_system/uniquefile.rb +4 -0
- data/lib/puppet/file_system/windows.rb +7 -10
- data/lib/puppet/forge.rb +3 -3
- data/lib/puppet/forge/errors.rb +2 -2
- data/lib/puppet/forge/repository.rb +31 -86
- data/lib/puppet/functions/call.rb +1 -1
- data/lib/puppet/functions/camelcase.rb +2 -2
- data/lib/puppet/functions/epp.rb +4 -4
- data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
- data/lib/puppet/functions/filter.rb +1 -0
- data/lib/puppet/functions/find_file.rb +9 -9
- data/lib/puppet/functions/find_template.rb +63 -0
- data/lib/puppet/functions/inline_epp.rb +5 -5
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/http.rb +7 -0
- data/lib/puppet/http/client.rb +341 -54
- data/lib/puppet/http/errors.rb +2 -0
- data/lib/puppet/http/external_client.rb +90 -0
- data/lib/puppet/http/redirector.rb +34 -0
- data/lib/puppet/http/resolver.rb +57 -1
- data/lib/puppet/http/resolver/server_list.rb +98 -0
- data/lib/puppet/http/resolver/settings.rb +23 -2
- data/lib/puppet/http/resolver/srv.rb +36 -4
- data/lib/puppet/http/response.rb +68 -1
- data/lib/puppet/http/retry_after_handler.rb +39 -0
- data/lib/puppet/http/service.rb +179 -3
- data/lib/puppet/http/service/ca.rb +84 -21
- data/lib/puppet/http/service/compiler.rb +319 -0
- data/lib/puppet/http/service/file_server.rb +206 -0
- data/lib/puppet/http/service/report.rb +66 -0
- data/lib/puppet/http/session.rb +106 -31
- data/lib/puppet/indirector/catalog/compiler.rb +10 -0
- data/lib/puppet/indirector/catalog/rest.rb +34 -0
- data/lib/puppet/indirector/facts/rest.rb +42 -0
- data/lib/puppet/indirector/file_bucket_file/file.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 +30 -0
- data/lib/puppet/indirector/file_metadata/http.rb +4 -4
- data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
- data/lib/puppet/indirector/json.rb +1 -1
- data/lib/puppet/indirector/msgpack.rb +1 -1
- data/lib/puppet/indirector/node/rest.rb +24 -0
- data/lib/puppet/indirector/report/rest.rb +19 -0
- data/lib/puppet/indirector/report/yaml.rb +23 -0
- data/lib/puppet/indirector/rest.rb +12 -0
- data/lib/puppet/indirector/status/rest.rb +18 -0
- data/lib/puppet/loaders.rb +6 -0
- data/lib/puppet/metatype/manager.rb +80 -80
- data/lib/puppet/network/http/base_pool.rb +19 -1
- data/lib/puppet/network/http/compression.rb +7 -0
- data/lib/puppet/network/http/connection.rb +6 -0
- data/lib/puppet/network/http/connection_adapter.rb +182 -0
- data/lib/puppet/network/http/nocache_pool.rb +2 -0
- data/lib/puppet/network/http/pool.rb +13 -6
- data/lib/puppet/network/http_pool.rb +2 -1
- data/lib/puppet/node/environment.rb +24 -8
- data/lib/puppet/pal/catalog_compiler.rb +5 -0
- data/lib/puppet/pal/pal_impl.rb +9 -29
- data/lib/puppet/parser/ast/pops_bridge.rb +6 -11
- data/lib/puppet/parser/compiler.rb +42 -32
- data/lib/puppet/parser/functions.rb +18 -13
- data/lib/puppet/parser/functions/epp.rb +3 -3
- data/lib/puppet/parser/functions/filter.rb +1 -0
- data/lib/puppet/parser/functions/inline_epp.rb +5 -5
- data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
- data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
- data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
- data/lib/puppet/pops/loaders.rb +7 -5
- data/lib/puppet/pops/lookup/invocation.rb +10 -3
- data/lib/puppet/pops/model/pn_transformer.rb +5 -9
- data/lib/puppet/pops/parser/evaluating_parser.rb +8 -11
- data/lib/puppet/pops/serialization/json_path.rb +3 -3
- data/lib/puppet/pops/time/timespan.rb +3 -5
- data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
- data/lib/puppet/pops/types/string_converter.rb +6 -9
- data/lib/puppet/pops/types/type_calculator.rb +30 -10
- data/lib/puppet/pops/types/type_formatter.rb +9 -11
- data/lib/puppet/pops/types/type_parser.rb +3 -3
- data/lib/puppet/pops/validation/checker4_0.rb +1 -1
- data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
- data/lib/puppet/provider/aix_object.rb +4 -2
- data/lib/puppet/provider/group/aix.rb +1 -0
- data/lib/puppet/provider/group/groupadd.rb +57 -24
- 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 +78 -4
- data/lib/puppet/provider/package/dnfmodule.rb +69 -15
- data/lib/puppet/provider/package/dpkg.rb +14 -7
- data/lib/puppet/provider/package/fink.rb +20 -3
- data/lib/puppet/provider/package/gem.rb +41 -7
- data/lib/puppet/provider/package/openbsd.rb +13 -1
- data/lib/puppet/provider/package/pacman.rb +2 -5
- data/lib/puppet/provider/package/pip.rb +143 -48
- data/lib/puppet/provider/package/pip3.rb +0 -2
- data/lib/puppet/provider/package/pkg.rb +18 -5
- 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 +5 -5
- data/lib/puppet/provider/package/puppet_gem.rb +6 -2
- data/lib/puppet/provider/package/rpm.rb +6 -213
- data/lib/puppet/provider/package/yum.rb +108 -24
- data/lib/puppet/provider/package/zypper.rb +59 -1
- data/lib/puppet/provider/package_targetable.rb +5 -4
- data/lib/puppet/provider/service/systemd.rb +23 -5
- data/lib/puppet/provider/user/aix.rb +1 -0
- data/lib/puppet/provider/user/directoryservice.rb +30 -5
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +11 -8
- data/lib/puppet/reports/http.rb +13 -9
- data/lib/puppet/reports/store.rb +1 -1
- data/lib/puppet/resource/type_collection.rb +20 -16
- data/lib/puppet/runtime.rb +32 -1
- data/lib/puppet/settings.rb +4 -0
- data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
- data/lib/puppet/ssl.rb +1 -0
- data/lib/puppet/ssl/certificate.rb +2 -1
- data/lib/puppet/ssl/host.rb +4 -4
- data/lib/puppet/ssl/oids.rb +1 -0
- data/lib/puppet/ssl/ssl_provider.rb +20 -0
- data/lib/puppet/ssl/state_machine.rb +81 -35
- data/lib/puppet/ssl/verifier_adapter.rb +9 -1
- data/lib/puppet/test/test_helper.rb +7 -1
- data/lib/puppet/transaction.rb +33 -11
- data/lib/puppet/transaction/report.rb +2 -2
- data/lib/puppet/transaction/resource_harness.rb +1 -1
- data/lib/puppet/type.rb +7 -2
- data/lib/puppet/type/file.rb +13 -0
- data/lib/puppet/type/file/data_sync.rb +5 -1
- data/lib/puppet/type/file/source.rb +49 -58
- data/lib/puppet/type/group.rb +5 -4
- data/lib/puppet/type/package.rb +102 -10
- data/lib/puppet/type/service.rb +6 -8
- data/lib/puppet/type/user.rb +6 -30
- data/lib/puppet/util.rb +34 -11
- data/lib/puppet/util/at_fork.rb +1 -1
- data/lib/puppet/util/autoload.rb +4 -18
- data/lib/puppet/util/instance_loader.rb +14 -10
- data/lib/puppet/util/log/destinations.rb +2 -11
- data/lib/puppet/util/logging.rb +30 -18
- 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 +36 -10
- data/lib/puppet/util/platform.rb +5 -0
- data/lib/puppet/util/plist.rb +6 -0
- data/lib/puppet/util/rpm_compare.rb +193 -0
- data/lib/puppet/util/storage.rb +0 -1
- data/lib/puppet/util/windows/adsi.rb +50 -20
- data/lib/puppet/util/windows/process.rb +15 -14
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/util/yaml.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet/x509/cert_provider.rb +9 -5
- data/locales/puppet.pot +640 -521
- data/man/man5/puppet.conf.5 +88 -9
- data/man/man8/puppet-agent.8 +6 -6
- 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 +2 -2
- 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 +17 -2
- 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 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +4 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +2 -2
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- 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.json +76 -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/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/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
- data/spec/integration/application/agent_spec.rb +394 -0
- data/spec/integration/application/apply_spec.rb +132 -3
- data/spec/integration/application/filebucket_spec.rb +190 -0
- data/spec/integration/application/plugin_spec.rb +73 -0
- data/spec/integration/configurer_spec.rb +26 -7
- data/spec/integration/http/client_spec.rb +154 -0
- data/spec/integration/indirector/facts/facter_spec.rb +4 -0
- data/spec/integration/indirector/report/yaml.rb +83 -0
- data/spec/integration/module_tool/forge_spec.rb +51 -0
- data/spec/integration/network/http_pool_spec.rb +76 -20
- data/spec/integration/node/environment_spec.rb +15 -0
- data/spec/integration/util/windows/adsi_spec.rb +6 -1
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/https.rb +20 -9
- data/spec/lib/puppet_spec/puppetserver.rb +119 -0
- data/spec/shared_contexts/https.rb +29 -0
- data/spec/spec_helper.rb +6 -2
- data/spec/unit/agent_spec.rb +80 -26
- data/spec/unit/application/agent_spec.rb +9 -5
- data/spec/unit/application/apply_spec.rb +2 -12
- data/spec/unit/application/describe_spec.rb +88 -50
- data/spec/unit/application/device_spec.rb +2 -2
- data/spec/unit/application/filebucket_spec.rb +22 -2
- data/spec/unit/application/resource_spec.rb +2 -2
- data/spec/unit/concurrent/lock_spec.rb +29 -0
- data/spec/unit/configurer/fact_handler_spec.rb +0 -4
- data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
- data/spec/unit/configurer_spec.rb +400 -406
- data/spec/unit/context/trusted_information_spec.rb +17 -0
- data/spec/unit/daemon_spec.rb +5 -64
- data/spec/unit/defaults_spec.rb +38 -4
- data/spec/unit/environments_spec.rb +65 -28
- data/spec/unit/face/facts_spec.rb +24 -20
- data/spec/unit/face/module/search_spec.rb +17 -0
- data/spec/unit/face/plugin_spec.rb +12 -10
- data/spec/unit/file_system/uniquefile_spec.rb +11 -0
- data/spec/unit/file_system_spec.rb +26 -2
- data/spec/unit/forge/errors_spec.rb +1 -1
- data/spec/unit/forge/forge_spec.rb +12 -54
- data/spec/unit/forge/module_release_spec.rb +19 -6
- data/spec/unit/forge/repository_spec.rb +63 -157
- data/spec/unit/forge_spec.rb +46 -116
- data/spec/unit/functions/find_template_spec.rb +69 -0
- data/spec/unit/functions/lookup_spec.rb +13 -0
- data/spec/unit/http/client_spec.rb +395 -27
- data/spec/unit/http/external_client_spec.rb +201 -0
- data/spec/unit/http/resolver_spec.rb +81 -12
- data/spec/unit/http/response_spec.rb +69 -0
- data/spec/unit/http/service/ca_spec.rb +100 -7
- data/spec/unit/http/service/compiler_spec.rb +627 -0
- data/spec/unit/http/service/file_server_spec.rb +308 -0
- data/spec/unit/http/service/report_spec.rb +118 -0
- data/spec/unit/http/service_spec.rb +117 -4
- data/spec/unit/http/session_spec.rb +237 -19
- data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
- data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
- data/spec/unit/indirector/facts/rest_spec.rb +79 -24
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
- data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
- data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
- data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
- data/spec/unit/indirector/node/rest_spec.rb +57 -2
- data/spec/unit/indirector/report/rest_spec.rb +58 -51
- data/spec/unit/indirector/resource/ral_spec.rb +7 -8
- data/spec/unit/indirector/rest_spec.rb +13 -0
- data/spec/unit/indirector/status/rest_spec.rb +43 -2
- data/spec/unit/network/http/connection_spec.rb +549 -176
- data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
- data/spec/unit/network/http/pool_spec.rb +89 -11
- 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 +16 -0
- data/spec/unit/node/facts_spec.rb +2 -1
- data/spec/unit/node_spec.rb +7 -4
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
- data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
- data/spec/unit/pops/validator/validator_spec.rb +7 -2
- data/spec/unit/provider/aix_object_spec.rb +16 -2
- data/spec/unit/provider/group/groupadd_spec.rb +181 -56
- 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 +43 -2
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
- data/spec/unit/provider/package/dpkg_spec.rb +28 -6
- data/spec/unit/provider/package/gem_spec.rb +40 -0
- data/spec/unit/provider/package/openbsd_spec.rb +17 -0
- data/spec/unit/provider/package/pacman_spec.rb +6 -21
- data/spec/unit/provider/package/pip_spec.rb +68 -19
- data/spec/unit/provider/package/pkg_spec.rb +15 -1
- 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 +9 -4
- data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
- data/spec/unit/provider/package/rpm_spec.rb +0 -212
- data/spec/unit/provider/package/yum_spec.rb +292 -0
- data/spec/unit/provider/package/zypper_spec.rb +84 -0
- data/spec/unit/provider/package_targetable_spec.rb +60 -0
- data/spec/unit/provider/service/init_spec.rb +1 -0
- data/spec/unit/provider/service/openbsd_spec.rb +9 -0
- data/spec/unit/provider/service/openwrt_spec.rb +1 -0
- data/spec/unit/provider/service/redhat_spec.rb +9 -0
- data/spec/unit/provider/service/systemd_spec.rb +92 -12
- data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
- data/spec/unit/provider/user/hpux_spec.rb +2 -2
- data/spec/unit/provider/user/useradd_spec.rb +21 -8
- data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
- data/spec/unit/puppet_pal_2pec.rb +0 -26
- data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
- data/spec/unit/puppet_spec.rb +47 -0
- data/spec/unit/reports/http_spec.rb +70 -52
- data/spec/unit/settings/autosign_setting_spec.rb +1 -1
- data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
- data/spec/unit/ssl/certificate_spec.rb +7 -0
- 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 +71 -0
- data/spec/unit/ssl/state_machine_spec.rb +99 -13
- data/spec/unit/transaction/persistence_spec.rb +1 -10
- data/spec/unit/transaction/report_spec.rb +4 -0
- data/spec/unit/transaction_spec.rb +45 -1
- data/spec/unit/type/file/content_spec.rb +9 -3
- data/spec/unit/type/file/ensure_spec.rb +1 -2
- data/spec/unit/type/file/source_spec.rb +86 -35
- data/spec/unit/type/package_spec.rb +8 -0
- data/spec/unit/type/service_spec.rb +9 -8
- data/spec/unit/type/user_spec.rb +1 -2
- data/spec/unit/util/at_fork_spec.rb +3 -2
- data/spec/unit/util/autoload_spec.rb +2 -1
- data/spec/unit/util/log/destinations_spec.rb +1 -29
- data/spec/unit/util/log_spec.rb +0 -138
- data/spec/unit/util/logging_spec.rb +200 -0
- 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 +112 -42
- data/spec/unit/util/plist_spec.rb +20 -0
- data/spec/unit/util/rpm_compare_spec.rb +196 -0
- data/spec/unit/util/storage_spec.rb +1 -8
- data/spec/unit/util/windows/adsi_spec.rb +55 -4
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/spec/unit/x509/cert_provider_spec.rb +24 -4
- data/tasks/generate_cert_fixtures.rake +15 -1
- data/tasks/manpages.rake +6 -35
- metadata +92 -12
- data/COMMITTERS.md +0 -244
- data/spec/integration/faces/plugin_spec.rb +0 -61
- data/spec/lib/puppet_spec/validators.rb +0 -37
@@ -1,12 +1,37 @@
|
|
1
1
|
require 'date'
|
2
2
|
require 'time'
|
3
3
|
|
4
|
+
#
|
5
|
+
# @api private
|
6
|
+
#
|
7
|
+
# Parse information relating to responses containing a Retry-After headers
|
8
|
+
#
|
4
9
|
class Puppet::HTTP::RetryAfterHandler
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
#
|
13
|
+
# Create a handler to allow the system to sleep between HTTP requests
|
14
|
+
#
|
15
|
+
# @param [Integer] retry_limit number of retries allowed
|
16
|
+
# @param [Integer] max_sleep maximum sleep time allowed
|
17
|
+
#
|
5
18
|
def initialize(retry_limit, max_sleep)
|
6
19
|
@retry_limit = retry_limit
|
7
20
|
@max_sleep = max_sleep
|
8
21
|
end
|
9
22
|
|
23
|
+
#
|
24
|
+
# @api private
|
25
|
+
#
|
26
|
+
# Does the response from the server tell us to wait until we attempt the next
|
27
|
+
# retry?
|
28
|
+
#
|
29
|
+
# @param [Net::HTTP] request
|
30
|
+
# @param [Puppet::HTTP::Response] response
|
31
|
+
#
|
32
|
+
# @return [Boolean] Return true if the response code is 429 or 503, return
|
33
|
+
# false otherwise
|
34
|
+
#
|
10
35
|
def retry_after?(request, response)
|
11
36
|
case response.code
|
12
37
|
when 429, 503
|
@@ -16,6 +41,20 @@ class Puppet::HTTP::RetryAfterHandler
|
|
16
41
|
end
|
17
42
|
end
|
18
43
|
|
44
|
+
#
|
45
|
+
# @api private
|
46
|
+
#
|
47
|
+
# The amount of time to wait before attempting a retry
|
48
|
+
#
|
49
|
+
# @param [Net::HTTP] request
|
50
|
+
# @param [Puppet::HTTP::Response] response
|
51
|
+
# @param [Integer] retries number of retries attempted so far
|
52
|
+
#
|
53
|
+
# @return [Integer] the amount of time to wait
|
54
|
+
#
|
55
|
+
# @raise [Puppet::HTTP::TooManyRetryAfters] raise if we have hit our retry
|
56
|
+
# limit
|
57
|
+
#
|
19
58
|
def retry_after_interval(request, response, retries)
|
20
59
|
raise Puppet::HTTP::TooManyRetryAfters.new(request.uri) if retries >= @retry_limit
|
21
60
|
|
data/lib/puppet/http/service.rb
CHANGED
@@ -1,18 +1,194 @@
|
|
1
|
+
#
|
2
|
+
# @api private
|
3
|
+
#
|
4
|
+
# Represents a puppet web service
|
5
|
+
#
|
1
6
|
class Puppet::HTTP::Service
|
7
|
+
# @api private
|
8
|
+
# @return [URI] the url associated with this service
|
2
9
|
attr_reader :url
|
3
10
|
|
4
|
-
|
11
|
+
# @api private
|
12
|
+
# @return [Array<Symbol>] available services
|
13
|
+
SERVICE_NAMES = [:ca, :fileserver, :puppet, :report].freeze
|
14
|
+
|
15
|
+
# @api private
|
16
|
+
# @return [Array<Symbol>] format types that are unsupported
|
17
|
+
EXCLUDED_FORMATS = [:yaml, :b64_zlib_yaml, :dot].freeze
|
18
|
+
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
#
|
22
|
+
# Create a new web service, which contains the URL used to connect to the
|
23
|
+
# service. The four services implemented are `:ca`, `:fileserver`, `:puppet`,
|
24
|
+
# and `:report`.
|
25
|
+
#
|
26
|
+
# The `:ca` and `:report` services handle certs and reports, respectively. The
|
27
|
+
# `:fileserver` service handles puppet file metadata and content requests. And
|
28
|
+
# the default service, `:puppet`, handles nodes, facts, and catalogs.
|
29
|
+
#
|
30
|
+
# @param [Puppet::HTTP::Client] client the owner of the session
|
31
|
+
# @param [Puppet::HTTP::Session] session the owner of the service
|
32
|
+
# @param [Symbol] name the type of service to create
|
33
|
+
# @param [<Type>] server optional, the server to connect to
|
34
|
+
# @param [<Type>] port optional, the port to connect to
|
35
|
+
#
|
36
|
+
# @return [Puppet::HTTP::Service] an instance of the service type requested
|
37
|
+
#
|
38
|
+
def self.create_service(client, session, name, server = nil, port = nil)
|
39
|
+
case name
|
40
|
+
when :ca
|
41
|
+
Puppet::HTTP::Service::Ca.new(client, session, server, port)
|
42
|
+
when :fileserver
|
43
|
+
Puppet::HTTP::Service::FileServer.new(client, session, server, port)
|
44
|
+
when :puppet
|
45
|
+
::Puppet::HTTP::Service::Compiler.new(client, session, server, port)
|
46
|
+
when :report
|
47
|
+
Puppet::HTTP::Service::Report.new(client, session, server, port)
|
48
|
+
else
|
49
|
+
raise ArgumentError, "Unknown service #{name}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# @api private
|
55
|
+
#
|
56
|
+
# Check if the service named is included in the list of available services.
|
57
|
+
#
|
58
|
+
# @param [Symbol] name
|
59
|
+
#
|
60
|
+
# @return [Boolean]
|
61
|
+
#
|
62
|
+
def self.valid_name?(name)
|
63
|
+
SERVICE_NAMES.include?(name)
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
# @api private
|
68
|
+
#
|
69
|
+
# Create a new service
|
70
|
+
#
|
71
|
+
# @param [Puppet::HTTP::Client] client
|
72
|
+
# @param [Puppet::HTTP::Session] session
|
73
|
+
# @param [URI] url The url to connect to
|
74
|
+
#
|
75
|
+
def initialize(client, session, url)
|
5
76
|
@client = client
|
77
|
+
@session = session
|
6
78
|
@url = url
|
7
79
|
end
|
8
80
|
|
81
|
+
#
|
82
|
+
# @api private
|
83
|
+
#
|
84
|
+
# Return the url with the given path encoded and appended
|
85
|
+
#
|
86
|
+
# @param [String] path the string to append to the base url
|
87
|
+
#
|
88
|
+
# @return [URI] the URI object containing the encoded path
|
89
|
+
#
|
9
90
|
def with_base_url(path)
|
10
91
|
u = @url.dup
|
11
|
-
u.path += path
|
92
|
+
u.path += Puppet::Util.uri_encode(path)
|
12
93
|
u
|
13
94
|
end
|
14
95
|
|
96
|
+
#
|
97
|
+
# @api private
|
98
|
+
#
|
99
|
+
# Open a connection using the given ssl context
|
100
|
+
#
|
101
|
+
# @param [Puppet::SSL::SSLContext] ssl_context (nil) optional ssl context to
|
102
|
+
# connect with
|
103
|
+
#
|
15
104
|
def connect(ssl_context: nil)
|
16
|
-
@client.connect(@url, ssl_context: ssl_context)
|
105
|
+
@client.connect(@url, options: {ssl_context: ssl_context})
|
106
|
+
end
|
107
|
+
|
108
|
+
protected
|
109
|
+
|
110
|
+
def add_puppet_headers(headers)
|
111
|
+
modified_headers = headers.dup
|
112
|
+
|
113
|
+
# Add 'X-Puppet-Profiling' to enable performance profiling if turned on
|
114
|
+
modified_headers['X-Puppet-Profiling'] = 'true' if Puppet[:profile]
|
115
|
+
|
116
|
+
# Add additional user-defined headers if they are defined
|
117
|
+
Puppet[:http_extra_headers].each do |name, value|
|
118
|
+
if modified_headers.keys.find { |key| key.casecmp(name) == 0 }
|
119
|
+
Puppet.warning(_('Ignoring extra header "%{name}" as it was previously set.') % { name: name })
|
120
|
+
else
|
121
|
+
if value.nil? || value.empty?
|
122
|
+
Puppet.warning(_('Ignoring extra header "%{name}" as it has no value.') % { name: name })
|
123
|
+
else
|
124
|
+
modified_headers[name] = value
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
modified_headers
|
129
|
+
end
|
130
|
+
|
131
|
+
def build_url(api, server, port)
|
132
|
+
URI::HTTPS.build(host: server,
|
133
|
+
port: port,
|
134
|
+
path: api
|
135
|
+
).freeze
|
136
|
+
end
|
137
|
+
|
138
|
+
def get_mime_types(model)
|
139
|
+
network_formats = model.supported_formats - EXCLUDED_FORMATS
|
140
|
+
network_formats.map { |f| model.get_format(f).mime }
|
141
|
+
end
|
142
|
+
|
143
|
+
def formatter_for_response(response)
|
144
|
+
header = response['Content-Type']
|
145
|
+
raise Puppet::HTTP::ProtocolError.new(_("No content type in http response; cannot parse")) unless header
|
146
|
+
|
147
|
+
header.gsub!(/\s*;.*$/,'') # strip any charset
|
148
|
+
|
149
|
+
formatter = Puppet::Network::FormatHandler.mime(header)
|
150
|
+
raise Puppet::HTTP::ProtocolError.new("Content-Type is unsupported") if EXCLUDED_FORMATS.include?(formatter.name)
|
151
|
+
|
152
|
+
formatter
|
153
|
+
end
|
154
|
+
|
155
|
+
def serialize(formatter, object)
|
156
|
+
begin
|
157
|
+
formatter.render(object)
|
158
|
+
rescue => err
|
159
|
+
raise Puppet::HTTP::SerializationError.new("Failed to serialize #{object.class} to #{formatter.name}: #{err.message}", err)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def serialize_multiple(formatter, object)
|
164
|
+
begin
|
165
|
+
formatter.render_multiple(object)
|
166
|
+
rescue => err
|
167
|
+
raise Puppet::HTTP::SerializationError.new("Failed to serialize multiple #{object.class} to #{formatter.name}: #{err.message}", err)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def deserialize(response, model)
|
172
|
+
formatter = formatter_for_response(response)
|
173
|
+
begin
|
174
|
+
formatter.intern(model, response.body.to_s)
|
175
|
+
rescue => err
|
176
|
+
raise Puppet::HTTP::SerializationError.new("Failed to deserialize #{model} from #{formatter.name}: #{err.message}", err)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def deserialize_multiple(response, model)
|
181
|
+
formatter = formatter_for_response(response)
|
182
|
+
begin
|
183
|
+
formatter.intern_multiple(model, response.body.to_s)
|
184
|
+
rescue => err
|
185
|
+
raise Puppet::HTTP::SerializationError.new("Failed to deserialize multiple #{model} from #{formatter.name}: #{err.message}", err)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def process_response(response)
|
190
|
+
@session.process_response(response)
|
191
|
+
|
192
|
+
raise Puppet::HTTP::ResponseError.new(response) unless response.success?
|
17
193
|
end
|
18
194
|
end
|
@@ -1,49 +1,112 @@
|
|
1
|
+
#
|
2
|
+
# @api private
|
3
|
+
#
|
4
|
+
# The Ca service is used to handle certificate requests
|
5
|
+
#
|
1
6
|
class Puppet::HTTP::Service::Ca < Puppet::HTTP::Service
|
7
|
+
# @api private
|
8
|
+
# @return [Hash] default headers for the ca service
|
2
9
|
HEADERS = { 'Accept' => 'text/plain' }.freeze
|
3
10
|
|
11
|
+
# @api private
|
12
|
+
# @return [String] default API for the ca service
|
13
|
+
API = '/puppet-ca/v1'.freeze
|
14
|
+
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
#
|
18
|
+
# @param [Puppet::HTTP::Client] client
|
19
|
+
# @param [Puppet::HTTP::Session] session
|
20
|
+
# @param [String] server (Puppet[:ca_server]) If an explicit server is given,
|
21
|
+
# create a service using that server. If server is nil, the default value
|
22
|
+
# is used to create the service.
|
23
|
+
# @param [Integer] port (Puppet[:ca_port]) If an explicit port is given, create
|
24
|
+
# a service using that port. If port is nil, the default value is used to
|
25
|
+
# create the service.
|
26
|
+
#
|
27
|
+
def initialize(client, session, server, port)
|
28
|
+
url = build_url(API, server || Puppet[:ca_server], port || Puppet[:ca_port])
|
29
|
+
super(client, session, url)
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
#
|
35
|
+
# Submit a GET request to retrieve the named certificate from the server
|
36
|
+
#
|
37
|
+
# @param [String] name name of the certificate to request
|
38
|
+
# @param [Puppet::SSL::SSLContext] ssl_context
|
39
|
+
#
|
40
|
+
# @return [Array<Puppet::HTTP::Response, String>] An array containing the
|
41
|
+
# request response and the stringified body of the request response
|
42
|
+
#
|
4
43
|
def get_certificate(name, ssl_context: nil)
|
5
44
|
response = @client.get(
|
6
45
|
with_base_url("/certificate/#{name}"),
|
7
|
-
headers: HEADERS,
|
8
|
-
ssl_context: ssl_context
|
46
|
+
headers: add_puppet_headers(HEADERS),
|
47
|
+
options: {ssl_context: ssl_context}
|
9
48
|
)
|
10
49
|
|
11
|
-
|
50
|
+
process_response(response)
|
12
51
|
|
13
|
-
|
52
|
+
[response, response.body.to_s]
|
14
53
|
end
|
15
54
|
|
55
|
+
#
|
56
|
+
# @api private
|
57
|
+
#
|
58
|
+
# Submit a GET request to retrieve the certificate revocation list from the
|
59
|
+
# server
|
60
|
+
#
|
61
|
+
# @param [Time] if_modified_since If not nil, only download the CRL if it has
|
62
|
+
# been modified since the specified time.
|
63
|
+
# @param [Puppet::SSL::SSLContext] ssl_context
|
64
|
+
#
|
65
|
+
# @return [Array<Puppet::HTTP::Response, String>] An array containing the
|
66
|
+
# request response and the stringified body of the request response
|
67
|
+
#
|
16
68
|
def get_certificate_revocation_list(if_modified_since: nil, ssl_context: nil)
|
17
|
-
|
18
|
-
|
19
|
-
h['If-Modified-Since'] = if_modified_since.httpdate
|
20
|
-
h
|
21
|
-
else
|
22
|
-
HEADERS
|
23
|
-
end
|
69
|
+
headers = add_puppet_headers(HEADERS)
|
70
|
+
headers['If-Modified-Since'] = if_modified_since.httpdate if if_modified_since
|
24
71
|
|
25
72
|
response = @client.get(
|
26
73
|
with_base_url("/certificate_revocation_list/ca"),
|
27
|
-
headers:
|
28
|
-
ssl_context: ssl_context
|
74
|
+
headers: headers,
|
75
|
+
options: {ssl_context: ssl_context}
|
29
76
|
)
|
30
77
|
|
31
|
-
|
78
|
+
process_response(response)
|
32
79
|
|
33
|
-
|
80
|
+
[response, response.body.to_s]
|
34
81
|
end
|
35
82
|
|
83
|
+
#
|
84
|
+
# @api private
|
85
|
+
#
|
86
|
+
# Submit a PUT request to send a certificate request to the server
|
87
|
+
#
|
88
|
+
# @param [String] name The name of the certificate request being sent
|
89
|
+
# @param [OpenSSL::X509::Request] csr Certificate request to send to the
|
90
|
+
# server
|
91
|
+
# @param [Puppet::SSL::SSLContext] ssl_context
|
92
|
+
#
|
93
|
+
# @return [Puppet::HTTP::Response] The request response
|
94
|
+
#
|
36
95
|
def put_certificate_request(name, csr, ssl_context: nil)
|
96
|
+
headers = add_puppet_headers(HEADERS)
|
97
|
+
headers['Content-Type'] = 'text/plain'
|
98
|
+
|
37
99
|
response = @client.put(
|
38
100
|
with_base_url("/certificate_request/#{name}"),
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
101
|
+
csr.to_pem,
|
102
|
+
headers: headers,
|
103
|
+
options: {
|
104
|
+
ssl_context: ssl_context
|
105
|
+
}
|
43
106
|
)
|
44
107
|
|
45
|
-
|
108
|
+
process_response(response)
|
46
109
|
|
47
|
-
|
110
|
+
response
|
48
111
|
end
|
49
112
|
end
|
@@ -0,0 +1,319 @@
|
|
1
|
+
#
|
2
|
+
# @api private
|
3
|
+
#
|
4
|
+
# The Compiler service is used to submit and retrieve data from the
|
5
|
+
# puppetserver.
|
6
|
+
#
|
7
|
+
class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
|
8
|
+
# @api private
|
9
|
+
# @return [String] Default API for the Compiler service
|
10
|
+
API = '/puppet/v3'.freeze
|
11
|
+
|
12
|
+
#
|
13
|
+
# @api private
|
14
|
+
#
|
15
|
+
# @param [Puppet::HTTP::Client] client
|
16
|
+
# @param [Puppet::HTTP::Session] session
|
17
|
+
# @param [String] server (Puppet[:ca_server]) If an explicit server is given,
|
18
|
+
# create a service using that server. If server is nil, the default value
|
19
|
+
# is used to create the service.
|
20
|
+
# @param [Integer] port (Puppet[:ca_port]) If an explicit port is given, create
|
21
|
+
# a service using that port. If port is nil, the default value is used to
|
22
|
+
# create the service.
|
23
|
+
#
|
24
|
+
def initialize(client, session, server, port)
|
25
|
+
url = build_url(API, server || Puppet[:server], port || Puppet[:masterport])
|
26
|
+
super(client, session, url)
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# @api private
|
31
|
+
#
|
32
|
+
# Submit a GET request to retrieve a node from the server
|
33
|
+
#
|
34
|
+
# @param [String] name The name of the node being requested
|
35
|
+
# @param [String] environment The name of the environment we are operating in
|
36
|
+
# @param [String] configured_environment Optional, the name of the configured
|
37
|
+
# environment. If unset, `environment` is used.
|
38
|
+
# @param [String] transaction_uuid An agent generated transaction uuid, used
|
39
|
+
# for connecting catalogs and reports.
|
40
|
+
#
|
41
|
+
# @return [Array<Puppet::HTTP::Response, Puppet::Node>] An array containing
|
42
|
+
# the request response and the deserialized requested node
|
43
|
+
#
|
44
|
+
def get_node(name, environment:, configured_environment: nil, transaction_uuid: nil)
|
45
|
+
headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Node).join(', '))
|
46
|
+
|
47
|
+
response = @client.get(
|
48
|
+
with_base_url("/node/#{name}"),
|
49
|
+
headers: headers,
|
50
|
+
params: {
|
51
|
+
environment: environment,
|
52
|
+
configured_environment: configured_environment || environment,
|
53
|
+
transaction_uuid: transaction_uuid,
|
54
|
+
}
|
55
|
+
)
|
56
|
+
|
57
|
+
process_response(response)
|
58
|
+
|
59
|
+
[response, deserialize(response, Puppet::Node)]
|
60
|
+
end
|
61
|
+
|
62
|
+
#
|
63
|
+
# @api private
|
64
|
+
#
|
65
|
+
# Submit a POST request to submit a catalog to the server
|
66
|
+
#
|
67
|
+
# @param [String] name The name of the catalog to be submitted
|
68
|
+
# @param [Puppet::Node::Facts] facts Facts for this catalog
|
69
|
+
# @param [String] environment The name of the environment we are operating in
|
70
|
+
# @param [String] configured_environment Optional, the name of the configured
|
71
|
+
# environment. If unset, `environment` is used.
|
72
|
+
# @param [String] transaction_uuid An agent generated transaction uuid, used
|
73
|
+
# for connecting catalogs and reports.
|
74
|
+
# @param [String] job_uuid A unique job identifier defined when the orchestrator
|
75
|
+
# starts a puppet run via pxp-agent. This is used to correlate catalogs and
|
76
|
+
# reports with the orchestrator job.
|
77
|
+
# @param [Boolean] static_catalog Indicates if the file metadata(s) are inlined
|
78
|
+
# in the catalog. This informs the agent if it needs to make a second request
|
79
|
+
# to retrieve metadata in addition to the initial catalog request.
|
80
|
+
# @param [Array<String>] checksum_type An array of accepted checksum type.
|
81
|
+
# Currently defaults to `["md5", "sha256", "sha384", "sha512", "sha224"]`,
|
82
|
+
# or `["sha256", "sha384", "sha512", "sha224"]` if fips is enabled.
|
83
|
+
#
|
84
|
+
# @return [Array<Puppet::HTTP::Response, Puppet::Resource::Catalog>] An array
|
85
|
+
# containing the request response and the deserialized catalog returned by
|
86
|
+
# the server
|
87
|
+
#
|
88
|
+
def post_catalog(name, facts:, environment:, configured_environment: nil, transaction_uuid: nil, job_uuid: nil, static_catalog: true, checksum_type: Puppet[:supported_checksum_types])
|
89
|
+
if Puppet[:preferred_serialization_format] == "pson"
|
90
|
+
formatter = Puppet::Network::FormatHandler.format_for(:pson)
|
91
|
+
# must use 'pson' instead of 'text/pson'
|
92
|
+
facts_format = 'pson'
|
93
|
+
else
|
94
|
+
formatter = Puppet::Network::FormatHandler.format_for(:json)
|
95
|
+
facts_format = formatter.mime
|
96
|
+
end
|
97
|
+
|
98
|
+
facts_as_string = serialize(formatter, facts)
|
99
|
+
|
100
|
+
# query parameters are sent in the POST request body
|
101
|
+
body = {
|
102
|
+
facts_format: facts_format,
|
103
|
+
facts: Puppet::Util.uri_query_encode(facts_as_string),
|
104
|
+
environment: environment,
|
105
|
+
configured_environment: configured_environment || environment,
|
106
|
+
transaction_uuid: transaction_uuid,
|
107
|
+
job_uuid: job_uuid,
|
108
|
+
static_catalog: static_catalog,
|
109
|
+
checksum_type: checksum_type.join('.')
|
110
|
+
}.map do |key, value|
|
111
|
+
"#{key}=#{Puppet::Util.uri_query_encode(value.to_s)}"
|
112
|
+
end.join("&")
|
113
|
+
|
114
|
+
headers = add_puppet_headers(
|
115
|
+
'Accept' => get_mime_types(Puppet::Resource::Catalog).join(', '),
|
116
|
+
'Content-Type' => 'application/x-www-form-urlencoded'
|
117
|
+
)
|
118
|
+
|
119
|
+
response = @client.post(
|
120
|
+
with_base_url("/catalog/#{name}"),
|
121
|
+
body,
|
122
|
+
headers: headers,
|
123
|
+
# for legacy reasons we always send environment as a query parameter too
|
124
|
+
params: { environment: environment },
|
125
|
+
)
|
126
|
+
|
127
|
+
process_response(response)
|
128
|
+
|
129
|
+
[response, deserialize(response, Puppet::Resource::Catalog)]
|
130
|
+
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# @api private
|
134
|
+
#
|
135
|
+
# Submit a GET request to retrieve the facts for the named node
|
136
|
+
#
|
137
|
+
# @param [String] name Name of the node to retrieve facts for
|
138
|
+
# @param [String] environment Name of the environment we are operating in
|
139
|
+
#
|
140
|
+
# @return [Array<Puppet::HTTP::Response, Puppet::Node::Facts>] An array
|
141
|
+
# containing the request response and the deserialized facts for the
|
142
|
+
# specified node
|
143
|
+
#
|
144
|
+
def get_facts(name, environment:)
|
145
|
+
headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Node::Facts).join(', '))
|
146
|
+
|
147
|
+
response = @client.get(
|
148
|
+
with_base_url("/facts/#{name}"),
|
149
|
+
headers: headers,
|
150
|
+
params: { environment: environment }
|
151
|
+
)
|
152
|
+
|
153
|
+
process_response(response)
|
154
|
+
|
155
|
+
[response, deserialize(response, Puppet::Node::Facts)]
|
156
|
+
end
|
157
|
+
|
158
|
+
#
|
159
|
+
# @api private
|
160
|
+
#
|
161
|
+
# Submits a PUT request to submit facts for the node to the server
|
162
|
+
#
|
163
|
+
# @param [String] name Name of the node we are submitting facts for
|
164
|
+
# @param [String] environment Name of the environment we are operating in
|
165
|
+
# @param [Puppet::Node::Facts] facts Facts for the named node
|
166
|
+
#
|
167
|
+
# @return [Puppet::HTTP::Response] The request response
|
168
|
+
#
|
169
|
+
def put_facts(name, environment:, facts:)
|
170
|
+
formatter = Puppet::Network::FormatHandler.format_for(Puppet[:preferred_serialization_format])
|
171
|
+
|
172
|
+
headers = add_puppet_headers(
|
173
|
+
'Accept' => get_mime_types(Puppet::Node::Facts).join(', '),
|
174
|
+
'Content-Type' => formatter.mime
|
175
|
+
)
|
176
|
+
|
177
|
+
response = @client.put(
|
178
|
+
with_base_url("/facts/#{name}"),
|
179
|
+
serialize(formatter, facts),
|
180
|
+
headers: headers,
|
181
|
+
params: { environment: environment },
|
182
|
+
)
|
183
|
+
|
184
|
+
process_response(response)
|
185
|
+
|
186
|
+
response
|
187
|
+
end
|
188
|
+
|
189
|
+
#
|
190
|
+
# @api private
|
191
|
+
#
|
192
|
+
# Submit a GET request to find the status of a compiler
|
193
|
+
#
|
194
|
+
# @param [String] name The name of the node that a status being requested for
|
195
|
+
#
|
196
|
+
# @return [Array<Puppet::HTTP::Response, Puppet::Status>] An array containing
|
197
|
+
# the request response and the deserialized status returned from the server
|
198
|
+
#
|
199
|
+
def get_status(name)
|
200
|
+
headers = add_puppet_headers('Accept' => get_mime_types(Puppet::Status).join(', '))
|
201
|
+
|
202
|
+
response = @client.get(
|
203
|
+
with_base_url("/status/#{name}"),
|
204
|
+
headers: headers,
|
205
|
+
params: {
|
206
|
+
# environment is required, but meaningless, default to production
|
207
|
+
environment: 'production'
|
208
|
+
},
|
209
|
+
)
|
210
|
+
|
211
|
+
process_response(response)
|
212
|
+
|
213
|
+
[response, deserialize(response, Puppet::Status)]
|
214
|
+
end
|
215
|
+
|
216
|
+
#
|
217
|
+
# @api private
|
218
|
+
#
|
219
|
+
# Submit a GET request to retrieve a file stored with filebucket
|
220
|
+
#
|
221
|
+
# @param [String] path The request path, formatted by Puppet::FileBucket::Dipper
|
222
|
+
# @param [String] environment Name of the environment we are operating in.
|
223
|
+
# This should not impact filebucket at all, but is included to be consistent
|
224
|
+
# with legacy code.
|
225
|
+
# @param [String] bucket_path
|
226
|
+
# @param [String] diff_with a checksum to diff against if we are comparing
|
227
|
+
# files that are both stored in the bucket
|
228
|
+
# @param [String] list_all
|
229
|
+
# @param [String] fromdate
|
230
|
+
# @param [String] todate
|
231
|
+
#
|
232
|
+
# @return [Array<Puppet::HTTP::Response, Puppet::FileBucket::File>] An array
|
233
|
+
# containing the request response and the deserialized file returned from
|
234
|
+
# the server.
|
235
|
+
#
|
236
|
+
def get_filebucket_file(path, environment:, bucket_path: nil, diff_with: nil, list_all: nil, fromdate: nil, todate: nil)
|
237
|
+
headers = add_puppet_headers('Accept' => 'application/octet-stream')
|
238
|
+
|
239
|
+
response = @client.get(
|
240
|
+
with_base_url("/file_bucket_file/#{path}"),
|
241
|
+
headers: headers,
|
242
|
+
params: {
|
243
|
+
environment: environment,
|
244
|
+
bucket_path: bucket_path,
|
245
|
+
diff_with: diff_with,
|
246
|
+
list_all: list_all,
|
247
|
+
fromdate: fromdate,
|
248
|
+
todate: todate
|
249
|
+
}
|
250
|
+
)
|
251
|
+
|
252
|
+
process_response(response)
|
253
|
+
|
254
|
+
[response, deserialize(response, Puppet::FileBucket::File)]
|
255
|
+
end
|
256
|
+
|
257
|
+
#
|
258
|
+
# @api private
|
259
|
+
#
|
260
|
+
# Submit a PUT request to store a file with filebucket
|
261
|
+
#
|
262
|
+
# @param [String] path The request path, formatted by Puppet::FileBucket::Dipper
|
263
|
+
# @param [String] body The contents of the file to be backed
|
264
|
+
# @param [String] environment Name of the environment we are operating in.
|
265
|
+
# This should not impact filebucket at all, but is included to be consistent
|
266
|
+
# with legacy code.
|
267
|
+
#
|
268
|
+
# @return [Puppet::HTTP::Response] The response request
|
269
|
+
#
|
270
|
+
def put_filebucket_file(path, body:, environment:)
|
271
|
+
headers = add_puppet_headers({
|
272
|
+
'Accept' => 'application/octet-stream',
|
273
|
+
'Content-Type' => 'application/octet-stream'
|
274
|
+
})
|
275
|
+
|
276
|
+
response = @client.put(
|
277
|
+
with_base_url("/file_bucket_file/#{path}"),
|
278
|
+
body,
|
279
|
+
headers: headers,
|
280
|
+
params: {
|
281
|
+
environment: environment
|
282
|
+
}
|
283
|
+
)
|
284
|
+
|
285
|
+
process_response(response)
|
286
|
+
|
287
|
+
response
|
288
|
+
end
|
289
|
+
|
290
|
+
#
|
291
|
+
# @api private
|
292
|
+
#
|
293
|
+
# Submit a HEAD request to check the status of a file stored with filebucket
|
294
|
+
#
|
295
|
+
# @param [String] path The request path, formatted by Puppet::FileBucket::Dipper
|
296
|
+
# @param [String] environment Name of the environment we are operating in.
|
297
|
+
# This should not impact filebucket at all, but is included to be consistent
|
298
|
+
# with legacy code.
|
299
|
+
# @param [String] bucket_path
|
300
|
+
#
|
301
|
+
# @return [Puppet::HTTP::Response] The request response
|
302
|
+
#
|
303
|
+
def head_filebucket_file(path, environment:, bucket_path: nil)
|
304
|
+
headers = add_puppet_headers('Accept' => 'application/octet-stream')
|
305
|
+
|
306
|
+
response = @client.head(
|
307
|
+
with_base_url("/file_bucket_file/#{path}"),
|
308
|
+
headers: headers,
|
309
|
+
params: {
|
310
|
+
environment: environment,
|
311
|
+
bucket_path: bucket_path
|
312
|
+
}
|
313
|
+
)
|
314
|
+
|
315
|
+
process_response(response)
|
316
|
+
|
317
|
+
response
|
318
|
+
end
|
319
|
+
end
|