puppet 6.11.1-x64-mingw32 → 6.16.0-x64-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
| @@ -176,6 +176,19 @@ describe Puppet::Type.type(:package).provider(:zypper) do | |
| 176 176 | 
             
                  @provider.install
         | 
| 177 177 | 
             
                end
         | 
| 178 178 |  | 
| 179 | 
            +
                it "should install the package with --no-gpg-checks" do
         | 
| 180 | 
            +
                  allow(@resource).to receive(:[]).with(:name).and_return("php5")
         | 
| 181 | 
            +
                  allow(@resource).to receive(:[]).with(:install_options).and_return(['--no-gpg-checks', {'-p' => '/vagrant/files/localrepo/'}])
         | 
| 182 | 
            +
                  allow(@resource).to receive(:should).with(:ensure).and_return("5.4.10-4.5.6")
         | 
| 183 | 
            +
                  allow(@resource).to receive(:allow_virtual?).and_return(false)
         | 
| 184 | 
            +
                  allow(@provider).to receive(:zypper_version).and_return("1.2.8")
         | 
| 185 | 
            +
             | 
| 186 | 
            +
                  expect(@provider).to receive(:zypper).with('--quiet', '--no-gpg-checks', :install,
         | 
| 187 | 
            +
                    '--auto-agree-with-licenses', '--no-confirm', '-p=/vagrant/files/localrepo/', 'php5-5.4.10-4.5.6')
         | 
| 188 | 
            +
                  expect(@provider).to receive(:query).and_return("php5 0 5.4.10 4.5.6 x86_64")
         | 
| 189 | 
            +
                  @provider.install
         | 
| 190 | 
            +
                end
         | 
| 191 | 
            +
             | 
| 179 192 | 
             
                it "should install package with hash install options" do
         | 
| 180 193 | 
             
                  allow(@resource).to receive(:[]).with(:name).and_return('vim')
         | 
| 181 194 | 
             
                  allow(@resource).to receive(:[]).with(:install_options).and_return([{ '--a' => 'foo', '--b' => '"quoted bar"' }])
         | 
| @@ -226,4 +239,75 @@ describe Puppet::Type.type(:package).provider(:zypper) do | |
| 226 239 | 
             
                  @provider.uninstall
         | 
| 227 240 | 
             
                end
         | 
| 228 241 | 
             
              end
         | 
| 242 | 
            +
             | 
| 243 | 
            +
              context 'when installing with VersionRange' do
         | 
| 244 | 
            +
                let(:search_output) { File.read(my_fixture('zypper-search-uninstalled.out')) }
         | 
| 245 | 
            +
             | 
| 246 | 
            +
                before(:each) do
         | 
| 247 | 
            +
                  allow(@resource).to receive(:[]).with(:name).and_return('vim')
         | 
| 248 | 
            +
                  allow(@resource).to receive(:allow_virtual?).and_return(false)
         | 
| 249 | 
            +
                  allow(@provider).to receive(:zypper_version).and_return('1.0.2')
         | 
| 250 | 
            +
             | 
| 251 | 
            +
                  expect(@provider).to receive(:zypper).with('search', '--match-exact', '--type', 'package', '--uninstalled-only', '-s', 'vim')
         | 
| 252 | 
            +
                                                       .and_return(search_output)
         | 
| 253 | 
            +
                end
         | 
| 254 | 
            +
             | 
| 255 | 
            +
                it 'does install the package if version is available' do
         | 
| 256 | 
            +
                  expect(@resource).to receive(:should).with(:ensure).and_return('>1.0')
         | 
| 257 | 
            +
             | 
| 258 | 
            +
                  expect(@provider).to receive(:zypper).with('--quiet', :install, '--auto-agree-with-licenses', '--no-confirm', 'vim-1.0.20040813-19.9')
         | 
| 259 | 
            +
                  expect(@provider).to receive(:query).and_return('vim 0 1.0.20040813 19.9 x86_64')
         | 
| 260 | 
            +
             | 
| 261 | 
            +
                  @provider.install
         | 
| 262 | 
            +
                end
         | 
| 263 | 
            +
             | 
| 264 | 
            +
                it 'does consider range as version if version in range is not available' do
         | 
| 265 | 
            +
                  allow(@resource).to receive(:should).with(:ensure).and_return('>2.0')
         | 
| 266 | 
            +
             | 
| 267 | 
            +
                  expect(@provider).to receive(:zypper).with('--quiet', :install, '--auto-agree-with-licenses', '--no-confirm', 'vim->2.0')
         | 
| 268 | 
            +
                                         .and_raise(Puppet::ExecutionFailure.new('My Error'))
         | 
| 269 | 
            +
             | 
| 270 | 
            +
                  expect { @provider.install }.to raise_error(Puppet::ExecutionFailure, 'My Error')
         | 
| 271 | 
            +
                end
         | 
| 272 | 
            +
              end
         | 
| 273 | 
            +
             | 
