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
@@ -2,7 +2,7 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
|
|
2
2
|
desc "Support for SuSE `zypper` package manager. Found in SLES10sp2+ and SLES11.
|
3
3
|
|
4
4
|
This provider supports the `install_options` attribute, which allows command-line flags to be passed to zypper.
|
5
|
-
These options should be specified as an array where each element is either a
|
5
|
+
These options should be specified as an array where each element is either a
|
6
6
|
string or a hash."
|
7
7
|
|
8
8
|
has_feature :versionable, :install_options, :virtual_packages
|
@@ -50,6 +50,41 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
|
|
50
50
|
execute(cmd, { :failonfail => false, :combine => true})
|
51
51
|
end
|
52
52
|
|
53
|
+
def best_version(should)
|
54
|
+
if should.is_a?(String)
|
55
|
+
begin
|
56
|
+
should_range = Puppet::Util::Package::Version::Range.parse(should, Puppet::Util::Package::Version::Rpm)
|
57
|
+
rescue Puppet::Util::Package::Version::Range::ValidationFailure, Puppet::Util::Package::Version::Rpm::ValidationFailure
|
58
|
+
Puppet.debug("Cannot parse #{should} as a RPM version range")
|
59
|
+
return should
|
60
|
+
end
|
61
|
+
|
62
|
+
if should_range.is_a?(Puppet::Util::Package::Version::Range::Eq)
|
63
|
+
return should
|
64
|
+
end
|
65
|
+
|
66
|
+
sorted_versions = SortedSet.new
|
67
|
+
|
68
|
+
output = zypper('search', '--match-exact', '--type', 'package', '--uninstalled-only', '-s', @resource[:name])
|
69
|
+
output.lines.each do |line|
|
70
|
+
pkg_ver = line.split(/\s*\|\s*/)
|
71
|
+
next unless pkg_ver[1] == @resource[:name]
|
72
|
+
begin
|
73
|
+
rpm_version = Puppet::Util::Package::Version::Rpm.parse(pkg_ver[3])
|
74
|
+
|
75
|
+
sorted_versions << rpm_version if should_range.include?(rpm_version)
|
76
|
+
rescue Puppet::Util::Package::Version::Rpm::ValidationFailure
|
77
|
+
Puppet.debug("Cannot parse #{pkg_ver[3]} as a RPM version")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
return sorted_versions.entries.last if sorted_versions.any?
|
82
|
+
|
83
|
+
Puppet.debug("No available version for package #{@resource[:name]} is included in range #{should_range}")
|
84
|
+
should
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
53
88
|
# Install a package using 'zypper'.
|
54
89
|
def install
|
55
90
|
should = @resource.should(:ensure)
|
@@ -62,6 +97,7 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
|
|
62
97
|
should = nil
|
63
98
|
else
|
64
99
|
# Add the package version
|
100
|
+
should = best_version(should)
|
65
101
|
wanted = "#{wanted}-#{should}"
|
66
102
|
end
|
67
103
|
|
@@ -89,6 +125,7 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
|
|
89
125
|
options = []
|
90
126
|
options << quiet
|
91
127
|
options << '--no-gpg-check' unless inst_opts.delete('--no-gpg-check').nil?
|
128
|
+
options << '--no-gpg-checks' unless inst_opts.delete('--no-gpg-checks').nil?
|
92
129
|
options << :install
|
93
130
|
|
94
131
|
#zypper 0.6.13 (OpenSuSE 10.2) does not support auto agree with licenses
|
@@ -142,4 +179,25 @@ Puppet::Type.type(:package).provide :zypper, :parent => :rpm, :source => :rpm do
|
|
142
179
|
end
|
143
180
|
|
144
181
|
end
|
182
|
+
|
183
|
+
def insync?(is)
|
184
|
+
return false if [:purged, :absent].include?(is)
|
185
|
+
|
186
|
+
should = @resource[:ensure]
|
187
|
+
if should.is_a?(String)
|
188
|
+
begin
|
189
|
+
should_version = Puppet::Util::Package::Version::Range.parse(should, Puppet::Util::Package::Version::Rpm)
|
190
|
+
rescue Puppet::Util::Package::Version::Range::ValidationFailure, Puppet::Util::Package::Version::Rpm::ValidationFailure
|
191
|
+
Puppet.debug("Cannot parse #{should} as a RPM version range")
|
192
|
+
return super
|
193
|
+
end
|
194
|
+
|
195
|
+
begin
|
196
|
+
is_version = Puppet::Util::Package::Version::Rpm.parse(is)
|
197
|
+
should_version.include?(is_version)
|
198
|
+
rescue Puppet::Util::Package::Version::Rpm::ValidationFailure
|
199
|
+
Puppet.debug("Cannot parse #{is} as a RPM version")
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
145
203
|
end
|
@@ -25,24 +25,25 @@ require 'puppet/provider/package'
|
|
25
25
|
class Puppet::Provider::Package::Targetable < Puppet::Provider::Package
|
26
26
|
# Prefetch our package list, yo.
|
27
27
|
def self.prefetch(packages)
|
28
|
-
catalog_packages = packages.first
|
28
|
+
catalog_packages = packages.values.first.catalog.resources.select{ |p| p.provider.class == self }
|
29
29
|
package_commands = catalog_packages.map { |catalog_package| catalog_package::original_parameters[:command] }.uniq
|
30
30
|
package_commands.each do |command|
|
31
31
|
instances(command).each do |instance|
|
32
32
|
catalog_packages.each do |catalog_package|
|
33
|
-
if catalog_package[:name] == instance.name && catalog_package
|
33
|
+
if catalog_package[:name] == instance.name && catalog_package.original_parameters[:command] == command
|
34
34
|
catalog_package.provider = instance
|
35
|
-
self.debug "Prefetched instance: %{name} via command: %{
|
35
|
+
self.debug "Prefetched instance: %{name} via command: %{cmd}" % { name: instance.name, cmd: (command || :default) }
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
40
|
+
package_commands
|
40
41
|
end
|
41
42
|
|
42
43
|
# Returns the resource command or provider command.
|
43
44
|
|
44
45
|
def resource_or_provider_command
|
45
|
-
resource
|
46
|
+
resource.original_parameters[:command] || self.class.provider_command
|
46
47
|
end
|
47
48
|
|
48
49
|
# Targetable providers use has_command/is_optional to defer validation of provider suitability.
|
@@ -25,12 +25,13 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
25
25
|
notdefaultfor :operatingsystem => :LinuxMint, :operatingsystemmajrelease => ["10", "11", "12", "13", "14", "15", "16", "17"] # These are using upstart
|
26
26
|
defaultfor :operatingsystem => :ubuntu
|
27
27
|
notdefaultfor :operatingsystem => :ubuntu, :operatingsystemmajrelease => ["10.04", "12.04", "14.04", "14.10"] # These are using upstart
|
28
|
-
defaultfor :operatingsystem => :cumuluslinux, :operatingsystemmajrelease => ["3"]
|
28
|
+
defaultfor :operatingsystem => :cumuluslinux, :operatingsystemmajrelease => ["3", "4"]
|
29
29
|
|
30
30
|
def self.instances
|
31
31
|
i = []
|
32
32
|
output = systemctl('list-unit-files', '--type', 'service', '--full', '--all', '--no-pager')
|
33
|
-
output.scan(/^(\S+)\s+(disabled|enabled|masked|indirect)\s*$/i).each do |m|
|
33
|
+
output.scan(/^(\S+)\s+(disabled|enabled|masked|indirect|bad|static)\s*$/i).each do |m|
|
34
|
+
Puppet.debug("#{m[0]} marked as bad by `systemctl`. It is recommended to be further checked.") if m[1] == "bad"
|
34
35
|
i << new(:name => m[0])
|
35
36
|
end
|
36
37
|
return i
|
@@ -38,6 +39,22 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
38
39
|
return []
|
39
40
|
end
|
40
41
|
|
42
|
+
# Static services cannot be enabled or disabled manually. Indirect services
|
43
|
+
# should not be enabled or disabled due to limitations in systemd (see
|
44
|
+
# https://github.com/systemd/systemd/issues/6681).
|
45
|
+
def enabled_insync?(current)
|
46
|
+
case cached_enabled?[:output]
|
47
|
+
when 'static'
|
48
|
+
Puppet.debug("Unable to enable or disable static service #{@resource[:name]}")
|
49
|
+
return true
|
50
|
+
when 'indirect'
|
51
|
+
Puppet.debug("Service #{@resource[:name]} is in 'indirect' state and cannot be enabled/disabled")
|
52
|
+
return true
|
53
|
+
else
|
54
|
+
current == @resource[:enable]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
41
58
|
# This helper ensures that the enable state cache is always reset
|
42
59
|
# after a systemctl enable operation. A particular service state is not guaranteed
|
43
60
|
# after such an operation, so the cache must be emptied to prevent inconsistencies
|
@@ -69,12 +86,13 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
69
86
|
def cached_enabled?
|
70
87
|
return @cached_enabled if @cached_enabled
|
71
88
|
cmd = [command(:systemctl), 'is-enabled', '--', @resource[:name]]
|
72
|
-
|
89
|
+
result = execute(cmd, :failonfail => false)
|
90
|
+
@cached_enabled = { output: result.chomp, exitcode: result.exitstatus }
|
73
91
|
end
|
74
92
|
|
75
93
|
def enabled?
|
76
|
-
output = cached_enabled?
|
77
|
-
code =
|
94
|
+
output = cached_enabled?[:output]
|
95
|
+
code = cached_enabled?[:exitcode]
|
78
96
|
|
79
97
|
# The masked state is equivalent to the disabled state in terms of
|
80
98
|
# comparison so we only care to check if it is masked if we want to keep
|
@@ -32,6 +32,7 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do
|
|
32
32
|
has_features :manages_aix_lam
|
33
33
|
has_features :manages_homedir, :manages_passwords, :manages_shell
|
34
34
|
has_features :manages_expiry, :manages_password_age
|
35
|
+
has_features :manages_local_users_and_groups
|
35
36
|
|
36
37
|
class << self
|
37
38
|
def group_provider
|
@@ -387,7 +387,7 @@ Puppet::Type.type(:user).provide :directoryservice do
|
|
387
387
|
if (Puppet::Util::Package.versioncmp(self.class.get_os_version, '10.7') > 0)
|
388
388
|
assert_full_pbkdf2_password
|
389
389
|
|
390
|
-
sleep
|
390
|
+
sleep 3
|
391
391
|
flush_dscl_cache
|
392
392
|
users_plist = get_users_plist(@resource.name)
|
393
393
|
shadow_hash_data = get_shadow_hash_data(users_plist)
|
@@ -404,7 +404,7 @@ Puppet::Type.type(:user).provide :directoryservice do
|
|
404
404
|
if (Puppet::Util::Package.versioncmp(self.class.get_os_version, '10.7') > 0)
|
405
405
|
assert_full_pbkdf2_password
|
406
406
|
|
407
|
-
sleep
|
407
|
+
sleep 3
|
408
408
|
flush_dscl_cache
|
409
409
|
users_plist = get_users_plist(@resource.name)
|
410
410
|
shadow_hash_data = get_shadow_hash_data(users_plist)
|
@@ -435,8 +435,8 @@ Puppet::Type.type(:user).provide :directoryservice do
|
|
435
435
|
['home', 'uid', 'gid', 'comment', 'shell'].each do |setter_method|
|
436
436
|
define_method("#{setter_method}=") do |value|
|
437
437
|
if @property_hash[setter_method.intern]
|
438
|
-
if self.class.get_os_version
|
439
|
-
raise Puppet::Error, "OS X version
|
438
|
+
if self.class.get_os_version.split('.').last.to_i >= 14 && %w(home uid).include?(setter_method)
|
439
|
+
raise Puppet::Error, "OS X version #{self.class.get_os_version} does not allow changing #{setter_method} using puppet"
|
440
440
|
end
|
441
441
|
begin
|
442
442
|
dscl '.', '-change', "/Users/#{resource.name}", self.class.ns_to_ds_attribute_map[setter_method.intern], @property_hash[setter_method.intern], value
|
@@ -572,7 +572,32 @@ Puppet::Type.type(:user).provide :directoryservice do
|
|
572
572
|
else
|
573
573
|
users_plist['ShadowHashData'] = [binary_plist]
|
574
574
|
end
|
575
|
-
|
575
|
+
if Puppet::Util::Package.versioncmp(self.class.get_os_version, '10.15') < 0
|
576
|
+
write_users_plist_to_disk(users_plist)
|
577
|
+
else
|
578
|
+
write_and_import_shadow_hash_data(users_plist['ShadowHashData'].first)
|
579
|
+
end
|
580
|
+
end
|
581
|
+
|
582
|
+
# This method writes the ShadowHashData plist in a temporary file,
|
583
|
+
# then imports it using dsimport. macOS versions 10.15 and newer do
|
584
|
+
# not support directly managing binary plists, so we have to use an
|
585
|
+
# intermediary.
|
586
|
+
# dsimport is an archaic utilitary with hard-to-find documentation
|
587
|
+
#
|
588
|
+
# See http://web.archive.org/web/20090106120111/http://support.apple.com/kb/TA21305?viewlocale=en_US
|
589
|
+
# for information regarding the dsimport syntax
|
590
|
+
def write_and_import_shadow_hash_data(data_plist)
|
591
|
+
Tempfile.create("dsimport_#{@resource.name}", :encoding => Encoding::ASCII) do |dsimport_file|
|
592
|
+
dsimport_file.write <<-DSIMPORT
|
593
|
+
0x0A 0x5C 0x3A 0x2C dsRecTypeStandard:Users 2 dsAttrTypeStandard:RecordName base64:dsAttrTypeNative:ShadowHashData
|
594
|
+
#{@resource.name}:#{Base64.strict_encode64(data_plist)}
|
595
|
+
DSIMPORT
|
596
|
+
dsimport_file.flush
|
597
|
+
# Delete the user's existing ShadowHashData, since dsimport appends, not replaces
|
598
|
+
dscl('.', 'delete', "/Users/#{@resource.name}", 'ShadowHashData')
|
599
|
+
dsimport(dsimport_file.path, '/Local/Default', 'M')
|
600
|
+
end
|
576
601
|
end
|
577
602
|
|
578
603
|
# This method accepts an argument of a hex password hash, and base64
|
@@ -29,7 +29,7 @@ Puppet::Type.type(:user).provide :hpuxuseradd, :parent => :useradd do
|
|
29
29
|
|
30
30
|
def modifycmd(param,value)
|
31
31
|
cmd = super(param, value)
|
32
|
-
cmd
|
32
|
+
cmd.insert(1,"-F")
|
33
33
|
if trusted then
|
34
34
|
# Append an additional command to reset the password age to 0
|
35
35
|
# until a workaround with expiry module can be found for trusted
|
@@ -21,7 +21,11 @@ Puppet::Type.type(:user).provide :useradd, :parent => Puppet::Provider::NameServ
|
|
21
21
|
options :expiry, :method => :sp_expire,
|
22
22
|
:munge => proc { |value|
|
23
23
|
if value == :absent
|
24
|
-
''
|
24
|
+
if Facter.value(:operatingsystem)=='SLES' && Facter.value(:operatingsystemmajrelease) == "11"
|
25
|
+
-1
|
26
|
+
else
|
27
|
+
''
|
28
|
+
end
|
25
29
|
else
|
26
30
|
case Facter.value(:operatingsystem)
|
27
31
|
when 'Solaris'
|
@@ -43,7 +47,7 @@ Puppet::Type.type(:user).provide :useradd, :parent => Puppet::Provider::NameServ
|
|
43
47
|
}
|
44
48
|
|
45
49
|
optional_commands :localadd => "luseradd", :localdelete => "luserdel", :localmodify => "lusermod", :localpassword => "lchage"
|
46
|
-
has_feature :
|
50
|
+
has_feature :manages_local_users_and_groups if Puppet.features.libuser?
|
47
51
|
|
48
52
|
def exists?
|
49
53
|
return !!localuid if @resource.forcelocal?
|
@@ -64,12 +68,11 @@ Puppet::Type.type(:user).provide :useradd, :parent => Puppet::Provider::NameServ
|
|
64
68
|
passwd_file = "/etc/passwd"
|
65
69
|
passwd_keys = [:account, :password, :uid, :gid, :gecos, :directory, :shell]
|
66
70
|
index = passwd_keys.index(key)
|
67
|
-
File.
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end
|
71
|
+
@passwd_content ||= File.read(passwd_file)
|
72
|
+
@passwd_content.each_line do |line|
|
73
|
+
user = line.split(":")
|
74
|
+
if user[index] == value
|
75
|
+
return Hash[passwd_keys.zip(user)]
|
73
76
|
end
|
74
77
|
end
|
75
78
|
false
|
data/lib/puppet/reports/http.rb
CHANGED
@@ -20,19 +20,23 @@ Puppet::Reports.register_report(:http) do
|
|
20
20
|
# (Puppet::Network::HTTP) but is used by Puppet Server's http client
|
21
21
|
# (Puppet::Server::HttpClient) to track metrics on the request made to the
|
22
22
|
# `reporturl` to store a report.
|
23
|
-
options = {
|
23
|
+
options = {
|
24
|
+
:metric_id => [:puppet, :report, :http],
|
25
|
+
:include_system_store => Puppet[:report_include_system_store],
|
26
|
+
}
|
27
|
+
|
24
28
|
if url.user && url.password
|
25
29
|
options[:basic_auth] = {
|
26
|
-
:
|
27
|
-
:
|
30
|
+
user: url.user,
|
31
|
+
password: url.password
|
28
32
|
}
|
29
33
|
end
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
34
|
+
|
35
|
+
client = Puppet.runtime[:http]
|
36
|
+
client.post(url, self.to_yaml, headers: headers, options: options) do |response|
|
37
|
+
unless response.success?
|
38
|
+
Puppet.err _("Unable to submit report to %{url} [%{code}] %{message}") % { url: Puppet[:reporturl].to_s, code: response.code, message: response.reason }
|
39
|
+
end
|
36
40
|
end
|
37
41
|
end
|
38
42
|
end
|
data/lib/puppet/reports/store.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'puppet/parser/type_loader'
|
2
2
|
require 'puppet/util/file_watcher'
|
3
3
|
require 'puppet/util/warnings'
|
4
|
+
require 'puppet/concurrent/lock'
|
4
5
|
|
5
6
|
# @api private
|
6
7
|
class Puppet::Resource::TypeCollection
|
@@ -28,6 +29,7 @@ class Puppet::Resource::TypeCollection
|
|
28
29
|
@nodes = {}
|
29
30
|
@notfound = {}
|
30
31
|
@sites = []
|
32
|
+
@lock = Puppet::Concurrent::Lock.new
|
31
33
|
|
32
34
|
# So we can keep a list and match the first-defined regex
|
33
35
|
@node_list = []
|
@@ -225,25 +227,27 @@ class Puppet::Resource::TypeCollection
|
|
225
227
|
# Resolve namespaces and find the given object. Autoload it if
|
226
228
|
# necessary.
|
227
229
|
def find_or_load(name, type)
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
230
|
+
@lock.synchronize do
|
231
|
+
# Name is always absolute, but may start with :: which must be removed
|
232
|
+
fqname = (name[0,2] == COLON_COLON ? name[2..-1] : name)
|
233
|
+
|
234
|
+
result = send(type, fqname)
|
235
|
+
unless result
|
236
|
+
if @notfound[ fqname ] && Puppet[ :ignoremissingtypes ]
|
237
|
+
# do not try to autoload if we already tried and it wasn't conclusive
|
238
|
+
# as this is a time consuming operation. Warn the user.
|
239
|
+
# Check first if debugging is on since the call to debug_once is expensive
|
240
|
+
if Puppet[:debug]
|
241
|
+
debug_once _("Not attempting to load %{type} %{fqname} as this object was missing during a prior compilation") % { type: type, fqname: fqname }
|
242
|
+
end
|
243
|
+
else
|
244
|
+
fqname = munge_name(fqname)
|
245
|
+
result = loader.try_load_fqname(type, fqname)
|
246
|
+
@notfound[ fqname ] = result.nil?
|
239
247
|
end
|
240
|
-
else
|
241
|
-
fqname = munge_name(fqname)
|
242
|
-
result = loader.try_load_fqname(type, fqname)
|
243
|
-
@notfound[ fqname ] = result.nil?
|
244
248
|
end
|
249
|
+
result
|
245
250
|
end
|
246
|
-
result
|
247
251
|
end
|
248
252
|
|
249
253
|
def munge_name(name)
|
data/lib/puppet/runtime.rb
CHANGED
@@ -1,13 +1,32 @@
|
|
1
1
|
require 'puppet/http'
|
2
|
+
require 'singleton'
|
2
3
|
|
4
|
+
# Provides access to runtime implementations.
|
5
|
+
#
|
6
|
+
# @api private
|
3
7
|
class Puppet::Runtime
|
4
8
|
include Singleton
|
5
9
|
|
6
10
|
def initialize
|
7
|
-
@runtime_services = {
|
11
|
+
@runtime_services = {
|
12
|
+
http: proc do
|
13
|
+
klass = Puppet::Network::HttpPool.http_client_class
|
14
|
+
if klass == Puppet::Network::HTTP::Connection ||
|
15
|
+
klass == Puppet::Network::HTTP::ConnectionAdapter
|
16
|
+
Puppet::HTTP::Client.new
|
17
|
+
else
|
18
|
+
Puppet::HTTP::ExternalClient.new(klass)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
}
|
8
22
|
end
|
9
23
|
private :initialize
|
10
24
|
|
25
|
+
# Get a runtime implementation.
|
26
|
+
#
|
27
|
+
# @param name [Symbol] the name of the implementation
|
28
|
+
# @return [Object] the runtime implementation
|
29
|
+
# @api private
|
11
30
|
def [](name)
|
12
31
|
service = @runtime_services[name]
|
13
32
|
raise ArgumentError, "Unknown service #{name}" unless service
|
@@ -19,7 +38,19 @@ class Puppet::Runtime
|
|
19
38
|
end
|
20
39
|
end
|
21
40
|
|
41
|
+
# Register a runtime implementation.
|
42
|
+
#
|
43
|
+
# @param name [Symbol] the name of the implementation
|
44
|
+
# @param impl [Object] the runtime implementation
|
45
|
+
# @api private
|
22
46
|
def []=(name, impl)
|
23
47
|
@runtime_services[name] = impl
|
24
48
|
end
|
49
|
+
|
50
|
+
# Clears all implementations. This is used for testing.
|
51
|
+
#
|
52
|
+
# @api private
|
53
|
+
def clear
|
54
|
+
initialize
|
55
|
+
end
|
25
56
|
end
|