puppet 5.5.17-universal-darwin → 5.5.22-universal-darwin
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 +1 -1
- data/Gemfile +4 -5
- data/Gemfile.lock +59 -55
- data/ext/build_defaults.yaml +1 -0
- data/ext/cert_inspector +3 -3
- 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 -6
- 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 +3 -1
- data/lib/puppet/application/apply.rb +2 -2
- data/lib/puppet/application/describe.rb +3 -9
- 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/script.rb +2 -2
- data/lib/puppet/configurer.rb +106 -31
- data/lib/puppet/configurer/downloader.rb +33 -16
- data/lib/puppet/daemon.rb +1 -1
- data/lib/puppet/defaults.rb +86 -40
- 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/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/file_serving/http_metadata.rb +1 -1
- data/lib/puppet/file_serving/mount/locales.rb +1 -2
- data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
- data/lib/puppet/file_serving/mount/plugins.rb +1 -2
- 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/new.rb +8 -3
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/functions/reverse_each.rb +1 -1
- data/lib/puppet/functions/step.rb +1 -1
- 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 +6 -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 +1 -1
- 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/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 +11 -3
- 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 +14 -10
- 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/adaptable.rb +7 -13
- data/lib/puppet/pops/adapters.rb +8 -4
- data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
- 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/iterable.rb +34 -8
- data/lib/puppet/pops/types/p_meta_type.rb +1 -1
- data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
- data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
- 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 +29 -15
- 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/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/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/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/gem.rb +4 -2
- 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/puppet_gem.rb +5 -0
- data/lib/puppet/provider/package/rpm.rb +6 -6
- data/lib/puppet/provider/package/windows/package.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +28 -20
- 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/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 +31 -13
- data/lib/puppet/provider/user/directoryservice.rb +31 -6
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +39 -20
- 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 +1 -1
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/resource/type.rb +10 -1
- data/lib/puppet/settings.rb +3 -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 +20 -12
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/transaction/resource_harness.rb +1 -1
- data/lib/puppet/type.rb +8 -4
- data/lib/puppet/type/cron.rb +1 -1
- data/lib/puppet/type/exec.rb +7 -3
- 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 +97 -8
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/selboolean.rb +17 -3
- data/lib/puppet/type/service.rb +2 -8
- data/lib/puppet/type/user.rb +5 -9
- data/lib/puppet/util.rb +35 -12
- data/lib/puppet/util/autoload.rb +9 -7
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +8 -14
- 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 +3 -1
- 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 +1 -0
- data/lib/puppet/util/windows/sid.rb +3 -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 +362 -318
- data/man/man5/puppet.conf.5 +39 -9
- 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 +66 -0
- data/spec/integration/data_binding_spec.rb +1 -0
- data/spec/integration/defaults_spec.rb +1 -2
- data/spec/integration/faces/plugin_spec.rb +29 -47
- data/spec/integration/indirector/facts/facter_spec.rb +4 -0
- data/spec/integration/parser/compiler_spec.rb +11 -0
- data/spec/integration/type/notify_spec.rb +46 -0
- data/spec/integration/util/windows/adsi_spec.rb +6 -1
- data/spec/integration/util/windows/registry_spec.rb +7 -7
- data/spec/shared_contexts/types_setup.rb +2 -0
- data/spec/unit/agent_spec.rb +34 -26
- data/spec/unit/application/apply_spec.rb +2 -12
- data/spec/unit/configurer/downloader_spec.rb +10 -0
- data/spec/unit/configurer/fact_handler_spec.rb +0 -4
- data/spec/unit/configurer_spec.rb +430 -415
- data/spec/unit/daemon_spec.rb +0 -1
- data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
- data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
- data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
- 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/network/http/api/indirected_routes_spec.rb +2 -1
- data/spec/unit/network/http/connection_spec.rb +43 -1
- 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/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/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/puppet_gem_spec.rb +4 -1
- data/spec/unit/provider/package/yum_spec.rb +90 -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/runit_spec.rb +24 -0
- data/spec/unit/provider/service/systemd_spec.rb +109 -36
- 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/useradd_spec.rb +81 -16
- data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
- data/spec/unit/puppet_pal_2pec.rb +3 -0
- data/spec/unit/ssl/certificate_authority_spec.rb +2 -3
- data/spec/unit/ssl/certificate_spec.rb +7 -0
- data/spec/unit/ssl/host_spec.rb +2 -0
- data/spec/unit/test/test_helper_spec.rb +17 -0
- data/spec/unit/type/exec_spec.rb +6 -12
- data/spec/unit/type/file/content_spec.rb +9 -3
- data/spec/unit/type/file_spec.rb +9 -4
- data/spec/unit/type/package_spec.rb +8 -0
- data/spec/unit/type/selboolean_spec.rb +4 -6
- data/spec/unit/type/service_spec.rb +9 -8
- data/spec/unit/type/user_spec.rb +19 -13
- data/spec/unit/util/execution_spec.rb +16 -0
- data/spec/unit/util/http_proxy_spec.rb +97 -0
- data/spec/unit/util/log/destinations_spec.rb +2 -26
- data/spec/unit/util/log_spec.rb +0 -138
- 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/sid_spec.rb +2 -2
- data/tasks/manpages.rake +1 -0
- metadata +16 -7
- 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
@@ -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)
|
@@ -228,5 +228,15 @@ describe Puppet::Configurer::Downloader do
|
|
228
228
|
|
229
229
|
expect { @dler.evaluate }.not_to raise_error
|
230
230
|
end
|
231
|
+
|
232
|
+
it "raises an exception if catalog application fails" do
|
233
|
+
Puppet[:ignore_plugin_errors] = false
|
234
|
+
|
235
|
+
expect(@dler.file).to receive(:retrieve).and_raise(Puppet::Error, "testing")
|
236
|
+
|
237
|
+
expect {
|
238
|
+
@dler.evaluate
|
239
|
+
}.to raise_error(Puppet::Error, /testing/)
|
240
|
+
end
|
231
241
|
end
|
232
242
|
end
|
@@ -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,127 @@
|
|
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)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "fails the run if pluginsync fails when usecacheonfailure is false" do
|
90
|
+
Puppet[:ignore_plugin_errors] = false
|
91
|
+
|
92
|
+
# --test implies these, set them so we don't fall back to a cached catalog
|
93
|
+
Puppet[:use_cached_catalog] = false
|
94
|
+
Puppet[:usecacheonfailure] = false
|
95
|
+
|
96
|
+
body = "{\"message\":\"Not Found: Could not find environment 'fasdfad'\",\"issue_kind\":\"RUNTIME_ERROR\"}"
|
97
|
+
stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(
|
98
|
+
status: 404, body: body, headers: {'Content-Type' => 'application/json'}
|
99
|
+
)
|
100
|
+
stub_request(:get, %r{/puppet/v3/file_metadata/pluginfacts}).to_return(
|
101
|
+
status: 404, body: body, headers: {'Content-Type' => 'application/json'}
|
102
|
+
)
|
103
|
+
|
104
|
+
configurer.run(pluginsync: true)
|
105
|
+
|
106
|
+
expect(@logs).to include(an_object_having_attributes(level: :err, message: %r{Failed to apply catalog: Failed to retrieve pluginfacts: Could not retrieve information from environment production source\(s\) puppet:///pluginfacts}))
|
107
|
+
end
|
108
|
+
|
109
|
+
it "applies a cached catalog if pluginsync fails when usecacheonfailure is true" do
|
110
|
+
Puppet[:ignore_plugin_errors] = false
|
111
|
+
|
112
|
+
Puppet[:use_cached_catalog] = false
|
113
|
+
Puppet[:usecacheonfailure] = true
|
114
|
+
|
115
|
+
body = "{\"message\":\"Not Found: Could not find environment 'fasdfad'\",\"issue_kind\":\"RUNTIME_ERROR\"}"
|
116
|
+
stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(
|
117
|
+
status: 404, body: body, headers: {'Content-Type' => 'application/json'}
|
118
|
+
)
|
119
|
+
stub_request(:get, %r{/puppet/v3/file_metadata/pluginfacts}).to_return(
|
120
|
+
status: 404, body: body, headers: {'Content-Type' => 'application/json'}
|
121
|
+
)
|
122
|
+
|
123
|
+
expect(configurer.run(pluginsync: true, :report => report)).to eq(0)
|
124
|
+
expect(report.cached_catalog_status).to eq('on_failure')
|
106
125
|
end
|
107
126
|
|
108
127
|
it "applies a cached catalog when it can't connect to the master" do
|
@@ -110,208 +129,159 @@ describe Puppet::Configurer do
|
|
110
129
|
|
111
130
|
expect(Puppet::Node.indirection).to receive(:find).and_raise(error)
|
112
131
|
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(
|
132
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_terminus => true)).and_return(catalog)
|
114
133
|
|
115
|
-
expect(
|
134
|
+
expect(configurer.run).to eq(0)
|
116
135
|
end
|
117
136
|
|
118
137
|
it "should initialize a transaction report if one is not provided" do
|
119
|
-
|
120
|
-
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
138
|
+
# host and settings catalogs each create a report...
|
139
|
+
expect(Puppet::Transaction::Report).to receive(:new).and_return(report).twice
|
121
140
|
|
122
|
-
|
141
|
+
configurer.run
|
123
142
|
end
|
124
143
|
|
125
144
|
it "should respect node_name_fact when setting the host on a report" do
|
126
145
|
Puppet[:node_name_fact] = 'my_name_fact'
|
127
|
-
|
128
|
-
|
129
|
-
report = Puppet::Transaction::Report.new
|
146
|
+
facts.values = {'my_name_fact' => 'node_name_from_fact'}
|
147
|
+
Puppet::Node::Facts.indirection.save(facts)
|
130
148
|
|
131
|
-
|
149
|
+
configurer.run(:report => report)
|
132
150
|
expect(report.host).to eq('node_name_from_fact')
|
133
151
|
end
|
134
152
|
|
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)
|
153
|
+
it "creates a new report when applying the catalog" do
|
154
|
+
options = {}
|
155
|
+
configurer.run(options)
|
154
156
|
|
155
|
-
|
157
|
+
expect(options[:report].metrics['time']['catalog_application']).to be_an_instance_of(Float)
|
156
158
|
end
|
157
159
|
|
158
|
-
it "
|
159
|
-
|
160
|
+
it "uses the provided report when applying the catalog" do
|
161
|
+
configurer.run(:report => report)
|
160
162
|
|
161
|
-
|
163
|
+
expect(report.metrics['time']['catalog_application']).to be_an_instance_of(Float)
|
162
164
|
end
|
163
165
|
|
164
166
|
it "should log a failure and do nothing if no catalog can be retrieved" do
|
165
|
-
expect(
|
167
|
+
expect(configurer).to receive(:retrieve_catalog).and_return(nil)
|
166
168
|
|
167
169
|
expect(Puppet).to receive(:err).with("Could not retrieve catalog; skipping run")
|
168
170
|
|
169
|
-
|
171
|
+
configurer.run
|
170
172
|
end
|
171
173
|
|
172
|
-
it "
|
173
|
-
expect(
|
174
|
+
it "passes arbitrary options when applying the catalog" do
|
175
|
+
expect(catalog).to receive(:apply).with(hash_including(one: true))
|
174
176
|
|
175
|
-
|
176
|
-
@agent.run :one => true
|
177
|
-
end
|
178
|
-
|
179
|
-
it "should accept a catalog and use it instead of retrieving a different one" do
|
180
|
-
expect(@agent).not_to receive(:retrieve_catalog)
|
181
|
-
|
182
|
-
expect(@catalog).to receive(:apply)
|
183
|
-
@agent.run :one => true, :catalog => @catalog
|
177
|
+
configurer.run(catalog: catalog, one: true)
|
184
178
|
end
|
185
179
|
|
186
180
|
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)
|
181
|
+
configurer.run(report: report)
|
197
182
|
|
198
|
-
|
183
|
+
expect(report.logs).to include(an_object_having_attributes(level: :notice, message: /Applied catalog in .* seconds/))
|
199
184
|
end
|
200
185
|
|
201
186
|
it "should create report with passed transaction_uuid and job_id" do
|
202
|
-
|
203
|
-
allow(@agent).to receive(:init_storage)
|
187
|
+
configurer = Puppet::Configurer.new("test_tuuid", "test_jid")
|
204
188
|
|
205
189
|
report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
|
206
190
|
expect(Puppet::Transaction::Report).to receive(:new).with(anything, anything, 'test_tuuid', 'test_jid').and_return(report)
|
207
|
-
expect(
|
191
|
+
expect(configurer).to receive(:send_report).with(report)
|
208
192
|
|
209
|
-
|
193
|
+
configurer.run
|
210
194
|
end
|
211
195
|
|
212
196
|
it "should send the report" do
|
213
197
|
report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
|
214
198
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
215
|
-
expect(
|
199
|
+
expect(configurer).to receive(:send_report).with(report)
|
216
200
|
|
217
201
|
expect(report.environment).to eq("test")
|
218
202
|
expect(report.transaction_uuid).to eq("aaaa")
|
219
203
|
|
220
|
-
|
204
|
+
configurer.run
|
221
205
|
end
|
222
206
|
|
223
207
|
it "should send the transaction report even if the catalog could not be retrieved" do
|
224
|
-
expect(
|
208
|
+
expect(configurer).to receive(:retrieve_catalog).and_return(nil)
|
225
209
|
|
226
210
|
report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
|
227
211
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
228
|
-
expect(
|
212
|
+
expect(configurer).to receive(:send_report).with(report)
|
229
213
|
|
230
214
|
expect(report.environment).to eq("test")
|
231
215
|
expect(report.transaction_uuid).to eq("aaaa")
|
232
216
|
|
233
|
-
|
217
|
+
configurer.run
|
234
218
|
end
|
235
219
|
|
236
220
|
it "should send the transaction report even if there is a failure" do
|
237
|
-
expect(
|
221
|
+
expect(configurer).to receive(:retrieve_catalog).and_raise("whatever")
|
238
222
|
|
239
223
|
report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
|
240
224
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
241
|
-
expect(
|
225
|
+
expect(configurer).to receive(:send_report).with(report)
|
242
226
|
|
243
227
|
expect(report.environment).to eq("test")
|
244
228
|
expect(report.transaction_uuid).to eq("aaaa")
|
245
229
|
|
246
|
-
expect(
|
230
|
+
expect(configurer.run).to be_nil
|
247
231
|
end
|
248
232
|
|
249
233
|
it "should remove the report as a log destination when the run is finished" do
|
250
|
-
report
|
251
|
-
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
252
|
-
|
253
|
-
@agent.run
|
234
|
+
configurer.run(report: report)
|
254
235
|
|
255
236
|
expect(Puppet::Util::Log.destinations).not_to include(report)
|
256
237
|
end
|
257
238
|
|
258
|
-
it "should return
|
259
|
-
|
260
|
-
|
261
|
-
expect(report).to receive(:exit_status).and_return(1234)
|
239
|
+
it "should return an exit status of 2 due to the notify resource 'changing'" do
|
240
|
+
cat = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
|
241
|
+
cat.add_resource(Puppet::Type.type(:notify).new(:name => 'something changed'))
|
262
242
|
|
263
|
-
expect(
|
243
|
+
expect(configurer.run(catalog: cat, report: report)).to eq(2)
|
264
244
|
end
|
265
245
|
|
266
246
|
it "should return nil if catalog application fails" do
|
267
|
-
expect(
|
268
|
-
|
269
|
-
expect(
|
247
|
+
expect(catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
|
248
|
+
|
249
|
+
expect(configurer.run(catalog: catalog, report: report)).to be_nil
|
270
250
|
end
|
271
251
|
|
272
252
|
it "should send the transaction report even if the pre-run command fails" do
|
273
|
-
report = Puppet::Transaction::Report.new
|
274
253
|
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
275
254
|
|
276
255
|
Puppet.settings[:prerun_command] = "/my/command"
|
277
256
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
278
|
-
expect(
|
257
|
+
expect(configurer).to receive(:send_report).with(report)
|
279
258
|
|
280
|
-
expect(
|
259
|
+
expect(configurer.run).to be_nil
|
281
260
|
end
|
282
261
|
|
283
262
|
it "should include the pre-run command failure in the report" do
|
284
|
-
report = Puppet::Transaction::Report.new
|
285
|
-
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
286
|
-
|
287
263
|
Puppet.settings[:prerun_command] = "/my/command"
|
288
264
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
289
265
|
|
290
|
-
expect(
|
266
|
+
expect(configurer.run(report: report)).to be_nil
|
291
267
|
expect(report.logs.find { |x| x.message =~ /Could not run command from prerun_command/ }).to be
|
292
268
|
end
|
293
269
|
|
294
270
|
it "should send the transaction report even if the post-run command fails" do
|
295
|
-
report = Puppet::Transaction::Report.new
|
296
|
-
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
297
|
-
|
298
271
|
Puppet.settings[:postrun_command] = "/my/command"
|
299
272
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
300
|
-
expect(
|
273
|
+
expect(configurer).to receive(:send_report).with(report)
|
301
274
|
|
302
|
-
expect(
|
275
|
+
expect(configurer.run(report: report)).to be_nil
|
303
276
|
end
|
304
277
|
|
305
278
|
it "should include the post-run command failure in the report" do
|
306
|
-
report = Puppet::Transaction::Report.new
|
307
|
-
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
308
|
-
|
309
279
|
Puppet.settings[:postrun_command] = "/my/command"
|
310
280
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
311
281
|
|
312
282
|
expect(report).to receive(:<<) { |log, _| expect(log.message).to match(/Could not run command from postrun_command/) }.at_least(:once)
|
313
283
|
|
314
|
-
expect(
|
284
|
+
expect(configurer.run(report: report)).to be_nil
|
315
285
|
end
|
316
286
|
|
317
287
|
it "should execute post-run command even if the pre-run command fails" do
|
@@ -320,47 +290,36 @@ describe Puppet::Configurer do
|
|
320
290
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/precommand"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
321
291
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/postcommand"])
|
322
292
|
|
323
|
-
expect(
|
293
|
+
expect(configurer.run).to be_nil
|
324
294
|
end
|
325
295
|
|
326
296
|
it "should finalize the report" do
|
327
|
-
report = Puppet::Transaction::Report.new
|
328
|
-
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
329
|
-
|
330
297
|
expect(report).to receive(:finalize_report)
|
331
|
-
|
298
|
+
configurer.run(report: report)
|
332
299
|
end
|
333
300
|
|
334
301
|
it "should not apply the catalog if the pre-run command fails" do
|
335
|
-
report = Puppet::Transaction::Report.new
|
336
|
-
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
337
|
-
|
338
302
|
Puppet.settings[:prerun_command] = "/my/command"
|
339
303
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
340
304
|
|
341
|
-
|
342
|
-
expect(
|
305
|
+
expect_any_instance_of(Puppet::Resource::Catalog).not_to receive(:apply)
|
306
|
+
expect(configurer).to receive(:send_report)
|
343
307
|
|
344
|
-
expect(
|
308
|
+
expect(configurer.run(report: report)).to be_nil
|
345
309
|
end
|
346
310
|
|
347
311
|
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
|
-
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
350
|
-
|
351
312
|
Puppet.settings[:postrun_command] = "/my/command"
|
352
313
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
353
314
|
|
354
|
-
|
355
|
-
expect(
|
315
|
+
expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply)
|
316
|
+
expect(configurer).to receive(:send_report)
|
356
317
|
|
357
|
-
expect(
|
318
|
+
expect(configurer.run(report: report)).to be_nil
|
358
319
|
end
|
359
320
|
|
360
321
|
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)
|
322
|
+
configurer.run(report: report)
|
364
323
|
|
365
324
|
expect(report.metrics['time']).to be
|
366
325
|
expect(report.metrics['time']['total']).to be_a_kind_of(Numeric)
|
@@ -370,17 +329,15 @@ describe Puppet::Configurer do
|
|
370
329
|
Puppet.settings[:prerun_command] = "/my/command"
|
371
330
|
expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
|
372
331
|
|
373
|
-
report
|
374
|
-
@agent.run(report: report)
|
332
|
+
configurer.run(report: report)
|
375
333
|
|
376
334
|
expect(report.metrics['time']).to be
|
377
335
|
expect(report.metrics['time']['total']).to be_a_kind_of(Numeric)
|
378
336
|
end
|
379
337
|
|
380
338
|
it 'includes total time metrics in the report even if catalog retrieval fails' do
|
381
|
-
|
382
|
-
|
383
|
-
@agent.run(:report => report)
|
339
|
+
allow(configurer).to receive(:prepare_and_retrieve_catalog_from_cache).and_raise
|
340
|
+
configurer.run(:report => report)
|
384
341
|
|
385
342
|
expect(report.metrics['time']).to be
|
386
343
|
expect(report.metrics['time']['total']).to be_a_kind_of(Numeric)
|
@@ -388,96 +345,93 @@ describe Puppet::Configurer do
|
|
388
345
|
|
389
346
|
it "should refetch the catalog if the server specifies a new environment in the catalog" do
|
390
347
|
catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
|
391
|
-
expect(
|
348
|
+
expect(configurer).to receive(:retrieve_catalog).and_return(catalog).twice
|
392
349
|
|
393
|
-
|
350
|
+
configurer.run
|
394
351
|
end
|
395
352
|
|
396
|
-
it "
|
397
|
-
|
353
|
+
it "changes the configurer's environment if the server specifies a new environment in the catalog" do
|
354
|
+
allow_any_instance_of(Puppet::Resource::Catalog).to receive(:environment).and_return("second_env")
|
398
355
|
|
399
|
-
|
356
|
+
configurer.run
|
400
357
|
|
401
|
-
expect(
|
358
|
+
expect(configurer.environment).to eq("second_env")
|
402
359
|
end
|
403
360
|
|
404
|
-
it "
|
405
|
-
|
406
|
-
expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
|
407
|
-
expect(@agent).to receive(:send_report).with(report)
|
408
|
-
|
409
|
-
allow(@catalog).to receive(:environment).and_return("second_env")
|
410
|
-
allow(@agent).to receive(:retrieve_catalog).and_return(@catalog)
|
361
|
+
it "changes the report's environment if the server specifies a new environment in the catalog" do
|
362
|
+
allow_any_instance_of(Puppet::Resource::Catalog).to receive(:environment).and_return("second_env")
|
411
363
|
|
412
|
-
|
364
|
+
configurer.run(report: report)
|
413
365
|
|
414
366
|
expect(report.environment).to eq("second_env")
|
415
367
|
end
|
416
368
|
|
417
369
|
it "sends the transaction uuid in a catalog request" do
|
418
|
-
|
370
|
+
configurer = Puppet::Configurer.new('aaa')
|
419
371
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(transaction_uuid: 'aaa'))
|
420
|
-
|
372
|
+
configurer.run
|
421
373
|
end
|
422
374
|
|
423
375
|
it "sends the transaction uuid in a catalog request" do
|
424
|
-
|
376
|
+
configurer = Puppet::Configurer.new('b', 'aaa')
|
425
377
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(job_id: 'aaa'))
|
426
|
-
|
378
|
+
configurer.run
|
427
379
|
end
|
428
380
|
|
429
381
|
it "sets the static_catalog query param to true in a catalog request" do
|
430
382
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(static_catalog: true))
|
431
|
-
|
383
|
+
configurer.run
|
432
384
|
end
|
433
385
|
|
434
386
|
it "sets the checksum_type query param to the default supported_checksum_types in a catalog request" do
|
435
387
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything,
|
436
388
|
hash_including(checksum_type: 'md5.sha256.sha384.sha512.sha224'))
|
437
|
-
|
389
|
+
configurer.run
|
438
390
|
end
|
439
391
|
|
440
392
|
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
393
|
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)
|
394
|
+
# Regenerate the agent to pick up the new setting
|
395
|
+
configurer = Puppet::Configurer.new
|
448
396
|
|
449
397
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(checksum_type: 'sha256'))
|
450
|
-
|
398
|
+
configurer.run
|
451
399
|
end
|
452
400
|
|
453
401
|
describe "when not using a REST terminus for catalogs" do
|
454
402
|
it "should not pass any facts when retrieving the catalog" do
|
403
|
+
# This is weird, we collect facts when constructing the node,
|
404
|
+
# but we don't send them in the indirector request. Then the compiler
|
405
|
+
# looks up the node, and collects its facts, which we could have sent
|
406
|
+
# in the first place. This seems like a bug.
|
455
407
|
Puppet::Resource::Catalog.indirection.terminus_class = :compiler
|
456
|
-
|
408
|
+
|
457
409
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find) do |name, options|
|
458
|
-
options[:facts].
|
459
|
-
end.and_return(
|
410
|
+
expect(options[:facts]).to be_nil
|
411
|
+
end.and_return(catalog)
|
460
412
|
|
461
|
-
|
413
|
+
configurer.run
|
462
414
|
end
|
463
415
|
end
|
464
416
|
|
465
417
|
describe "when using a REST terminus for catalogs" do
|
466
|
-
it "should pass the
|
418
|
+
it "should pass the url encoded facts and facts format as arguments when retrieving the catalog" do
|
467
419
|
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
420
|
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
421
|
+
facts.values = { 'foo' => 'bar' }
|
422
|
+
Puppet::Node::Facts.indirection.save(facts)
|
423
|
+
|
424
|
+
expect(
|
425
|
+
Puppet::Resource::Catalog.indirection
|
426
|
+
).to receive(:find) do |_, options|
|
427
|
+
expect(options[:facts_format]).to eq("application/json")
|
475
428
|
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
429
|
+
unescaped = JSON.parse(CGI.unescape(options[:facts]))
|
430
|
+
expect(unescaped).to include("values" => {"foo" => "bar"})
|
431
|
+
end.and_return(catalog)
|
432
|
+
|
433
|
+
configurer.run
|
434
|
+
end
|
481
435
|
end
|
482
436
|
end
|
483
437
|
|
@@ -485,56 +439,52 @@ describe Puppet::Configurer do
|
|
485
439
|
include PuppetSpec::Files
|
486
440
|
|
487
441
|
before do
|
488
|
-
allow(Puppet.settings).to receive(:use).and_return(true)
|
489
|
-
@configurer = Puppet::Configurer.new
|
490
442
|
Puppet[:lastrunfile] = tmpfile('last_run_file')
|
491
|
-
|
492
|
-
@report = Puppet::Transaction::Report.new
|
493
443
|
Puppet[:reports] = "none"
|
494
444
|
end
|
495
445
|
|
496
446
|
it "should print a report summary if configured to do so" do
|
497
447
|
Puppet.settings[:summarize] = true
|
498
448
|
|
499
|
-
expect(
|
449
|
+
expect(report).to receive(:summary).and_return("stuff")
|
500
450
|
|
501
|
-
expect(
|
502
|
-
|
451
|
+
expect(configurer).to receive(:puts).with("stuff")
|
452
|
+
configurer.send_report(report)
|
503
453
|
end
|
504
454
|
|
505
455
|
it "should not print a report summary if not configured to do so" do
|
506
456
|
Puppet.settings[:summarize] = false
|
507
457
|
|
508
|
-
expect(
|
509
|
-
|
458
|
+
expect(configurer).not_to receive(:puts)
|
459
|
+
configurer.send_report(report)
|
510
460
|
end
|
511
461
|
|
512
462
|
it "should save the report if reporting is enabled" do
|
513
463
|
Puppet.settings[:report] = true
|
514
464
|
|
515
|
-
expect(Puppet::Transaction::Report.indirection).to receive(:save).with(
|
516
|
-
|
465
|
+
expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash))
|
466
|
+
configurer.send_report(report)
|
517
467
|
end
|
518
468
|
|
519
469
|
it "should not save the report if reporting is disabled" do
|
520
470
|
Puppet.settings[:report] = false
|
521
471
|
|
522
|
-
expect(Puppet::Transaction::Report.indirection).not_to receive(:save).with(
|
523
|
-
|
472
|
+
expect(Puppet::Transaction::Report.indirection).not_to receive(:save).with(report, nil, instance_of(Hash))
|
473
|
+
configurer.send_report(report)
|
524
474
|
end
|
525
475
|
|
526
476
|
it "should save the last run summary if reporting is enabled" do
|
527
477
|
Puppet.settings[:report] = true
|
528
478
|
|
529
|
-
expect(
|
530
|
-
|
479
|
+
expect(configurer).to receive(:save_last_run_summary).with(report)
|
480
|
+
configurer.send_report(report)
|
531
481
|
end
|
532
482
|
|
533
483
|
it "should save the last run summary if reporting is disabled" do
|
534
484
|
Puppet.settings[:report] = false
|
535
485
|
|
536
|
-
expect(
|
537
|
-
|
486
|
+
expect(configurer).to receive(:save_last_run_summary).with(report)
|
487
|
+
configurer.send_report(report)
|
538
488
|
end
|
539
489
|
|
540
490
|
it "should log but not fail if saving the report fails" do
|
@@ -543,7 +493,7 @@ describe Puppet::Configurer do
|
|
543
493
|
expect(Puppet::Transaction::Report.indirection).to receive(:save).and_raise("whatever")
|
544
494
|
|
545
495
|
expect(Puppet).to receive(:err)
|
546
|
-
expect {
|
496
|
+
expect { configurer.send_report(report) }.not_to raise_error
|
547
497
|
end
|
548
498
|
end
|
549
499
|
|
@@ -551,22 +501,17 @@ describe Puppet::Configurer do
|
|
551
501
|
include PuppetSpec::Files
|
552
502
|
|
553
503
|
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
504
|
Puppet[:lastrunfile] = tmpfile('last_run_file')
|
560
505
|
end
|
561
506
|
|
562
507
|
it "should write the last run file" do
|
563
|
-
|
508
|
+
configurer.save_last_run_summary(report)
|
564
509
|
expect(Puppet::FileSystem.exist?(Puppet[:lastrunfile])).to be_truthy
|
565
510
|
end
|
566
511
|
|
567
512
|
it "should write the raw summary as yaml" do
|
568
|
-
expect(
|
569
|
-
|
513
|
+
expect(report).to receive(:raw_summary).and_return("summary")
|
514
|
+
configurer.save_last_run_summary(report)
|
570
515
|
expect(File.read(Puppet[:lastrunfile])).to eq(YAML.dump("summary"))
|
571
516
|
end
|
572
517
|
|
@@ -582,12 +527,12 @@ describe Puppet::Configurer do
|
|
582
527
|
expect(Puppet::Util).to receive(:replace_file).and_yield(fh)
|
583
528
|
|
584
529
|
expect(Puppet).to receive(:err)
|
585
|
-
expect {
|
530
|
+
expect { configurer.save_last_run_summary(report) }.to_not raise_error
|
586
531
|
end
|
587
532
|
|
588
533
|
it "should create the last run file with the correct mode" do
|
589
534
|
expect(Puppet.settings.setting(:lastrunfile)).to receive(:mode).and_return('664')
|
590
|
-
|
535
|
+
configurer.save_last_run_summary(report)
|
591
536
|
|
592
537
|
if Puppet::Util::Platform.windows?
|
593
538
|
require 'puppet/util/windows/security'
|
@@ -601,28 +546,37 @@ describe Puppet::Configurer do
|
|
601
546
|
it "should report invalid last run file permissions" do
|
602
547
|
expect(Puppet.settings.setting(:lastrunfile)).to receive(:mode).and_return('892')
|
603
548
|
expect(Puppet).to receive(:err).with(/Could not save last run local report.*892 is invalid/)
|
604
|
-
|
549
|
+
configurer.save_last_run_summary(report)
|
605
550
|
end
|
606
551
|
end
|
607
552
|
|
608
553
|
describe "when requesting a node" do
|
609
554
|
it "uses the transaction uuid in the request" do
|
610
555
|
expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(transaction_uuid: anything)).twice
|
611
|
-
|
556
|
+
configurer.run
|
612
557
|
end
|
613
558
|
|
614
559
|
it "sends an explicitly configured environment request" do
|
615
560
|
expect(Puppet.settings).to receive(:set_by_config?).with(:environment).and_return(true)
|
616
561
|
expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(configured_environment: Puppet[:environment])).twice
|
617
|
-
|
562
|
+
configurer.run
|
618
563
|
end
|
619
564
|
|
620
565
|
it "does not send a configured_environment when using the default" do
|
621
566
|
expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(configured_environment: nil)).twice
|
622
|
-
|
567
|
+
configurer.run
|
623
568
|
end
|
624
569
|
end
|
625
570
|
|
571
|
+
def expects_pluginsync
|
572
|
+
metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":420,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
|
573
|
+
stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
|
574
|
+
|
575
|
+
# response retains owner/group/mode due to source_permissions => use
|
576
|
+
facts_metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":500,\"group\":500,\"mode\":493,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
|
577
|
+
stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(status: 200, body: facts_metadata, headers: {'Content-Type' => 'application/json'})
|
578
|
+
end
|
579
|
+
|
626
580
|
def expects_new_catalog_only(catalog)
|
627
581
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
|
628
582
|
expect(Puppet::Resource::Catalog.indirection).not_to receive(:find).with(anything, hash_including(ignore_terminus: true))
|
@@ -639,6 +593,7 @@ describe Puppet::Configurer do
|
|
639
593
|
end
|
640
594
|
|
641
595
|
def expects_fallback_to_new_catalog(catalog)
|
596
|
+
expects_pluginsync
|
642
597
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(nil)
|
643
598
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
|
644
599
|
end
|
@@ -650,14 +605,6 @@ describe Puppet::Configurer do
|
|
650
605
|
|
651
606
|
describe "when retrieving a catalog" do
|
652
607
|
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
608
|
allow(Puppet::Resource::Catalog.indirection).to receive(:terminus_class).and_return(:rest)
|
662
609
|
end
|
663
610
|
|
@@ -667,100 +614,127 @@ describe Puppet::Configurer do
|
|
667
614
|
end
|
668
615
|
|
669
616
|
it "should first look in the cache for a catalog" do
|
670
|
-
expects_cached_catalog_only(
|
617
|
+
expects_cached_catalog_only(catalog)
|
671
618
|
|
672
|
-
|
619
|
+
configurer.run
|
673
620
|
end
|
674
621
|
|
675
622
|
it "should not make a node request or pluginsync when a cached catalog is successfully retrieved" do
|
676
623
|
expect(Puppet::Node.indirection).not_to receive(:find)
|
677
|
-
expects_cached_catalog_only(
|
678
|
-
expect(
|
624
|
+
expects_cached_catalog_only(catalog)
|
625
|
+
expect(configurer).not_to receive(:download_plugins)
|
679
626
|
|
680
|
-
|
627
|
+
configurer.run
|
681
628
|
end
|
682
629
|
|
683
630
|
it "should make a node request and pluginsync when a cached catalog cannot be retrieved" do
|
684
631
|
expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
|
685
|
-
expects_fallback_to_new_catalog(
|
686
|
-
expect(@agent).to receive(:download_plugins)
|
632
|
+
expects_fallback_to_new_catalog(catalog)
|
687
633
|
|
688
|
-
|
634
|
+
configurer.run
|
689
635
|
end
|
690
636
|
|
691
637
|
it "should set its cached_catalog_status to 'explicitly_requested'" do
|
692
|
-
expects_cached_catalog_only(
|
638
|
+
expects_cached_catalog_only(catalog)
|
693
639
|
|
694
|
-
|
695
|
-
|
640
|
+
options = {}
|
641
|
+
configurer.run(options)
|
642
|
+
|
643
|
+
expect(options[:report].cached_catalog_status).to eq('explicitly_requested')
|
696
644
|
end
|
697
645
|
|
698
646
|
it "should set its cached_catalog_status to 'explicitly requested' if the cached catalog is from a different environment" do
|
699
647
|
cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
|
700
648
|
expects_cached_catalog_only(cached_catalog)
|
701
649
|
|
702
|
-
|
703
|
-
|
650
|
+
options = {}
|
651
|
+
configurer.run(options)
|
652
|
+
|
653
|
+
expect(options[:report].cached_catalog_status).to eq('explicitly_requested')
|
704
654
|
end
|
705
655
|
|
706
656
|
it "should compile a new catalog if none is found in the cache" do
|
707
|
-
expects_fallback_to_new_catalog(
|
657
|
+
expects_fallback_to_new_catalog(catalog)
|
708
658
|
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
it "should set its cached_catalog_status to 'not_used' if no catalog is found in the cache" do
|
713
|
-
expects_fallback_to_new_catalog(@catalog)
|
659
|
+
options = {}
|
660
|
+
configurer.run(options)
|
714
661
|
|
715
|
-
|
716
|
-
expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('not_used')
|
662
|
+
expect(options[:report].cached_catalog_status).to eq('not_used')
|
717
663
|
end
|
718
664
|
|
719
665
|
it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
|
720
666
|
expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
|
721
667
|
expects_neither_new_or_cached_catalog
|
668
|
+
expects_pluginsync
|
722
669
|
|
723
|
-
|
670
|
+
configurer.run
|
724
671
|
end
|
725
672
|
|
726
673
|
it "should return the cached catalog when the environment doesn't match" do
|
727
674
|
cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
|
728
675
|
expects_cached_catalog_only(cached_catalog)
|
729
676
|
|
677
|
+
allow(Puppet).to receive(:info)
|
730
678
|
expect(Puppet).to receive(:info).with("Using cached catalog from environment 'second_env'")
|
731
|
-
|
679
|
+
|
680
|
+
configurer.run
|
681
|
+
end
|
682
|
+
|
683
|
+
it "applies the catalog passed as options when the catalog cache terminus is not set" do
|
684
|
+
expects_pluginsync
|
685
|
+
|
686
|
+
catalog.add_resource(Puppet::Resource.new('notify', 'from apply'))
|
687
|
+
configurer.run(catalog: catalog.to_ral)
|
688
|
+
|
689
|
+
# make sure cache class is not set to avoid surprises later
|
690
|
+
expect(Puppet::Resource::Catalog.indirection).to_not be_cache
|
691
|
+
expect(@logs).to include(an_object_having_attributes(level: :notice, message: /defined 'message' as 'from apply'/))
|
692
|
+
end
|
693
|
+
|
694
|
+
it "applies the cached catalog when the catalog cache terminus is set, ignoring the catalog passed as options" do
|
695
|
+
Puppet::Resource::Catalog.indirection.cache_class = :json
|
696
|
+
|
697
|
+
cached_catalog = Puppet::Resource::Catalog.new(Puppet[:node_name_value], Puppet[:environment])
|
698
|
+
cached_catalog.add_resource(Puppet::Resource.new('notify', 'from cache'))
|
699
|
+
|
700
|
+
# update cached catalog
|
701
|
+
Puppet.settings.use(:main, :agent)
|
702
|
+
path = Puppet::Resource::Catalog.indirection.cache.path(cached_catalog.name)
|
703
|
+
FileUtils.mkdir(File.dirname(path))
|
704
|
+
File.write(path, cached_catalog.render(:json))
|
705
|
+
|
706
|
+
configurer.run(catalog: catalog.to_ral)
|
707
|
+
|
708
|
+
expect(@logs).to include(an_object_having_attributes(level: :notice, message: /defined 'message' as 'from cache'/))
|
732
709
|
end
|
733
710
|
end
|
734
711
|
|
735
712
|
describe "and strict environment mode is set" do
|
736
713
|
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
714
|
Puppet.settings[:strict_environment_mode] = true
|
743
715
|
end
|
744
716
|
|
745
717
|
it "should not make a node request" do
|
746
718
|
expect(Puppet::Node.indirection).not_to receive(:find)
|
747
719
|
|
748
|
-
|
720
|
+
configurer.run
|
749
721
|
end
|
750
722
|
|
751
723
|
it "should return nil when the catalog's environment doesn't match the agent specified environment" do
|
752
|
-
|
753
|
-
|
724
|
+
Puppet[:environment] = 'second_env'
|
725
|
+
configurer = Puppet::Configurer.new
|
726
|
+
|
727
|
+
catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote("production"))
|
728
|
+
expects_new_catalog_only(catalog)
|
754
729
|
|
755
730
|
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(
|
731
|
+
expect(configurer.run).to be_nil
|
757
732
|
end
|
758
733
|
|
759
|
-
it "should
|
760
|
-
|
761
|
-
expects_new_catalog_only(@catalog)
|
734
|
+
it "should return 0 when the catalog's environment matches the agent specified environment" do
|
735
|
+
expects_new_catalog_only(catalog)
|
762
736
|
|
763
|
-
expect(
|
737
|
+
expect(configurer.run).to eq(0)
|
764
738
|
end
|
765
739
|
|
766
740
|
describe "and a cached catalog is explicitly requested" do
|
@@ -769,83 +743,81 @@ describe Puppet::Configurer do
|
|
769
743
|
end
|
770
744
|
|
771
745
|
it "should return nil when the cached catalog's environment doesn't match the agent specified environment" do
|
772
|
-
|
773
|
-
|
746
|
+
Puppet[:environment] = 'second_env'
|
747
|
+
configurer = Puppet::Configurer.new
|
748
|
+
|
749
|
+
catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote("production"))
|
750
|
+
expects_cached_catalog_only(catalog)
|
774
751
|
|
775
752
|
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(
|
753
|
+
expect(configurer.run).to be_nil
|
777
754
|
end
|
778
755
|
|
779
756
|
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)
|
757
|
+
expects_cached_catalog_only(catalog)
|
783
758
|
|
784
|
-
expect(
|
759
|
+
expect(configurer.run).to eq(0)
|
785
760
|
end
|
786
761
|
end
|
787
762
|
end
|
788
763
|
|
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
764
|
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(
|
765
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
|
797
766
|
|
798
|
-
|
799
|
-
|
767
|
+
options = {}
|
768
|
+
configurer.run(options)
|
769
|
+
|
770
|
+
expect(options[:report].cached_catalog_status).to eq('not_used')
|
800
771
|
end
|
801
772
|
|
802
773
|
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
|
774
|
+
myhost_facts = Puppet::Node::Facts.new("myhost.domain.com")
|
775
|
+
Puppet::Node::Facts.indirection.save(myhost_facts)
|
809
776
|
|
810
|
-
|
811
|
-
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(
|
777
|
+
Puppet.settings[:node_name_value] = "myhost.domain.com"
|
778
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with("myhost.domain.com", anything).and_return(catalog)
|
812
779
|
|
813
|
-
|
780
|
+
configurer.run
|
814
781
|
end
|
815
782
|
|
816
|
-
it "should log
|
817
|
-
expects_fallback_to_cached_catalog(
|
783
|
+
it "should log when no catalog can be retrieved from the server" do
|
784
|
+
expects_fallback_to_cached_catalog(catalog)
|
818
785
|
|
786
|
+
allow(Puppet).to receive(:info)
|
819
787
|
expect(Puppet).to receive(:info).with("Using cached catalog from environment 'production'")
|
820
|
-
|
788
|
+
configurer.run
|
821
789
|
end
|
822
790
|
|
823
791
|
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(
|
792
|
+
expects_fallback_to_cached_catalog(catalog)
|
793
|
+
|
794
|
+
options = {}
|
795
|
+
configurer.run(options)
|
825
796
|
|
826
|
-
|
827
|
-
expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('on_failure')
|
797
|
+
expect(options[:report].cached_catalog_status).to eq('on_failure')
|
828
798
|
end
|
829
799
|
|
830
800
|
it "should not look in the cache for a catalog if one is returned from the server" do
|
831
|
-
expects_new_catalog_only(
|
801
|
+
expects_new_catalog_only(catalog)
|
832
802
|
|
833
|
-
|
803
|
+
configurer.run
|
834
804
|
end
|
835
805
|
|
836
806
|
it "should return the cached catalog when retrieving the remote catalog throws an exception" do
|
837
807
|
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(
|
808
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(catalog)
|
839
809
|
|
840
|
-
|
810
|
+
configurer.run
|
841
811
|
end
|
842
812
|
|
843
813
|
it "should set its cached_catalog_status to 'on_failure' when retrieving the remote catalog throws an exception" do
|
844
814
|
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(
|
815
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(catalog)
|
816
|
+
|
817
|
+
options = {}
|
818
|
+
configurer.run(options)
|
846
819
|
|
847
|
-
|
848
|
-
expect(@agent.instance_variable_get(:@cached_catalog_status)).to eq('on_failure')
|
820
|
+
expect(options[:report].cached_catalog_status).to eq('on_failure')
|
849
821
|
end
|
850
822
|
|
851
823
|
it "should log and return nil if no catalog can be retrieved from the server and :usecacheonfailure is disabled" do
|
@@ -854,120 +826,173 @@ describe Puppet::Configurer do
|
|
854
826
|
|
855
827
|
expect(Puppet).to receive(:warning).with('Not using cache on failed catalog')
|
856
828
|
|
857
|
-
expect(
|
829
|
+
expect(configurer.run).to be_nil
|
858
830
|
end
|
859
831
|
|
860
832
|
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
833
|
Puppet[:usecacheonfailure] = false
|
862
834
|
expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(nil)
|
863
835
|
|
864
|
-
|
865
|
-
|
836
|
+
options = {}
|
837
|
+
configurer.run(options)
|
838
|
+
|
839
|
+
expect(options[:report].cached_catalog_status).to eq('not_used')
|
866
840
|
end
|
867
841
|
|
868
842
|
it "should return nil if no cached catalog is available and no catalog can be retrieved from the server" do
|
869
843
|
expects_neither_new_or_cached_catalog
|
870
844
|
|
871
|
-
expect(
|
845
|
+
expect(configurer.run).to be_nil
|
872
846
|
end
|
873
847
|
|
874
848
|
it "should return nil if its cached catalog environment doesn't match server-specified environment" do
|
875
849
|
cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
|
876
|
-
@agent.instance_variable_set(:@node_environment, 'production')
|
877
850
|
|
878
851
|
expects_fallback_to_cached_catalog(cached_catalog)
|
879
852
|
|
853
|
+
allow(Puppet).to receive(:err)
|
880
854
|
expect(Puppet).to receive(:err).with("Not using cached catalog because its environment 'second_env' does not match 'production'")
|
881
|
-
expect(
|
855
|
+
expect(configurer.run).to be_nil
|
882
856
|
end
|
883
857
|
|
884
858
|
it "should set its cached_catalog_status to 'not_used' if the cached catalog environment doesn't match server-specified environment" do
|
885
859
|
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
860
|
|
898
861
|
expects_fallback_to_cached_catalog(cached_catalog)
|
899
862
|
|
900
|
-
|
863
|
+
options = {}
|
864
|
+
configurer.run(options)
|
865
|
+
expect(options[:report].cached_catalog_status).to eq('not_used')
|
901
866
|
end
|
902
867
|
|
903
868
|
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)
|
869
|
+
expects_fallback_to_cached_catalog(catalog)
|
908
870
|
|
909
|
-
|
910
|
-
|
871
|
+
options = {}
|
872
|
+
configurer.run(options)
|
873
|
+
expect(options[:report].cached_catalog_status).to eq('on_failure')
|
911
874
|
end
|
912
875
|
|
913
876
|
it "should not update the cached catalog in noop mode" do
|
914
877
|
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
878
|
|
917
|
-
|
879
|
+
stub_request(:get, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
|
880
|
+
|
881
|
+
Puppet::Resource::Catalog.indirection.cache_class = :json
|
882
|
+
path = Puppet::Resource::Catalog.indirection.cache.path(catalog.name)
|
883
|
+
|
884
|
+
expect(File).to_not be_exist(path)
|
885
|
+
configurer.run
|
886
|
+
expect(File).to_not be_exist(path)
|
918
887
|
end
|
919
888
|
|
920
889
|
it "should update the cached catalog when not in noop mode" do
|
921
890
|
Puppet[:noop] = false
|
922
|
-
|
891
|
+
Puppet[:log_level] = 'info'
|
892
|
+
|
893
|
+
stub_request(:get, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
|
894
|
+
|
895
|
+
Puppet::Resource::Catalog.indirection.cache_class = :json
|
896
|
+
cache_path = Puppet::Resource::Catalog.indirection.cache.path(Puppet[:node_name_value])
|
923
897
|
|
924
|
-
|
898
|
+
expect(File).to_not be_exist(cache_path)
|
899
|
+
configurer.run
|
900
|
+
expect(File).to be_exist(cache_path)
|
901
|
+
|
902
|
+
expect(@logs).to include(an_object_having_attributes(level: :info, message: "Caching catalog for #{Puppet[:node_name_value]}"))
|
903
|
+
end
|
904
|
+
|
905
|
+
it "successfully applies the catalog without a cache" do
|
906
|
+
stub_request(:get, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
|
907
|
+
|
908
|
+
Puppet::Resource::Catalog.indirection.cache_class = nil
|
909
|
+
|
910
|
+
expect(configurer.run).to eq(0)
|
911
|
+
end
|
912
|
+
|
913
|
+
it "should not update the cached catalog when running puppet apply" do
|
914
|
+
Puppet::Resource::Catalog.indirection.cache_class = :json
|
915
|
+
path = Puppet::Resource::Catalog.indirection.cache.path(catalog.name)
|
916
|
+
|
917
|
+
expect(File).to_not be_exist(path)
|
918
|
+
configurer.run(catalog: catalog)
|
919
|
+
expect(File).to_not be_exist(path)
|
925
920
|
end
|
926
921
|
end
|
927
922
|
|
928
|
-
describe "when
|
929
|
-
|
930
|
-
|
923
|
+
describe "when converging the environment" do
|
924
|
+
let(:apple) { Puppet::Resource::Catalog.new(Puppet[:node_name_value], Puppet::Node::Environment.remote('apple')) }
|
925
|
+
let(:banana) { Puppet::Resource::Catalog.new(Puppet[:node_name_value], Puppet::Node::Environment.remote('banana')) }
|
931
926
|
|
932
|
-
|
927
|
+
before :each do
|
928
|
+
apple.add_resource(resource)
|
929
|
+
banana.add_resource(resource)
|
933
930
|
end
|
934
931
|
|
935
|
-
|
936
|
-
|
932
|
+
it "converges after multiple attempts" do
|
933
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(apple, banana, banana)
|
937
934
|
|
938
|
-
|
939
|
-
expect(
|
935
|
+
allow(Puppet).to receive(:notice)
|
936
|
+
expect(Puppet).to receive(:notice).with("Local environment: 'production' doesn't match server specified environment 'apple', restarting agent run with environment 'apple'")
|
937
|
+
expect(Puppet).to receive(:notice).with("Local environment: 'apple' doesn't match server specified environment 'banana', restarting agent run with environment 'banana'")
|
938
|
+
|
939
|
+
configurer.run
|
940
940
|
end
|
941
941
|
|
942
|
-
it "
|
943
|
-
expect(
|
942
|
+
it "raises if it can't converge after 4 tries after the initial catalog request" do
|
943
|
+
expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(apple, banana, apple, banana, apple)
|
944
|
+
|
945
|
+
expect(Puppet).to receive(:err).with("Failed to apply catalog: Catalog environment didn't stabilize after 4 fetches, aborting run")
|
944
946
|
|
945
|
-
|
947
|
+
configurer.run
|
946
948
|
end
|
949
|
+
end
|
947
950
|
|
948
|
-
|
949
|
-
|
951
|
+
describe "when converting the catalog" do
|
952
|
+
it "converts Puppet::Resource into Puppet::Type::Notify" do
|
953
|
+
expect(configurer).to receive(:apply_catalog) do |ral, _|
|
954
|
+
expect(ral.resources).to contain(an_instance_of(Puppet::Type::Notify))
|
955
|
+
end
|
950
956
|
|
951
|
-
|
957
|
+
configurer.run(catalog: catalog)
|
952
958
|
end
|
953
959
|
|
954
|
-
it "
|
955
|
-
expect(
|
960
|
+
it "adds default schedules" do
|
961
|
+
expect(configurer).to receive(:apply_catalog) do |ral, _|
|
962
|
+
expect(ral.resources.map(&:to_ref)).to contain(%w{Schedule[puppet] Schedule[hourly] Schedule[daily] Schedule[weekly] Schedule[monthly] Schedule[never]})
|
963
|
+
end
|
956
964
|
|
957
|
-
|
965
|
+
configurer.run
|
958
966
|
end
|
959
967
|
|
960
|
-
it "
|
961
|
-
expect(
|
968
|
+
it "records the retrieval duration to the catalog" do
|
969
|
+
expect(configurer).to receive(:apply_catalog) do |ral, _|
|
970
|
+
expect(ral.retrieval_duration).to be_an_instance_of(Float)
|
971
|
+
end
|
962
972
|
|
963
|
-
|
973
|
+
configurer.run
|
964
974
|
end
|
965
975
|
|
966
|
-
it "
|
967
|
-
|
976
|
+
it "writes the class file containing applied settings classes" do
|
977
|
+
expect(File).to_not be_exist(Puppet[:classfile])
|
978
|
+
|
979
|
+
configurer.run
|
968
980
|
|
969
|
-
expect(
|
970
|
-
|
981
|
+
expect(File.read(Puppet[:classfile]).chomp).to eq('settings')
|
982
|
+
end
|
983
|
+
|
984
|
+
it "writes an empty resource file since no resources are 'managed'" do
|
985
|
+
expect(File).to_not be_exist(Puppet[:resourcefile])
|
986
|
+
|
987
|
+
configurer.run
|
988
|
+
|
989
|
+
expect(File.read(Puppet[:resourcefile]).chomp).to eq("")
|
990
|
+
end
|
991
|
+
|
992
|
+
it "adds the conversion time to the report" do
|
993
|
+
configurer.run(report: report)
|
994
|
+
|
995
|
+
expect(report.metrics['time']['convert_catalog']).to be_an_instance_of(Float)
|
971
996
|
end
|
972
997
|
end
|
973
998
|
|
@@ -1002,80 +1027,70 @@ describe Puppet::Configurer do
|
|
1002
1027
|
describe "when attempting failover" do
|
1003
1028
|
it "should not failover if server_list is not set" do
|
1004
1029
|
Puppet.settings[:server_list] = []
|
1005
|
-
|
1006
|
-
@agent.run
|
1030
|
+
configurer.run
|
1007
1031
|
end
|
1008
1032
|
|
1009
1033
|
it "should not failover during an apply run" do
|
1010
1034
|
Puppet.settings[:server_list] = ["myserver:123"]
|
1011
|
-
expect(@agent).not_to receive(:find_functional_server)
|
1012
1035
|
catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
|
1013
|
-
|
1036
|
+
configurer.run(catalog: catalog)
|
1014
1037
|
end
|
1015
1038
|
|
1016
1039
|
it "should select a server when it receives 200 OK response" do
|
1017
1040
|
Puppet.settings[:server_list] = ["myserver:123"]
|
1018
|
-
|
1019
|
-
|
1020
|
-
allow(@agent).to receive(:run_internal)
|
1041
|
+
|
1042
|
+
stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 200)
|
1021
1043
|
|
1022
1044
|
options = {}
|
1023
|
-
|
1045
|
+
configurer.run(options)
|
1024
1046
|
expect(options[:report].master_used).to eq('myserver:123')
|
1025
1047
|
end
|
1026
1048
|
|
1027
1049
|
it "should select a server when it receives 403 Forbidden" do
|
1028
1050
|
Puppet.settings[:server_list] = ["myserver:123"]
|
1029
|
-
|
1030
|
-
|
1031
|
-
allow(@agent).to receive(:run_internal)
|
1051
|
+
|
1052
|
+
stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 403)
|
1032
1053
|
|
1033
1054
|
options = {}
|
1034
|
-
|
1055
|
+
configurer.run(options)
|
1035
1056
|
expect(options[:report].master_used).to eq('myserver:123')
|
1036
1057
|
end
|
1037
1058
|
|
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
1059
|
it "should report when a server is unavailable" do
|
1050
1060
|
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
1061
|
|
1062
|
+
stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: [500, "Internal Server Error"])
|
1063
|
+
|
1064
|
+
allow(Puppet).to receive(:debug)
|
1055
1065
|
expect(Puppet).to receive(:debug).with("Puppet server myserver:123 is unavailable: 500 Internal Server Error")
|
1056
|
-
expect {
|
1066
|
+
expect {
|
1067
|
+
configurer.run
|
1068
|
+
}.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list:/)
|
1057
1069
|
end
|
1058
1070
|
|
1059
1071
|
it "should error when no servers in 'server_list' are reachable" do
|
1060
1072
|
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'/)
|
1073
|
+
|
1074
|
+
stub_request(:get, 'https://myserver/status/v1/simple/master').to_return(status: 400)
|
1075
|
+
stub_request(:get, 'https://someotherservername/status/v1/simple/master').to_return(status: 400)
|
1076
|
+
|
1077
|
+
expect{
|
1078
|
+
configurer.run
|
1079
|
+
}.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list: 'myserver:123,someotherservername'/)
|
1069
1080
|
end
|
1070
1081
|
|
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
|
-
|
1082
|
+
it "should not make multiple node requests when the server is found" do
|
1075
1083
|
Puppet.settings[:server_list] = ["myserver:123"]
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1084
|
+
Puppet::Node.indirection.terminus_class = :rest
|
1085
|
+
Puppet::Resource::Catalog.indirection.terminus_class = :rest
|
1086
|
+
|
1087
|
+
stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 200)
|
1088
|
+
stub_request(:get, %r{https://myserver:123/puppet/v3/catalog}).to_return(status: 200)
|
1089
|
+
node_request = stub_request(:get, %r{https://myserver:123/puppet/v3/node/}).to_return(status: 200)
|
1090
|
+
|
1091
|
+
configurer.run
|
1092
|
+
|
1093
|
+
expect(node_request).to have_been_requested.once
|
1079
1094
|
end
|
1080
1095
|
end
|
1081
1096
|
end
|