| 274 | 
            +
              describe 'insync?' do
         | 
| 275 | 
            +
                subject { @provider.insync?('1.19-2') }
         | 
| 276 | 
            +
             | 
| 277 | 
            +
                context 'when versions are matching' do
         | 
| 278 | 
            +
                  before { allow(@resource).to receive(:[]).with(:ensure).and_return('1.19-2') }
         | 
| 279 | 
            +
             | 
| 280 | 
            +
                  it { is_expected.to be true }
         | 
| 281 | 
            +
                end
         | 
| 282 | 
            +
             | 
| 283 | 
            +
                context 'when version are not matching' do
         | 
| 284 | 
            +
                  before { allow(@resource).to receive(:[]).with(:ensure).and_return('1.19-3') }
         | 
| 285 | 
            +
             | 
| 286 | 
            +
                  it { is_expected.to be false }
         | 
| 287 | 
            +
                end
         | 
| 288 | 
            +
             | 
| 289 | 
            +
                context 'when version is in gt range' do
         | 
| 290 | 
            +
                  before { allow(@resource).to receive(:[]).with(:ensure).and_return('>1.19-0') }
         | 
| 291 | 
            +
             | 
| 292 | 
            +
                  it { is_expected.to be true }
         | 
| 293 | 
            +
                end
         | 
| 294 | 
            +
             | 
| 295 | 
            +
                context 'when version is not in gt range' do
         | 
| 296 | 
            +
                  before { allow(@resource).to receive(:[]).with(:ensure).and_return('>1.19-2') }
         | 
| 297 | 
            +
             | 
| 298 | 
            +
                  it { is_expected.to be false }
         | 
| 299 | 
            +
                end
         | 
| 300 | 
            +
             | 
| 301 | 
            +
                context 'when version is in min-max range' do
         | 
| 302 | 
            +
                  before { allow(@resource).to receive(:[]).with(:ensure).and_return('>1.19-0 <1.19-3') }
         | 
| 303 | 
            +
             | 
| 304 | 
            +
                  it { is_expected.to be true }
         | 
| 305 | 
            +
                end
         | 
| 306 | 
            +
             | 
| 307 | 
            +
                context 'when version is not in min-max range' do
         | 
| 308 | 
            +
                  before { allow(@resource).to receive(:[]).with(:ensure).and_return('>1.19-0 <1.19-2') }
         | 
| 309 | 
            +
             | 
| 310 | 
            +
                  it { is_expected.to be false }
         | 
| 311 | 
            +
                end
         | 
| 312 | 
            +
              end
         | 
| 229 313 | 
             
            end
         | 
| @@ -0,0 +1,60 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'puppet'
         | 
| 3 | 
            +
            require 'puppet/provider/package_targetable'
         | 
| 4 | 
            +
            require 'puppet/provider/package/gem'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            describe Puppet::Provider::Package::Targetable do
         | 
| 7 | 
            +
              let(:provider) { Puppet::Type.type(:package).provider(:gem) }
         | 
| 8 | 
            +
              let(:command)  { '/opt/bin/gem' }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              describe "when prefetching" do
         | 
| 11 | 
            +
                context "with a package without a command attribute" do
         | 
| 12 | 
            +
                  let(:resource) { Puppet::Type.type(:package).new(:name => 'noo', :provider => 'gem', :ensure => :present) }
         | 
| 13 | 
            +
                  let(:catalog)  { Puppet::Resource::Catalog.new }
         | 
| 14 | 
            +
                  let(:instance) { provider.new(resource) }
         | 
| 15 | 
            +
                  let(:packages) { { 'noo' => resource } }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  it "should pass a command to the instances method of the provider" do
         | 
| 18 | 
            +
                    catalog.add_resource(resource)
         | 
| 19 | 
            +
                    expect(provider).to receive(:instances).with(nil).and_return([instance])
         | 
| 20 | 
            +
                    expect(provider.prefetch(packages)).to eq([nil]) # prefetch arbitrarily returns the array of commands for a provider in the catalog
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                context "with a package with a command attribute" do
         | 
| 25 | 
            +
                  let(:resource) { Puppet::Type.type(:package).new(:name => 'noo', :provider => 'gem', :ensure => :present) }
         | 
| 26 | 
            +
                  let(:resource_targeted) { Puppet::Type.type(:package).new(:name => 'yes', :provider => 'gem', :command => command, :ensure => :present) }
         | 
| 27 | 
            +
                  let(:catalog)  { Puppet::Resource::Catalog.new }
         | 
| 28 | 
            +
                  let(:instance) { provider.new(resource) }
         | 
| 29 | 
            +
                  let(:instance_targeted) { provider.new(resource_targeted) }
         | 
| 30 | 
            +
                  let(:packages) { { 'noo' => resource, 'yes' => resource_targeted } }
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  it "should pass the command to the instances method of the provider" do
         | 
| 33 | 
            +
                    catalog.add_resource(resource)
         | 
