puppet 6.11.1-x64-mingw32 → 6.16.0-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/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
data/lib/puppet/agent.rb
CHANGED
@@ -43,6 +43,7 @@ class Puppet::Agent
|
|
43
43
|
end
|
44
44
|
|
45
45
|
result = nil
|
46
|
+
wait_for_lock_deadline = nil
|
46
47
|
block_run = Puppet::Application.controlled_run do
|
47
48
|
splay client_options.fetch :splay, Puppet[:splay]
|
48
49
|
result = run_in_fork(should_fork) do
|
@@ -60,16 +61,29 @@ class Puppet::Agent
|
|
60
61
|
end
|
61
62
|
end
|
62
63
|
rescue Puppet::LockError
|
63
|
-
|
64
|
-
|
64
|
+
now = Time.now.to_i
|
65
|
+
wait_for_lock_deadline ||= now + Puppet[:maxwaitforlock]
|
66
|
+
|
67
|
+
if Puppet[:waitforlock] < 1
|
68
|
+
Puppet.notice _("Run of %{client_class} already in progress; skipping (%{lockfile_path} exists)") % { client_class: client_class, lockfile_path: lockfile_path }
|
69
|
+
nil
|
70
|
+
elsif now > wait_for_lock_deadline
|
71
|
+
Puppet.notice _("Exiting now because the maxwaitforlock timeout has been exceeded.")
|
72
|
+
nil
|
73
|
+
else
|
74
|
+
Puppet.info _("Another puppet instance is already running; --waitforlock flag used, waiting for running instance to finish.")
|
75
|
+
Puppet.info _("Will try again in %{time} seconds.") % {time: Puppet[:waitforlock]}
|
76
|
+
sleep Puppet[:waitforlock]
|
77
|
+
retry
|
78
|
+
end
|
65
79
|
rescue RunTimeoutError => detail
|
66
80
|
Puppet.log_exception(detail, _("Execution of %{client_class} did not complete within %{runtimeout} seconds and was terminated.") %
|
67
81
|
{client_class: client_class,
|
68
82
|
runtimeout: Puppet[:runtimeout]})
|
69
|
-
|
83
|
+
nil
|
70
84
|
rescue StandardError => detail
|
71
85
|
Puppet.log_exception(detail, _("Could not run %{client_class}: %{detail}") % { client_class: client_class, detail: detail })
|
72
|
-
|
86
|
+
nil
|
73
87
|
end
|
74
88
|
end
|
75
89
|
end
|
@@ -95,11 +109,9 @@ class Puppet::Agent
|
|
95
109
|
atForkHandler.child
|
96
110
|
$0 = _("puppet agent: applying configuration")
|
97
111
|
begin
|
98
|
-
exit(yield)
|
99
|
-
rescue SystemExit
|
100
|
-
exit(-1)
|
112
|
+
exit(yield || 1)
|
101
113
|
rescue NoMemoryError
|
102
|
-
exit(
|
114
|
+
exit(254)
|
103
115
|
end
|
104
116
|
end
|
105
117
|
ensure
|
@@ -107,12 +119,6 @@ class Puppet::Agent
|
|
107
119
|
end
|
108
120
|
|
109
121
|
exit_code = Process.waitpid2(child_pid)
|
110
|
-
case exit_code[1].exitstatus
|
111
|
-
when -1
|
112
|
-
raise SystemExit
|
113
|
-
when -2
|
114
|
-
raise NoMemoryError
|
115
|
-
end
|
116
122
|
exit_code[1].exitstatus
|
117
123
|
end
|
118
124
|
|
@@ -39,6 +39,7 @@ class Puppet::Application::Agent < Puppet::Application
|
|
39
39
|
:graph => true,
|
40
40
|
:fingerprint => false,
|
41
41
|
:sourceaddress => nil,
|
42
|
+
:start_time => Time.now,
|
42
43
|
}.each do |opt,val|
|
43
44
|
options[opt] = val
|
44
45
|
end
|
@@ -90,7 +91,7 @@ puppet-agent(8) -- #{summary}
|
|
90
91
|
|
91
92
|
SYNOPSIS
|
92
93
|
--------
|
93
|
-
Retrieves the client configuration from the
|
94
|
+
Retrieves the client configuration from the Puppet master and applies it to
|
94
95
|
the local host.
|
95
96
|
|
96
97
|
This service may be run as a daemon, run periodically using cron (or something
|
@@ -164,13 +165,15 @@ when signing certificates).
|
|
164
165
|
only resources not tagged with the specified tags will be applied.
|
165
166
|
Values must be comma-separated.
|
166
167
|
|
168
|
+
|
167
169
|
OPTIONS
|
168
170
|
-------
|
169
171
|
|
170
172
|
Note that any Puppet setting that's valid in the configuration file is also a
|
171
173
|
valid long argument. For example, 'server' is a valid setting, so you can
|
172
|
-
specify '--server <servername>' as an argument. Boolean settings
|
173
|
-
'--setting' and '--no-setting'
|
174
|
+
specify '--server <servername>' as an argument. Boolean settings accept a '--no-'
|
175
|
+
prefix to turn off a behavior, translating into '--setting' and '--no-setting'
|
176
|
+
pairs, such as `--daemonize` and `--no-daemonize`.
|
174
177
|
|
175
178
|
See the configuration file documentation at
|
176
179
|
https://puppet.com/docs/puppet/latest/configuration.html for the
|
@@ -237,15 +240,14 @@ generated by running puppet agent with '--genconfig'.
|
|
237
240
|
* --enable:
|
238
241
|
Enable working on the local system. This removes any lock file,
|
239
242
|
causing 'puppet agent' to start managing the local system again
|
240
|
-
|
241
|
-
not start for another half hour
|
243
|
+
However, it continues to use its normal scheduling, so it might
|
244
|
+
not start for another half hour.
|
242
245
|
|
243
246
|
'puppet agent' exits after executing this.
|
244
247
|
|
245
248
|
* --evaltrace:
|
246
249
|
Logs each resource as it is being evaluated. This allows you to interactively see exactly what is being done. (This is a Puppet setting, and can go in puppet.conf. Note the special 'no-' prefix for boolean settings on the command line.)
|
247
250
|
|
248
|
-
|
249
251
|
* --fingerprint:
|
250
252
|
Display the current certificate or certificate signing request
|
251
253
|
fingerprint and then exit. Use the '--digest' option to change the
|
@@ -278,7 +280,7 @@ generated by running puppet agent with '--genconfig'.
|
|
278
280
|
|
279
281
|
* --noop:
|
280
282
|
Use 'noop' mode where the daemon runs in a no-op or dry-run mode. This
|
281
|
-
is useful for seeing what changes Puppet
|
283
|
+
is useful for seeing what changes Puppet would make without actually
|
282
284
|
executing the changes.
|
283
285
|
(This is a Puppet setting, and can go in puppet.conf. Note the special 'no-'
|
284
286
|
prefix for boolean settings on the command line.)
|
@@ -302,8 +304,6 @@ generated by running puppet agent with '--genconfig'.
|
|
302
304
|
* --trace
|
303
305
|
Prints stack traces on some errors. (This is a Puppet setting, and can go in puppet.conf. Note the special 'no-' prefix for boolean settings on the command line.)
|
304
306
|
|
305
|
-
|
306
|
-
|
307
307
|
* --verbose:
|
308
308
|
Turn on verbose reporting.
|
309
309
|
|
@@ -317,8 +317,7 @@ generated by running puppet agent with '--genconfig'.
|
|
317
317
|
it to sign a certificate request. This is useful for the initial setup
|
318
318
|
of a puppet client. You can turn off waiting for certificates by
|
319
319
|
specifying a time of 0.
|
320
|
-
(This is a Puppet setting, and can go in puppet.conf.
|
321
|
-
prefix for boolean settings on the command line.)
|
320
|
+
(This is a Puppet setting, and can go in puppet.conf.)
|
322
321
|
|
323
322
|
|
324
323
|
EXAMPLE
|
@@ -407,7 +406,7 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
|
|
407
406
|
|
408
407
|
def onetime(daemon)
|
409
408
|
begin
|
410
|
-
exitstatus = daemon.agent.run(:job_id => options[:job_id])
|
409
|
+
exitstatus = daemon.agent.run({:job_id => options[:job_id], :start_time => options[:start_time]})
|
411
410
|
rescue => detail
|
412
411
|
Puppet.log_exception(detail)
|
413
412
|
end
|
@@ -490,9 +489,8 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
|
|
490
489
|
end
|
491
490
|
|
492
491
|
def daemonize_process_when(should_daemonize)
|
493
|
-
daemon = Puppet::Daemon.new(Puppet::Util::Pidlock.new(Puppet[:pidfile]))
|
492
|
+
daemon = Puppet::Daemon.new(@agent, Puppet::Util::Pidlock.new(Puppet[:pidfile]))
|
494
493
|
daemon.argv = @argv
|
495
|
-
daemon.agent = @agent
|
496
494
|
|
497
495
|
daemon.daemonize if should_daemonize
|
498
496
|
|
@@ -67,13 +67,15 @@ class TypeDoc
|
|
67
67
|
@types.keys.sort_by(&:to_s).each do |name|
|
68
68
|
type = @types[name]
|
69
69
|
s = type.doc.gsub(/\s+/, " ")
|
70
|
-
|
71
|
-
if n.nil?
|
70
|
+
if s.empty?
|
72
71
|
s = ".. no documentation .."
|
73
|
-
elsif n > 45
|
74
|
-
s = s[0, 45] + " ..."
|
75
72
|
else
|
76
|
-
|
73
|
+
n = s.index(".") || s.length
|
74
|
+
if n > 45
|
75
|
+
s = s[0, 45] + " ..."
|
76
|
+
else
|
77
|
+
s = s[0, n]
|
78
|
+
end
|
77
79
|
end
|
78
80
|
printf "%-15s - %s\n", name, s
|
79
81
|
end
|
@@ -194,7 +194,7 @@ you can specify '--server
|
|
194
194
|
|
195
195
|
* --resource:
|
196
196
|
Displays a resource state as Puppet code, roughly equivalent to
|
197
|
-
`puppet resource`. Can be
|
197
|
+
`puppet resource`. Can be filtered by title. Requires --target be specified.
|
198
198
|
|
199
199
|
* --target:
|
200
200
|
Target a specific device/certificate in the device.conf. Doing so will perform a
|
@@ -259,7 +259,7 @@ Licensed under the Apache 2.0 License
|
|
259
259
|
end
|
260
260
|
end
|
261
261
|
devices.collect do |devicename,device|
|
262
|
-
pool = Puppet
|
262
|
+
pool = Puppet.runtime[:http].pool
|
263
263
|
Puppet.override(:http_pool => pool) do
|
264
264
|
# TODO when we drop support for ruby < 2.5 we can remove the extra block here
|
265
265
|
begin
|
@@ -69,6 +69,19 @@ running as a user with valid Puppet certificates. Alternatively, you can
|
|
69
69
|
use your local file bucket by specifying '--local', or by specifying
|
70
70
|
'--bucket' with a local path.
|
71
71
|
|
72
|
+
> **Note**: Enabling and using the backup option, and by extension the
|
73
|
+
filebucket resource, requires appropriate planning and management to ensure
|
74
|
+
that sufficient disk space is available for the file backups. Generally, you
|
75
|
+
can implement this using one of the following two options:
|
76
|
+
- Use a `find` command and `crontab` entry to retain only the last X days
|
77
|
+
of file backups. For example:
|
78
|
+
|
79
|
+
```shell
|
80
|
+
find /opt/puppetlabs/server/data/puppetserver/bucket -type f -mtime +45 -atime +45 -print0 | xargs -0 rm
|
81
|
+
```
|
82
|
+
|
83
|
+
- Restrict the directory to a maximum size after which the oldest items are removed.
|
84
|
+
|
72
85
|
|
73
86
|
OPTIONS
|
74
87
|
-------
|
@@ -108,7 +121,7 @@ configuration options can also be generated by running puppet with
|
|
108
121
|
by default.
|
109
122
|
|
110
123
|
* --server_list:
|
111
|
-
A list of comma
|
124
|
+
A list of comma separated servers; only the first entry is used for file storage.
|
112
125
|
This setting takes precidence over `server`.
|
113
126
|
|
114
127
|
* --server:
|
@@ -279,7 +292,7 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
|
|
279
292
|
Puppet::Log.level = :info
|
280
293
|
end
|
281
294
|
|
282
|
-
|
295
|
+
exit(Puppet.settings.print_configs ? 0 : 1) if Puppet.settings.print_configs?
|
283
296
|
|
284
297
|
require 'puppet/file_bucket/dipper'
|
285
298
|
begin
|
@@ -287,19 +300,10 @@ Copyright (c) 2011 Puppet Inc., LLC Licensed under the Apache 2.0 License
|
|
287
300
|
path = options[:bucket] || Puppet[:clientbucketdir]
|
288
301
|
@client = Puppet::FileBucket::Dipper.new(:Path => path)
|
289
302
|
else
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
@client = Puppet::FileBucket::Dipper.new(
|
295
|
-
:Server => server[0],
|
296
|
-
:Port => server[1]
|
297
|
-
)
|
298
|
-
else
|
299
|
-
#TRANSLATORS 'server' is the name of a setting and should not be translated
|
300
|
-
Puppet.debug _("Selected server from the `server` setting: %{server}") % {server: Puppet[:server]}
|
301
|
-
@client = Puppet::FileBucket::Dipper.new(:Server => Puppet[:server])
|
302
|
-
end
|
303
|
+
session = Puppet.lookup(:http_session)
|
304
|
+
api = session.route_to(:puppet)
|
305
|
+
|
306
|
+
@client = Puppet::FileBucket::Dipper.new(Server: api.url.host, Port: api.url.port)
|
303
307
|
end
|
304
308
|
rescue => detail
|
305
309
|
Puppet.log_exception(detail)
|
@@ -28,7 +28,7 @@ OPTIONS
|
|
28
28
|
-------
|
29
29
|
|
30
30
|
* --help:
|
31
|
-
Print this help
|
31
|
+
Print this help message.
|
32
32
|
|
33
33
|
* --verbose:
|
34
34
|
Print extra information.
|
@@ -90,7 +90,7 @@ HELP
|
|
90
90
|
@cert_provider = Puppet::X509::CertProvider.new
|
91
91
|
@ssl_provider = Puppet::SSL::SSLProvider.new
|
92
92
|
@machine = Puppet::SSL::StateMachine.new
|
93
|
-
@session = Puppet.runtime[
|
93
|
+
@session = Puppet.runtime[:http].create_session
|
94
94
|
end
|
95
95
|
|
96
96
|
def setup_logs
|
@@ -182,7 +182,7 @@ HELP
|
|
182
182
|
route = create_route(ssl_context)
|
183
183
|
Puppet.info _("Downloading certificate '%{name}' from %{url}") % { name: Puppet[:certname], url: route.url }
|
184
184
|
|
185
|
-
x509 = route.get_certificate(Puppet[:certname], ssl_context: ssl_context)
|
185
|
+
_, x509 = route.get_certificate(Puppet[:certname], ssl_context: ssl_context)
|
186
186
|
cert = OpenSSL::X509::Certificate.new(x509)
|
187
187
|
Puppet.notice _("Downloaded certificate '%{name}' with fingerprint %{fingerprint}") % { name: Puppet[:certname], fingerprint: fingerprint(cert) }
|
188
188
|
|
@@ -226,7 +226,7 @@ HELP
|
|
226
226
|
begin
|
227
227
|
ssl_context = @machine.ensure_ca_certificates
|
228
228
|
route = create_route(ssl_context)
|
229
|
-
cert = route.get_certificate(certname, ssl_context: ssl_context)
|
229
|
+
_, cert = route.get_certificate(certname, ssl_context: ssl_context)
|
230
230
|
rescue Puppet::HTTP::ResponseError => e
|
231
231
|
if e.response.code.to_i != 404
|
232
232
|
raise Puppet::Error.new(_("Failed to connect to the CA to determine if certificate %{certname} has been cleaned") % { certname: certname }, e)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'puppet/concurrent/synchronized'
|
2
|
+
|
3
|
+
module Puppet
|
4
|
+
module Concurrent
|
5
|
+
|
6
|
+
# A simple lock that at the moment only does any locking on jruby
|
7
|
+
class Lock
|
8
|
+
include Puppet::Concurrent::Synchronized
|
9
|
+
def synchronize
|
10
|
+
yield
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Puppet
|
2
|
+
module Concurrent
|
3
|
+
|
4
|
+
# Including Puppet::Concurrent::Synchronized into a class when running on JRuby
|
5
|
+
# causes all of its instance methods to be synchronized on the instance itself.
|
6
|
+
# When running on MRI it has no effect.
|
7
|
+
if RUBY_PLATFORM == 'java'
|
8
|
+
require 'jruby/synchronized'
|
9
|
+
Synchronized = JRuby::Synchronized
|
10
|
+
else
|
11
|
+
module Synchronized; end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Puppet
|
2
|
+
module Concurrent
|
3
|
+
module ThreadLocalSingleton
|
4
|
+
def singleton
|
5
|
+
key = (name + ".singleton").intern
|
6
|
+
thread = Thread.current
|
7
|
+
unless thread.thread_variable?(key)
|
8
|
+
thread.thread_variable_set(key, new)
|
9
|
+
end
|
10
|
+
thread.thread_variable_get(key)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/puppet/configurer.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# The client for interacting with the puppetmaster config server.
|
2
|
-
require 'sync'
|
3
2
|
require 'timeout'
|
4
|
-
require 'puppet/network/http_pool'
|
5
3
|
require 'puppet/util'
|
6
4
|
require 'securerandom'
|
7
5
|
#require 'puppet/parser/script_compiler'
|
@@ -65,7 +63,7 @@ class Puppet::Configurer
|
|
65
63
|
end
|
66
64
|
|
67
65
|
# Get the remote catalog, yo. Returns nil if no catalog can be found.
|
68
|
-
def retrieve_catalog(query_options)
|
66
|
+
def retrieve_catalog(facts, query_options)
|
69
67
|
query_options ||= {}
|
70
68
|
result = retrieve_catalog_from_cache(query_options) if Puppet[:use_cached_catalog]
|
71
69
|
if result
|
@@ -73,7 +71,7 @@ class Puppet::Configurer
|
|
73
71
|
|
74
72
|
Puppet.info _("Using cached catalog from environment '%{environment}'") % { environment: result.environment }
|
75
73
|
else
|
76
|
-
result = retrieve_new_catalog(query_options)
|
74
|
+
result = retrieve_new_catalog(facts, query_options)
|
77
75
|
|
78
76
|
if !result
|
79
77
|
if !Puppet[:usecacheonfailure]
|
@@ -100,12 +98,11 @@ class Puppet::Configurer
|
|
100
98
|
end
|
101
99
|
|
102
100
|
# Convert a plain resource catalog into our full host catalog.
|
103
|
-
def convert_catalog(result, duration, options = {})
|
101
|
+
def convert_catalog(result, duration, facts, options = {})
|
104
102
|
catalog = nil
|
105
103
|
|
106
104
|
catalog_conversion_time = thinmark do
|
107
105
|
# Will mutate the result and replace all Deferred values with resolved values
|
108
|
-
facts = options[:convert_with_facts]
|
109
106
|
if facts
|
110
107
|
Puppet::Pops::Evaluator::DeferredResolver.resolve_and_replace(facts, result)
|
111
108
|
end
|
@@ -134,6 +131,7 @@ class Puppet::Configurer
|
|
134
131
|
end
|
135
132
|
|
136
133
|
facts_hash = {}
|
134
|
+
facts = nil
|
137
135
|
if Puppet::Resource::Catalog.indirection.terminus_class == :rest
|
138
136
|
# This is a bit complicated. We need the serialized and escaped facts,
|
139
137
|
# and we need to know which format they're encoded in. Thus, we
|
@@ -142,17 +140,17 @@ class Puppet::Configurer
|
|
142
140
|
# facts_for_uploading may set Puppet[:node_name_value] as a side effect
|
143
141
|
facter_time = thinmark do
|
144
142
|
facts = find_facts
|
145
|
-
options[:convert_with_facts] = facts
|
146
143
|
facts_hash = encode_facts(facts) # encode for uploading # was: facts_for_uploading
|
147
144
|
end
|
148
145
|
options[:report].add_times(:fact_generation, facter_time) if options[:report]
|
149
146
|
end
|
150
|
-
facts_hash
|
147
|
+
[facts_hash, facts]
|
151
148
|
end
|
152
149
|
|
153
|
-
def prepare_and_retrieve_catalog(options, query_options)
|
150
|
+
def prepare_and_retrieve_catalog(cached_catalog, facts, options, query_options)
|
154
151
|
# set report host name now that we have the fact
|
155
152
|
options[:report].host = Puppet[:node_name_value]
|
153
|
+
|
156
154
|
query_options[:transaction_uuid] = @transaction_uuid
|
157
155
|
query_options[:job_id] = @job_id
|
158
156
|
query_options[:static_catalog] = @static_catalog
|
@@ -162,26 +160,19 @@ class Puppet::Configurer
|
|
162
160
|
query_options[:checksum_type] = @checksum_type.join('.')
|
163
161
|
|
164
162
|
# apply passes in ral catalog
|
165
|
-
catalog = options
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
Puppet.err _("Could not retrieve catalog; skipping run")
|
173
|
-
nil
|
163
|
+
catalog = cached_catalog || options[:catalog]
|
164
|
+
unless catalog
|
165
|
+
# retrieve_catalog returns resource catalog
|
166
|
+
catalog = retrieve_catalog(facts, query_options)
|
167
|
+
Puppet.err _("Could not retrieve catalog; skipping run") unless catalog
|
168
|
+
end
|
169
|
+
catalog
|
174
170
|
end
|
175
171
|
|
176
172
|
def prepare_and_retrieve_catalog_from_cache(options = {})
|
177
173
|
result = retrieve_catalog_from_cache({:transaction_uuid => @transaction_uuid, :static_catalog => @static_catalog})
|
178
|
-
if result
|
179
|
-
|
180
|
-
# get facts now so that the convert_catalog method can resolve deferred values
|
181
|
-
get_facts(options)
|
182
|
-
return convert_catalog(result, @duration, options)
|
183
|
-
end
|
184
|
-
nil
|
174
|
+
Puppet.info _("Using cached catalog from environment '%{catalog_env}'") % { catalog_env: result.environment } if result
|
175
|
+
result
|
185
176
|
end
|
186
177
|
|
187
178
|
# Apply supplied catalog and return associated application report
|
@@ -203,12 +194,12 @@ class Puppet::Configurer
|
|
203
194
|
# This just passes any options on to the catalog,
|
204
195
|
# which accepts :tags and :ignoreschedules.
|
205
196
|
def run(options = {})
|
206
|
-
pool = Puppet
|
197
|
+
pool = Puppet.runtime[:http].pool
|
207
198
|
# We create the report pre-populated with default settings for
|
208
199
|
# environment and transaction_uuid very early, this is to ensure
|
209
200
|
# they are sent regardless of any catalog compilation failures or
|
210
201
|
# exceptions.
|
211
|
-
options[:report] ||= Puppet::Transaction::Report.new(nil, @environment, @transaction_uuid, @job_id)
|
202
|
+
options[:report] ||= Puppet::Transaction::Report.new(nil, @environment, @transaction_uuid, @job_id, options[:start_time] || Time.now)
|
212
203
|
report = options[:report]
|
213
204
|
init_storage
|
214
205
|
|
@@ -217,13 +208,9 @@ class Puppet::Configurer
|
|
217
208
|
completed = nil
|
218
209
|
begin
|
219
210
|
Puppet.override(:http_pool => pool) do
|
220
|
-
|
221
211
|
# Skip failover logic if the server_list setting is empty
|
222
|
-
|
223
|
-
|
224
|
-
else
|
225
|
-
do_failover = true
|
226
|
-
end
|
212
|
+
do_failover = Puppet.settings[:server_list] && !Puppet.settings[:server_list].empty?
|
213
|
+
|
227
214
|
# When we are passed a catalog, that means we're in apply
|
228
215
|
# mode. We shouldn't try to do any failover in that case.
|
229
216
|
if options[:catalog].nil? && do_failover
|
@@ -231,8 +218,6 @@ class Puppet::Configurer
|
|
231
218
|
if server.nil?
|
232
219
|
raise Puppet::Error, _("Could not select a functional puppet master from server_list: '%{server_list}'") % { server_list: Puppet.settings.value(:server_list, Puppet[:environment].to_sym, true) }
|
233
220
|
else
|
234
|
-
#TRANSLATORS 'server_list' is the name of a setting and should not be translated
|
235
|
-
Puppet.debug _("Selected puppet server from the `server_list` setting: %{server}:%{port}") % { server: server, port: port }
|
236
221
|
report.master_used = "#{server}:#{port}"
|
237
222
|
end
|
238
223
|
Puppet.override(server: server, serverport: port) do
|
@@ -250,23 +235,26 @@ class Puppet::Configurer
|
|
250
235
|
end
|
251
236
|
|
252
237
|
def run_internal(options)
|
253
|
-
start = Time.now
|
254
238
|
report = options[:report]
|
255
239
|
|
240
|
+
if options[:start_time]
|
241
|
+
startup_time = Time.now - options[:start_time]
|
242
|
+
report.add_times(:startup_time, startup_time)
|
243
|
+
end
|
244
|
+
|
256
245
|
# If a cached catalog is explicitly requested, attempt to retrieve it. Skip the node request,
|
257
246
|
# don't pluginsync and switch to the catalog's environment if we successfully retrieve it.
|
258
247
|
if Puppet[:use_cached_catalog]
|
259
248
|
Puppet::GettextConfig.reset_text_domain('agent')
|
260
249
|
Puppet::ModuleTranslations.load_from_vardir(Puppet[:vardir])
|
261
250
|
|
262
|
-
|
263
|
-
if
|
264
|
-
options[:catalog] = catalog
|
251
|
+
cached_catalog = prepare_and_retrieve_catalog_from_cache(options)
|
252
|
+
if cached_catalog
|
265
253
|
@cached_catalog_status = 'explicitly_requested'
|
266
254
|
|
267
|
-
if @environment !=
|
268
|
-
Puppet.notice _("Local environment: '%{local_env}' doesn't match the environment of the cached catalog '%{catalog_env}', switching agent to '%{catalog_env}'.") % { local_env: @environment, catalog_env:
|
269
|
-
@environment =
|
255
|
+
if @environment != cached_catalog.environment && !Puppet[:strict_environment_mode]
|
256
|
+
Puppet.notice _("Local environment: '%{local_env}' doesn't match the environment of the cached catalog '%{catalog_env}', switching agent to '%{catalog_env}'.") % { local_env: @environment, catalog_env: cached_catalog.environment }
|
257
|
+
@environment = cached_catalog.environment
|
270
258
|
end
|
271
259
|
|
272
260
|
report.environment = @environment
|
@@ -281,13 +269,13 @@ class Puppet::Configurer
|
|
281
269
|
|
282
270
|
begin
|
283
271
|
unless Puppet[:node_name_fact].empty?
|
284
|
-
query_options = get_facts(options)
|
272
|
+
query_options, facts = get_facts(options)
|
285
273
|
end
|
286
274
|
|
287
275
|
configured_environment = Puppet[:environment] if Puppet.settings.set_by_config?(:environment)
|
288
276
|
|
289
277
|
# We only need to find out the environment to run in if we don't already have a catalog
|
290
|
-
unless (options[:catalog] || Puppet[:strict_environment_mode])
|
278
|
+
unless (cached_catalog || options[:catalog] || Puppet[:strict_environment_mode])
|
291
279
|
begin
|
292
280
|
node = nil
|
293
281
|
node_retr_time = thinmark do
|
@@ -314,6 +302,7 @@ class Puppet::Configurer
|
|
314
302
|
@environment = node.environment.to_s
|
315
303
|
report.environment = @environment
|
316
304
|
query_options = nil
|
305
|
+
facts = nil
|
317
306
|
else
|
318
307
|
Puppet.info _("Using configured environment '%{env}'") % { env: @environment }
|
319
308
|
end
|
@@ -338,11 +327,11 @@ class Puppet::Configurer
|
|
338
327
|
:loaders => Puppet::Pops::Loaders.new(local_node_environment, true)
|
339
328
|
}, "Local node environment for configurer transaction")
|
340
329
|
|
341
|
-
query_options = get_facts(options) unless query_options
|
330
|
+
query_options, facts = get_facts(options) unless query_options
|
342
331
|
query_options[:configured_environment] = configured_environment
|
343
332
|
options[:convert_for_node] = node
|
344
333
|
|
345
|
-
catalog = prepare_and_retrieve_catalog(options, query_options)
|
334
|
+
catalog = prepare_and_retrieve_catalog(cached_catalog, facts, options, query_options)
|
346
335
|
unless catalog
|
347
336
|
return nil
|
348
337
|
end
|
@@ -365,20 +354,41 @@ class Puppet::Configurer
|
|
365
354
|
@environment = catalog.environment
|
366
355
|
report.environment = @environment
|
367
356
|
|
368
|
-
query_options = get_facts(options)
|
357
|
+
query_options, facts = get_facts(options)
|
369
358
|
query_options[:configured_environment] = configured_environment
|
370
359
|
|
371
|
-
|
360
|
+
# if we get here, ignore the cached catalog
|
361
|
+
catalog = prepare_and_retrieve_catalog(nil, facts, options, query_options)
|
372
362
|
return nil unless catalog
|
373
363
|
tries += 1
|
374
364
|
end
|
375
365
|
|
366
|
+
# now that environment has converged, convert resource catalog into ral catalog
|
367
|
+
# unless we were given a RAL catalog
|
368
|
+
if !cached_catalog && options[:catalog]
|
369
|
+
ral_catalog = options[:catalog]
|
370
|
+
else
|
371
|
+
# REMIND @duration is the time spent loading the last catalog, and doesn't
|
372
|
+
# account for things like we failed to download and fell back to the cache
|
373
|
+
ral_catalog = convert_catalog(catalog, @duration, facts, options)
|
374
|
+
|
375
|
+
# If not noop, commit the cached resource catalog (not ral catalog). Ideally
|
376
|
+
# we'd just copy the downloaded response body, instead of serializing the
|
377
|
+
# in-memory catalog, but that's hard due to the indirector.
|
378
|
+
indirection = Puppet::Resource::Catalog.indirection
|
379
|
+
if !Puppet[:noop] && indirection.cache?
|
380
|
+
request = indirection.request(:save, nil, catalog, environment: Puppet::Node::Environment.remote(catalog.environment))
|
381
|
+
Puppet.info("Caching catalog for #{request.key}")
|
382
|
+
indirection.cache.save(request)
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
376
386
|
execute_prerun_command or return nil
|
377
387
|
|
378
|
-
options[:report].code_id =
|
379
|
-
options[:report].catalog_uuid =
|
388
|
+
options[:report].code_id = ral_catalog.code_id
|
389
|
+
options[:report].catalog_uuid = ral_catalog.catalog_uuid
|
380
390
|
options[:report].cached_catalog_status = @cached_catalog_status
|
381
|
-
apply_catalog(
|
391
|
+
apply_catalog(ral_catalog, options)
|
382
392
|
true
|
383
393
|
rescue => detail
|
384
394
|
Puppet.log_exception(detail, _("Failed to apply catalog: %{detail}") % { detail: detail })
|
@@ -396,7 +406,7 @@ class Puppet::Configurer
|
|
396
406
|
end
|
397
407
|
|
398
408
|
report.cached_catalog_status ||= @cached_catalog_status
|
399
|
-
report.add_times(:total, Time.now -
|
409
|
+
report.add_times(:total, Time.now - report.time)
|
400
410
|
report.finalize_report
|
401
411
|
Puppet::Util::Log.close(report)
|
402
412
|
send_report(report)
|
@@ -405,21 +415,16 @@ class Puppet::Configurer
|
|
405
415
|
private :run_internal
|
406
416
|
|
407
417
|
def find_functional_server
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
{ host: host, port: port, code: response.code, reason: response.message })
|
419
|
-
rescue => detail
|
420
|
-
#TRANSLATORS 'server_list' is the name of a setting and should not be translated
|
421
|
-
Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}
|
422
|
-
end
|
418
|
+
begin
|
419
|
+
session = Puppet.lookup(:http_session)
|
420
|
+
service = session.route_to(:puppet)
|
421
|
+
return [service.url.host, service.url.port]
|
422
|
+
rescue Puppet::HTTP::ResponseError => e
|
423
|
+
Puppet.debug(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") %
|
424
|
+
{ host: e.response.url.host, port: e.response.url.port, code: e.response.code, reason: e.response.reason })
|
425
|
+
rescue => detail
|
426
|
+
#TRANSLATORS 'server_list' is the name of a setting and should not be translated
|
427
|
+
Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}
|
423
428
|
end
|
424
429
|
[nil, nil]
|
425
430
|
end
|
@@ -454,21 +459,17 @@ class Puppet::Configurer
|
|
454
459
|
::Facter.clear
|
455
460
|
facts = find_facts
|
456
461
|
|
457
|
-
|
458
|
-
|
459
|
-
|
462
|
+
client = Puppet.runtime[:http]
|
463
|
+
session = client.create_session
|
464
|
+
puppet = session.route_to(:puppet)
|
460
465
|
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
server: server})
|
466
|
+
Puppet.info(_("Uploading facts for %{node} to %{server}") % {
|
467
|
+
node: facts.name,
|
468
|
+
server: puppet.url.hostname})
|
465
469
|
|
466
|
-
|
470
|
+
puppet.put_facts(facts.name, facts: facts, environment: Puppet.lookup(:current_environment).name.to_s)
|
467
471
|
|
468
|
-
|
469
|
-
ensure
|
470
|
-
Puppet::Node::Facts.indirection.terminus_class = saved_fact_terminus
|
471
|
-
end
|
472
|
+
return true
|
472
473
|
rescue => detail
|
473
474
|
Puppet.log_exception(detail, _("Failed to submit facts: %{detail}") %
|
474
475
|
{ detail: detail })
|
@@ -507,17 +508,18 @@ class Puppet::Configurer
|
|
507
508
|
return nil
|
508
509
|
end
|
509
510
|
|
510
|
-
def retrieve_new_catalog(query_options)
|
511
|
+
def retrieve_new_catalog(facts, query_options)
|
511
512
|
result = nil
|
512
513
|
@duration = thinmark do
|
513
514
|
result = Puppet::Resource::Catalog.indirection.find(
|
514
515
|
Puppet[:node_name_value],
|
515
516
|
query_options.merge(
|
516
517
|
:ignore_cache => true,
|
517
|
-
#
|
518
|
-
:ignore_cache_save =>
|
518
|
+
# don't update cache until after environment converges
|
519
|
+
:ignore_cache_save => true,
|
519
520
|
:environment => Puppet::Node::Environment.remote(@environment),
|
520
|
-
:fail_on_404 => true
|
521
|
+
:fail_on_404 => true,
|
522
|
+
:facts_for_catalog => facts
|
521
523
|
)
|
522
524
|
)
|
523
525
|
end
|