puppet 5.5.16-x64-mingw32 → 5.5.21-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 +10 -10
- data/Gemfile +2 -3
- data/Gemfile.lock +57 -52
- data/ext/build_defaults.yaml +1 -0
- data/ext/cert_inspector +3 -3
- data/ext/project_data.yaml +2 -2
- data/ext/puppet-test +2 -2
- data/ext/regexp_nodes/regexp_nodes.rb +4 -4
- data/ext/windows/service/daemon.rb +54 -8
- data/install.rb +6 -24
- data/lib/puppet.rb +5 -2
- data/lib/puppet/agent.rb +5 -13
- data/lib/puppet/application.rb +1 -1
- data/lib/puppet/application/agent.rb +15 -1
- data/lib/puppet/application/apply.rb +2 -2
- data/lib/puppet/application/describe.rb +3 -9
- data/lib/puppet/application/device.rb +4 -4
- data/lib/puppet/application/doc.rb +1 -1
- data/lib/puppet/application/filebucket.rb +13 -0
- data/lib/puppet/application/lookup.rb +1 -1
- data/lib/puppet/application/resource.rb +4 -4
- data/lib/puppet/application/script.rb +2 -2
- data/lib/puppet/configurer.rb +86 -28
- data/lib/puppet/configurer/downloader.rb +2 -6
- data/lib/puppet/daemon.rb +1 -1
- data/lib/puppet/defaults.rb +82 -38
- data/lib/puppet/error.rb +9 -1
- data/lib/puppet/external/nagios/base.rb +1 -1
- data/lib/puppet/face/ca.rb +1 -1
- data/lib/puppet/face/config.rb +10 -48
- data/lib/puppet/face/facts.rb +1 -1
- data/lib/puppet/face/module/list.rb +5 -5
- data/lib/puppet/face/module/search.rb +1 -1
- data/lib/puppet/face/module/uninstall.rb +1 -1
- data/lib/puppet/face/module/upgrade.rb +1 -1
- data/lib/puppet/face/plugin.rb +9 -2
- data/lib/puppet/file_serving/http_metadata.rb +1 -1
- data/lib/puppet/file_system.rb +0 -8
- data/lib/puppet/file_system/memory_file.rb +1 -1
- data/lib/puppet/file_system/posix.rb +3 -2
- data/lib/puppet/file_system/uniquefile.rb +4 -0
- data/lib/puppet/forge.rb +3 -3
- data/lib/puppet/functions/epp.rb +4 -4
- data/lib/puppet/functions/inline_epp.rb +5 -5
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/gettext/module_translations.rb +1 -1
- data/lib/puppet/graph/rb_tree_map.rb +2 -2
- data/lib/puppet/graph/simple_graph.rb +6 -5
- data/lib/puppet/indirector/catalog/compiler.rb +8 -0
- data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
- data/lib/puppet/indirector/hiera.rb +2 -0
- data/lib/puppet/indirector/resource/ral.rb +1 -3
- data/lib/puppet/indirector/resource/validator.rb +1 -1
- data/lib/puppet/interface.rb +2 -1
- data/lib/puppet/loaders.rb +0 -1
- data/lib/puppet/metatype/manager.rb +1 -1
- data/lib/puppet/module.rb +1 -1
- data/lib/puppet/module_tool/applications/builder.rb +1 -1
- data/lib/puppet/module_tool/applications/installer.rb +1 -1
- data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
- data/lib/puppet/module_tool/metadata.rb +1 -1
- data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
- data/lib/puppet/module_tool/tar/mini.rb +12 -2
- data/lib/puppet/network/http/api/indirected_routes.rb +13 -12
- data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
- data/lib/puppet/network/http/connection.rb +14 -12
- data/lib/puppet/network/http/factory.rb +1 -11
- data/lib/puppet/network/http/pool.rb +7 -1
- data/lib/puppet/network/http/rack/rest.rb +2 -2
- data/lib/puppet/network/http/site.rb +1 -1
- data/lib/puppet/network/resolver.rb +2 -2
- data/lib/puppet/node/environment.rb +4 -2
- data/lib/puppet/parameter.rb +8 -0
- data/lib/puppet/parser/ast.rb +1 -1
- data/lib/puppet/parser/ast/resourceparam.rb +1 -1
- 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 +3 -0
- data/lib/puppet/parser/functions.rb +1 -1
- data/lib/puppet/parser/functions/epp.rb +3 -3
- data/lib/puppet/parser/functions/inline_epp.rb +5 -5
- 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/collectors/catalog_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
- data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
- data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
- data/lib/puppet/pops/issues.rb +5 -0
- data/lib/puppet/pops/loaders.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
- data/lib/puppet/pops/merge_strategy.rb +22 -18
- data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
- data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
- data/lib/puppet/pops/parser/locator.rb +1 -1
- data/lib/puppet/pops/parser/pn_parser.rb +17 -16
- data/lib/puppet/pops/puppet_stack.rb +51 -48
- data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
- data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
- data/lib/puppet/pops/types/string_converter.rb +10 -10
- data/lib/puppet/pops/types/type_calculator.rb +24 -0
- data/lib/puppet/pops/types/types.rb +3 -3
- data/lib/puppet/pops/validation/checker4_0.rb +10 -0
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/property/ensure.rb +1 -1
- data/lib/puppet/provider/augeas/augeas.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +1 -1
- data/lib/puppet/provider/exec.rb +6 -2
- data/lib/puppet/provider/file/posix.rb +5 -0
- data/lib/puppet/provider/group/groupadd.rb +19 -19
- data/lib/puppet/provider/group/windows_adsi.rb +3 -3
- data/lib/puppet/provider/mailalias/aliases.rb +1 -1
- data/lib/puppet/provider/mount.rb +1 -1
- data/lib/puppet/provider/mount/parsed.rb +8 -8
- data/lib/puppet/provider/nameservice.rb +10 -3
- data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
- data/lib/puppet/provider/nameservice/pw.rb +2 -2
- data/lib/puppet/provider/package/aix.rb +17 -2
- data/lib/puppet/provider/package/apt.rb +14 -3
- data/lib/puppet/provider/package/dnf.rb +1 -1
- data/lib/puppet/provider/package/dnfmodule.rb +141 -0
- data/lib/puppet/provider/package/dpkg.rb +16 -18
- data/lib/puppet/provider/package/fink.rb +20 -3
- data/lib/puppet/provider/package/openbsd.rb +14 -2
- data/lib/puppet/provider/package/pip.rb +37 -10
- 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 +4 -4
- data/lib/puppet/provider/package/rpm.rb +57 -19
- data/lib/puppet/provider/package/windows/package.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +35 -24
- data/lib/puppet/provider/package/zypper.rb +1 -0
- data/lib/puppet/provider/package_targetable.rb +5 -4
- data/lib/puppet/provider/parsedfile.rb +1 -1
- data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +3 -3
- data/lib/puppet/provider/selmodule/semodule.rb +43 -26
- data/lib/puppet/provider/service/daemontools.rb +9 -9
- data/lib/puppet/provider/service/launchd.rb +20 -5
- data/lib/puppet/provider/service/openbsd.rb +1 -1
- data/lib/puppet/provider/service/rcng.rb +2 -2
- data/lib/puppet/provider/service/runit.rb +2 -8
- data/lib/puppet/provider/service/systemd.rb +35 -22
- data/lib/puppet/provider/service/windows.rb +8 -0
- data/lib/puppet/provider/user/directoryservice.rb +31 -6
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/pw.rb +12 -3
- data/lib/puppet/provider/user/user_role_add.rb +5 -1
- data/lib/puppet/provider/user/useradd.rb +62 -27
- data/lib/puppet/provider/user/windows_adsi.rb +4 -5
- data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
- data/lib/puppet/reference/indirection.rb +2 -2
- data/lib/puppet/reference/metaparameter.rb +1 -3
- data/lib/puppet/reference/providers.rb +1 -1
- data/lib/puppet/reference/type.rb +3 -9
- data/lib/puppet/reports.rb +1 -1
- data/lib/puppet/resource.rb +18 -1
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/resource/type.rb +8 -0
- data/lib/puppet/settings.rb +43 -3
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/ssl/certificate.rb +2 -1
- data/lib/puppet/ssl/certificate_authority.rb +6 -5
- data/lib/puppet/ssl/certificate_authority/interface.rb +1 -1
- data/lib/puppet/ssl/certificate_factory.rb +2 -2
- data/lib/puppet/ssl/host.rb +3 -3
- data/lib/puppet/ssl/oids.rb +1 -1
- data/lib/puppet/test/test_helper.rb +15 -10
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/transaction/resource_harness.rb +1 -1
- data/lib/puppet/type.rb +15 -4
- data/lib/puppet/type/cron.rb +1 -1
- data/lib/puppet/type/exec.rb +21 -9
- data/lib/puppet/type/file.rb +14 -2
- data/lib/puppet/type/file/data_sync.rb +5 -1
- data/lib/puppet/type/group.rb +4 -2
- data/lib/puppet/type/interface.rb +1 -1
- data/lib/puppet/type/notify.rb +3 -2
- data/lib/puppet/type/package.rb +107 -8
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/selboolean.rb +17 -3
- data/lib/puppet/type/service.rb +9 -10
- data/lib/puppet/type/user.rb +6 -24
- data/lib/puppet/type/yumrepo.rb +3 -7
- data/lib/puppet/util.rb +47 -25
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/execution.rb +4 -3
- data/lib/puppet/util/http_proxy.rb +24 -16
- data/lib/puppet/util/instance_loader.rb +1 -1
- data/lib/puppet/util/log.rb +1 -1
- data/lib/puppet/util/log/destinations.rb +3 -12
- data/lib/puppet/util/logging.rb +30 -18
- data/lib/puppet/util/metric.rb +2 -2
- data/lib/puppet/util/monkey_patches.rb +1 -1
- data/lib/puppet/util/nagios_maker.rb +2 -2
- data/lib/puppet/util/network_device/cisco/device.rb +1 -1
- data/lib/puppet/util/network_device/cisco/interface.rb +2 -2
- data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
- data/lib/puppet/util/pidlock.rb +12 -6
- data/lib/puppet/util/plist.rb +6 -0
- data/lib/puppet/util/provider_features.rb +2 -4
- data/lib/puppet/util/rdoc.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/resource_template.rb +1 -1
- data/lib/puppet/util/selinux.rb +8 -2
- data/lib/puppet/util/windows/adsi.rb +60 -30
- 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 +16 -15
- data/lib/puppet/util/windows/registry.rb +17 -15
- data/lib/puppet/util/windows/security.rb +3 -0
- data/lib/puppet/util/windows/service.rb +149 -4
- data/lib/puppet/util/windows/sid.rb +4 -3
- data/lib/puppet/vendor.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet_pal.rb +2 -2
- data/locales/puppet.pot +479 -443
- data/man/man5/puppet.conf.5 +38 -8
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-ca.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-cert.8 +1 -1
- data/man/man8/puppet-certificate.8 +1 -1
- data/man/man8/puppet-certificate_request.8 +1 -1
- data/man/man8/puppet-certificate_revocation_list.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 +1 -1
- 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 +16 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- 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-master.8 +1 -1
- data/man/man8/puppet-module.8 +1 -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-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/provider/mailalias/aliases/test1 +1 -0
- data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list.txt +19 -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/service/systemd/list_unit_files_services +9 -0
- data/spec/integration/configurer_spec.rb +52 -0
- data/spec/integration/defaults_spec.rb +1 -2
- data/spec/integration/indirector/facts/facter_spec.rb +4 -0
- data/spec/integration/parser/compiler_spec.rb +11 -0
- data/spec/integration/provider/service/systemd_spec.rb +8 -5
- data/spec/integration/type/file_spec.rb +28 -0
- data/spec/integration/type/notify_spec.rb +46 -0
- data/spec/integration/util/execution_spec.rb +27 -0
- data/spec/integration/util/windows/adsi_spec.rb +6 -1
- data/spec/integration/util/windows/registry_spec.rb +7 -7
- data/spec/unit/agent_spec.rb +34 -26
- data/spec/unit/application/agent_spec.rb +18 -0
- data/spec/unit/application/apply_spec.rb +2 -12
- data/spec/unit/application/device_spec.rb +1 -1
- data/spec/unit/configurer/fact_handler_spec.rb +0 -4
- data/spec/unit/configurer_spec.rb +377 -397
- data/spec/unit/daemon_spec.rb +0 -1
- data/spec/unit/face/facts_spec.rb +9 -0
- data/spec/unit/face/plugin_spec.rb +8 -0
- data/spec/unit/file_system/uniquefile_spec.rb +11 -0
- data/spec/unit/forge/forge_spec.rb +1 -3
- data/spec/unit/forge/repository_spec.rb +1 -3
- data/spec/unit/indirector/catalog/compiler_spec.rb +45 -26
- data/spec/unit/indirector/resource/ral_spec.rb +4 -4
- data/spec/unit/module_tool/tar/mini_spec.rb +1 -1
- data/spec/unit/network/http/api/indirected_routes_spec.rb +28 -11
- data/spec/unit/network/http/connection_spec.rb +43 -1
- data/spec/unit/network/http/factory_spec.rb +27 -5
- data/spec/unit/network/http/pool_spec.rb +32 -0
- data/spec/unit/node_spec.rb +7 -4
- data/spec/unit/parser/environment_compiler_spec.rb +7 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
- data/spec/unit/pops/validator/validator_spec.rb +7 -0
- data/spec/unit/provider/exec_spec.rb +209 -0
- data/spec/unit/provider/group/groupadd_spec.rb +30 -1
- 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 +13 -2
- data/spec/unit/provider/package/aptitude_spec.rb +1 -0
- data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
- data/spec/unit/provider/package/dnf_spec.rb +7 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +247 -0
- data/spec/unit/provider/package/dpkg_spec.rb +35 -7
- data/spec/unit/provider/package/openbsd_spec.rb +17 -0
- data/spec/unit/provider/package/pip_spec.rb +93 -22
- data/spec/unit/provider/package/pkg_spec.rb +13 -1
- data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
- data/spec/unit/provider/package/pkgng_spec.rb +36 -0
- data/spec/unit/provider/package/portage_spec.rb +4 -4
- data/spec/unit/provider/package/rpm_spec.rb +150 -16
- data/spec/unit/provider/package/yum_spec.rb +66 -0
- data/spec/unit/provider/package/zypper_spec.rb +13 -0
- data/spec/unit/provider/package_targetable_spec.rb +60 -0
- data/spec/unit/provider/selmodule_spec.rb +118 -47
- data/spec/unit/provider/service/daemontools_spec.rb +24 -0
- data/spec/unit/provider/service/launchd_spec.rb +28 -0
- data/spec/unit/provider/service/runit_spec.rb +24 -0
- data/spec/unit/provider/service/systemd_spec.rb +109 -36
- data/spec/unit/provider/service/windows_spec.rb +20 -0
- 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/openbsd_spec.rb +1 -0
- data/spec/unit/provider/user/pw_spec.rb +37 -0
- data/spec/unit/provider/user/useradd_spec.rb +122 -15
- data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
- data/spec/unit/puppet_pal_2pec.rb +3 -0
- data/spec/unit/resource_spec.rb +26 -1
- data/spec/unit/ssl/certificate_authority_spec.rb +2 -3
- data/spec/unit/ssl/certificate_spec.rb +7 -0
- data/spec/unit/test/test_helper_spec.rb +17 -0
- data/spec/unit/transaction_spec.rb +18 -0
- data/spec/unit/type/exec_spec.rb +15 -12
- data/spec/unit/type/file/content_spec.rb +9 -3
- data/spec/unit/type/file/source_spec.rb +4 -4
- data/spec/unit/type/file_spec.rb +9 -4
- data/spec/unit/type/package_spec.rb +8 -0
- data/spec/unit/type/schedule_spec.rb +3 -1
- data/spec/unit/type/selboolean_spec.rb +4 -6
- data/spec/unit/type/service_spec.rb +25 -8
- data/spec/unit/type/user_spec.rb +32 -26
- data/spec/unit/type/yumrepo_spec.rb +30 -0
- data/spec/unit/type_spec.rb +40 -0
- data/spec/unit/util/execution_spec.rb +16 -0
- data/spec/unit/util/http_proxy_spec.rb +121 -1
- data/spec/unit/util/log/destinations_spec.rb +2 -26
- data/spec/unit/util/log_spec.rb +0 -112
- data/spec/unit/util/logging_spec.rb +200 -0
- data/spec/unit/util/pidlock_spec.rb +67 -40
- data/spec/unit/util/plist_spec.rb +20 -0
- data/spec/unit/util/windows/adsi_spec.rb +55 -4
- data/spec/unit/util/windows/api_types_spec.rb +104 -40
- data/spec/unit/util/windows/service_spec.rb +9 -0
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/tasks/manpages.rake +1 -0
- metadata +18 -13
- data/ext/windows/eventlog/Rakefile +0 -32
- data/ext/windows/eventlog/puppetres.dll +0 -0
- data/ext/windows/eventlog/puppetres.mc +0 -18
- data/lib/puppet/pops/loader/null_loader.rb +0 -60
- data/locales/ja/puppet.po +0 -12114
- data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -590,6 +590,24 @@ describe Puppet::Application::Agent do
|
|
590
590
|
end
|
591
591
|
end
|
592
592
|
|
593
|
+
describe "when starting in daemon mode on non-windows", :unless => Puppet.features.microsoft_windows? do
|
594
|
+
before :each do
|
595
|
+
allow(Puppet).to receive(:notice)
|
596
|
+
Puppet[:daemonize] = true
|
597
|
+
end
|
598
|
+
|
599
|
+
it "should not print config in default mode" do
|
600
|
+
execute_agent
|
601
|
+
expect(@logs).to be_empty
|
602
|
+
end
|
603
|
+
|
604
|
+
it "should print config in debug mode" do
|
605
|
+
@puppetd.options[:debug] = true
|
606
|
+
execute_agent
|
607
|
+
expect(@logs).to include(an_object_having_attributes(level: :debug, message: /agent_catalog_run_lockfile=/))
|
608
|
+
end
|
609
|
+
end
|
610
|
+
|
593
611
|
def execute_agent
|
594
612
|
@puppetd.setup
|
595
613
|
@puppetd.run_command
|
@@ -14,14 +14,6 @@ describe Puppet::Application::Apply do
|
|
14
14
|
Puppet[:reports] = "none"
|
15
15
|
end
|
16
16
|
|
17
|
-
after :each do
|
18
|
-
Puppet::Node::Facts.indirection.reset_terminus_class
|
19
|
-
Puppet::Node::Facts.indirection.cache_class = nil
|
20
|
-
|
21
|
-
Puppet::Node.indirection.reset_terminus_class
|
22
|
-
Puppet::Node.indirection.cache_class = nil
|
23
|
-
end
|
24
|
-
|
25
17
|
[:debug,:loadclasses,:test,:verbose,:use_nodes,:detailed_exitcodes,:catalog, :write_catalog_summary].each do |option|
|
26
18
|
it "should declare handle_#{option} method" do
|
27
19
|
expect(@apply).to respond_to("handle_#{option}".to_sym)
|
@@ -182,13 +174,11 @@ describe Puppet::Application::Apply do
|
|
182
174
|
Puppet[:prerun_command] = ''
|
183
175
|
Puppet[:postrun_command] = ''
|
184
176
|
|
185
|
-
Puppet::Node::Facts.indirection.terminus_class = :memory
|
186
|
-
Puppet::Node::Facts.indirection.cache_class = :memory
|
187
177
|
Puppet::Node.indirection.terminus_class = :memory
|
188
178
|
Puppet::Node.indirection.cache_class = :memory
|
189
179
|
|
190
|
-
|
191
|
-
Puppet::Node::Facts.indirection.save(
|
180
|
+
facts = Puppet::Node::Facts.new(Puppet[:node_name_value])
|
181
|
+
Puppet::Node::Facts.indirection.save(facts)
|
192
182
|
|
193
183
|
@node = Puppet::Node.new(Puppet[:node_name_value])
|
194
184
|
Puppet::Node.indirection.save(@node)
|
@@ -481,7 +481,7 @@ describe Puppet::Application::Device do
|
|
481
481
|
allow(@device.options).to receive(:[]).with(:to_yaml).and_return(true)
|
482
482
|
allow(@device.command_line).to receive(:args).and_return(['user'])
|
483
483
|
expect(Puppet::Resource.indirection).to receive(:search).with('user/', {}).and_return(resources)
|
484
|
-
expect(@device).to receive(:puts).with("
|
484
|
+
expect(@device).to receive(:puts).with("---\nuser:\n title: {}\n")
|
485
485
|
expect { @device.main }.to exit_with 0
|
486
486
|
end
|
487
487
|
|
@@ -22,10 +22,6 @@ describe Puppet::Configurer::FactHandler do
|
|
22
22
|
|
23
23
|
let(:facthandler) { FactHandlerTester.new('production') }
|
24
24
|
|
25
|
-
before :each do
|
26
|
-
Puppet::Node::Facts.indirection.terminus_class = :memory
|
27
|
-
end
|
28
|
-
|
29
25
|
describe "when finding facts" do
|
30
26
|
it "should use the node name value to retrieve the facts" do
|
31
27
|
foo_facts = Puppet::Node::Facts.new('foo')
|
@@ -1,108 +1,89 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'puppet/configurer'
|
3
|
+
require 'webmock/rspec'
|
3
4
|
|
4
5
|
describe Puppet::Configurer do
|
5
6
|
before do
|
6
|
-
allow(Puppet.settings).to receive(:use).and_return(true)
|
7
|
-
@agent = Puppet::Configurer.new
|
8
|
-
allow(@agent).to receive(:init_storage)
|
9
|
-
allow(Puppet::Util::Storage).to receive(:store)
|
10
7
|
Puppet[:server] = "puppetmaster"
|
11
8
|
Puppet[:report] = true
|
12
|
-
end
|
13
9
|
|
14
|
-
|
15
|
-
|
10
|
+
catalog.add_resource(resource)
|
11
|
+
|
12
|
+
allow(Puppet::SSL::Host).to receive(:localhost).and_return(double('host'))
|
16
13
|
end
|
17
14
|
|
15
|
+
let(:configurer) { Puppet::Configurer.new }
|
16
|
+
let(:report) { Puppet::Transaction::Report.new }
|
17
|
+
let(:catalog) { Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym)) }
|
18
|
+
let(:resource) { Puppet::Resource.new(:notice, 'a') }
|
19
|
+
let(:facts) { Puppet::Node::Facts.new(Puppet[:node_name_value]) }
|
20
|
+
|
18
21
|
describe "when executing a pre-run hook" do
|
19
22
|
it "should do nothing if the hook is set to an empty string" do
|
20
23
|
Puppet.settings[:prerun_command] = ""
|
21
|
-
expect(Puppet::Util).not_to receive(:
|
24
|
+
expect(Puppet::Util::Execution).not_to receive(:execute)
|
22
25
|
|
23
|
-
|
26
|
+
configurer.execute_prerun_command
|
24
27
|
end
|
25
28
|
|
26
29
|
it "should execute any pre-run command provided via the 'prerun_command' setting" do
|
27
30
|
Puppet.settings[:prerun_command] = "/my/command"
|
28
31
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
29
32
|
|
30
|
-
|
33
|
+
configurer.execute_prerun_command
|
31
34
|
end
|
32
35
|
|
33
36
|
it "should fail if the command fails" do
|
34
37
|
Puppet.settings[:prerun_command] = "/my/command"
|
35
38
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
36
39
|
|
37
|
-
expect(
|
40
|
+
expect(configurer.execute_prerun_command).to be_falsey
|
38
41
|
end
|
39
42
|
end
|
40
43
|
|
41
44
|
describe "when executing a post-run hook" do
|
42
45
|
it "should do nothing if the hook is set to an empty string" do
|
43
46
|
Puppet.settings[:postrun_command] = ""
|
44
|
-
expect(Puppet::Util).not_to receive(:
|
47
|
+
expect(Puppet::Util::Execution).not_to receive(:execute)
|
45
48
|
|
46
|
-
|
49
|
+
configurer.execute_postrun_command
|
47
50
|
end
|
48
51
|
|
49
52
|
it "should execute any post-run command provided via the 'postrun_command' setting" do
|
50
53
|
Puppet.settings[:postrun_command] = "/my/command"
|
51
54
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
52
55
|
|
53
|
-
|
56
|
+
configurer.execute_postrun_command
|
54
57
|
end
|
55
58
|
|
56
59
|
it "should fail if the command fails" do
|
57
60
|
Puppet.settings[:postrun_command] = "/my/command"
|
58
61
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
59
62
|
|
60
|
-
expect(
|
63
|
+
expect(configurer.execute_postrun_command).to be_falsey
|
61
64
|
end
|
62
65
|
end
|
63
66
|
|
64
67
|
describe "when executing a catalog run" do
|
65
68
|
before do
|
66
|
-
allow(Puppet.settings).to receive(:use).and_return(true)
|
67
|
-
allow(@agent).to receive(:download_plugins)
|
68
|
-
Puppet::Node::Facts.indirection.terminus_class = :memory
|
69
|
-
@facts = Puppet::Node::Facts.new(Puppet[:node_name_value])
|
70
|
-
Puppet::Node::Facts.indirection.save(@facts)
|
71
|
-
|
72
|
-
@catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
|
73
|
-
allow(@catalog).to receive(:to_ral).and_return(@catalog)
|
74
69
|
Puppet::Resource::Catalog.indirection.terminus_class = :rest
|
75
|
-
allow(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(
|
76
|
-
allow(@agent).to receive(:send_report)
|
77
|
-
allow(@agent).to receive(:save_last_run_summary)
|
78
|
-
|
79
|
-
allow(Puppet::Util::Log).to receive(:close_all)
|
80
|
-
end
|
81
|
-
|
82
|
-
after :all do
|
83
|
-
Puppet::Node::Facts.indirection.reset_terminus_class
|
84
|
-
Puppet::Resource::Catalog.indirection.reset_terminus_class
|
85
|
-
end
|
86
|
-
|
87
|
-
it "should initialize storage" do
|
88
|
-
expect(Puppet::Util::Storage).to receive(:load)
|
89
|
-
@agent.run
|
70
|
+
allow(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(catalog)
|
90
71
|
end
|
91
72
|
|
92
73
|
it "downloads plugins when told" do
|
93
|
-
expect(
|
94
|
-
|
74
|
+
expect(configurer).to receive(:download_plugins)
|
75
|
+
configurer.run(:pluginsync => true)
|
95
76
|
end
|
96
77
|
|
97
78
|
it "does not download plugins when told" do
|
98
|
-
expect(
|
99
|
-
|
79
|
+
expect(configurer).not_to receive(:download_plugins)
|
80
|
+
configurer.run(:pluginsync => false)
|
100
81
|
end
|
101
82
|
|
102
83
|
it "should carry on when it can't fetch its node definition" do
|
103
84
|
error = Net::HTTPError.new(400, 'dummy server communication error')
|
104
85
|
expect(Puppet::Node.indirection).to receive(:find).and_raise(error)
|
105
|
-
expect(
|
86
|
+
expect(configurer.run).to eq(0)
|
106
87
|
end
|
107
88
|
|
108
89
|
it "applies a cached catalog when it can't connect to the master" do
|
@@ -110,200 +91,157 @@ describe Puppet::Configurer do
|
|
110
91
|
|
111
92
|
expect(Puppet::Node.indirection).to receive(:find).and_raise(error)
|
112
93
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_cache => true)).and_raise(error)
|
113
|
-
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_terminus => true)).and_return(
|
94
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_terminus => true)).and_return(catalog)
|
114
95
|
|
115
|
-
expect(
|
96
|
+
expect(configurer.run).to eq(0)
|
116
97
|
end
|
117
98
|
|
118
99
|
it "should initialize a transaction report if one is not provided" do
|
119
|
-
report = Puppet::Transaction::Report.new
|
120
100
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
121
101
|
|
122
|
-
|
102
|
+
configurer.run
|
123
103
|
end
|
124
104
|
|
125
105
|
it "should respect node_name_fact when setting the host on a report" do
|
126
106
|
Puppet[:node_name_fact] = 'my_name_fact'
|
127
|
-
|
107
|
+
facts.values = {'my_name_fact' => 'node_name_from_fact'}
|
108
|
+
Puppet::Node::Facts.indirection.save(facts)
|
128
109
|
|
129
|
-
report
|
130
|
-
|
131
|
-
@agent.run(:report => report)
|
110
|
+
configurer.run(:report => report)
|
132
111
|
expect(report.host).to eq('node_name_from_fact')
|
133
112
|
end
|
134
113
|
|
135
|
-
it "
|
136
|
-
|
137
|
-
|
138
|
-
expect(@catalog).to receive(:apply).with(hash_including(report: report))
|
139
|
-
|
140
|
-
@agent.run
|
141
|
-
end
|
142
|
-
|
143
|
-
it "should use the provided report if it was passed one" do
|
144
|
-
report = Puppet::Transaction::Report.new
|
145
|
-
expect(@catalog).to receive(:apply).with(hash_including(report: report))
|
146
|
-
|
147
|
-
@agent.run(:report => report)
|
148
|
-
end
|
149
|
-
|
150
|
-
it "should set the report as a log destination" do
|
151
|
-
report = Puppet::Transaction::Report.new
|
152
|
-
|
153
|
-
expect(report).to receive(:<<).with(instance_of(Puppet::Util::Log)).at_least(:once)
|
114
|
+
it "creates a new report when applying the catalog" do
|
115
|
+
options = {}
|
116
|
+
configurer.run(options)
|
154
117
|
|
155
|
-
|
118
|
+
expect(options[:report].metrics['time']['catalog_application']).to be_an_instance_of(Float)
|
156
119
|
end
|
157
120
|
|
158
|
-
it "
|
159
|
-
|
121
|
+
it "uses the provided report when applying the catalog" do
|
122
|
+
configurer.run(:report => report)
|
160
123
|
|
161
|
-
|
124
|
+
expect(report.metrics['time']['catalog_application']).to be_an_instance_of(Float)
|
162
125
|
end
|
163
126
|
|
164
127
|
it "should log a failure and do nothing if no catalog can be retrieved" do
|
165
|
-
expect(
|
128
|
+
expect(configurer).to receive(:retrieve_catalog).and_return(nil)
|
166
129
|
|
167
130
|
expect(Puppet).to receive(:err).with("Could not retrieve catalog; skipping run")
|
168
131
|
|
169
|
-
|
170
|
-
end
|
171
|
-
|
172
|
-
it "should apply the catalog with all options to :run" do
|
173
|
-
expect(@agent).to receive(:retrieve_catalog).and_return(@catalog)
|
174
|
-
|
175
|
-
expect(@catalog).to receive(:apply).with(hash_including(one: true))
|
176
|
-
@agent.run :one => true
|
132
|
+
configurer.run
|
177
133
|
end
|
178
134
|
|
179
|
-
it "
|
180
|
-
expect(
|
135
|
+
it "passes arbitrary options when applying the catalog" do
|
136
|
+
expect(catalog).to receive(:apply).with(hash_including(one: true))
|
181
137
|
|
182
|
-
|
183
|
-
@agent.run :one => true, :catalog => @catalog
|
138
|
+
configurer.run(catalog: catalog, one: true)
|
184
139
|
end
|
185
140
|
|
186
141
|
it "should benchmark how long it takes to apply the catalog" do
|
187
|
-
|
188
|
-
|
189
|
-
expect(@agent).to receive(:retrieve_catalog).and_return(@catalog)
|
190
|
-
|
191
|
-
expect(@catalog).not_to receive(:apply) # because we're not yielding
|
192
|
-
@agent.run
|
193
|
-
end
|
194
|
-
|
195
|
-
it "should execute post-run hooks after the run" do
|
196
|
-
expect(@agent).to receive(:execute_postrun_command)
|
142
|
+
configurer.run(report: report)
|
197
143
|
|
198
|
-
|
144
|
+
expect(report.logs).to include(an_object_having_attributes(level: :notice, message: /Applied catalog in .* seconds/))
|
199
145
|
end
|
200
146
|
|
201
147
|
it "should create report with passed transaction_uuid and job_id" do
|
202
|
-
|
203
|
-
allow(@agent).to receive(:init_storage)
|
148
|
+
configurer = Puppet::Configurer.new("test_tuuid", "test_jid")
|
204
149
|
|
205
150
|
report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
|
206
151
|
expect(Puppet::Transaction::Report).to receive(:new).with(anything, anything, 'test_tuuid', 'test_jid').and_return(report)
|
207
|
-
expect(
|
152
|
+
expect(configurer).to receive(:send_report).with(report)
|
208
153
|
|
209
|
-
|
154
|
+
configurer.run
|
210
155
|
end
|
211
156
|
|
212
157
|
it "should send the report" do
|
213
158
|
report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
|
214
159
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
215
|
-
expect(
|
160
|
+
expect(configurer).to receive(:send_report).with(report)
|
216
161
|
|
217
162
|
expect(report.environment).to eq("test")
|
218
163
|
expect(report.transaction_uuid).to eq("aaaa")
|
219
164
|
|
220
|
-
|
165
|
+
configurer.run
|
221
166
|
end
|
222
167
|
|
223
168
|
it "should send the transaction report even if the catalog could not be retrieved" do
|
224
|
-
expect(
|
169
|
+
expect(configurer).to receive(:retrieve_catalog).and_return(nil)
|
225
170
|
|
226
171
|
report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
|
227
172
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
228
|
-
expect(
|
173
|
+
expect(configurer).to receive(:send_report).with(report)
|
229
174
|
|
230
175
|
expect(report.environment).to eq("test")
|
231
176
|
expect(report.transaction_uuid).to eq("aaaa")
|
232
177
|
|
233
|
-
|
178
|
+
configurer.run
|
234
179
|
end
|
235
180
|
|
236
181
|
it "should send the transaction report even if there is a failure" do
|
237
|
-
expect(
|
182
|
+
expect(configurer).to receive(:retrieve_catalog).and_raise("whatever")
|
238
183
|
|
239
184
|
report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
|
240
185
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
241
|
-
expect(
|
186
|
+
expect(configurer).to receive(:send_report).with(report)
|
242
187
|
|
243
188
|
expect(report.environment).to eq("test")
|
244
189
|
expect(report.transaction_uuid).to eq("aaaa")
|
245
190
|
|
246
|
-
expect(
|
191
|
+
expect(configurer.run).to be_nil
|
247
192
|
end
|
248
193
|
|
249
194
|
it "should remove the report as a log destination when the run is finished" do
|
250
|
-
report = Puppet::Transaction::Report.new
|
251
195
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
252
196
|
|
253
|
-
|
197
|
+
configurer.run
|
254
198
|
|
255
199
|
expect(Puppet::Util::Log.destinations).not_to include(report)
|
256
200
|
end
|
257
201
|
|
258
202
|
it "should return the report exit_status as the result of the run" do
|
259
|
-
report = Puppet::Transaction::Report.new
|
260
203
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
261
204
|
expect(report).to receive(:exit_status).and_return(1234)
|
262
205
|
|
263
|
-
expect(
|
206
|
+
expect(configurer.run).to eq(1234)
|
264
207
|
end
|
265
208
|
|
266
209
|
it "should return nil if catalog application fails" do
|
267
|
-
|
268
|
-
report
|
269
|
-
expect(@agent.run(catalog: @catalog, report: report)).to be_nil
|
210
|
+
expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
|
211
|
+
expect(configurer.run(catalog: catalog, report: report)).to be_nil
|
270
212
|
end
|
271
213
|
|
272
214
|
it "should send the transaction report even if the pre-run command fails" do
|
273
|
-
report = Puppet::Transaction::Report.new
|
274
215
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
275
216
|
|
276
217
|
Puppet.settings[:prerun_command] = "/my/command"
|
277
218
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
278
|
-
expect(
|
219
|
+
expect(configurer).to receive(:send_report).with(report)
|
279
220
|
|
280
|
-
expect(
|
221
|
+
expect(configurer.run).to be_nil
|
281
222
|
end
|
282
223
|
|
283
224
|
it "should include the pre-run command failure in the report" do
|
284
|
-
report = Puppet::Transaction::Report.new
|
285
225
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
286
226
|
|
287
227
|
Puppet.settings[:prerun_command] = "/my/command"
|
288
228
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
289
229
|
|
290
|
-
expect(
|
230
|
+
expect(configurer.run).to be_nil
|
291
231
|
expect(report.logs.find { |x| x.message =~ /Could not run command from prerun_command/ }).to be
|
292
232
|
end
|
293
233
|
|
294
234
|
it "should send the transaction report even if the post-run command fails" do
|
295
|
-
report = Puppet::Transaction::Report.new
|
296
235
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
297
236
|
|
298
237
|
Puppet.settings[:postrun_command] = "/my/command"
|
299
238
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
300
|
-
expect(
|
239
|
+
expect(configurer).to receive(:send_report).with(report)
|
301
240
|
|
302
|
-
expect(
|
241
|
+
expect(configurer.run).to be_nil
|
303
242
|
end
|
304
243
|
|
305
244
|
it "should include the post-run command failure in the report" do
|
306
|
-
report = Puppet::Transaction::Report.new
|
307
245
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
308
246
|
|
309
247
|
Puppet.settings[:postrun_command] = "/my/command"
|
@@ -311,7 +249,7 @@ describe Puppet::Configurer do
|
|
311
249
|
|
312
250
|
expect(report).to receive(:<<) { |log, _| expect(log.message).to match(/Could not run command from postrun_command/) }.at_least(:once)
|
313
251
|
|
314
|
-
expect(
|
252
|
+
expect(configurer.run).to be_nil
|
315
253
|
end
|
316
254
|
|
317
255
|
it "should execute post-run command even if the pre-run command fails" do
|
@@ -320,47 +258,42 @@ describe Puppet::Configurer do
|
|
320
258
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/precommand"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
321
259
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/postcommand"])
|
322
260
|
|
323
|
-
expect(
|
261
|
+
expect(configurer.run).to be_nil
|
324
262
|
end
|
325
263
|
|
326
264
|
it "should finalize the report" do
|
327
|
-
report = Puppet::Transaction::Report.new
|
328
265
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
329
266
|
|
330
267
|
expect(report).to receive(:finalize_report)
|
331
|
-
|
268
|
+
configurer.run
|
332
269
|
end
|
333
270
|
|
334
271
|
it "should not apply the catalog if the pre-run command fails" do
|
335
|
-
report = Puppet::Transaction::Report.new
|
336
272
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
337
273
|
|
338
274
|
Puppet.settings[:prerun_command] = "/my/command"
|
339
275
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
340
276
|
|
341
|
-
|
342
|
-
expect(
|
277
|
+
expect_any_instance_of(Puppet::Resource::Catalog).not_to receive(:apply)
|
278
|
+
expect(configurer).to receive(:send_report)
|
343
279
|
|
344
|
-
expect(
|
280
|
+
expect(configurer.run).to be_nil
|
345
281
|
end
|
346
282
|
|
347
283
|
it "should apply the catalog, send the report, and return nil if the post-run command fails" do
|
348
|
-
report = Puppet::Transaction::Report.new
|
349
284
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
350
285
|
|
351
286
|
Puppet.settings[:postrun_command] = "/my/command"
|
352
287
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
353
288
|
|
354
|
-
|
355
|
-
expect(
|
289
|
+
expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply)
|
290
|
+
expect(configurer).to receive(:send_report)
|
356
291
|
|
357
|
-
expect(
|
292
|
+
expect(configurer.run).to be_nil
|
358
293
|
end
|
359
294
|
|
360
295
|
it 'includes total time metrics in the report after successfully applying the catalog' do
|
361
|
-
report
|
362
|
-
allow(@catalog).to receive(:apply).with(:report => report)
|
363
|
-
@agent.run(report: report)
|
296
|
+
configurer.run(report: report)
|
364
297
|
|
365
298
|
expect(report.metrics['time']).to be
|
366
299
|
expect(report.metrics['time']['total']).to be_a_kind_of(Numeric)
|
@@ -370,17 +303,15 @@ describe Puppet::Configurer do
|
|
370
303
|
Puppet.settings[:prerun_command] = "/my/command"
|
371
304
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
372
305
|
|
373
|
-
report
|
374
|
-
@agent.run(report: report)
|
306
|
+
configurer.run(report: report)
|
375
307
|
|
376
308
|
expect(report.metrics['time']).to be
|
377
309
|
expect(report.metrics['time']['total']).to be_a_kind_of(Numeric)
|
378
310
|
end
|
379
311
|
|
380
312
|
it 'includes total time metrics in the report even if catalog retrieval fails' do
|
381
|
-
|
382
|
-
|
383
|
-
@agent.run(:report => report)
|
313
|
+
allow(configurer).to receive(:prepare_and_retrieve_catalog_from_cache).and_raise
|
314
|
+
configurer.run(:report => report)
|
384
315
|
|
385
316
|
expect(report.metrics['time']).to be
|
386
317
|
expect(report.metrics['time']['total']).to be_a_kind_of(Numeric)
|
@@ -388,96 +319,93 @@ describe Puppet::Configurer do
|
|
388
319
|
|
389
320
|
it "should refetch the catalog if the server specifies a new environment in the catalog" do
|
390
321
|
catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
|
391
|
-
expect(
|
322
|
+
expect(configurer).to receive(:retrieve_catalog).and_return(catalog).twice
|
392
323
|
|
393
|
-
|
324
|
+
configurer.run
|
394
325
|
end
|
395
326
|
|
396
|
-
it "
|
397
|
-
|
327
|
+
it "changes the configurer's environment if the server specifies a new environment in the catalog" do
|
328
|
+
allow_any_instance_of(Puppet::Resource::Catalog).to receive(:environment).and_return("second_env")
|
398
329
|
|
399
|
-
|
330
|
+
configurer.run
|
400
331
|
|
401
|
-
expect(
|
332
|
+
expect(configurer.environment).to eq("second_env")
|
402
333
|
end
|
403
334
|
|
404
|
-
it "
|
405
|
-
|
406
|
-
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
407
|
-
expect(@agent).to receive(:send_report).with(report)
|
335
|
+
it "changes the report's environment if the server specifies a new environment in the catalog" do
|
336
|
+
allow_any_instance_of(Puppet::Resource::Catalog).to receive(:environment).and_return("second_env")
|
408
337
|
|
409
|
-
|
410
|
-
allow(@agent).to receive(:retrieve_catalog).and_return(@catalog)
|
411
|
-
|
412
|
-
@agent.run
|
338
|
+
configurer.run(report: report)
|
413
339
|
|
414
340
|
expect(report.environment).to eq("second_env")
|
415
341
|
end
|
416
342
|
|
417
343
|
it "sends the transaction uuid in a catalog request" do
|
418
|
-
|
344
|
+
configurer = Puppet::Configurer.new('aaa')
|
419
345
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(transaction_uuid: 'aaa'))
|
420
|
-
|
346
|
+
configurer.run
|
421
347
|
end
|
422
348
|
|
423
349
|
it "sends the transaction uuid in a catalog request" do
|
424
|
-
|
350
|
+
configurer = Puppet::Configurer.new('b', 'aaa')
|
425
351
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(job_id: 'aaa'))
|
426
|
-
|
352
|
+
configurer.run
|
427
353
|
end
|
428
354
|
|
429
355
|
it "sets the static_catalog query param to true in a catalog request" do
|
430
356
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(static_catalog: true))
|
431
|
-
|
357
|
+
configurer.run
|
432
358
|
end
|
433
359
|
|
434
360
|
it "sets the checksum_type query param to the default supported_checksum_types in a catalog request" do
|
435
361
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything,
|
436
362
|
hash_including(checksum_type: 'md5.sha256.sha384.sha512.sha224'))
|
437
|
-
|
363
|
+
configurer.run
|
438
364
|
end
|
439
365
|
|
440
366
|
it "sets the checksum_type query param to the supported_checksum_types setting in a catalog request" do
|
441
|
-
# Regenerate the agent to pick up the new setting
|
442
367
|
Puppet[:supported_checksum_types] = ['sha256']
|
443
|
-
|
444
|
-
|
445
|
-
allow(@agent).to receive(:download_plugins)
|
446
|
-
allow(@agent).to receive(:send_report)
|
447
|
-
allow(@agent).to receive(:save_last_run_summary)
|
368
|
+
# Regenerate the agent to pick up the new setting
|
369
|
+
configurer = Puppet::Configurer.new
|
448
370
|
|
449
371
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(checksum_type: 'sha256'))
|
450
|
-
|
372
|
+
configurer.run
|
451
373
|
end
|
452
374
|
|
453
375
|
describe "when not using a REST terminus for catalogs" do
|
454
376
|
it "should not pass any facts when retrieving the catalog" do
|
377
|
+
# This is weird, we collect facts when constructing the node,
|
378
|
+
# but we don't send them in the indirector request. Then the compiler
|
379
|
+
# looks up the node, and collects its facts, which we could have sent
|
380
|
+
# in the first place. This seems like a bug.
|
455
381
|
Puppet::Resource::Catalog.indirection.terminus_class = :compiler
|
456
|
-
|
382
|
+
|
457
383
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find) do |name, options|
|
458
|
-
options[:facts].
|
459
|
-
end.and_return(
|
384
|
+
expect(options[:facts]).to be_nil
|
385
|
+
end.and_return(catalog)
|
460
386
|
|
461
|
-
|
387
|
+
configurer.run
|
462
388
|
end
|
463
389
|
end
|
464
390
|
|
465
391
|
describe "when using a REST terminus for catalogs" do
|
466
|
-
it "should pass the
|
392
|
+
it "should pass the url encoded facts and facts format as arguments when retrieving the catalog" do
|
467
393
|
Puppet::Resource::Catalog.indirection.terminus_class = :rest
|
468
|
-
expect(@agent).to receive(:facts_for_uploading).and_return(:facts => "myfacts", :facts_format => :foo)
|
469
|
-
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(facts: "myfacts", facts_format: :foo)).and_return(@catalog)
|
470
394
|
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
395
|
+
facts.values = { 'foo' => 'bar' }
|
396
|
+
Puppet::Node::Facts.indirection.save(facts)
|
397
|
+
|
398
|
+
expect(
|
399
|
+
Puppet::Resource::Catalog.indirection
|
400
|
+
).to receive(:find) do |_, options|
|
401
|
+
expect(options[:facts_format]).to eq("application/json")
|
475
402
|
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
403
|
+
unescaped = JSON.parse(CGI.unescape(options[:facts]))
|
404
|
+
expect(unescaped).to include("values" => {"foo" => "bar"})
|
405
|
+
end.and_return(catalog)
|
406
|
+
|
407
|
+
configurer.run
|
408
|
+
end
|
481
409
|
end
|
482
410
|
end
|
483
411
|
|
@@ -485,56 +413,52 @@ describe Puppet::Configurer do
|
|
485
413
|
include PuppetSpec::Files
|
486
414
|
|
487
415
|
before do
|
488
|
-
allow(Puppet.settings).to receive(:use).and_return(true)
|
489
|
-
@configurer = Puppet::Configurer.new
|
490
416
|
Puppet[:lastrunfile] = tmpfile('last_run_file')
|
491
|
-
|
492
|
-
@report = Puppet::Transaction::Report.new
|
493
417
|
Puppet[:reports] = "none"
|
494
418
|
end
|
495
419
|
|
496
420
|
it "should print a report summary if configured to do so" do
|
497
421
|
Puppet.settings[:summarize] = true
|
498
422
|
|
499
|
-
expect(
|
423
|
+
expect(report).to receive(:summary).and_return("stuff")
|
500
424
|
|
501
|
-
expect(
|
502
|
-
|
425
|
+
expect(configurer).to receive(:puts).with("stuff")
|
426
|
+
configurer.send_report(report)
|
503
427
|
end
|
504
428
|
|
505
429
|
it "should not print a report summary if not configured to do so" do
|
506
430
|
Puppet.settings[:summarize] = false
|
507
431
|
|
508
|
-
expect(
|
509
|
-
|
432
|
+
expect(configurer).not_to receive(:puts)
|
433
|
+
configurer.send_report(report)
|
510
434
|
end
|
511
435
|
|
512
436
|
it "should save the report if reporting is enabled" do
|
513
437
|
Puppet.settings[:report] = true
|
514
438
|
|
515
|
-
expect(Puppet::Transaction::Report.indirection).to receive(:save).with(
|
516
|
-
|
439
|
+
expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash))
|
440
|
+
configurer.send_report(report)
|
517
441
|
end
|
518
442
|
|
519
443
|
it "should not save the report if reporting is disabled" do
|
520
444
|
Puppet.settings[:report] = false
|
521
445
|
|
522
|
-
expect(Puppet::Transaction::Report.indirection).not_to receive(:save).with(
|
523
|
-
|
446
|
+
expect(Puppet::Transaction::Report.indirection).not_to receive(:save).with(report, nil, instance_of(Hash))
|
447
|
+
configurer.send_report(report)
|
524
448
|
end
|
525
449
|
|
526
450
|
it "should save the last run summary if reporting is enabled" do
|
527
451
|
Puppet.settings[:report] = true
|
528
452
|
|
529
|
-
expect(
|
530
|
-
|
453
|
+
expect(configurer).to receive(:save_last_run_summary).with(report)
|
454
|
+
configurer.send_report(report)
|
531
455
|
end
|
532
456
|
|
533
457
|
it "should save the last run summary if reporting is disabled" do
|
534
458
|
Puppet.settings[:report] = false
|
535
459
|
|
536
|
-
expect(
|
537
|
-
|
460
|
+
expect(configurer).to receive(:save_last_run_summary).with(report)
|
461
|
+
configurer.send_report(report)
|
538
462
|
end
|
539
463
|
|
540
464
|
it "should log but not fail if saving the report fails" do
|
@@ -543,7 +467,7 @@ describe Puppet::Configurer do
|
|
543
467
|
expect(Puppet::Transaction::Report.indirection).to receive(:save).and_raise("whatever")
|
544
468
|
|
545
469
|
expect(Puppet).to receive(:err)
|
546
|
-
expect {
|
470
|
+
expect { configurer.send_report(report) }.not_to raise_error
|
547
471
|
end
|
548
472
|
end
|
549
473
|
|
@@ -551,22 +475,17 @@ describe Puppet::Configurer do
|
|
551
475
|
include PuppetSpec::Files
|
552
476
|
|
553
477
|
before do
|
554
|
-
allow(Puppet.settings).to receive(:use).and_return(true)
|
555
|
-
@configurer = Puppet::Configurer.new
|
556
|
-
|
557
|
-
@report = double('report', :raw_summary => {})
|
558
|
-
|
559
478
|
Puppet[:lastrunfile] = tmpfile('last_run_file')
|
560
479
|
end
|
561
480
|
|
562
481
|
it "should write the last run file" do
|
563
|
-
|
482
|
+
configurer.save_last_run_summary(report)
|
564
483
|
expect(Puppet::FileSystem.exist?(Puppet[:lastrunfile])).to be_truthy
|
565
484
|
end
|
566
485
|
|
567
486
|
it "should write the raw summary as yaml" do
|
568
|
-
expect(
|
569
|
-
|
487
|
+
expect(report).to receive(:raw_summary).and_return("summary")
|
488
|
+
configurer.save_last_run_summary(report)
|
570
489
|
expect(File.read(Puppet[:lastrunfile])).to eq(YAML.dump("summary"))
|
571
490
|
end
|
572
491
|
|
@@ -582,12 +501,12 @@ describe Puppet::Configurer do
|
|
582
501
|
expect(Puppet::Util).to receive(:replace_file).and_yield(fh)
|
583
502
|
|
584
503
|
expect(Puppet).to receive(:err)
|
585
|
-
expect {
|
504
|
+
expect { configurer.save_last_run_summary(report) }.to_not raise_error
|
586
505
|
end
|
587
506
|
|
588
507
|
it "should create the last run file with the correct mode" do
|
589
508
|
expect(Puppet.settings.setting(:lastrunfile)).to receive(:mode).and_return('664')
|
590
|
-
|
509
|
+
configurer.save_last_run_summary(report)
|
591
510
|
|
592
511
|
if Puppet::Util::Platform.windows?
|
593
512
|
require 'puppet/util/windows/security'
|
@@ -601,25 +520,25 @@ describe Puppet::Configurer do
|
|
601
520
|
it "should report invalid last run file permissions" do
|
602
521
|
expect(Puppet.settings.setting(:lastrunfile)).to receive(:mode).and_return('892')
|
603
522
|
expect(Puppet).to receive(:err).with(/Could not save last run local report.*892 is invalid/)
|
604
|
-
|
523
|
+
configurer.save_last_run_summary(report)
|
605
524
|
end
|
606
525
|
end
|
607
526
|
|
608
527
|
describe "when requesting a node" do
|
609
528
|
it "uses the transaction uuid in the request" do
|
610
529
|
expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(transaction_uuid: anything)).twice
|
611
|
-
|
530
|
+
configurer.run
|
612
531
|
end
|
613
532
|
|
614
533
|
it "sends an explicitly configured environment request" do
|
615
534
|
expect(Puppet.settings).to receive(:set_by_config?).with(:environment).and_return(true)
|
616
535
|
expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(configured_environment: Puppet[:environment])).twice
|
617
|
-
|
536
|
+
configurer.run
|
618
537
|
end
|
619
538
|
|
620
539
|
it "does not send a configured_environment when using the default" do
|
621
540
|
expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(configured_environment: nil)).twice
|
622
|
-
|
541
|
+
configurer.run
|
623
542
|
end
|
624
543
|
end
|
625
544
|
|
@@ -650,14 +569,6 @@ describe Puppet::Configurer do
|
|
650
569
|
|
651
570
|
describe "when retrieving a catalog" do
|
652
571
|
before do
|
653
|
-
allow(Puppet.settings).to receive(:use).and_return(true)
|
654
|
-
allow(@agent).to receive(:facts_for_uploading).and_return({})
|
655
|
-
allow(@agent).to receive(:download_plugins)
|
656
|
-
|
657
|
-
# retrieve a catalog in the current environment, so we don't try to converge unexpectedly
|
658
|
-
@catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
|
659
|
-
|
660
|
-
# this is the default when using a Configurer instance
|
661
572
|
allow(Puppet::Resource::Catalog.indirection).to receive(:terminus_class).and_return(:rest)
|
662
573
|
end
|
663
574
|
|
@@ -667,100 +578,128 @@ describe Puppet::Configurer do
|
|
667
578
|
end
|
668
579
|
|
669
580
|
it "should first look in the cache for a catalog" do
|
670
|
-
expects_cached_catalog_only(
|
581
|
+
expects_cached_catalog_only(catalog)
|
671
582
|
|
672
|
-
|
583
|
+
configurer.run
|
673
584
|
end
|
674
585
|
|
675
586
|
it "should not make a node request or pluginsync when a cached catalog is successfully retrieved" do
|
676
587
|
expect(Puppet::Node.indirection).not_to receive(:find)
|
677
|
-
expects_cached_catalog_only(
|
678
|
-
expect(
|
588
|
+
expects_cached_catalog_only(catalog)
|
589
|
+
expect(configurer).not_to receive(:download_plugins)
|
679
590
|
|
680
|
-
|
591
|
+
configurer.run
|
681
592
|
end
|
682
593
|
|
683
594
|
it "should make a node request and pluginsync when a cached catalog cannot be retrieved" do
|
684
595
|
expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
|
685
|
-
expects_fallback_to_new_catalog(
|
686
|
-
expect(
|
596
|
+
expects_fallback_to_new_catalog(catalog)
|
597
|
+
expect(configurer).to receive(:download_plugins)
|
687
598
|
|
688
|
-
|
599
|
+
configurer.run
|
689
600
|
end
|
690
601
|
|
691
602
|
it "should set its cached_catalog_status to 'explicitly_requested'" do
|
692
|
-
expects_cached_catalog_only(
|
603
|
+
expects_cached_catalog_only(catalog)
|
604
|
+
|
605
|
+
options = {}
|
606
|
+
configurer.run(options)
|
693
607
|
|
694
|
-
|
695
|
-
expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('explicitly_requested')
|
608
|
+
expect(options[:report].cached_catalog_status).to eq('explicitly_requested')
|
696
609
|
end
|
697
610
|
|
698
611
|
it "should set its cached_catalog_status to 'explicitly requested' if the cached catalog is from a different environment" do
|
699
612
|
cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
|
700
613
|
expects_cached_catalog_only(cached_catalog)
|
701
614
|
|
702
|
-
|
703
|
-
|
615
|
+
options = {}
|
616
|
+
configurer.run(options)
|
617
|
+
|
618
|
+
expect(options[:report].cached_catalog_status).to eq('explicitly_requested')
|
704
619
|
end
|
705
620
|
|
706
621
|
it "should compile a new catalog if none is found in the cache" do
|
707
|
-
expects_fallback_to_new_catalog(
|
708
|
-
|
709
|
-
expect(@agent.retrieve_catalog({})).to eq(@catalog)
|
710
|
-
end
|
622
|
+
expects_fallback_to_new_catalog(catalog)
|
711
623
|
|
712
|
-
|
713
|
-
|
624
|
+
options = {}
|
625
|
+
configurer.run(options)
|
714
626
|
|
715
|
-
|
716
|
-
expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('not_used')
|
627
|
+
expect(options[:report].cached_catalog_status).to eq('not_used')
|
717
628
|
end
|
718
629
|
|
719
630
|
it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
|
720
631
|
expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
|
721
632
|
expects_neither_new_or_cached_catalog
|
722
633
|
|
723
|
-
|
634
|
+
configurer.run
|
724
635
|
end
|
725
636
|
|
726
637
|
it "should return the cached catalog when the environment doesn't match" do
|
727
638
|
cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
|
728
639
|
expects_cached_catalog_only(cached_catalog)
|
729
640
|
|
641
|
+
allow(Puppet).to receive(:info)
|
730
642
|
expect(Puppet).to receive(:info).with("Using cached catalog from environment 'second_env'")
|
731
|
-
|
643
|
+
|
644
|
+
configurer.run
|
645
|
+
end
|
646
|
+
|
647
|
+
it "applies the catalog passed as options when the catalog cache terminus is not set" do
|
648
|
+
stub_request(:get, %r{/puppet/v3/file_metadatas?/plugins}).to_return(:status => 404)
|
649
|
+
stub_request(:get, %r{/puppet/v3/file_metadatas?/pluginfacts}).to_return(:status => 404)
|
650
|
+
|
651
|
+
catalog.add_resource(Puppet::Resource.new('notify', 'from apply'))
|
652
|
+
configurer.run(catalog: catalog.to_ral)
|
653
|
+
|
654
|
+
# make sure cache class is not set to avoid surprises later
|
655
|
+
expect(Puppet::Resource::Catalog.indirection).to_not be_cache
|
656
|
+
expect(@logs).to include(an_object_having_attributes(level: :notice, message: /defined 'message' as 'from apply'/))
|
657
|
+
end
|
658
|
+
|
659
|
+
it "applies the cached catalog when the catalog cache terminus is set, ignoring the catalog passed as options" do
|
660
|
+
Puppet::Resource::Catalog.indirection.cache_class = :json
|
661
|
+
|
662
|
+
cached_catalog = Puppet::Resource::Catalog.new(Puppet[:node_name_value], Puppet[:environment])
|
663
|
+
cached_catalog.add_resource(Puppet::Resource.new('notify', 'from cache'))
|
664
|
+
|
665
|
+
# update cached catalog
|
666
|
+
Puppet.settings.use(:main, :agent)
|
667
|
+
path = Puppet::Resource::Catalog.indirection.cache.path(cached_catalog.name)
|
668
|
+
FileUtils.mkdir(File.dirname(path))
|
669
|
+
File.write(path, cached_catalog.render(:json))
|
670
|
+
|
671
|
+
configurer.run(catalog: catalog.to_ral)
|
672
|
+
|
673
|
+
expect(@logs).to include(an_object_having_attributes(level: :notice, message: /defined 'message' as 'from cache'/))
|
732
674
|
end
|
733
675
|
end
|
734
676
|
|
735
677
|
describe "and strict environment mode is set" do
|
736
678
|
before do
|
737
|
-
allow(@catalog).to receive(:to_ral).and_return(@catalog)
|
738
|
-
allow(@catalog).to receive(:write_class_file)
|
739
|
-
allow(@catalog).to receive(:write_resource_file)
|
740
|
-
allow(@agent).to receive(:send_report)
|
741
|
-
allow(@agent).to receive(:save_last_run_summary)
|
742
679
|
Puppet.settings[:strict_environment_mode] = true
|
743
680
|
end
|
744
681
|
|
745
682
|
it "should not make a node request" do
|
746
683
|
expect(Puppet::Node.indirection).not_to receive(:find)
|
747
684
|
|
748
|
-
|
685
|
+
configurer.run
|
749
686
|
end
|
750
687
|
|
751
688
|
it "should return nil when the catalog's environment doesn't match the agent specified environment" do
|
752
|
-
|
753
|
-
|
689
|
+
Puppet[:environment] = 'second_env'
|
690
|
+
configurer = Puppet::Configurer.new
|
691
|
+
|
692
|
+
catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote("production"))
|
693
|
+
expects_new_catalog_only(catalog)
|
754
694
|
|
755
695
|
expect(Puppet).to receive(:err).with("Not using catalog because its environment 'production' does not match agent specified environment 'second_env' and strict_environment_mode is set")
|
756
|
-
expect(
|
696
|
+
expect(configurer.run).to be_nil
|
757
697
|
end
|
758
698
|
|
759
|
-
it "should
|
760
|
-
|
761
|
-
expects_new_catalog_only(@catalog)
|
699
|
+
it "should return 0 when the catalog's environment matches the agent specified environment" do
|
700
|
+
expects_new_catalog_only(catalog)
|
762
701
|
|
763
|
-
expect(
|
702
|
+
expect(configurer.run).to eq(0)
|
764
703
|
end
|
765
704
|
|
766
705
|
describe "and a cached catalog is explicitly requested" do
|
@@ -769,83 +708,81 @@ describe Puppet::Configurer do
|
|
769
708
|
end
|
770
709
|
|
771
710
|
it "should return nil when the cached catalog's environment doesn't match the agent specified environment" do
|
772
|
-
|
773
|
-
|
711
|
+
Puppet[:environment] = 'second_env'
|
712
|
+
configurer = Puppet::Configurer.new
|
713
|
+
|
714
|
+
catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote("production"))
|
715
|
+
expects_cached_catalog_only(catalog)
|
774
716
|
|
775
717
|
expect(Puppet).to receive(:err).with("Not using catalog because its environment 'production' does not match agent specified environment 'second_env' and strict_environment_mode is set")
|
776
|
-
expect(
|
718
|
+
expect(configurer.run).to be_nil
|
777
719
|
end
|
778
720
|
|
779
721
|
it "should proceed with the cached catalog if its environment matchs the local environment" do
|
780
|
-
|
781
|
-
@agent.instance_variable_set(:@environment, 'production')
|
782
|
-
expects_cached_catalog_only(@catalog)
|
722
|
+
expects_cached_catalog_only(catalog)
|
783
723
|
|
784
|
-
expect(
|
724
|
+
expect(configurer.run).to eq(0)
|
785
725
|
end
|
786
726
|
end
|
787
727
|
end
|
788
728
|
|
789
|
-
it "should use the Catalog class to get its catalog" do
|
790
|
-
expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(@catalog)
|
791
|
-
|
792
|
-
@agent.retrieve_catalog({})
|
793
|
-
end
|
794
|
-
|
795
729
|
it "should set its cached_catalog_status to 'not_used' when downloading a new catalog" do
|
796
|
-
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(
|
730
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
|
731
|
+
|
732
|
+
options = {}
|
733
|
+
configurer.run(options)
|
797
734
|
|
798
|
-
|
799
|
-
expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('not_used')
|
735
|
+
expect(options[:report].cached_catalog_status).to eq('not_used')
|
800
736
|
end
|
801
737
|
|
802
738
|
it "should use its node_name_value to retrieve the catalog" do
|
803
|
-
|
804
|
-
Puppet.
|
805
|
-
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with("myhost.domain.com", anything).and_return(@catalog)
|
806
|
-
|
807
|
-
@agent.retrieve_catalog({})
|
808
|
-
end
|
739
|
+
myhost_facts = Puppet::Node::Facts.new("myhost.domain.com")
|
740
|
+
Puppet::Node::Facts.indirection.save(myhost_facts)
|
809
741
|
|
810
|
-
|
811
|
-
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(
|
742
|
+
Puppet.settings[:node_name_value] = "myhost.domain.com"
|
743
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with("myhost.domain.com", anything).and_return(catalog)
|
812
744
|
|
813
|
-
|
745
|
+
configurer.run
|
814
746
|
end
|
815
747
|
|
816
|
-
it "should log
|
817
|
-
expects_fallback_to_cached_catalog(
|
748
|
+
it "should log when no catalog can be retrieved from the server" do
|
749
|
+
expects_fallback_to_cached_catalog(catalog)
|
818
750
|
|
751
|
+
allow(Puppet).to receive(:info)
|
819
752
|
expect(Puppet).to receive(:info).with("Using cached catalog from environment 'production'")
|
820
|
-
|
753
|
+
configurer.run
|
821
754
|
end
|
822
755
|
|
823
756
|
it "should set its cached_catalog_status to 'on_failure' when no catalog can be retrieved from the server" do
|
824
|
-
expects_fallback_to_cached_catalog(
|
757
|
+
expects_fallback_to_cached_catalog(catalog)
|
758
|
+
|
759
|
+
options = {}
|
760
|
+
configurer.run(options)
|
825
761
|
|
826
|
-
|
827
|
-
expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('on_failure')
|
762
|
+
expect(options[:report].cached_catalog_status).to eq('on_failure')
|
828
763
|
end
|
829
764
|
|
830
765
|
it "should not look in the cache for a catalog if one is returned from the server" do
|
831
|
-
expects_new_catalog_only(
|
766
|
+
expects_new_catalog_only(catalog)
|
832
767
|
|
833
|
-
|
768
|
+
configurer.run
|
834
769
|
end
|
835
770
|
|
836
771
|
it "should return the cached catalog when retrieving the remote catalog throws an exception" do
|
837
772
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_raise("eh")
|
838
|
-
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(
|
773
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(catalog)
|
839
774
|
|
840
|
-
|
775
|
+
configurer.run
|
841
776
|
end
|
842
777
|
|
843
778
|
it "should set its cached_catalog_status to 'on_failure' when retrieving the remote catalog throws an exception" do
|
844
779
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_raise("eh")
|
845
|
-
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(
|
780
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(catalog)
|
781
|
+
|
782
|
+
options = {}
|
783
|
+
configurer.run(options)
|
846
784
|
|
847
|
-
|
848
|
-
expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('on_failure')
|
785
|
+
expect(options[:report].cached_catalog_status).to eq('on_failure')
|
849
786
|
end
|
850
787
|
|
851
788
|
it "should log and return nil if no catalog can be retrieved from the server and :usecacheonfailure is disabled" do
|
@@ -854,120 +791,173 @@ describe Puppet::Configurer do
|
|
854
791
|
|
855
792
|
expect(Puppet).to receive(:warning).with('Not using cache on failed catalog')
|
856
793
|
|
857
|
-
expect(
|
794
|
+
expect(configurer.run).to be_nil
|
858
795
|
end
|
859
796
|
|
860
797
|
it "should set its cached_catalog_status to 'not_used' if no catalog can be retrieved from the server and :usecacheonfailure is disabled or fails to retrieve a catalog" do
|
861
798
|
Puppet[:usecacheonfailure] = false
|
862
799
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(nil)
|
863
800
|
|
864
|
-
|
865
|
-
|
801
|
+
options = {}
|
802
|
+
configurer.run(options)
|
803
|
+
|
804
|
+
expect(options[:report].cached_catalog_status).to eq('not_used')
|
866
805
|
end
|
867
806
|
|
868
807
|
it "should return nil if no cached catalog is available and no catalog can be retrieved from the server" do
|
869
808
|
expects_neither_new_or_cached_catalog
|
870
809
|
|
871
|
-
expect(
|
810
|
+
expect(configurer.run).to be_nil
|
872
811
|
end
|
873
812
|
|
874
813
|
it "should return nil if its cached catalog environment doesn't match server-specified environment" do
|
875
814
|
cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
|
876
|
-
@agent.instance_variable_set(:@node_environment, 'production')
|
877
815
|
|
878
816
|
expects_fallback_to_cached_catalog(cached_catalog)
|
879
817
|
|
818
|
+
allow(Puppet).to receive(:err)
|
880
819
|
expect(Puppet).to receive(:err).with("Not using cached catalog because its environment 'second_env' does not match 'production'")
|
881
|
-
expect(
|
820
|
+
expect(configurer.run).to be_nil
|
882
821
|
end
|
883
822
|
|
884
823
|
it "should set its cached_catalog_status to 'not_used' if the cached catalog environment doesn't match server-specified environment" do
|
885
824
|
cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
|
886
|
-
@agent.instance_variable_set(:@node_environment, 'production')
|
887
|
-
|
888
|
-
expects_fallback_to_cached_catalog(cached_catalog)
|
889
|
-
|
890
|
-
@agent.retrieve_catalog({})
|
891
|
-
expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('not_used')
|
892
|
-
end
|
893
|
-
|
894
|
-
it "should return its cached catalog if the environment matches the server-specified environment" do
|
895
|
-
cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment]))
|
896
|
-
@agent.instance_variable_set(:@node_environment, cached_catalog.environment)
|
897
825
|
|
898
826
|
expects_fallback_to_cached_catalog(cached_catalog)
|
899
827
|
|
900
|
-
|
828
|
+
options = {}
|
829
|
+
configurer.run(options)
|
830
|
+
expect(options[:report].cached_catalog_status).to eq('not_used')
|
901
831
|
end
|
902
832
|
|
903
833
|
it "should set its cached_catalog_status to 'on_failure' if the cached catalog environment matches server-specified environment" do
|
904
|
-
|
905
|
-
@agent.instance_variable_set(:@node_environment, cached_catalog.environment)
|
906
|
-
|
907
|
-
expects_fallback_to_cached_catalog(cached_catalog)
|
834
|
+
expects_fallback_to_cached_catalog(catalog)
|
908
835
|
|
909
|
-
|
910
|
-
|
836
|
+
options = {}
|
837
|
+
configurer.run(options)
|
838
|
+
expect(options[:report].cached_catalog_status).to eq('on_failure')
|
911
839
|
end
|
912
840
|
|
913
841
|
it "should not update the cached catalog in noop mode" do
|
914
842
|
Puppet[:noop] = true
|
915
|
-
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true, ignore_cache_save: true)).and_return(@catalog)
|
916
843
|
|
917
|
-
|
844
|
+
stub_request(:get, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
|
845
|
+
|
846
|
+
Puppet::Resource::Catalog.indirection.cache_class = :json
|
847
|
+
path = Puppet::Resource::Catalog.indirection.cache.path(catalog.name)
|
848
|
+
|
849
|
+
expect(File).to_not be_exist(path)
|
850
|
+
configurer.run
|
851
|
+
expect(File).to_not be_exist(path)
|
918
852
|
end
|
919
853
|
|
920
854
|
it "should update the cached catalog when not in noop mode" do
|
921
855
|
Puppet[:noop] = false
|
922
|
-
|
856
|
+
Puppet[:log_level] = 'info'
|
857
|
+
|
858
|
+
stub_request(:get, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
|
859
|
+
|
860
|
+
Puppet::Resource::Catalog.indirection.cache_class = :json
|
861
|
+
cache_path = Puppet::Resource::Catalog.indirection.cache.path(Puppet[:node_name_value])
|
862
|
+
|
863
|
+
expect(File).to_not be_exist(cache_path)
|
864
|
+
configurer.run
|
865
|
+
expect(File).to be_exist(cache_path)
|
866
|
+
|
867
|
+
expect(@logs).to include(an_object_having_attributes(level: :info, message: "Caching catalog for #{Puppet[:node_name_value]}"))
|
868
|
+
end
|
869
|
+
|
870
|
+
it "successfully applies the catalog without a cache" do
|
871
|
+
stub_request(:get, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
|
872
|
+
|
873
|
+
Puppet::Resource::Catalog.indirection.cache_class = nil
|
874
|
+
|
875
|
+
expect(configurer.run).to eq(0)
|
876
|
+
end
|
877
|
+
|
878
|
+
it "should not update the cached catalog when running puppet apply" do
|
879
|
+
Puppet::Resource::Catalog.indirection.cache_class = :json
|
880
|
+
path = Puppet::Resource::Catalog.indirection.cache.path(catalog.name)
|
923
881
|
|
924
|
-
|
882
|
+
expect(File).to_not be_exist(path)
|
883
|
+
configurer.run(catalog: catalog)
|
884
|
+
expect(File).to_not be_exist(path)
|
925
885
|
end
|
926
886
|
end
|
927
887
|
|
928
|
-
describe "when
|
929
|
-
|
930
|
-
|
888
|
+
describe "when converging the environment" do
|
889
|
+
let(:apple) { Puppet::Resource::Catalog.new(Puppet[:node_name_value], Puppet::Node::Environment.remote('apple')) }
|
890
|
+
let(:banana) { Puppet::Resource::Catalog.new(Puppet[:node_name_value], Puppet::Node::Environment.remote('banana')) }
|
891
|
+
|
892
|
+
before :each do
|
893
|
+
apple.add_resource(resource)
|
894
|
+
banana.add_resource(resource)
|
895
|
+
end
|
931
896
|
|
932
|
-
|
897
|
+
it "converges after multiple attempts" do
|
898
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(apple, banana, banana)
|
899
|
+
|
900
|
+
allow(Puppet).to receive(:notice)
|
901
|
+
expect(Puppet).to receive(:notice).with("Local environment: 'production' doesn't match server specified environment 'apple', restarting agent run with environment 'apple'")
|
902
|
+
expect(Puppet).to receive(:notice).with("Local environment: 'apple' doesn't match server specified environment 'banana', restarting agent run with environment 'banana'")
|
903
|
+
|
904
|
+
configurer.run
|
933
905
|
end
|
934
906
|
|
935
|
-
|
936
|
-
|
907
|
+
it "raises if it can't converge after 4 tries after the initial catalog request" do
|
908
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(apple, banana, apple, banana, apple)
|
937
909
|
|
938
|
-
|
939
|
-
|
910
|
+
expect(Puppet).to receive(:err).with("Failed to apply catalog: Catalog environment didn't stabilize after 4 fetches, aborting run")
|
911
|
+
|
912
|
+
configurer.run
|
940
913
|
end
|
914
|
+
end
|
941
915
|
|
942
|
-
|
943
|
-
|
916
|
+
describe "when converting the catalog" do
|
917
|
+
it "converts Puppet::Resource into Puppet::Type::Notify" do
|
918
|
+
expect(configurer).to receive(:apply_catalog) do |ral, _|
|
919
|
+
expect(ral.resources).to contain(an_instance_of(Puppet::Type::Notify))
|
920
|
+
end
|
944
921
|
|
945
|
-
|
922
|
+
configurer.run(catalog: catalog)
|
946
923
|
end
|
947
924
|
|
948
|
-
it "
|
949
|
-
expect(
|
925
|
+
it "adds default schedules" do
|
926
|
+
expect(configurer).to receive(:apply_catalog) do |ral, _|
|
927
|
+
expect(ral.resources.map(&:to_ref)).to contain(%w{Schedule[puppet] Schedule[hourly] Schedule[daily] Schedule[weekly] Schedule[monthly] Schedule[never]})
|
928
|
+
end
|
950
929
|
|
951
|
-
|
930
|
+
configurer.run
|
952
931
|
end
|
953
932
|
|
954
|
-
it "
|
955
|
-
expect(
|
933
|
+
it "records the retrieval duration to the catalog" do
|
934
|
+
expect(configurer).to receive(:apply_catalog) do |ral, _|
|
935
|
+
expect(ral.retrieval_duration).to be_an_instance_of(Float)
|
936
|
+
end
|
956
937
|
|
957
|
-
|
938
|
+
configurer.run
|
958
939
|
end
|
959
940
|
|
960
|
-
it "
|
961
|
-
expect(
|
941
|
+
it "writes the class file containing applied settings classes" do
|
942
|
+
expect(File).to_not be_exist(Puppet[:classfile])
|
962
943
|
|
963
|
-
|
944
|
+
configurer.run
|
945
|
+
|
946
|
+
expect(File.read(Puppet[:classfile]).chomp).to eq('settings')
|
964
947
|
end
|
965
948
|
|
966
|
-
it "
|
967
|
-
|
949
|
+
it "writes an empty resource file since no resources are 'managed'" do
|
950
|
+
expect(File).to_not be_exist(Puppet[:resourcefile])
|
951
|
+
|
952
|
+
configurer.run
|
968
953
|
|
969
|
-
expect(
|
970
|
-
|
954
|
+
expect(File.read(Puppet[:resourcefile]).chomp).to eq("")
|
955
|
+
end
|
956
|
+
|
957
|
+
it "adds the conversion time to the report" do
|
958
|
+
configurer.run(report: report)
|
959
|
+
|
960
|
+
expect(report.metrics['time']['convert_catalog']).to be_an_instance_of(Float)
|
971
961
|
end
|
972
962
|
end
|
973
963
|
|
@@ -1002,80 +992,70 @@ describe Puppet::Configurer do
|
|
1002
992
|
describe "when attempting failover" do
|
1003
993
|
it "should not failover if server_list is not set" do
|
1004
994
|
Puppet.settings[:server_list] = []
|
1005
|
-
|
1006
|
-
@agent.run
|
995
|
+
configurer.run
|
1007
996
|
end
|
1008
997
|
|
1009
998
|
it "should not failover during an apply run" do
|
1010
999
|
Puppet.settings[:server_list] = ["myserver:123"]
|
1011
|
-
expect(@agent).not_to receive(:find_functional_server)
|
1012
1000
|
catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
|
1013
|
-
|
1001
|
+
configurer.run(catalog: catalog)
|
1014
1002
|
end
|
1015
1003
|
|
1016
1004
|
it "should select a server when it receives 200 OK response" do
|
1017
1005
|
Puppet.settings[:server_list] = ["myserver:123"]
|
1018
|
-
|
1019
|
-
|
1020
|
-
allow(@agent).to receive(:run_internal)
|
1006
|
+
|
1007
|
+
stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 200)
|
1021
1008
|
|
1022
1009
|
options = {}
|
1023
|
-
|
1010
|
+
configurer.run(options)
|
1024
1011
|
expect(options[:report].master_used).to eq('myserver:123')
|
1025
1012
|
end
|
1026
1013
|
|
1027
1014
|
it "should select a server when it receives 403 Forbidden" do
|
1028
1015
|
Puppet.settings[:server_list] = ["myserver:123"]
|
1029
|
-
|
1030
|
-
|
1031
|
-
allow(@agent).to receive(:run_internal)
|
1016
|
+
|
1017
|
+
stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 403)
|
1032
1018
|
|
1033
1019
|
options = {}
|
1034
|
-
|
1020
|
+
configurer.run(options)
|
1035
1021
|
expect(options[:report].master_used).to eq('myserver:123')
|
1036
1022
|
end
|
1037
1023
|
|
1038
|
-
it "queries the simple status for the 'master' service" do
|
1039
|
-
Puppet.settings[:server_list] = ["myserver:123"]
|
1040
|
-
response = Net::HTTPOK.new(nil, 200, 'OK')
|
1041
|
-
http = double('request')
|
1042
|
-
expect(http).to receive(:get).with('/status/v1/simple/master').and_return(response)
|
1043
|
-
allow(Puppet::Network::HttpPool).to receive(:http_ssl_instance).with('myserver', '123').and_return(http)
|
1044
|
-
allow(@agent).to receive(:run_internal)
|
1045
|
-
|
1046
|
-
@agent.run
|
1047
|
-
end
|
1048
|
-
|
1049
1024
|
it "should report when a server is unavailable" do
|
1050
1025
|
Puppet.settings[:server_list] = ["myserver:123"]
|
1051
|
-
response = Net::HTTPInternalServerError.new(nil, 500, 'Internal Server Error')
|
1052
|
-
allow(Puppet::Network::HttpPool).to receive(:http_ssl_instance).with('myserver', '123').and_return(double('request', get: response))
|
1053
|
-
allow(@agent).to receive(:run_internal)
|
1054
1026
|
|
1027
|
+
stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: [500, "Internal Server Error"])
|
1028
|
+
|
1029
|
+
allow(Puppet).to receive(:debug)
|
1055
1030
|
expect(Puppet).to receive(:debug).with("Puppet server myserver:123 is unavailable: 500 Internal Server Error")
|
1056
|
-
expect {
|
1031
|
+
expect {
|
1032
|
+
configurer.run
|
1033
|
+
}.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list:/)
|
1057
1034
|
end
|
1058
1035
|
|
1059
1036
|
it "should error when no servers in 'server_list' are reachable" do
|
1060
1037
|
Puppet.settings[:server_list] = "myserver:123,someotherservername"
|
1061
|
-
|
1062
|
-
|
1063
|
-
|
1064
|
-
|
1065
|
-
|
1066
|
-
|
1067
|
-
|
1068
|
-
expect{ @agent.run }.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list: 'myserver:123,someotherservername'/)
|
1038
|
+
|
1039
|
+
stub_request(:get, 'https://myserver/status/v1/simple/master').to_return(status: 400)
|
1040
|
+
stub_request(:get, 'https://someotherservername/status/v1/simple/master').to_return(status: 400)
|
1041
|
+
|
1042
|
+
expect{
|
1043
|
+
configurer.run
|
1044
|
+
}.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list: 'myserver:123,someotherservername'/)
|
1069
1045
|
end
|
1070
1046
|
|
1071
|
-
it "should not make multiple node
|
1072
|
-
response = Net::HTTPOK.new(nil, 200, 'OK')
|
1073
|
-
allow(Puppet::Network::HttpPool).to receive(:http_ssl_instance).with('myserver', '123').and_return(double('request', get: response))
|
1074
|
-
|
1047
|
+
it "should not make multiple node requests when the server is found" do
|
1075
1048
|
Puppet.settings[:server_list] = ["myserver:123"]
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1049
|
+
Puppet::Node.indirection.terminus_class = :rest
|
1050
|
+
Puppet::Resource::Catalog.indirection.terminus_class = :rest
|
1051
|
+
|
1052
|
+
stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 200)
|
1053
|
+
stub_request(:get, %r{https://myserver:123/puppet/v3/catalog}).to_return(status: 200)
|
1054
|
+
node_request = stub_request(:get, %r{https://myserver:123/puppet/v3/node/}).to_return(status: 200)
|
1055
|
+
|
1056
|
+
configurer.run
|
1057
|
+
|
1058
|
+
expect(node_request).to have_been_requested.once
|
1079
1059
|
end
|
1080
1060
|
end
|
1081
1061
|
end
|