| 34 | 
            +
                    catalog.add_resource(resource_targeted)
         | 
| 35 | 
            +
                    expect(provider).to receive(:instances).with(nil).and_return([instance])
         | 
| 36 | 
            +
                    expect(provider).to receive(:instances).with(command).and_return([instance_targeted]).once
         | 
| 37 | 
            +
                    expect(provider.prefetch(packages)).to eq([nil, command]) # prefetch arbitrarily returns the array of commands for a provider in the catalog
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              describe "when validating a command" do
         | 
| 43 | 
            +
                context "with no command" do
         | 
| 44 | 
            +
                  it "report not functional" do
         | 
| 45 | 
            +
                    expect { provider.validate_command(nil) }.to raise_error(Puppet::Error, "Provider gem package command is not functional on this host")
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
                context "with a missing command" do
         | 
| 49 | 
            +
                  it "report does not exist" do
         | 
| 50 | 
            +
                    expect { provider.validate_command(command) }.to raise_error(Puppet::Error, "Provider gem package command '#{command}' does not exist on this host")
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
                context "with an existing command" do
         | 
| 54 | 
            +
                  it "validates" do
         | 
| 55 | 
            +
                    allow(File).to receive(:file?).with(command).and_return(true)
         | 
| 56 | 
            +
                    expect { provider.validate_command(command) }.not_to raise_error
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
            end
         | 
| @@ -150,6 +150,7 @@ describe 'Puppet::Type::Service::Provider::Init', unless: Puppet::Util::Platform | |
| 150 150 |  | 
| 151 151 | 
             
              describe "if the init script is present" do
         | 
| 152 152 | 
             
                before :each do
         | 
| 153 | 
            +
                  allow(File).to receive(:directory?).and_call_original
         | 
| 153 154 | 
             
                  allow(File).to receive(:directory?).with("/service/path").and_return(true)
         | 
| 154 155 | 
             
                  allow(File).to receive(:directory?).with("/alt/service/path").and_return(true)
         | 
| 155 156 | 
             
                  allow(Puppet::FileSystem).to receive(:exist?).with("/service/path/myservice").and_return(true)
         | 
| @@ -12,6 +12,15 @@ describe 'Puppet::Type::Service::Provider::Openbsd', | |
| 12 12 | 
             
                allow(FileTest).to receive(:executable?).with('/usr/sbin/rcctl').and_return(true)
         | 
| 13 13 | 
             
              end
         | 
| 14 14 |  | 
| 15 | 
            +
              # `execute` and `texecute` start a new process, consequently setting $CHILD_STATUS to a Process::Status instance,
         | 
| 16 | 
            +
              # but because they are mocked, an external process is never executed and $CHILD_STATUS remain nil.
         | 
| 17 | 
            +
              # In order to execute some parts of the code under test and to mock $CHILD_STATUS, we need this variable to be a
         | 
| 18 | 
            +
              # Process::Status instance. We can achieve this by starting a process that does nothing (exit 0). By doing this,
         | 
| 19 | 
            +
              # $CHILD_STATUS will be initialised with a instance of Process::Status and we will be able to mock it.
         | 
| 20 | 
            +
              before(:all) do
         | 
| 21 | 
            +
                `exit 0`
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 15 24 | 
             
              context "#instances" do
         | 
| 16 25 | 
             
                it "should have an instances method" do
         | 
| 17 26 | 
             
                  expect(provider_class).to respond_to :instances
         | 
| @@ -28,6 +28,7 @@ describe 'Puppet::Type::Service::Provider::Openwrt', | |
| 28 28 | 
             
                allow(FileTest).to receive(:executable?).with('/etc/rc.common').and_return(true)
         | 
| 29 29 |  | 
| 30 30 | 
             
                # All OpenWrt tests operate on the init script directly. It must exist.
         | 
| 31 | 
            +
                allow(File).to receive(:directory?).and_call_original
         | 
| 31 32 | 
             
                allow(File).to receive(:directory?).with('/etc/init.d').and_return(true)
         | 
| 32 33 |  | 
| 33 34 | 
             
                allow(Puppet::FileSystem).to receive(:exist?).with('/etc/init.d/myservice').and_return(true)
         | 
| @@ -4,6 +4,15 @@ describe 'Puppet::Type::Service::Provider::Redhat', | |
| 4 4 | 
             
                     if: Puppet.features.posix? && !Puppet::Util::Platform.jruby?do
         | 
| 5 5 | 
             
              let(:provider_class) { Puppet::Type.type(:service).provider(:redhat) }
         | 
| 6 6 |  | 
| 7 | 
            +
              # `execute` and `texecute` start a new process, consequently setting $CHILD_STATUS to a Process::Status instance,
         | 
| 8 | 
            +
              # but because they are mocked, an external process is never executed and $CHILD_STATUS remain nil.
         | 
| 9 | 
            +
              # In order to execute some parts of the code under test and to mock $CHILD_STATUS, we need this variable to be a
         | 
