puppet 7.10.0-x86-mingw32 → 7.13.1-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +3 -3
- data/Gemfile.lock +20 -15
- data/ext/project_data.yaml +1 -1
- data/lib/puppet/application/agent.rb +4 -0
- data/lib/puppet/application/apply.rb +20 -2
- data/lib/puppet/application/lookup.rb +72 -24
- data/lib/puppet/application/resource.rb +15 -13
- data/lib/puppet/concurrent/thread_local_singleton.rb +6 -3
- data/lib/puppet/configurer.rb +98 -29
- data/lib/puppet/confine/variable.rb +1 -1
- data/lib/puppet/defaults.rb +17 -3
- data/lib/puppet/facter_impl.rb +96 -0
- data/lib/puppet/file_serving/metadata.rb +3 -0
- data/lib/puppet/file_serving/mount/file.rb +4 -4
- data/lib/puppet/file_system/file_impl.rb +10 -8
- data/lib/puppet/file_system/jruby.rb +1 -1
- data/lib/puppet/file_system/path_pattern.rb +10 -15
- data/lib/puppet/file_system/uniquefile.rb +1 -1
- data/lib/puppet/file_system/windows.rb +4 -4
- data/lib/puppet/file_system.rb +3 -2
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/functions/versioncmp.rb +6 -2
- data/lib/puppet/graph/simple_graph.rb +2 -1
- data/lib/puppet/http/client.rb +1 -1
- data/lib/puppet/http/redirector.rb +5 -0
- data/lib/puppet/indirector/catalog/compiler.rb +3 -3
- data/lib/puppet/indirector/facts/facter.rb +6 -6
- data/lib/puppet/indirector/indirection.rb +1 -1
- data/lib/puppet/module_tool/applications/uninstaller.rb +1 -1
- data/lib/puppet/module_tool/applications/upgrader.rb +1 -1
- data/lib/puppet/pal/pal_impl.rb +1 -1
- data/lib/puppet/parser/resource.rb +1 -1
- data/lib/puppet/parser/scope.rb +8 -7
- data/lib/puppet/parser/templatewrapper.rb +1 -0
- data/lib/puppet/pops/evaluator/closure.rb +7 -5
- data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -0
- data/lib/puppet/pops/lookup/lookup_adapter.rb +3 -2
- data/lib/puppet/pops/model/ast.rb +1 -0
- data/lib/puppet/pops/model/factory.rb +14 -13
- data/lib/puppet/pops/parser/code_merger.rb +4 -4
- data/lib/puppet/pops/parser/egrammar.ra +4 -2
- data/lib/puppet/pops/parser/eparser.rb +909 -894
- data/lib/puppet/pops/parser/lexer2.rb +69 -68
- data/lib/puppet/pops/parser/slurp_support.rb +1 -0
- data/lib/puppet/pops/serialization/to_data_converter.rb +6 -18
- data/lib/puppet/pops/serialization/to_stringified_converter.rb +1 -1
- data/lib/puppet/pops/types/type_formatter.rb +7 -6
- data/lib/puppet/pops/types/types.rb +1 -1
- data/lib/puppet/pops/validation/checker4_0.rb +7 -2
- data/lib/puppet/provider/aix_object.rb +1 -1
- data/lib/puppet/provider/group/groupadd.rb +5 -2
- data/lib/puppet/provider/package/pkg.rb +11 -1
- data/lib/puppet/provider/package/puppet_gem.rb +1 -1
- data/lib/puppet/provider/package/puppetserver_gem.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/service/base.rb +1 -1
- data/lib/puppet/provider/service/init.rb +10 -9
- data/lib/puppet/provider/service/launchd.rb +1 -1
- data/lib/puppet/provider/service/redhat.rb +1 -1
- data/lib/puppet/provider/service/smf.rb +3 -3
- data/lib/puppet/provider/service/systemd.rb +1 -1
- data/lib/puppet/provider/service/upstart.rb +5 -5
- data/lib/puppet/provider/user/aix.rb +44 -1
- data/lib/puppet/provider/user/directoryservice.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +30 -7
- data/lib/puppet/provider.rb +1 -1
- data/lib/puppet/reference/providers.rb +2 -2
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/resource/type_collection.rb +2 -1
- data/lib/puppet/resource.rb +38 -5
- data/lib/puppet/runtime.rb +11 -1
- data/lib/puppet/settings/file_setting.rb +3 -8
- data/lib/puppet/settings.rb +2 -2
- data/lib/puppet/ssl/verifier.rb +3 -1
- data/lib/puppet/test/test_helper.rb +4 -1
- data/lib/puppet/transaction/persistence.rb +22 -12
- data/lib/puppet/type/exec.rb +9 -1
- data/lib/puppet/type/file/data_sync.rb +1 -1
- data/lib/puppet/type/file/group.rb +8 -1
- data/lib/puppet/type/file/owner.rb +8 -1
- data/lib/puppet/type/group.rb +0 -1
- data/lib/puppet/type/resources.rb +1 -1
- data/lib/puppet/type/service.rb +8 -3
- data/lib/puppet/type/user.rb +40 -39
- data/lib/puppet/util/autoload.rb +1 -1
- data/lib/puppet/util/command_line.rb +1 -1
- data/lib/puppet/util/filetype.rb +2 -2
- data/lib/puppet/util/json.rb +20 -0
- data/lib/puppet/util/log.rb +8 -4
- data/lib/puppet/util/logging.rb +1 -25
- data/lib/puppet/util/monkey_patches.rb +26 -2
- data/lib/puppet/util/package.rb +25 -16
- data/lib/puppet/util/pidlock.rb +1 -1
- data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
- data/lib/puppet/util/suidmanager.rb +1 -2
- data/lib/puppet/util/tagging.rb +1 -0
- data/lib/puppet/util/windows/service.rb +0 -5
- data/lib/puppet/util/windows/user.rb +0 -1
- data/lib/puppet/util/windows.rb +3 -0
- data/lib/puppet/util/yaml.rb +11 -0
- data/lib/puppet/util.rb +4 -3
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet.rb +3 -6
- data/locales/puppet.pot +265 -239
- data/man/man5/puppet.conf.5 +18 -2
- data/man/man8/puppet-agent.8 +4 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +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 +1 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-lookup.8 +9 -6
- 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-ssl.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +2 -1
- data/spec/fixtures/unit/forge/bacula.json +1 -1
- data/spec/integration/application/agent_spec.rb +44 -0
- data/spec/integration/application/lookup_spec.rb +29 -6
- data/spec/integration/configurer_spec.rb +1 -1
- data/spec/integration/indirector/facts/facter_spec.rb +3 -3
- data/spec/integration/parser/pcore_resource_spec.rb +20 -0
- data/spec/integration/transaction/report_spec.rb +1 -1
- data/spec/integration/type/file_spec.rb +2 -2
- data/spec/integration/type/package_spec.rb +6 -6
- data/spec/integration/util/rdoc/parser_spec.rb +1 -1
- data/spec/integration/util/windows/process_spec.rb +1 -9
- data/spec/shared_contexts/l10n.rb +5 -0
- data/spec/unit/application/apply_spec.rb +76 -56
- data/spec/unit/application/lookup_spec.rb +131 -10
- data/spec/unit/application/resource_spec.rb +29 -0
- data/spec/unit/concurrent/thread_local_singleton_spec.rb +39 -0
- data/spec/unit/configurer_spec.rb +113 -28
- data/spec/unit/facter_impl_spec.rb +31 -0
- data/spec/unit/file_bucket/dipper_spec.rb +2 -2
- data/spec/unit/file_system/uniquefile_spec.rb +7 -1
- data/spec/unit/file_system_spec.rb +41 -4
- data/spec/unit/forge/module_release_spec.rb +3 -3
- data/spec/unit/functions/lookup_spec.rb +64 -0
- data/spec/unit/functions/versioncmp_spec.rb +40 -4
- data/spec/unit/http/client_spec.rb +58 -1
- data/spec/unit/indirector/indirection_spec.rb +10 -3
- data/spec/unit/network/formats_spec.rb +6 -0
- data/spec/unit/pops/parser/parse_containers_spec.rb +2 -2
- data/spec/unit/pops/serialization/to_from_hr_spec.rb +0 -58
- data/spec/unit/pops/serialization/to_stringified_spec.rb +5 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +6 -0
- data/spec/unit/pops/validator/validator_spec.rb +5 -0
- data/spec/unit/provider/package/gem_spec.rb +1 -1
- data/spec/unit/provider/package/pip2_spec.rb +1 -1
- data/spec/unit/provider/package/pip3_spec.rb +1 -1
- data/spec/unit/provider/package/pip_spec.rb +1 -1
- data/spec/unit/provider/package/pkg_spec.rb +15 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +1 -1
- data/spec/unit/provider/package/puppetserver_gem_spec.rb +1 -1
- data/spec/unit/provider/service/gentoo_spec.rb +6 -5
- data/spec/unit/provider/service/init_spec.rb +15 -9
- data/spec/unit/provider/service/openwrt_spec.rb +21 -29
- data/spec/unit/provider/service/redhat_spec.rb +3 -2
- data/spec/unit/provider/user/aix_spec.rb +100 -0
- data/spec/unit/provider/user/directoryservice_spec.rb +1 -1
- data/spec/unit/provider/user/useradd_spec.rb +40 -0
- data/spec/unit/provider_spec.rb +4 -4
- data/spec/unit/puppet_spec.rb +12 -4
- data/spec/unit/resource/catalog_spec.rb +14 -1
- data/spec/unit/resource_spec.rb +58 -2
- data/spec/unit/settings/file_setting_spec.rb +10 -7
- data/spec/unit/transaction/persistence_spec.rb +51 -0
- data/spec/unit/type/file/group_spec.rb +7 -0
- data/spec/unit/type/file/owner_spec.rb +7 -0
- data/spec/unit/type/service_spec.rb +27 -0
- data/spec/unit/type/user_spec.rb +0 -45
- data/spec/unit/type_spec.rb +2 -2
- data/spec/unit/util/autoload_spec.rb +25 -8
- data/spec/unit/util/json_spec.rb +126 -0
- data/spec/unit/util/logging_spec.rb +2 -0
- data/spec/unit/util/yaml_spec.rb +37 -13
- data/tasks/parallel.rake +3 -3
- metadata +17 -4
@@ -2,6 +2,8 @@ require 'spec_helper'
|
|
2
2
|
require 'puppet/configurer'
|
3
3
|
|
4
4
|
describe Puppet::Configurer do
|
5
|
+
include PuppetSpec::Files
|
6
|
+
|
5
7
|
before do
|
6
8
|
Puppet[:server] = "puppetmaster"
|
7
9
|
Puppet[:report] = true
|
@@ -10,6 +12,17 @@ describe Puppet::Configurer do
|
|
10
12
|
allow_any_instance_of(described_class).to(
|
11
13
|
receive(:valid_server_environment?).and_return(true)
|
12
14
|
)
|
15
|
+
|
16
|
+
Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
|
17
|
+
---
|
18
|
+
version:
|
19
|
+
config: 1624882680
|
20
|
+
puppet: #{Puppet.version}
|
21
|
+
application:
|
22
|
+
initial_environment: #{Puppet[:environment]}
|
23
|
+
converged_environment: #{Puppet[:environment]}
|
24
|
+
run_mode: agent
|
25
|
+
SUMMARY
|
13
26
|
end
|
14
27
|
|
15
28
|
let(:node_name) { Puppet[:node_name_value] }
|
@@ -191,7 +204,7 @@ describe Puppet::Configurer do
|
|
191
204
|
}
|
192
205
|
Puppet::Node::Facts.indirection.save(facts)
|
193
206
|
|
194
|
-
expect(Puppet).to receive(:warning).with(/Payload with the current size of: '
|
207
|
+
expect(Puppet).to receive(:warning).with(/Payload with the current size of: '\d*' exceeds the payload size limit: \d*/)
|
195
208
|
configurer.run
|
196
209
|
end
|
197
210
|
|
@@ -583,7 +596,7 @@ describe Puppet::Configurer do
|
|
583
596
|
it "should save the report if reporting is enabled" do
|
584
597
|
Puppet.settings[:report] = true
|
585
598
|
|
586
|
-
expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash))
|
599
|
+
expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash)).twice
|
587
600
|
configurer.send_report(report)
|
588
601
|
end
|
589
602
|
|
@@ -611,12 +624,22 @@ describe Puppet::Configurer do
|
|
611
624
|
it "should log but not fail if saving the report fails" do
|
612
625
|
Puppet.settings[:report] = true
|
613
626
|
|
614
|
-
expect(Puppet::Transaction::Report.indirection).to receive(:save).and_raise("whatever")
|
627
|
+
expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_cache: true)).and_raise("whatever")
|
628
|
+
expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_terminus: true))
|
615
629
|
|
616
630
|
configurer.send_report(report)
|
617
631
|
|
618
632
|
expect(@logs).to include(an_object_having_attributes(level: :err, message: 'Could not send report: whatever'))
|
619
633
|
end
|
634
|
+
|
635
|
+
it "should save the cached report if fails to send the report" do
|
636
|
+
allow(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_terminus: true)).and_call_original
|
637
|
+
allow(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_cache: true)).and_raise("whatever")
|
638
|
+
|
639
|
+
expect(File).to_not be_exist(Puppet[:lastrunfile])
|
640
|
+
configurer.send_report(report)
|
641
|
+
expect(File.read(Puppet[:lastrunfile])).to match(/puppet: #{Puppet::PUPPETVERSION}/)
|
642
|
+
end
|
620
643
|
end
|
621
644
|
|
622
645
|
describe "when saving the summary report file" do
|
@@ -856,7 +879,7 @@ describe Puppet::Configurer do
|
|
856
879
|
expect(configurer.run).to be_nil
|
857
880
|
end
|
858
881
|
|
859
|
-
it "should proceed with the cached catalog if its environment
|
882
|
+
it "should proceed with the cached catalog if its environment matches the local environment" do
|
860
883
|
expects_cached_catalog_only(catalog)
|
861
884
|
|
862
885
|
expect(configurer.run).to eq(0)
|
@@ -1212,7 +1235,6 @@ describe Puppet::Configurer do
|
|
1212
1235
|
end
|
1213
1236
|
|
1214
1237
|
describe "when selecting an environment" do
|
1215
|
-
include PuppetSpec::Files
|
1216
1238
|
include PuppetSpec::Settings
|
1217
1239
|
|
1218
1240
|
describe "when the last used environment is available" do
|
@@ -1229,6 +1251,9 @@ describe Puppet::Configurer do
|
|
1229
1251
|
converged_environment: #{last_server_specified_environment}
|
1230
1252
|
run_mode: agent
|
1231
1253
|
SUMMARY
|
1254
|
+
|
1255
|
+
expect(Puppet::Node.indirection).not_to receive(:find)
|
1256
|
+
.with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
|
1232
1257
|
end
|
1233
1258
|
|
1234
1259
|
it "prefers the environment set via cli" do
|
@@ -1238,26 +1263,27 @@ describe Puppet::Configurer do
|
|
1238
1263
|
expect(configurer.environment).to eq('usethis')
|
1239
1264
|
end
|
1240
1265
|
|
1241
|
-
it "prefers the environment set via config" do
|
1266
|
+
it "prefers the environment set via lastrunfile over config" do
|
1242
1267
|
FileUtils.mkdir_p(Puppet[:confdir])
|
1243
1268
|
set_puppet_conf(Puppet[:confdir], <<~CONF)
|
1244
1269
|
[main]
|
1245
1270
|
environment = usethis
|
1271
|
+
lastrunfile = #{Puppet[:lastrunfile]}
|
1246
1272
|
CONF
|
1247
1273
|
|
1248
1274
|
Puppet.initialize_settings
|
1249
1275
|
configurer.run
|
1250
1276
|
|
1251
|
-
expect(configurer.environment).to eq(
|
1277
|
+
expect(configurer.environment).to eq(last_server_specified_environment)
|
1252
1278
|
end
|
1253
1279
|
|
1254
|
-
it "uses environment from Puppet[:environment] if given a catalog" do
|
1280
|
+
it "uses the environment from Puppet[:environment] if given a catalog" do
|
1255
1281
|
configurer.run(catalog: catalog)
|
1256
1282
|
|
1257
1283
|
expect(configurer.environment).to eq(Puppet[:environment])
|
1258
1284
|
end
|
1259
1285
|
|
1260
|
-
it "uses environment from Puppet[:environment] if use_cached_catalog = true" do
|
1286
|
+
it "uses the environment from Puppet[:environment] if use_cached_catalog = true" do
|
1261
1287
|
Puppet[:use_cached_catalog] = true
|
1262
1288
|
expects_cached_catalog_only(catalog)
|
1263
1289
|
configurer.run
|
@@ -1272,14 +1298,28 @@ describe Puppet::Configurer do
|
|
1272
1298
|
expect(configurer.environment).to eq(last_server_specified_environment)
|
1273
1299
|
end
|
1274
1300
|
|
1275
|
-
it "
|
1301
|
+
it "pushes the converged environment found in lastrunfile over the existing context" do
|
1302
|
+
initial_env = Puppet::Node::Environment.remote('production')
|
1303
|
+
Puppet.push_context(
|
1304
|
+
current_environment: initial_env,
|
1305
|
+
loaders: Puppet::Pops::Loaders.new(initial_env, true))
|
1306
|
+
|
1307
|
+
expect(Puppet).to receive(:push_context).with(
|
1308
|
+
hash_including(:current_environment, :loaders),
|
1309
|
+
"Local node environment #{last_server_specified_environment} for configurer transaction"
|
1310
|
+
).once.and_call_original
|
1311
|
+
|
1312
|
+
configurer.run
|
1313
|
+
end
|
1314
|
+
|
1315
|
+
it "uses the environment from Puppet[:environment] if strict_environment_mode is set" do
|
1276
1316
|
Puppet[:strict_environment_mode] = true
|
1277
1317
|
configurer.run
|
1278
1318
|
|
1279
1319
|
expect(configurer.environment).to eq(Puppet[:environment])
|
1280
1320
|
end
|
1281
1321
|
|
1282
|
-
it "uses environment from Puppet[:environment] if initial_environment is the same as converged_environment" do
|
1322
|
+
it "uses the environment from Puppet[:environment] if initial_environment is the same as converged_environment" do
|
1283
1323
|
Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
|
1284
1324
|
---
|
1285
1325
|
version:
|
@@ -1294,41 +1334,86 @@ describe Puppet::Configurer do
|
|
1294
1334
|
|
1295
1335
|
expect(configurer.environment).to eq(Puppet[:environment])
|
1296
1336
|
end
|
1337
|
+
end
|
1338
|
+
end
|
1339
|
+
|
1340
|
+
describe "when the last used environment is not available" do
|
1341
|
+
describe "when the node request succeeds" do
|
1342
|
+
let(:node_environment) { Puppet::Node::Environment.remote(:salam) }
|
1343
|
+
let(:node) { Puppet::Node.new(Puppet[:node_name_value]) }
|
1344
|
+
let(:last_server_specified_environment) { 'development' }
|
1297
1345
|
|
1298
|
-
|
1346
|
+
before do
|
1347
|
+
node.environment = node_environment
|
1348
|
+
|
1349
|
+
allow(Puppet::Node.indirection).to receive(:find)
|
1350
|
+
allow(Puppet::Node.indirection).to receive(:find)
|
1351
|
+
.with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
|
1352
|
+
.and_return(node)
|
1353
|
+
end
|
1354
|
+
|
1355
|
+
it "uses the environment from the node request if the run mode doesn't match" do
|
1299
1356
|
Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
|
1307
|
-
|
1357
|
+
---
|
1358
|
+
version:
|
1359
|
+
config: 1624882680
|
1360
|
+
puppet: 6.24.0
|
1361
|
+
application:
|
1362
|
+
initial_environment: #{Puppet[:environment]}
|
1363
|
+
converged_environment: #{last_server_specified_environment}
|
1364
|
+
run_mode: user
|
1308
1365
|
SUMMARY
|
1309
1366
|
configurer.run
|
1310
1367
|
|
1311
|
-
expect(configurer.environment).to eq(
|
1368
|
+
expect(configurer.environment).to eq(node_environment.name.to_s)
|
1312
1369
|
end
|
1313
1370
|
|
1314
|
-
it "uses environment from
|
1371
|
+
it "uses the environment from the node request if lastrunfile does not contain the expected keys" do
|
1315
1372
|
Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
|
1316
|
-
|
1317
|
-
|
1373
|
+
---
|
1374
|
+
version:
|
1375
|
+
config: 1624882680
|
1376
|
+
puppet: 6.24.0
|
1318
1377
|
SUMMARY
|
1319
1378
|
configurer.run
|
1320
1379
|
|
1321
|
-
expect(configurer.environment).to eq(
|
1380
|
+
expect(configurer.environment).to eq(node_environment.name.to_s)
|
1381
|
+
end
|
1382
|
+
|
1383
|
+
it "uses the environment from the node request if lastrunfile is invalid YAML" do
|
1384
|
+
Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
|
1385
|
+
Key: 'this is my very very very ' +
|
1386
|
+
'long string'
|
1387
|
+
SUMMARY
|
1388
|
+
configurer.run
|
1389
|
+
|
1390
|
+
expect(configurer.environment).to eq(node_environment.name.to_s)
|
1322
1391
|
end
|
1323
1392
|
|
1324
|
-
it "uses environment from
|
1393
|
+
it "uses the environment from the node request if lastrunfile exists but is empty" do
|
1325
1394
|
Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', '')
|
1326
1395
|
configurer.run
|
1327
1396
|
|
1328
|
-
expect(configurer.environment).to eq(
|
1397
|
+
expect(configurer.environment).to eq(node_environment.name.to_s)
|
1398
|
+
end
|
1399
|
+
|
1400
|
+
it "uses the environment from the node request if the last used one cannot be found" do
|
1401
|
+
Puppet[:lastrunfile] = tmpfile('last_run_summary.yaml')
|
1402
|
+
configurer.run
|
1403
|
+
|
1404
|
+
expect(configurer.environment).to eq(node_environment.name.to_s)
|
1405
|
+
end
|
1406
|
+
end
|
1407
|
+
|
1408
|
+
describe "when the node request fails" do
|
1409
|
+
before do
|
1410
|
+
allow(Puppet::Node.indirection).to receive(:find).and_call_original
|
1411
|
+
allow(Puppet::Node.indirection).to receive(:find)
|
1412
|
+
.with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
|
1413
|
+
.and_raise(Puppet::Error)
|
1329
1414
|
end
|
1330
1415
|
|
1331
|
-
it "uses environment from Puppet[:environment] if the last used one cannot be found" do
|
1416
|
+
it "uses the environment from Puppet[:environment] if the last used one cannot be found" do
|
1332
1417
|
Puppet[:lastrunfile] = tmpfile('last_run_summary.yaml')
|
1333
1418
|
configurer.run
|
1334
1419
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Puppet::FacterImpl' do
|
4
|
+
subject(:facter_impl) { Puppet::FacterImpl.new }
|
5
|
+
|
6
|
+
it { is_expected.to respond_to(:value) }
|
7
|
+
it { is_expected.to respond_to(:add) }
|
8
|
+
|
9
|
+
describe '.value' do
|
10
|
+
let(:method_name) { :value }
|
11
|
+
|
12
|
+
before { allow(Facter).to receive(method_name) }
|
13
|
+
|
14
|
+
it 'delegates to Facter API' do
|
15
|
+
facter_impl.value('test_fact')
|
16
|
+
expect(Facter).to have_received(method_name).with('test_fact')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.add' do
|
21
|
+
let(:block) { Proc.new { setcode 'test' } }
|
22
|
+
let(:method_name) { :add }
|
23
|
+
|
24
|
+
before { allow(Facter).to receive(method_name) }
|
25
|
+
|
26
|
+
it 'delegates to Facter API' do
|
27
|
+
facter_impl.add('test_fact', &block)
|
28
|
+
expect(Facter).to have_received(method_name).with('test_fact', &block)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -104,8 +104,8 @@ describe Puppet::FileBucket::Dipper, :uses_checksums => true do
|
|
104
104
|
# Diff without the context
|
105
105
|
# Lines we need to see match 'Content' instead of trimming diff output filter out
|
106
106
|
# surrounding noise...or hard code the check values
|
107
|
-
if
|
108
|
-
Puppet::Util::Package.versioncmp(
|
107
|
+
if Puppet.runtime[:facter].value(:osfamily) == 'Solaris' &&
|
108
|
+
Puppet::Util::Package.versioncmp(Puppet.runtime[:facter].value(:operatingsystemrelease), '11.0') >= 0
|
109
109
|
# Use gdiff on Solaris
|
110
110
|
diff12 = Puppet::Util::Execution.execute("gdiff -uN #{file1} #{file2}| grep Content")
|
111
111
|
diff21 = Puppet::Util::Execution.execute("gdiff -uN #{file2} #{file1}| grep Content")
|
@@ -80,7 +80,7 @@ describe Puppet::FileSystem::Uniquefile do
|
|
80
80
|
lock = File.join(dir, 'path', 'to', 'lock')
|
81
81
|
|
82
82
|
expect {
|
83
|
-
Puppet::FileSystem::Uniquefile.
|
83
|
+
Puppet::FileSystem::Uniquefile.new('foo', lock) { |tmp| }
|
84
84
|
}.to raise_error(Errno::ENOENT, %r{No such file or directory - A directory component in .* does not exist or is a dangling symbolic link})
|
85
85
|
end
|
86
86
|
|
@@ -102,6 +102,12 @@ describe Puppet::FileSystem::Uniquefile do
|
|
102
102
|
expect(filename).to eq(temp_rune_utf8)
|
103
103
|
end
|
104
104
|
|
105
|
+
it "preserves tilde characters" do
|
106
|
+
Puppet::FileSystem::Uniquefile.open_tmp('~foo') do |file|
|
107
|
+
expect(File.basename(file.path)).to start_with('~foo')
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
105
111
|
context "Ruby 1.9.3 Tempfile tests" do
|
106
112
|
# the remaining tests in this file are ported directly from the ruby 1.9.3 source,
|
107
113
|
# since most of this file was ported from there
|
@@ -296,6 +296,13 @@ describe "Puppet::FileSystem" do
|
|
296
296
|
expect(Puppet::FileSystem.read_preserve_line_endings(file)).to eq("file content \n")
|
297
297
|
end
|
298
298
|
end
|
299
|
+
|
300
|
+
it "should not warn about misusage of BOM with non-UTF encoding" do
|
301
|
+
allow(Encoding).to receive(:default_external).and_return(Encoding::US_ASCII)
|
302
|
+
with_file_content("file content \n") do |file|
|
303
|
+
expect{ Puppet::FileSystem.read_preserve_line_endings(file) }.not_to output(/BOM with non-UTF encoding US-ASCII is nonsense/).to_stderr
|
304
|
+
end
|
305
|
+
end
|
299
306
|
end
|
300
307
|
|
301
308
|
context "read without an encoding specified" do
|
@@ -977,11 +984,12 @@ describe "Puppet::FileSystem" do
|
|
977
984
|
end
|
978
985
|
|
979
986
|
it 'preserves file ownership' do
|
980
|
-
|
981
|
-
|
982
|
-
|
987
|
+
FileUtils.touch(dest)
|
988
|
+
allow(File).to receive(:lstat).and_call_original
|
989
|
+
allow(File).to receive(:lstat).with(Pathname.new(dest)).and_return(double(uid: 1, gid: 2, 'directory?': false))
|
983
990
|
|
984
|
-
|
991
|
+
allow(File).to receive(:chown).and_call_original
|
992
|
+
expect(FileUtils).to receive(:chown).with(1, 2, any_args)
|
985
993
|
|
986
994
|
Puppet::FileSystem.replace_file(dest, 0644) { |f| f.write(content) }
|
987
995
|
end
|
@@ -1156,4 +1164,33 @@ describe "Puppet::FileSystem" do
|
|
1156
1164
|
expect(File.mtime(dest)).to be_within(1).of(tomorrow)
|
1157
1165
|
end
|
1158
1166
|
end
|
1167
|
+
|
1168
|
+
context '#chmod' do
|
1169
|
+
let(:dest) { tmpfile('abs_file') }
|
1170
|
+
|
1171
|
+
it "changes the mode given an absolute string" do
|
1172
|
+
Puppet::FileSystem.touch(dest)
|
1173
|
+
Puppet::FileSystem.chmod(0644, dest)
|
1174
|
+
expect(File.stat(dest).mode & 0777).to eq(0644)
|
1175
|
+
end
|
1176
|
+
|
1177
|
+
it "returns true if given an absolute pathname" do
|
1178
|
+
Puppet::FileSystem.touch(dest)
|
1179
|
+
Puppet::FileSystem.chmod(0644, Pathname.new(dest))
|
1180
|
+
expect(File.stat(dest).mode & 0777).to eq(0644)
|
1181
|
+
end
|
1182
|
+
|
1183
|
+
it "raises if the file doesn't exist" do
|
1184
|
+
klass = Puppet::Util::Platform.windows? ? Puppet::Error : Errno::ENOENT
|
1185
|
+
expect {
|
1186
|
+
Puppet::FileSystem.chmod(0644, dest)
|
1187
|
+
}.to raise_error(klass)
|
1188
|
+
end
|
1189
|
+
|
1190
|
+
it "raises ArgumentError if dest is invalid" do
|
1191
|
+
expect {
|
1192
|
+
Puppet::FileSystem.chmod(0644, nil)
|
1193
|
+
}.to raise_error(ArgumentError, /expected Pathname, got: 'NilClass'/)
|
1194
|
+
end
|
1195
|
+
end
|
1159
1196
|
end
|
@@ -90,7 +90,7 @@ describe Puppet::Forge::ModuleRelease do
|
|
90
90
|
"checksums": { },
|
91
91
|
"version": "#{module_version}",
|
92
92
|
"description": "Standard Library for Puppet Modules",
|
93
|
-
"source": "
|
93
|
+
"source": "https://github.com/puppetlabs/puppetlabs-stdlib",
|
94
94
|
"project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
|
95
95
|
"summary": "Puppet Module Standard Library",
|
96
96
|
"dependencies": [
|
@@ -204,7 +204,7 @@ describe Puppet::Forge::ModuleRelease do
|
|
204
204
|
"checksums": { },
|
205
205
|
"version": "#{module_version}",
|
206
206
|
"description": "Standard Library for Puppet Modules",
|
207
|
-
"source": "
|
207
|
+
"source": "https://github.com/puppetlabs/puppetlabs-stdlib",
|
208
208
|
"project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
|
209
209
|
"summary": "Puppet Module Standard Library",
|
210
210
|
"author": "#{module_author}",
|
@@ -279,7 +279,7 @@ describe Puppet::Forge::ModuleRelease do
|
|
279
279
|
"checksums": { },
|
280
280
|
"version": "#{module_version}",
|
281
281
|
"description": "Standard Library for Puppet Modules",
|
282
|
-
"source": "
|
282
|
+
"source": "https://github.com/puppetlabs/puppetlabs-stdlib",
|
283
283
|
"project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
|
284
284
|
"summary": "Puppet Module Standard Library",
|
285
285
|
"dependencies": [
|
@@ -870,6 +870,46 @@ describe "The lookup function" do
|
|
870
870
|
end
|
871
871
|
end
|
872
872
|
|
873
|
+
context 'with lookup_options' do
|
874
|
+
let(:environment_files) do
|
875
|
+
{
|
876
|
+
env_name => {
|
877
|
+
'hiera.yaml' => <<-YAML.unindent,
|
878
|
+
---
|
879
|
+
version: 5
|
880
|
+
YAML
|
881
|
+
'data' => {
|
882
|
+
'common.yaml' => common_yaml
|
883
|
+
}
|
884
|
+
}
|
885
|
+
}
|
886
|
+
end
|
887
|
+
|
888
|
+
context 'that are empty' do
|
889
|
+
let(:common_yaml) { <<-YAML.unindent }
|
890
|
+
lookup_options:
|
891
|
+
a: b
|
892
|
+
YAML
|
893
|
+
|
894
|
+
it 'ignores empty options' do
|
895
|
+
expect(lookup('a')).to eq("b")
|
896
|
+
end
|
897
|
+
end
|
898
|
+
|
899
|
+
context 'that contains a legal yaml hash with unexpected types' do
|
900
|
+
let(:common_yaml) { <<-YAML.unindent }
|
901
|
+
lookup_options:
|
902
|
+
:invalid_symbol
|
903
|
+
YAML
|
904
|
+
|
905
|
+
it 'fails lookup and reports a type mismatch' do
|
906
|
+
expect {
|
907
|
+
lookup('a')
|
908
|
+
}.to raise_error(Puppet::DataBinding::LookupError, /has wrong type, expects Puppet::LookupValue, got Runtime\[ruby, 'Symbol'\]/)
|
909
|
+
end
|
910
|
+
end
|
911
|
+
end
|
912
|
+
|
873
913
|
context 'with lookup_options configured using patterns' do
|
874
914
|
let(:mod_common) {
|
875
915
|
<<-YAML.unindent
|
@@ -1019,6 +1059,30 @@ describe "The lookup function" do
|
|
1019
1059
|
})
|
1020
1060
|
end
|
1021
1061
|
|
1062
|
+
context 'and lookup_options is empty' do
|
1063
|
+
let(:mod_common) { <<-YAML.unindent }
|
1064
|
+
lookup_options:
|
1065
|
+
mod::a: b
|
1066
|
+
YAML
|
1067
|
+
|
1068
|
+
it 'ignores empty options' do
|
1069
|
+
expect(lookup('mod::a')).to eq("b")
|
1070
|
+
end
|
1071
|
+
end
|
1072
|
+
|
1073
|
+
context 'and lookup_options contains a legal hash with unexpected types' do
|
1074
|
+
let(:mod_common) { <<-YAML.unindent }
|
1075
|
+
lookup_options:
|
1076
|
+
:invalid_symbol
|
1077
|
+
YAML
|
1078
|
+
|
1079
|
+
it 'fails lookup and reports a type mismatch' do
|
1080
|
+
expect {
|
1081
|
+
lookup('mod::a')
|
1082
|
+
}.to raise_error(Puppet::DataBinding::LookupError, /has wrong type, expects Puppet::LookupValue, got Runtime\[ruby, 'Symbol'\]/)
|
1083
|
+
end
|
1084
|
+
end
|
1085
|
+
|
1022
1086
|
context 'and patterns in module are not limited to module keys' do
|
1023
1087
|
let(:mod_common) {
|
1024
1088
|
<<-YAML.unindent
|
@@ -19,16 +19,52 @@ describe "the versioncmp function" do
|
|
19
19
|
let(:type_parser) { Puppet::Pops::Types::TypeParser.singleton }
|
20
20
|
|
21
21
|
it 'should raise an Error if there is less than 2 arguments' do
|
22
|
-
expect { versioncmp('a,b') }.to raise_error(/expects 2 arguments, got 1/)
|
22
|
+
expect { versioncmp('a,b') }.to raise_error(/expects between 2 and 3 arguments, got 1/)
|
23
23
|
end
|
24
24
|
|
25
|
-
it 'should raise an Error if there is more than
|
26
|
-
expect { versioncmp('a,b','foo', 'bar') }.to raise_error(/expects 2 arguments, got
|
25
|
+
it 'should raise an Error if there is more than 3 arguments' do
|
26
|
+
expect { versioncmp('a,b','foo', false, 'bar') }.to raise_error(/expects between 2 and 3 arguments, got 4/)
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should call Puppet::Util::Package.versioncmp (included in scope)" do
|
30
|
-
expect(Puppet::Util::Package).to receive(:versioncmp).with('1.2', '1.3').and_return(-1)
|
30
|
+
expect(Puppet::Util::Package).to receive(:versioncmp).with('1.2', '1.3', false).and_return(-1)
|
31
31
|
|
32
32
|
expect(versioncmp('1.2', '1.3')).to eq(-1)
|
33
33
|
end
|
34
|
+
|
35
|
+
context "when ignore_trailing_zeroes is true" do
|
36
|
+
it "should equate versions with 2 elements and dots but with unnecessary zero" do
|
37
|
+
expect(versioncmp("10.1.0", "10.1", true)).to eq(0)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should equate versions with 1 element and dot but with unnecessary zero" do
|
41
|
+
expect(versioncmp("11.0", "11", true)).to eq(0)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should equate versions with 1 element and dot but with unnecessary zeros" do
|
45
|
+
expect(versioncmp("11.00", "11", true)).to eq(0)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should equate versions with dots and iregular zeroes" do
|
49
|
+
expect(versioncmp("11.0.00", "11", true)).to eq(0)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should equate versions with dashes" do
|
53
|
+
expect(versioncmp("10.1-0", "10.1.0-0", true)).to eq(0)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should compare versions with dashes after normalization" do
|
57
|
+
expect(versioncmp("10.1-1", "10.1.0-0", true)).to eq(1)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should not normalize versions if zeros are not trailing" do
|
61
|
+
expect(versioncmp("1.1", "1.0.1", true)).to eq(1)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "when ignore_trailing_zeroes is false" do
|
66
|
+
it "should not equate versions if zeros are not trailing" do
|
67
|
+
expect(versioncmp("1.1", "1.0.1")).to eq(1)
|
68
|
+
end
|
69
|
+
end
|
34
70
|
end
|
@@ -597,11 +597,68 @@ describe Puppet::HTTP::Client do
|
|
597
597
|
expect(response).to be_success
|
598
598
|
end
|
599
599
|
|
600
|
-
it "
|
600
|
+
it "does not preserve basic authorization when redirecting to different hosts" do
|
601
|
+
stub_request(:get, start_url).with(basic_auth: credentials).to_return(redirect_to(url: other_host))
|
602
|
+
stub_request(:get, other_host).to_return(status: 200)
|
603
|
+
|
604
|
+
client.get(start_url, options: {basic_auth: {user: 'user', password: 'pass'}})
|
605
|
+
expect(a_request(:get, other_host).
|
606
|
+
with{ |req| !req.headers.key?('Authorization')}).to have_been_made
|
607
|
+
end
|
608
|
+
|
609
|
+
it "does preserve basic authorization when redirecting to the same hosts" do
|
610
|
+
stub_request(:get, start_url).with(basic_auth: credentials).to_return(redirect_to(url: bar_url))
|
611
|
+
stub_request(:get, bar_url).with(basic_auth: credentials).to_return(status: 200)
|
612
|
+
|
613
|
+
client.get(start_url, options: {basic_auth: {user: 'user', password: 'pass'}})
|
614
|
+
expect(a_request(:get, bar_url).
|
615
|
+
with{ |req| req.headers.key?('Authorization')}).to have_been_made
|
616
|
+
end
|
617
|
+
|
618
|
+
it "does not preserve cookie header when redirecting to different hosts" do
|
619
|
+
headers = { 'Cookie' => 'TEST_COOKIE'}
|
620
|
+
|
621
|
+
stub_request(:get, start_url).with(headers: headers).to_return(redirect_to(url: other_host))
|
622
|
+
stub_request(:get, other_host).to_return(status: 200)
|
623
|
+
|
624
|
+
client.get(start_url, headers: headers)
|
625
|
+
expect(a_request(:get, other_host).
|
626
|
+
with{ |req| !req.headers.key?('Cookie')}).to have_been_made
|
627
|
+
end
|
628
|
+
|
629
|
+
it "does preserve cookie header when redirecting to the same hosts" do
|
630
|
+
headers = { 'Cookie' => 'TEST_COOKIE'}
|
631
|
+
|
632
|
+
stub_request(:get, start_url).with(headers: headers).to_return(redirect_to(url: bar_url))
|
633
|
+
stub_request(:get, bar_url).with(headers: headers).to_return(status: 200)
|
634
|
+
|
635
|
+
client.get(start_url, headers: headers)
|
636
|
+
expect(a_request(:get, bar_url).
|
637
|
+
with{ |req| req.headers.key?('Cookie')}).to have_been_made
|
638
|
+
end
|
639
|
+
|
640
|
+
it "does preserves cookie header and basic authentication when Puppet[:location_trusted] is true redirecting to different hosts" do
|
641
|
+
headers = { 'cookie' => 'TEST_COOKIE'}
|
642
|
+
Puppet[:location_trusted] = true
|
643
|
+
|
644
|
+
stub_request(:get, start_url).with(headers: headers, basic_auth: credentials).to_return(redirect_to(url: other_host))
|
645
|
+
stub_request(:get, other_host).with(headers: headers, basic_auth: credentials).to_return(status: 200)
|
646
|
+
|
647
|
+
client.get(start_url, headers: headers, options: {basic_auth: {user: 'user', password: 'pass'}})
|
648
|
+
expect(a_request(:get, other_host).
|
649
|
+
with{ |req| req.headers.key?('Authorization') && req.headers.key?('Cookie')}).to have_been_made
|
650
|
+
end
|
651
|
+
|
652
|
+
it "treats hosts as case-insensitive" do
|
653
|
+
start_url = URI("https://www.EXAmple.com:8140/Start")
|
654
|
+
bar_url = "https://www.example.com:8140/bar"
|
655
|
+
|
601
656
|
stub_request(:get, start_url).with(basic_auth: credentials).to_return(redirect_to(url: bar_url))
|
602
657
|
stub_request(:get, bar_url).with(basic_auth: credentials).to_return(status: 200)
|
603
658
|
|
604
659
|
client.get(start_url, options: {basic_auth: {user: 'user', password: 'pass'}})
|
660
|
+
expect(a_request(:get, bar_url).
|
661
|
+
with{ |req| req.headers.key?('Authorization')}).to have_been_made
|
605
662
|
end
|
606
663
|
|
607
664
|
it "redirects given a relative location" do
|
@@ -499,7 +499,7 @@ describe Puppet::Indirector::Indirection do
|
|
499
499
|
end
|
500
500
|
|
501
501
|
it "should return the result of saving to the terminus" do
|
502
|
-
request = double('request', :instance => @instance, :node => nil, :ignore_cache_save? => false)
|
502
|
+
request = double('request', :instance => @instance, :node => nil, :ignore_cache_save? => false, :ignore_terminus? => false)
|
503
503
|
|
504
504
|
expect(@indirection).to receive(:request).and_return(request)
|
505
505
|
|
@@ -509,7 +509,7 @@ describe Puppet::Indirector::Indirection do
|
|
509
509
|
end
|
510
510
|
|
511
511
|
it "should use a request to save the object to the cache" do
|
512
|
-
request = double('request', :instance => @instance, :node => nil, :ignore_cache_save? => false)
|
512
|
+
request = double('request', :instance => @instance, :node => nil, :ignore_cache_save? => false, :ignore_terminus? => false)
|
513
513
|
|
514
514
|
expect(@indirection).to receive(:request).and_return(request)
|
515
515
|
|
@@ -519,7 +519,7 @@ describe Puppet::Indirector::Indirection do
|
|
519
519
|
end
|
520
520
|
|
521
521
|
it "should not save to the cache if the normal save fails" do
|
522
|
-
request = double('request', :instance => @instance, :node => nil)
|
522
|
+
request = double('request', :instance => @instance, :node => nil, :ignore_terminus? => false)
|
523
523
|
|
524
524
|
expect(@indirection).to receive(:request).and_return(request)
|
525
525
|
|
@@ -534,6 +534,13 @@ describe Puppet::Indirector::Indirection do
|
|
534
534
|
|
535
535
|
@indirection.save(@instance, '/my/key', :ignore_cache_save => true)
|
536
536
|
end
|
537
|
+
|
538
|
+
it "should only save to the cache if the request specifies not to use the terminus" do
|
539
|
+
expect(@terminus).not_to receive(:save)
|
540
|
+
expect(@cache).to receive(:save)
|
541
|
+
|
542
|
+
@indirection.save(@instance, "/my/key", :ignore_terminus => true)
|
543
|
+
end
|
537
544
|
end
|
538
545
|
end
|
539
546
|
|