puppet 6.12.0-x64-mingw32 → 6.17.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 +2 -7
- data/CONTRIBUTING.md +7 -13
- data/Gemfile +4 -2
- data/Gemfile.lock +39 -36
- data/README.md +18 -25
- data/ext/project_data.yaml +1 -1
- data/ext/windows/service/daemon.rb +3 -3
- data/lib/puppet.rb +52 -13
- data/lib/puppet/agent.rb +20 -14
- data/lib/puppet/application/agent.rb +26 -17
- 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/configurer.rb +65 -69
- data/lib/puppet/configurer/plugin_handler.rb +10 -1
- data/lib/puppet/confine.rb +1 -1
- data/lib/puppet/context/trusted_information.rb +14 -8
- data/lib/puppet/daemon.rb +13 -27
- data/lib/puppet/defaults.rb +154 -58
- data/lib/puppet/environments.rb +27 -20
- 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 +14 -2
- data/lib/puppet/file_serving/metadata.rb +4 -1
- data/lib/puppet/file_serving/terminus_selector.rb +7 -8
- data/lib/puppet/file_system/file_impl.rb +14 -10
- 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 +12 -16
- data/lib/puppet/file_system/windows.rb +7 -10
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/forge/cache.rb +1 -1
- data/lib/puppet/forge/repository.rb +4 -7
- data/lib/puppet/functions/call.rb +1 -1
- data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
- data/lib/puppet/functions/filter.rb +1 -0
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/http.rb +5 -0
- data/lib/puppet/http/client.rb +293 -73
- data/lib/puppet/http/errors.rb +2 -0
- data/lib/puppet/http/external_client.rb +90 -0
- data/lib/puppet/http/redirector.rb +43 -7
- data/lib/puppet/http/resolver.rb +46 -3
- data/lib/puppet/http/resolver/server_list.rb +76 -16
- data/lib/puppet/http/resolver/settings.rb +23 -3
- data/lib/puppet/http/resolver/srv.rb +29 -3
- data/lib/puppet/http/response.rb +87 -1
- data/lib/puppet/http/retry_after_handler.rb +39 -0
- data/lib/puppet/http/service.rb +151 -7
- data/lib/puppet/http/service/ca.rb +76 -14
- 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 +49 -23
- data/lib/puppet/http/session.rb +103 -7
- data/lib/puppet/indirector.rb +1 -1
- 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 +27 -8
- 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/request.rb +1 -1
- 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/api/indirected_routes.rb +1 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
- data/lib/puppet/network/http/base_pool.rb +7 -2
- 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 +184 -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 +11 -1
- data/lib/puppet/pal/catalog_compiler.rb +5 -0
- data/lib/puppet/pal/pal_impl.rb +4 -29
- data/lib/puppet/parser/ast/leaf.rb +5 -5
- data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
- data/lib/puppet/parser/compiler.rb +43 -33
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
- data/lib/puppet/parser/environment_compiler.rb +4 -1
- data/lib/puppet/parser/functions.rb +18 -13
- data/lib/puppet/parser/functions/filter.rb +1 -0
- data/lib/puppet/parser/resource.rb +3 -2
- data/lib/puppet/parser/resource/param.rb +6 -0
- data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
- data/lib/puppet/pops/issues.rb +5 -0
- data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
- data/lib/puppet/pops/loaders.rb +7 -5
- data/lib/puppet/pops/parser/evaluating_parser.rb +5 -7
- data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
- data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
- data/lib/puppet/pops/types/type_calculator.rb +24 -0
- data/lib/puppet/pops/validation/checker4_0.rb +11 -1
- data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- 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/aptitude.rb +1 -1
- 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 +2 -2
- 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 +109 -25
- data/lib/puppet/provider/package/zypper.rb +59 -1
- data/lib/puppet/provider/service/systemd.rb +22 -4
- data/lib/puppet/provider/service/windows.rb +23 -7
- data/lib/puppet/provider/user/aix.rb +1 -0
- data/lib/puppet/provider/user/directoryservice.rb +30 -5
- data/lib/puppet/provider/user/useradd.rb +22 -12
- data/lib/puppet/reports/http.rb +15 -9
- data/lib/puppet/reports/store.rb +1 -1
- data/lib/puppet/resource.rb +2 -1
- data/lib/puppet/resource/type.rb +8 -0
- data/lib/puppet/resource/type_collection.rb +20 -16
- data/lib/puppet/runtime.rb +31 -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_context.rb +2 -2
- data/lib/puppet/ssl/ssl_provider.rb +20 -1
- 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 +15 -11
- data/lib/puppet/transaction/report.rb +2 -2
- data/lib/puppet/transaction/resource_harness.rb +1 -1
- data/lib/puppet/trusted_external.rb +29 -1
- data/lib/puppet/type.rb +18 -6
- data/lib/puppet/type/file.rb +51 -13
- data/lib/puppet/type/file/checksum.rb +4 -4
- data/lib/puppet/type/file/source.rb +51 -60
- data/lib/puppet/type/group.rb +2 -2
- data/lib/puppet/type/package.rb +102 -10
- data/lib/puppet/type/service.rb +55 -8
- data/lib/puppet/type/user.rb +3 -28
- data/lib/puppet/util.rb +39 -15
- data/lib/puppet/util/at_fork.rb +1 -1
- data/lib/puppet/util/autoload.rb +4 -18
- data/lib/puppet/util/checksums.rb +19 -4
- data/lib/puppet/util/fileparsing.rb +2 -2
- data/lib/puppet/util/instance_loader.rb +14 -10
- data/lib/puppet/util/log/destinations.rb +2 -11
- 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/provider_features.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/rpm_compare.rb +193 -0
- data/lib/puppet/util/storage.rb +0 -1
- data/lib/puppet/util/windows/adsi.rb +2 -2
- data/lib/puppet/util/windows/api_types.rb +45 -32
- data/lib/puppet/util/windows/eventlog.rb +1 -6
- data/lib/puppet/util/windows/principal.rb +8 -6
- data/lib/puppet/util/windows/process.rb +15 -14
- data/lib/puppet/util/windows/registry.rb +11 -11
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/util/windows/service.rb +43 -26
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/util/windows/user.rb +23 -8
- data/lib/puppet/util/yaml.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +707 -574
- data/man/man5/puppet.conf.5 +74 -14
- data/man/man8/puppet-agent.8 +7 -7
- 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/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 +483 -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/defaults_spec.rb +1 -2
- data/spec/integration/http/client_spec.rb +47 -37
- 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 +2 -15
- data/spec/integration/network/http_pool_spec.rb +93 -20
- data/spec/integration/node/environment_spec.rb +15 -0
- data/spec/integration/parser/compiler_spec.rb +11 -0
- data/spec/integration/type/file_spec.rb +1 -1
- data/spec/integration/util/windows/adsi_spec.rb +6 -1
- data/spec/integration/util/windows/registry_spec.rb +7 -7
- data/spec/integration/util/windows/user_spec.rb +40 -5
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/https.rb +16 -7
- data/spec/lib/puppet_spec/puppetserver.rb +119 -0
- data/spec/shared_contexts/https.rb +29 -0
- 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/configurer/fact_handler_spec.rb +4 -8
- data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
- data/spec/unit/configurer_spec.rb +17 -18
- data/spec/unit/context/trusted_information_spec.rb +25 -2
- data/spec/unit/daemon_spec.rb +5 -64
- data/spec/unit/defaults_spec.rb +25 -2
- 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_serving/http_metadata_spec.rb +37 -14
- data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
- data/spec/unit/file_system/uniquefile_spec.rb +11 -0
- data/spec/unit/file_system_spec.rb +26 -2
- data/spec/unit/functions/lookup_spec.rb +13 -0
- data/spec/unit/http/client_spec.rb +327 -35
- data/spec/unit/http/external_client_spec.rb +201 -0
- data/spec/unit/http/resolver_spec.rb +34 -2
- data/spec/unit/http/response_spec.rb +75 -0
- data/spec/unit/http/service/ca_spec.rb +53 -11
- 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 +27 -9
- data/spec/unit/http/service_spec.rb +98 -5
- data/spec/unit/http/session_spec.rb +190 -7
- 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 +194 -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/request_spec.rb +1 -1
- 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/interface_spec.rb +3 -3
- data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
- data/spec/unit/network/http/connection_spec.rb +559 -175
- 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/parser/ast/block_expression_spec.rb +1 -1
- data/spec/unit/parser/environment_compiler_spec.rb +7 -0
- data/spec/unit/parser/scope_spec.rb +1 -1
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
- data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
- data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
- data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
- 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 +5 -0
- 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/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/service/windows_spec.rb +22 -14
- data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
- data/spec/unit/provider/user/openbsd_spec.rb +1 -0
- data/spec/unit/provider/user/useradd_spec.rb +43 -24
- 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/resource_spec.rb +3 -3
- 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 +69 -43
- data/spec/unit/ssl/state_machine_spec.rb +99 -13
- data/spec/unit/test/test_helper_spec.rb +17 -0
- data/spec/unit/transaction/persistence_spec.rb +1 -10
- data/spec/unit/transaction/report_spec.rb +5 -1
- data/spec/unit/transaction_spec.rb +0 -2
- data/spec/unit/type/file/ensure_spec.rb +1 -2
- data/spec/unit/type/file/source_spec.rb +89 -38
- data/spec/unit/type/file_spec.rb +122 -96
- data/spec/unit/type/package_spec.rb +8 -0
- data/spec/unit/type/service_spec.rb +185 -8
- data/spec/unit/type/user_spec.rb +1 -2
- data/spec/unit/type_spec.rb +50 -0
- data/spec/unit/util/at_fork_spec.rb +3 -2
- data/spec/unit/util/autoload_spec.rb +2 -1
- data/spec/unit/util/checksums_spec.rb +16 -0
- data/spec/unit/util/log/destinations_spec.rb +1 -29
- data/spec/unit/util/package/version/debian_spec.rb +83 -0
- data/spec/unit/util/package/version/pip_spec.rb +464 -0
- data/spec/unit/util/package/version/range_spec.rb +175 -0
- data/spec/unit/util/package/version/rpm_spec.rb +121 -0
- data/spec/unit/util/pidlock_spec.rb +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 +4 -4
- data/spec/unit/util/windows/api_types_spec.rb +104 -40
- data/spec/unit/util/windows/service_spec.rb +4 -4
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/spec/unit/util_spec.rb +3 -3
- data/spec/unit/x509/cert_provider_spec.rb +1 -1
- data/tasks/generate_cert_fixtures.rake +15 -1
- data/tasks/manpages.rake +5 -35
- metadata +73 -12
- data/COMMITTERS.md +0 -244
- data/spec/integration/faces/plugin_spec.rb +0 -61
- data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -834,6 +834,17 @@ describe Puppet::Parser::Compiler do
|
|
834
834
|
MANIFEST
|
835
835
|
end.to raise_error(/Foo\[bar\]:\s+parameter 'a' expects a value for key 'd'\s+parameter 'a' unrecognized key 'c'/m)
|
836
836
|
end
|
837
|
+
|
838
|
+
it 'handles Sensitive type in resource array' do
|
839
|
+
catalog = compile_to_catalog(<<-MANIFEST)
|
840
|
+
define foo(Sensitive[String] $password) {
|
841
|
+
notify{ "${title}": message => "${password}" }
|
842
|
+
}
|
843
|
+
foo { ['testA', 'testB']: password =>Sensitive('some password') }
|
844
|
+
MANIFEST
|
845
|
+
expect(catalog).to have_resource("Notify[testA]").with_parameter(:message, 'Sensitive [value redacted]')
|
846
|
+
expect(catalog).to have_resource("Notify[testB]").with_parameter(:message, 'Sensitive [value redacted]')
|
847
|
+
end
|
837
848
|
end
|
838
849
|
|
839
850
|
context 'when using typed parameters in class' do
|
@@ -1160,7 +1160,7 @@ describe Puppet::Type.type(:file), :uses_checksums => true do
|
|
1160
1160
|
source_prefix = Puppet::Util::Platform.windows? ? '/' : ''
|
1161
1161
|
|
1162
1162
|
# the URI can be round-tripped through unescape
|
1163
|
-
expect(
|
1163
|
+
expect(Puppet::Util.uri_unescape(uri_path)).to eq(source_prefix + source)
|
1164
1164
|
# and is properly UTF-8
|
1165
1165
|
expect(uri_path.encoding).to eq (Encoding::UTF_8)
|
1166
1166
|
|
@@ -82,6 +82,9 @@ describe Puppet::Util::Windows::ADSI::Group,
|
|
82
82
|
it 'should return a list of members resolvable with Puppet::Util::Windows::ADSI::Group.name_sid_hash' do
|
83
83
|
temp_groupname = "g#{SecureRandom.uuid}"
|
84
84
|
temp_username = "u#{SecureRandom.uuid}"[0..12]
|
85
|
+
# From https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/password-must-meet-complexity-requirements
|
86
|
+
specials = "~!@#$%^&*_-+=`|\(){}[]:;\"'<>,.?/"
|
87
|
+
temp_password = "p#{SecureRandom.uuid[0..7]}-#{SecureRandom.uuid.upcase[0..7]}-#{specials[rand(specials.length)]}"
|
85
88
|
|
86
89
|
# select a virtual account that requires an authority to be able to resolve to SID
|
87
90
|
# the Dhcp service is chosen for no particular reason aside from it's a service available on all Windows versions
|
@@ -110,6 +113,8 @@ describe Puppet::Util::Windows::ADSI::Group,
|
|
110
113
|
begin
|
111
114
|
# :SidTypeUser as user on localhost, can be resolved with or without authority prefix
|
112
115
|
user = Puppet::Util::Windows::ADSI::User.create(temp_username)
|
116
|
+
# appveyor sometimes requires a password
|
117
|
+
user.password = temp_password
|
113
118
|
user.commit()
|
114
119
|
users.push({ :sid => user.sid.sid, :name => Puppet::Util::Windows::ADSI.computer_name + '\\' + temp_username })
|
115
120
|
|
@@ -160,7 +165,7 @@ describe Puppet::Util::Windows::ADSI::Group,
|
|
160
165
|
|
161
166
|
# unresolvable SID
|
162
167
|
expect(admins.members[1].sid).to eq('S-1-5-21-3661721861-956923663-2119435483-1112')
|
163
|
-
expect(admins.members[1].account).to eq('S-1-5-21-3661721861-956923663-2119435483-1112
|
168
|
+
expect(admins.members[1].account).to eq('S-1-5-21-3661721861-956923663-2119435483-1112')
|
164
169
|
expect(admins.members[1].account_type).to eq(:SidTypeUnknown)
|
165
170
|
end
|
166
171
|
|
@@ -259,23 +259,23 @@ describe Puppet::Util::Windows::Registry do
|
|
259
259
|
{
|
260
260
|
name: 'REG_SZ',
|
261
261
|
type: Win32::Registry::REG_SZ,
|
262
|
-
value: "reg sz\u0000 string",
|
263
|
-
expected_value: "reg sz
|
262
|
+
value: "reg sz\u0000\u0000 string",
|
263
|
+
expected_value: "reg sz"
|
264
264
|
},
|
265
265
|
{
|
266
266
|
name: 'REG_SZ_2',
|
267
267
|
type: Win32::Registry::REG_SZ,
|
268
|
-
value: "reg sz\x00 string",
|
269
|
-
expected_value: "reg sz
|
268
|
+
value: "reg sz 2\x00\x00 string",
|
269
|
+
expected_value: "reg sz 2"
|
270
270
|
},
|
271
271
|
{
|
272
272
|
name: 'REG_EXPAND_SZ',
|
273
273
|
type: Win32::Registry::REG_EXPAND_SZ,
|
274
|
-
value: "\0reg expand string",
|
275
|
-
expected_value: "
|
274
|
+
value: "\0\0\0reg expand string",
|
275
|
+
expected_value: ""
|
276
276
|
}
|
277
277
|
].each do |pair|
|
278
|
-
it '
|
278
|
+
it 'reads up to the first wide null' do
|
279
279
|
hklm.create("#{puppet_key}\\#{subkey_name}", Win32::Registry::KEY_ALL_ACCESS) do |reg|
|
280
280
|
reg.write(value_name, pair[:type], pair[:value])
|
281
281
|
end
|
@@ -125,19 +125,16 @@ describe "Puppet::Util::Windows::User", :if => Puppet::Util::Platform.windows? d
|
|
125
125
|
end
|
126
126
|
|
127
127
|
it 'should raise error given that logon returns false' do
|
128
|
-
|
129
128
|
allow(Puppet::Util::Windows::User).to receive(:logon_user_by_logon_type).with(
|
130
|
-
user, passwd, fLOGON32_LOGON_NETWORK, fLOGON32_PROVIDER_DEFAULT, anything).and_return (0)
|
129
|
+
user, '.', passwd, fLOGON32_LOGON_NETWORK, fLOGON32_PROVIDER_DEFAULT, anything).and_return (0)
|
131
130
|
allow(Puppet::Util::Windows::User).to receive(:logon_user_by_logon_type).with(
|
132
|
-
user, passwd, fLOGON32_LOGON_INTERACTIVE, fLOGON32_PROVIDER_DEFAULT, anything).and_return(0)
|
131
|
+
user, '.', passwd, fLOGON32_LOGON_INTERACTIVE, fLOGON32_PROVIDER_DEFAULT, anything).and_return(0)
|
133
132
|
|
134
133
|
expect {Puppet::Util::Windows::User.logon_user(user, passwd) {}}
|
135
134
|
.to raise_error(Puppet::Util::Windows::Error, /Failed to logon user/)
|
136
|
-
|
137
135
|
end
|
138
136
|
end
|
139
137
|
|
140
|
-
|
141
138
|
describe "password_is?" do
|
142
139
|
it "should return false given an incorrect username and password" do
|
143
140
|
expect(Puppet::Util::Windows::User.password_is?(username, bad_password)).to be_falsey
|
@@ -180,5 +177,43 @@ describe "Puppet::Util::Windows::User", :if => Puppet::Util::Platform.windows? d
|
|
180
177
|
expect { Puppet::Util::Windows::User.check_token_membership }.not_to raise_error
|
181
178
|
end
|
182
179
|
end
|
180
|
+
|
181
|
+
describe "default_system_account?" do
|
182
|
+
it "should succesfully identify 'SYSTEM' user as a default system account" do
|
183
|
+
allow(Puppet::Util::Windows::SID).to receive(:name_to_sid).with('SYSTEM').and_return(Puppet::Util::Windows::SID::LocalSystem)
|
184
|
+
expect(Puppet::Util::Windows::User.default_system_account?('SYSTEM')).to eq(true)
|
185
|
+
end
|
186
|
+
|
187
|
+
it "should succesfully identify 'NETWORK SERVICE' user as a default system account" do
|
188
|
+
allow(Puppet::Util::Windows::SID).to receive(:name_to_sid).with('NETWORK SERVICE').and_return(Puppet::Util::Windows::SID::NtNetwork)
|
189
|
+
expect(Puppet::Util::Windows::User.default_system_account?('NETWORK SERVICE')).to eq(true)
|
190
|
+
end
|
191
|
+
|
192
|
+
it "should succesfully identify 'LOCAL SERVICE' user as a default system account" do
|
193
|
+
allow(Puppet::Util::Windows::SID).to receive(:name_to_sid).with('LOCAL SERVICE').and_return(Puppet::Util::Windows::SID::NtLocal)
|
194
|
+
expect(Puppet::Util::Windows::User.default_system_account?('LOCAL SERVICE')).to eq(true)
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should not identify user with unknown sid as a default system account" do
|
198
|
+
allow(Puppet::Util::Windows::SID).to receive(:name_to_sid).with('UnknownUser').and_return(Puppet::Util::Windows::SID::Null)
|
199
|
+
expect(Puppet::Util::Windows::User.default_system_account?('UnknownUser')).to eq(false)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe "localsystem?" do
|
204
|
+
before do
|
205
|
+
allow(Puppet::Util::Windows::ADSI).to receive(:computer_name).and_return("myPC")
|
206
|
+
end
|
207
|
+
|
208
|
+
['LocalSystem', '.\LocalSystem', 'myPC\LocalSystem', 'lOcALsysTem'].each do |input|
|
209
|
+
it "should succesfully identify #{input} as the 'LocalSystem' account" do
|
210
|
+
expect(Puppet::Util::Windows::User.localsystem?(input)).to eq(true)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should not identify any other user as the 'LocalSystem' account" do
|
215
|
+
expect(Puppet::Util::Windows::User.localsystem?('OtherUser')).to eq(false)
|
216
|
+
end
|
217
|
+
end
|
183
218
|
end
|
184
219
|
end
|
data/spec/lib/puppet/test_ca.rb
CHANGED
@@ -21,9 +21,9 @@ module Puppet
|
|
21
21
|
id
|
22
22
|
end
|
23
23
|
|
24
|
-
def initialize
|
24
|
+
def initialize(name = 'Test CA')
|
25
25
|
@digest = OpenSSL::Digest::SHA256.new
|
26
|
-
info = create_cacert(
|
26
|
+
info = create_cacert(name)
|
27
27
|
@key = info[:private_key]
|
28
28
|
@ca_cert = info[:cert]
|
29
29
|
@ca_crl = create_crl(@ca_cert, @key)
|
@@ -6,11 +6,11 @@ class PuppetSpec::HTTPSServer
|
|
6
6
|
|
7
7
|
attr_reader :ca_cert, :ca_crl, :server_cert, :server_key
|
8
8
|
|
9
|
-
def initialize
|
10
|
-
@ca_cert = cert_fixture('ca.pem')
|
11
|
-
@ca_crl = crl_fixture('crl.pem')
|
12
|
-
@server_key = key_fixture('127.0.0.1-key.pem')
|
13
|
-
@server_cert = cert_fixture('127.0.0.1.pem')
|
9
|
+
def initialize(ca_cert: nil, ca_crl: nil, server_key: nil, server_cert: nil)
|
10
|
+
@ca_cert = ca_cert || cert_fixture('ca.pem')
|
11
|
+
@ca_crl = ca_crl || crl_fixture('crl.pem')
|
12
|
+
@server_key = server_key || key_fixture('127.0.0.1-key.pem')
|
13
|
+
@server_cert = server_cert || cert_fixture('127.0.0.1.pem')
|
14
14
|
@config = WEBrick::Config::HTTP.dup
|
15
15
|
end
|
16
16
|
|
@@ -18,10 +18,19 @@ class PuppetSpec::HTTPSServer
|
|
18
18
|
req = WEBrick::HTTPRequest.new(@config)
|
19
19
|
req.parse(ssl)
|
20
20
|
|
21
|
+
# always drain request body
|
22
|
+
req.body
|
23
|
+
|
21
24
|
res = WEBrick::HTTPResponse.new(@config)
|
22
25
|
res.status = 200
|
23
26
|
res.body = 'OK'
|
24
|
-
|
27
|
+
# The server explicitly closes the connection after handling it,
|
28
|
+
# so explicitly tell the client we're not going to keep it open.
|
29
|
+
# Without this, ruby will add `Connection: Keep-Alive`, which
|
30
|
+
# confuses the client when it tries to reuse the half-closed
|
31
|
+
# connection.
|
32
|
+
res['Connection'] = 'close'
|
33
|
+
response_proc.call(req, res) if response_proc
|
25
34
|
|
26
35
|
res.send_response(ssl)
|
27
36
|
end
|
@@ -52,7 +61,7 @@ class PuppetSpec::HTTPSServer
|
|
52
61
|
|
53
62
|
loop do
|
54
63
|
readable, = IO.select([ssls, stop_pipe_r])
|
55
|
-
break if readable.include?
|
64
|
+
break if readable.include?(stop_pipe_r)
|
56
65
|
|
57
66
|
ssl = ssls.accept
|
58
67
|
begin
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'webrick'
|
3
|
+
require "webrick/ssl"
|
4
|
+
|
5
|
+
class PuppetSpec::Puppetserver
|
6
|
+
include PuppetSpec::Fixtures
|
7
|
+
include PuppetSpec::Files
|
8
|
+
|
9
|
+
attr_reader :ca_cert, :ca_crl, :server_cert, :server_key
|
10
|
+
|
11
|
+
class NodeServlet < WEBrick::HTTPServlet::AbstractServlet
|
12
|
+
def do_GET request, response
|
13
|
+
node = Puppet::Node.new(Puppet[:certname])
|
14
|
+
response.body = node.render(:json)
|
15
|
+
response['Content-Type'] = 'application/json'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class CatalogServlet < WEBrick::HTTPServlet::AbstractServlet
|
20
|
+
def do_POST request, response
|
21
|
+
response['Content-Type'] = 'application/json'
|
22
|
+
catalog = Puppet::Resource::Catalog.new(Puppet[:certname], 'production')
|
23
|
+
response.body = catalog.render(:json)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class FileMetadatasServlet < WEBrick::HTTPServlet::AbstractServlet
|
28
|
+
def do_GET request, response
|
29
|
+
response['Content-Type'] = 'application/json'
|
30
|
+
response.body = "[{\"path\":\"/etc/puppetlabs/code/environments/production/modules\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":493,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-03-06 20:14:25 UTC\"},\"type\":\"directory\",\"destination\":null}]"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class ReportServlet < WEBrick::HTTPServlet::AbstractServlet
|
35
|
+
def do_PUT request, response
|
36
|
+
response['Content-Type'] = 'application/json'
|
37
|
+
response.body = "[]"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class StaticFileContentServlet < WEBrick::HTTPServlet::AbstractServlet
|
42
|
+
def do_GET request, response
|
43
|
+
response.status = 404
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class FilebucketServlet < WEBrick::HTTPServlet::AbstractServlet
|
48
|
+
def do_GET request, response
|
49
|
+
end
|
50
|
+
def do_PUT request, response
|
51
|
+
response['Content-Type'] = 'application/octet-stream'
|
52
|
+
end
|
53
|
+
def do_HEAD request, response
|
54
|
+
response.status = 404
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def initialize
|
59
|
+
@ca_cert = cert_fixture('ca.pem')
|
60
|
+
@ca_crl = crl_fixture('crl.pem')
|
61
|
+
@server_key = key_fixture('127.0.0.1-key.pem')
|
62
|
+
@server_cert = cert_fixture('127.0.0.1.pem')
|
63
|
+
@path = tmpfile('webrick')
|
64
|
+
|
65
|
+
@https = WEBrick::HTTPServer.new(
|
66
|
+
BindAddress: "127.0.0.1",
|
67
|
+
Port: 0, # webrick will choose the first available port, and set it in the config
|
68
|
+
SSLEnable: true,
|
69
|
+
SSLStartImmediately: true,
|
70
|
+
SSLCACertificateFile: File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'ca.pem'),
|
71
|
+
SSLCertificate: @server_cert,
|
72
|
+
SSLPrivateKey: @server_key,
|
73
|
+
Logger: WEBrick::Log.new(@path),
|
74
|
+
AccessLog: [
|
75
|
+
[@path, WEBrick::AccessLog::COMBINED_LOG_FORMAT],
|
76
|
+
]
|
77
|
+
)
|
78
|
+
|
79
|
+
trap('INT') do
|
80
|
+
@https.shutdown
|
81
|
+
end
|
82
|
+
|
83
|
+
# Enable this line for more detailed webrick logging
|
84
|
+
# @https.logger.level = 5 # DEBUG
|
85
|
+
end
|
86
|
+
|
87
|
+
def start_server(mounts: {}, &block)
|
88
|
+
register_mounts(mounts: mounts)
|
89
|
+
|
90
|
+
Thread.new do
|
91
|
+
@https.start
|
92
|
+
end
|
93
|
+
|
94
|
+
begin
|
95
|
+
yield @https.config[:Port]
|
96
|
+
ensure
|
97
|
+
@https.shutdown
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def register_mounts(mounts: {})
|
102
|
+
register_mount('/status/v1/simple/master', proc { |req, res| }, nil)
|
103
|
+
register_mount('/puppet/v3/node', mounts[:node], NodeServlet)
|
104
|
+
register_mount('/puppet/v3/catalog', mounts[:catalog], CatalogServlet)
|
105
|
+
register_mount('/puppet/v3/file_metadatas', mounts[:file_metadatas], FileMetadatasServlet)
|
106
|
+
register_mount('/puppet/v3/static_file_content', mounts[:static_file_content], StaticFileContentServlet)
|
107
|
+
register_mount('/puppet/v3/report', mounts[:report], ReportServlet)
|
108
|
+
register_mount('/puppet/v3/file_bucket_file', mounts[:filebucket], FilebucketServlet)
|
109
|
+
end
|
110
|
+
|
111
|
+
def register_mount(path, user_proc, default_servlet)
|
112
|
+
handler = if user_proc
|
113
|
+
WEBrick::HTTPServlet::ProcHandler.new(user_proc)
|
114
|
+
else
|
115
|
+
default_servlet
|
116
|
+
end
|
117
|
+
@https.mount(path, handler)
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.shared_context('https client') do
|
4
|
+
before :all do
|
5
|
+
WebMock.disable!
|
6
|
+
end
|
7
|
+
|
8
|
+
after :all do
|
9
|
+
WebMock.enable!
|
10
|
+
end
|
11
|
+
|
12
|
+
before :each do
|
13
|
+
# make sure we don't take too long
|
14
|
+
Puppet[:http_connect_timeout] = '5s'
|
15
|
+
Puppet[:server] = '127.0.0.1'
|
16
|
+
Puppet[:certname] = '127.0.0.1'
|
17
|
+
|
18
|
+
Puppet[:localcacert] = File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'ca.pem')
|
19
|
+
Puppet[:hostcrl] = File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'crl.pem')
|
20
|
+
Puppet[:hostprivkey] = File.join(PuppetSpec::FIXTURE_DIR, 'ssl', '127.0.0.1-key.pem')
|
21
|
+
Puppet[:hostcert] = File.join(PuppetSpec::FIXTURE_DIR, 'ssl', '127.0.0.1.pem')
|
22
|
+
|
23
|
+
# set in memory facts since certname is changed above
|
24
|
+
facts = Puppet::Node::Facts.new(Puppet[:certname])
|
25
|
+
Puppet::Node::Facts.indirection.save(facts)
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:https_server) { PuppetSpec::HTTPSServer.new }
|
29
|
+
end
|
data/spec/unit/agent_spec.rb
CHANGED
@@ -179,37 +179,78 @@ describe Puppet::Agent do
|
|
179
179
|
expect(@agent.run).to eq(:result)
|
180
180
|
end
|
181
181
|
|
182
|
+
describe "and a puppet agent is already running" do
|
183
|
+
before(:each) do
|
184
|
+
allow_any_instance_of(Object).to receive(:sleep)
|
185
|
+
lockfile = double('lockfile')
|
186
|
+
expect(@agent).to receive(:lockfile).and_return(lockfile).at_least(:once)
|
187
|
+
# so the lock method raises Puppet::LockError
|
188
|
+
allow(lockfile).to receive(:lock).and_return(false)
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should notify that a run is already in progres" do
|
192
|
+
client = AgentTestClient.new
|
193
|
+
expect(AgentTestClient).to receive(:new).and_return(client)
|
194
|
+
expect(Puppet).to receive(:notice).with(/Run of .* already in progress; skipping .* exists/)
|
195
|
+
@agent.run
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should inform that a run is already in progres and try to run every X seconds if waitforlock is used" do
|
199
|
+
# so the locked file exists
|
200
|
+
allow(File).to receive(:file?).and_return(true)
|
201
|
+
# so we don't have to wait again for the run to exit (default maxwaitforcert is 60)
|
202
|
+
# first 0 is to get the time, second 0 is to inform user, then 1000 so the time expires
|
203
|
+
allow(Time).to receive(:now).and_return(0, 0, 1000)
|
204
|
+
allow(Puppet).to receive(:info)
|
205
|
+
client = AgentTestClient.new
|
206
|
+
expect(AgentTestClient).to receive(:new).and_return(client)
|
207
|
+
|
208
|
+
Puppet[:waitforlock] = 1
|
209
|
+
Puppet[:maxwaitforlock] = 2
|
210
|
+
expect(Puppet).to receive(:info).with(/Another puppet instance is already running; --waitforlock flag used, waiting for running instance to finish./)
|
211
|
+
expect(Puppet).to receive(:info).with(/Will try again in #{Puppet[:waitforlock]} seconds./)
|
212
|
+
@agent.run
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should notify that the run is exiting if waitforlock is used and maxwaitforlock is exceeded" do
|
216
|
+
# so we don't have to wait again for the run to exit (default maxwaitforcert is 60)
|
217
|
+
# first 0 is to get the time, then 1000 so that the time expires
|
218
|
+
allow(Time).to receive(:now).and_return(0, 1000)
|
219
|
+
client = AgentTestClient.new
|
220
|
+
expect(AgentTestClient).to receive(:new).and_return(client)
|
221
|
+
|
222
|
+
Puppet[:waitforlock] = 1
|
223
|
+
expect(Puppet).to receive(:notice).with(/Exiting now because the maxwaitforlock timeout has been exceeded./)
|
224
|
+
@agent.run
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
182
228
|
describe "when should_fork is true", :if => Puppet.features.posix? && RUBY_PLATFORM != 'java' do
|
183
229
|
before do
|
184
230
|
@agent = Puppet::Agent.new(AgentTestClient, true)
|
185
231
|
|
186
232
|
# So we don't actually try to hit the filesystem.
|
187
233
|
allow(@agent).to receive(:lock).and_yield
|
188
|
-
|
189
|
-
allow(Kernel).to receive(:fork)
|
190
|
-
allow(Process).to receive(:waitpid2).and_return([123, double('process::status', :exitstatus => 0)])
|
191
|
-
allow(@agent).to receive(:exit)
|
192
234
|
end
|
193
235
|
|
194
236
|
it "should run the agent in a forked process" do
|
195
237
|
client = AgentTestClient.new
|
196
238
|
expect(AgentTestClient).to receive(:new).and_return(client)
|
197
239
|
|
198
|
-
expect(client).to receive(:run)
|
240
|
+
expect(client).to receive(:run).and_return(0)
|
199
241
|
|
200
242
|
expect(Kernel).to receive(:fork).and_yield
|
201
|
-
@agent.run
|
243
|
+
expect { @agent.run }.to exit_with(0)
|
202
244
|
end
|
203
245
|
|
204
246
|
it "should exit child process if child exit" do
|
205
247
|
client = AgentTestClient.new
|
206
248
|
expect(AgentTestClient).to receive(:new).and_return(client)
|
207
249
|
|
208
|
-
expect(client).to receive(:run).and_raise(SystemExit)
|
250
|
+
expect(client).to receive(:run).and_raise(SystemExit.new(-1))
|
209
251
|
|
210
252
|
expect(Kernel).to receive(:fork).and_yield
|
211
|
-
expect
|
212
|
-
@agent.run
|
253
|
+
expect { @agent.run }.to exit_with(-1)
|
213
254
|
end
|
214
255
|
|
215
256
|
it 'should exit with 1 if an exception is raised' do
|
@@ -219,31 +260,44 @@ describe Puppet::Agent do
|
|
219
260
|
expect(client).to receive(:run).and_raise(StandardError)
|
220
261
|
|
221
262
|
expect(Kernel).to receive(:fork).and_yield
|
222
|
-
expect
|
223
|
-
@agent.run
|
263
|
+
expect { @agent.run }.to exit_with(1)
|
224
264
|
end
|
225
265
|
|
226
|
-
it
|
227
|
-
|
228
|
-
expect
|
266
|
+
it 'should exit with 254 if NoMemoryError exception is raised' do
|
267
|
+
client = AgentTestClient.new
|
268
|
+
expect(AgentTestClient).to receive(:new).and_return(client)
|
269
|
+
|
270
|
+
expect(client).to receive(:run).and_raise(NoMemoryError)
|
271
|
+
|
272
|
+
expect(Kernel).to receive(:fork).and_yield
|
273
|
+
expect { @agent.run }.to exit_with(254)
|
229
274
|
end
|
230
275
|
|
231
|
-
it "should
|
232
|
-
|
233
|
-
expect {
|
276
|
+
it "should return the block exit code as the child exit code" do
|
277
|
+
expect(Kernel).to receive(:fork).and_yield
|
278
|
+
expect {
|
279
|
+
@agent.run_in_fork {
|
280
|
+
777
|
281
|
+
}
|
282
|
+
}.to exit_with(777)
|
234
283
|
end
|
235
284
|
|
236
|
-
it "should return the
|
237
|
-
|
238
|
-
expect
|
285
|
+
it "should return `1` exit code if the block returns `nil`" do
|
286
|
+
expect(Kernel).to receive(:fork).and_yield
|
287
|
+
expect {
|
288
|
+
@agent.run_in_fork {
|
289
|
+
nil
|
290
|
+
}
|
291
|
+
}.to exit_with(1)
|
239
292
|
end
|
240
293
|
|
241
|
-
it "should return
|
294
|
+
it "should return `1` exit code if the block returns `false`" do
|
242
295
|
expect(Kernel).to receive(:fork).and_yield
|
243
|
-
expect
|
244
|
-
|
245
|
-
|
246
|
-
|
296
|
+
expect {
|
297
|
+
@agent.run_in_fork {
|
298
|
+
false
|
299
|
+
}
|
300
|
+
}.to exit_with(1)
|
247
301
|
end
|
248
302
|
end
|
249
303
|
|
@@ -283,7 +337,7 @@ describe Puppet::Agent do
|
|
283
337
|
expect(client).not_to receive(:handling)
|
284
338
|
expect(Puppet).to receive(:log_exception).with(be_an_instance_of(Puppet::Agent::RunTimeoutError), anything)
|
285
339
|
|
286
|
-
expect(@agent.run).to eq(
|
340
|
+
expect(@agent.run).to eq(nil)
|
287
341
|
end
|
288
342
|
end
|
289
343
|
end
|