| 10 | 
            +
              # Process::Status instance. We can achieve this by starting a process that does nothing (exit 0). By doing this,
         | 
| 11 | 
            +
              # $CHILD_STATUS will be initialised with a instance of Process::Status and we will be able to mock it.
         | 
| 12 | 
            +
              before(:all) do
         | 
| 13 | 
            +
                `exit 0`
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 7 16 | 
             
              before :each do
         | 
| 8 17 | 
             
                @class = Puppet::Type.type(:service).provider(:redhat)
         | 
| 9 18 | 
             
                @resource = double('resource')
         | 
| @@ -13,6 +13,15 @@ describe 'Puppet::Type::Service::Provider::Systemd', unless: Puppet::Util::Platf | |
| 13 13 | 
             
                allow(provider_class).to receive(:which).with('systemctl').and_return('/bin/systemctl')
         | 
| 14 14 | 
             
              end
         | 
| 15 15 |  | 
| 16 | 
            +
              # `execute` and `texecute` start a new process, consequently setting $CHILD_STATUS to a Process::Status instance,
         | 
| 17 | 
            +
              # but because they are mocked, an external process is never executed and $CHILD_STATUS remain nil.
         | 
| 18 | 
            +
              # In order to execute some parts of the code under test and to mock $CHILD_STATUS, we need this variable to be a
         | 
| 19 | 
            +
              # Process::Status instance. We can achieve this by starting a process that does nothing (exit 0). By doing this,
         | 
| 20 | 
            +
              # $CHILD_STATUS will be initialised with a instance of Process::Status and we will be able to mock it.
         | 
| 21 | 
            +
              before(:all) do
         | 
| 22 | 
            +
                `exit 0`
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 16 25 | 
             
              let :provider do
         | 
| 17 26 | 
             
                provider_class.new(:name => 'sshd.service')
         | 
| 18 27 | 
             
              end
         | 
| @@ -187,8 +196,18 @@ describe 'Puppet::Type::Service::Provider::Systemd', unless: Puppet::Util::Platf | |
| 187 196 | 
             
                    autovt@.service
         | 
| 188 197 | 
             
                    avahi-daemon.service
         | 
| 189 198 | 
             
                    blk-availability.service
         | 
| 199 | 
            +
                    apparmor.service
         | 
| 200 | 
            +
                    umountnfs.service
         | 
| 201 | 
            +
                    urandom.service
         | 
| 202 | 
            +
                    brandbot.service
         | 
| 190 203 | 
             
                  })
         | 
| 191 204 | 
             
                end
         | 
| 205 | 
            +
             | 
| 206 | 
            +
                it "should print a debug message when a service with the state `bad` is found" do
         | 
| 207 | 
            +
                  expect(provider_class).to receive(:systemctl).with('list-unit-files', '--type', 'service', '--full', '--all', '--no-pager').and_return(File.read(my_fixture('list_unit_files_services')))
         | 
| 208 | 
            +
                  expect(Puppet).to receive(:debug).with("apparmor.service marked as bad by `systemctl`. It is recommended to be further checked.")
         | 
| 209 | 
            +
                  provider_class.instances
         | 
| 210 | 
            +
                end
         | 
| 192 211 | 
             
              end
         | 
| 193 212 |  | 
| 194 213 | 
             
              describe "#start" do
         | 
| @@ -269,43 +288,43 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a | |
| 269 288 | 
             
              describe "#enabled?" do
         | 
| 270 289 | 
             
                it "should return :true if the service is enabled" do
         | 
| 271 290 | 
             
                  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 272 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false). | 
| 273 | 
            -
             | 
| 291 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
         | 
| 292 | 
            +
                                        and_return(Puppet::Util::Execution::ProcessOutput.new("enabled\n", 0))
         | 
| 274 293 | 
             
                  expect(provider.enabled?).to eq(:true)
         | 
| 275 294 | 
             
                end
         | 
| 276 295 |  | 
| 277 296 | 
             
                it "should return :true if the service is static" do
         | 
| 278 297 | 
             
                  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 279 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','--', 'sshd.service'], :failonfail => false). | 
| 280 | 
            -
             | 
| 298 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled','--', 'sshd.service'], :failonfail => false).
         | 
| 299 | 
            +
                                        and_return(Puppet::Util::Execution::ProcessOutput.new("static\n", 0))
         | 
| 281 300 | 
             
                  expect(provider.enabled?).to eq(:true)
         | 
| 282 301 | 
             
                end
         | 
| 283 302 |  | 
| 284 303 | 
             
                it "should return :false if the service is disabled" do
         | 
| 285 304 | 
             
                  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 286 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false). | 
| 287 | 
            -
             | 
| 305 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
         | 
| 306 | 
            +
                                        and_return(Puppet::Util::Execution::ProcessOutput.new("disabled\n", 1))
         | 
| 288 307 | 
             
                  expect(provider.enabled?).to eq(:false)
         | 
| 289 308 | 
             
                end
         | 
| 290 309 |  | 
| 291 310 | 
             
                it "should return :false if the service is indirect" do
         | 
| 292 311 | 
             
                  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| 293 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false). | 
| 294 | 
            -
             | 
| 312 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
         | 
| 313 | 
            +
                                        and_return(Puppet::Util::Execution::ProcessOutput.new("indirect\n", 0))
         | 
| 295 314 | 
             
                  expect(provider.enabled?).to eq(:false)
         | 
| 296 315 | 
             
                end
         | 
| 297 316 |  | 
| 298 317 | 
             
                it "should return :false if the service is masked and the resource is attempting to be disabled" do
         | 
| 299 318 | 
             
                  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => false))
         | 
| 300 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false). | 
| 301 | 
            -
             | 
| 319 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
         | 
| 320 | 
            +
                                        and_return(Puppet::Util::Execution::ProcessOutput.new("masked\n", 1))
         | 
| 302 321 | 
             
                  expect(provider.enabled?).to eq(:false)
         | 
| 303 322 | 
             
                end
         | 
| 304 323 |  | 
| 305 324 | 
             
                it "should return :mask if the service is masked and the resource is attempting to be masked" do
         | 
| 306 325 | 
             
                  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => 'mask'))
         | 
| 307 | 
            -
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false). | 
| 308 | 
            -
             | 
| 326 | 
            +
                  expect(provider).to receive(:execute).with(['/bin/systemctl','is-enabled', '--', 'sshd.service'], :failonfail => false).
         | 
| 327 | 
            +
                                        and_return(Puppet::Util::Execution::ProcessOutput.new("masked\n", 1))
         | 
| 309 328 | 
             
                  expect(provider.enabled?).to eq(:mask)
         | 
| 310 329 | 
             
                end
         | 
| 311 330 | 
             
              end
         | 
| @@ -428,6 +447,67 @@ Jun 14 21:43:23 foo.example.com systemd[1]: sshd.service lacks both ExecStart= a | |
| 428 447 | 
             
                end
         | 
| 429 448 | 
             
              end
         | 
| 430 449 |  | 
| 450 | 
            +
              describe "#insync_enabled?" do
         | 
| 451 | 
            +
                let(:provider) do
         | 
| 452 | 
            +
                  provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service', :enable => false))
         | 
| 453 | 
            +
                end
         | 
| 454 | 
            +
             | 
| 455 | 
            +
                before do
         | 
| 456 | 
            +
                  allow(provider).to receive(:cached_enabled?).and_return({ output: service_state, exitcode: 0 })
         | 
| 457 | 
            +
                end
         | 
| 458 | 
            +
             | 
| 459 | 
            +
                context 'when service state is static' do
         | 
| 460 | 
            +
                  let(:service_state) { 'static' }
         | 
| 461 | 
            +
             | 
| 462 | 
            +
                  it 'is always enabled_insync even if current value is the same as expected' do
         | 
| 463 | 
            +
                    expect(provider).to be_enabled_insync(:false)
         | 
| 464 | 
            +
                  end
         | 
| 465 | 
            +
             | 
| 466 | 
            +
                  it 'is always enabled_insync even if current value is not the same as expected' do
         | 
| 467 | 
            +
                    expect(provider).to be_enabled_insync(:true)
         | 
| 468 | 
            +
                  end
         | 
| 469 | 
            +
             | 
| 470 | 
            +
                  it 'logs a debug messsage' do
         | 
| 471 | 
            +
                    expect(Puppet).to receive(:debug).with("Unable to enable or disable static service sshd.service")
         | 
| 472 | 
            +
                    provider.enabled_insync?(:true)
         | 
| 473 | 
            +
                  end
         | 
| 474 | 
            +
                end
         | 
| 475 | 
            +
             | 
| 476 | 
            +
                context 'when service state is indirect' do
         | 
| 477 | 
            +
                  let(:service_state) { 'indirect' }
         | 
| 478 | 
            +
             | 
| 479 | 
            +
                  it 'is always enabled_insync even if current value is the same as expected' do
         | 
| 480 | 
            +
                    expect(provider).to be_enabled_insync(:false)
         | 
| 481 | 
            +
                  end
         | 
| 482 | 
            +
             | 
| 483 | 
            +
                  it 'is always enabled_insync even if current value is not the same as expected' do
         | 
| 484 | 
            +
                    expect(provider).to be_enabled_insync(:true)
         | 
| 485 | 
            +
                  end
         | 
| 486 | 
            +
             | 
| 487 | 
            +
                  it 'logs a debug messsage' do
         | 
| 488 | 
            +
                    expect(Puppet).to receive(:debug).with("Service sshd.service is in 'indirect' state and cannot be enabled/disabled")
         | 
| 489 | 
            +
                    provider.enabled_insync?(:true)
         | 
| 490 | 
            +
                  end
         | 
| 491 | 
            +
                end
         | 
| 492 | 
            +
             | 
| 493 | 
            +
                context 'when service state is enabled' do
         | 
| 494 | 
            +
                  let(:service_state) { 'enabled' }
         | 
| 495 | 
            +
             | 
| 496 | 
            +
                  it 'is enabled_insync if current value is the same as expected' do
         | 
| 497 | 
            +
                    expect(provider).to be_enabled_insync(:false)
         | 
| 498 | 
            +
                  end
         | 
| 499 | 
            +
             | 
| 500 | 
            +
                  it 'is not enabled_insync if current value is not the same as expected' do
         | 
| 501 | 
            +
                    expect(provider).not_to be_enabled_insync(:true)
         | 
| 502 | 
            +
                  end
         | 
| 503 | 
            +
             | 
| 504 | 
            +
                  it 'logs no debug messsage' do
         | 
| 505 | 
            +
                    expect(Puppet).not_to receive(:debug)
         | 
| 506 | 
            +
                    provider.enabled_insync?(:true)
         | 
| 507 | 
            +
                  end
         | 
| 508 | 
            +
                end
         | 
| 509 | 
            +
              end
         | 
| 510 | 
            +
             | 
| 431 511 | 
             
              describe "#get_start_link_count" do
         | 
| 432 512 | 
             
                it "should strip the '.service' from the search if present in the resource name" do
         | 
| 433 513 | 
             
                  provider = provider_class.new(Puppet::Type.type(:service).new(:name => 'sshd.service'))
         | 
| @@ -196,6 +196,17 @@ describe Puppet::Type.type(:user).provider(:directoryservice) do | |
| 196 196 | 
             
                }
         | 
| 197 197 | 
             
              end
         | 
| 198 198 |  | 
| 199 | 
            +
              let (:dsimport_preamble) do
         | 
| 200 | 
            +
                '0x0A 0x5C 0x3A 0x2C dsRecTypeStandard:Users 2 dsAttrTypeStandard:RecordName base64:dsAttrTypeNative:ShadowHashData'
         | 
| 201 | 
            +
              end
         | 
| 202 | 
            +
             | 
| 203 | 
            +
              let (:dsimport_contents) do
         | 
| 204 | 
            +
                <<-DSIMPORT
         | 
| 205 | 
            +
            #{dsimport_preamble}
         | 
| 206 | 
            +
            #{username}:#{Base64.strict_encode64(sha512_embedded_bplist)}
         | 
| 207 | 
            +
                DSIMPORT
         | 
| 208 | 
            +
              end
         | 
| 209 | 
            +
             | 
| 199 210 | 
             
              # The below represents output of 'dscl -plist . readall /Users' converted to
         | 
| 200 211 | 
             
              # a native Ruby hash if only one user were installed on the system.
         | 
| 201 212 | 
             
              # This lets us check the behavior of all the methods necessary to return a
         | 
| @@ -960,6 +971,24 @@ end | |
| 960 971 | 
             
                end
         | 
| 961 972 | 
             
              end
         | 
| 962 973 |  | 
| 974 | 
            +
              describe '#set_shadow_hash_data' do
         | 
| 975 | 
            +
                let(:users_plist) { {'ShadowHashData' => ['string_data'] } }
         | 
| 976 | 
            +
             | 
| 977 | 
            +
                it 'should flush the plist data to disk on OS X < 10.15' do
         | 
| 978 | 
            +
                  allow(provider.class).to receive(:get_os_version).and_return('10.12')
         | 
| 979 | 
            +
             | 
| 980 | 
            +
                  expect(provider).to receive(:write_users_plist_to_disk)
         | 
| 981 | 
            +
                  provider.set_shadow_hash_data(users_plist, pbkdf2_embedded_plist)
         | 
| 982 | 
            +
                end
         | 
| 983 | 
            +
             | 
| 984 | 
            +
                it 'should flush the plist data a temporary file on OS X >= 10.15' do
         | 
| 985 | 
            +
                  allow(provider.class).to receive(:get_os_version).and_return('10.15')
         | 
| 986 | 
            +
             | 
| 987 | 
            +
                  expect(provider).to receive(:write_and_import_shadow_hash_data)
         | 
| 988 | 
            +
                  provider.set_shadow_hash_data(users_plist, pbkdf2_embedded_plist)
         | 
| 989 | 
            +
                end
         | 
| 990 | 
            +
              end
         | 
| 991 | 
            +
             | 
| 963 992 | 
             
              describe '#set_salted_pbkdf2' do
         | 
| 964 993 | 
             
                let(:users_plist) { {'ShadowHashData' => ['string_data'] } }
         | 
| 965 994 | 
             
                let(:entropy_shadow_hash_data) do
         | 
| @@ -1011,6 +1040,18 @@ end | |
| 1011 1040 | 
             
                end
         | 
| 1012 1041 | 
             
              end
         | 
| 1013 1042 |  | 
| 1043 | 
            +
              describe '#write_and_import_shadow_hash_data' do
         | 
| 1044 | 
            +
                it 'should save the passed plist to a temporary file and import it' do
         | 
| 1045 | 
            +
                  tmpfile = double('tempfile', :path => "/tmp/dsimport_#{username}", :flush => nil)
         | 
| 1046 | 
            +
                  allow(Tempfile).to receive(:create).and_yield(tmpfile)
         | 
| 1047 | 
            +
                  allow(provider).to receive(:dscl).with('.', 'delete', user_path, 'ShadowHashData')
         | 
| 1048 | 
            +
             | 
| 1049 | 
            +
                  expect(tmpfile).to receive(:write).with(dsimport_contents)
         | 
| 1050 | 
            +
                  expect(provider).to receive(:dsimport).with(tmpfile.path, '/Local/Default', 'M')
         | 
| 1051 | 
            +
                  provider.write_and_import_shadow_hash_data(sha512_embedded_bplist)
         | 
| 1052 | 
            +
                end
         | 
| 1053 | 
            +
              end
         | 
| 1054 | 
            +
             | 
| 1014 1055 | 
             
              describe '#merge_attribute_with_dscl' do
         | 
| 1015 1056 | 
             
                it 'should raise an error if a dscl command raises an error' do
         | 
| 1016 1057 | 
             
                  expect(provider).to receive(:dscl).with('.', '-merge', user_path, 'GeneratedUID', 'GUID').and_raise(Puppet::ExecutionFailure, 'boom')
         | 
| @@ -58,14 +58,14 @@ describe Puppet::Type.type(:user).provider(:hpuxuseradd), | |
| 58 58 | 
             
                it "should add modprpw to modifycmd if Trusted System" do
         | 
| 59 59 | 
             
                  allow(resource).to receive(:allowdupe?).and_return(true)
         | 
| 60 60 | 
             
                  expect(provider).to receive(:exec_getprpw).with('root','-m uid').and_return('uid=0')
         | 
| 61 | 
            -
                  expect(provider).to receive(:execute).with(['/usr/sam/lbin/usermod.sam', '-u', 1000, '-o', 'testuser', ' | 
| 61 | 
            +
                  expect(provider).to receive(:execute).with(['/usr/sam/lbin/usermod.sam', '-F', '-u', 1000, '-o', 'testuser', ';', '/usr/lbin/modprpw', '-v', '-l', 'testuser'], hash_including(custom_environment: {}))
         | 
| 62 62 | 
             
                  provider.uid = 1000
         | 
| 63 63 | 
             
                end
         | 
| 64 64 |  | 
| 65 65 | 
             
                it "should not add modprpw if not Trusted System" do
         | 
| 66 66 | 
             
                  allow(resource).to receive(:allowdupe?).and_return(true)
         | 
| 67 67 | 
             
                  expect(provider).to receive(:exec_getprpw).with('root','-m uid').and_return('System is not trusted')
         | 
| 68 | 
            -
                  expect(provider).to receive(:execute).with(['/usr/sam/lbin/usermod.sam', '-u', 1000, '-o', 'testuser' | 
| 68 | 
            +
                  expect(provider).to receive(:execute).with(['/usr/sam/lbin/usermod.sam', '-F', '-u', 1000, '-o', 'testuser'], hash_including(custom_environment: {}))
         | 
| 69 69 | 
             
                  provider.uid = 1000
         | 
| 70 70 | 
             
                end
         | 
| 71 71 | 
             
              end
         | 
| @@ -124,7 +124,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do | |
| 124 124 |  | 
| 125 125 | 
             
                describe "on systems with the libuser and forcelocal=true" do
         | 
| 126 126 | 
             
                  before do
         | 
| 127 | 
            -
                     described_class.has_feature : | 
| 127 | 
            +
                     described_class.has_feature :manages_local_users_and_groups
         | 
| 128 128 | 
             
                     resource[:forcelocal] = true
         | 
| 129 129 | 
             
                  end
         | 
| 130 130 |  | 
| @@ -188,7 +188,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do | |
| 188 188 |  | 
| 189 189 | 
             
              describe 'when modifying the password' do
         | 
| 190 190 | 
             
                before do
         | 
| 191 | 
            -
                  described_class.has_feature : | 
| 191 | 
            +
                  described_class.has_feature :manages_local_users_and_groups
         | 
| 192 192 | 
             
                  described_class.has_feature :manages_passwords
         | 
| 193 193 | 
             
                  #Setting any resource value here initializes needed variables and methods in the resource and provider
         | 
| 194 194 | 
             
                  #Setting a password value here initializes the existence and management of the password parameter itself
         | 
| @@ -210,7 +210,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do | |
| 210 210 | 
             
              describe '#modify' do
         | 
| 211 211 | 
             
                describe "on systems with the libuser and forcelocal=false" do
         | 
| 212 212 | 
             
                  before do
         | 
| 213 | 
            -
                     described_class.has_feature : | 
| 213 | 
            +
                     described_class.has_feature :manages_local_users_and_groups
         | 
| 214 214 | 
             
                     resource[:forcelocal] = false
         | 
| 215 215 | 
             
                  end
         | 
| 216 216 |  | 
| @@ -315,16 +315,24 @@ describe Puppet::Type.type(:user).provider(:useradd) do | |
| 315 315 | 
             
                  expect(provider).to receive(:execute).with(['/usr/sbin/usermod', '-e', '', 'myuser'], hash_including(custom_environment: {}))
         | 
| 316 316 | 
             
                  provider.expiry = :absent
         | 
| 317 317 | 
             
                end
         | 
| 318 | 
            +
             | 
| 319 | 
            +
                it "should use -e with -1 when the expiry property is removed on SLES11" do
         | 
| 320 | 
            +
                  allow(Facter).to receive(:value).with(:operatingsystem).and_return('SLES')
         | 
| 321 | 
            +
                  allow(Facter).to receive(:value).with(:operatingsystemmajrelease).and_return('11')
         | 
| 322 | 
            +
                  resource[:expiry] = :absent
         | 
| 323 | 
            +
                  expect(provider).to receive(:execute).with(['/usr/sbin/usermod', '-e', -1, 'myuser'], hash_including(custom_environment: {}))
         | 
| 324 | 
            +
                  provider.expiry = :absent
         | 
| 325 | 
            +
                end
         | 
| 318 326 | 
             
              end
         | 
| 319 327 |  | 
| 320 328 | 
             
              describe "#comment" do
         | 
| 321 | 
            -
                before { described_class.has_feature : | 
| 329 | 
            +
                before { described_class.has_feature :manages_local_users_and_groups }
         | 
| 322 330 |  | 
| 323 331 | 
             
                let(:content) { "myuser:x:x:x:local comment:x:x" }
         | 
| 324 332 |  | 
| 325 333 | 
             
                it "should return the local comment string when forcelocal is true" do
         | 
| 326 334 | 
             
                  resource[:forcelocal] = true
         | 
| 327 | 
            -
                  allow(File).to receive(: | 
| 335 | 
            +
                  allow(File).to receive(:read).with('/etc/passwd').and_return(content)
         | 
| 328 336 | 
             
                  expect(provider.comment).to eq('local comment')
         | 
| 329 337 | 
             
                end
         | 
| 330 338 |  | 
| @@ -337,7 +345,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do | |
| 337 345 | 
             
              end
         | 
| 338 346 |  | 
| 339 347 | 
             
              describe "#finduser" do
         | 
| 340 | 
            -
                before { allow(File).to receive(: | 
| 348 | 
            +
                before { allow(File).to receive(:read).with('/etc/passwd').and_return(content) }
         | 
| 341 349 |  | 
| 342 350 | 
             
                let(:content) { "sample_account:sample_password:sample_uid:sample_gid:sample_gecos:sample_directory:sample_shell" }
         | 
| 343 351 | 
             
                let(:output) do
         | 
| @@ -361,6 +369,11 @@ describe Puppet::Type.type(:user).provider(:useradd) do | |
| 361 369 | 
             
                it "returns false when specified key/value pair is not found" do
         | 
| 362 370 | 
             
                  expect(provider.finduser(:account, 'invalid_account')).to eq(false)
         | 
| 363 371 | 
             
                end
         | 
| 372 | 
            +
             | 
| 373 | 
            +
                it "reads the user file only once per resource" do
         | 
| 374 | 
            +
                  expect(File).to receive(:read).with('/etc/passwd').once
         | 
| 375 | 
            +
                  5.times { provider.finduser(:account, 'sample_account') }
         | 
| 376 | 
            +
                end
         | 
| 364 377 | 
             
              end
         | 
| 365 378 |  | 
| 366 379 | 
             
              describe "#check_allow_dup" do
         | 
| @@ -696,7 +709,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do | |
| 696 709 |  | 
| 697 710 | 
             
                describe "on systems with the libuser and forcelocal=false" do
         | 
| 698 711 | 
             
                  before do
         | 
| 699 | 
            -
                     described_class.has_feature : | 
| 712 | 
            +
                     described_class.has_feature :manages_local_users_and_groups
         | 
| 700 713 | 
             
                     resource[:forcelocal] = false
         | 
| 701 714 | 
             
                  end
         | 
| 702 715 |  | 
| @@ -708,7 +721,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do | |
| 708 721 |  | 
| 709 722 | 
             
                describe "on systems with the libuser and forcelocal=true" do
         | 
| 710 723 | 
             
                  before do
         | 
| 711 | 
            -
                     described_class.has_feature : | 
| 724 | 
            +
                     described_class.has_feature :manages_local_users_and_groups
         | 
| 712 725 | 
             
                     resource[:forcelocal] = true
         | 
| 713 726 | 
             
                  end
         | 
| 714 727 |  |