puppet 7.11.0-x86-mingw32 → 7.14.0-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CODEOWNERS +1 -1
- data/Gemfile +2 -2
- data/Gemfile.lock +24 -19
- data/ext/project_data.yaml +1 -1
- data/lib/puppet/application/lookup.rb +78 -24
- data/lib/puppet/concurrent/thread_local_singleton.rb +5 -3
- data/lib/puppet/configurer.rb +74 -25
- data/lib/puppet/defaults.rb +20 -1
- data/lib/puppet/face/generate.rb +2 -0
- data/lib/puppet/file_serving/metadata.rb +3 -0
- data/lib/puppet/file_system/file_impl.rb +7 -7
- 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/functions/versioncmp.rb +6 -2
- data/lib/puppet/generate/type.rb +9 -0
- 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/node.rb +1 -1
- data/lib/puppet/parser/resource.rb +1 -1
- data/lib/puppet/pops/evaluator/closure.rb +7 -5
- data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -0
- data/lib/puppet/pops/parser/code_merger.rb +4 -4
- data/lib/puppet/pops/parser/egrammar.ra +2 -0
- data/lib/puppet/pops/parser/eparser.rb +574 -558
- data/lib/puppet/pops/serialization/to_data_converter.rb +6 -18
- data/lib/puppet/pops/validation/checker4_0.rb +7 -2
- data/lib/puppet/provider/package/pkg.rb +10 -0
- data/lib/puppet/provider/service/init.rb +5 -4
- data/lib/puppet/provider/user/useradd.rb +20 -0
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/resource/type_collection.rb +21 -17
- data/lib/puppet/resource.rb +38 -5
- data/lib/puppet/ssl/verifier.rb +3 -1
- data/lib/puppet/transaction/persistence.rb +22 -12
- 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/service.rb +8 -3
- data/lib/puppet/type/user.rb +41 -39
- data/lib/puppet/util/autoload.rb +1 -1
- data/lib/puppet/util/json.rb +20 -0
- data/lib/puppet/util/log.rb +7 -2
- data/lib/puppet/util/monkey_patches.rb +26 -2
- data/lib/puppet/util/package.rb +25 -16
- data/lib/puppet/util/windows/service.rb +0 -5
- data/lib/puppet/util/windows.rb +3 -0
- data/lib/puppet/util/yaml.rb +16 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet.rb +1 -0
- data/locales/puppet.pot +5 -9737
- data/man/man5/puppet.conf.5 +21 -2
- data/man/man8/puppet-agent.8 +1 -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 +28 -0
- data/spec/integration/application/lookup_spec.rb +32 -6
- data/spec/integration/parser/pcore_resource_spec.rb +20 -0
- data/spec/shared_contexts/l10n.rb +5 -0
- data/spec/unit/application/lookup_spec.rb +131 -10
- data/spec/unit/concurrent/thread_local_singleton_spec.rb +39 -0
- data/spec/unit/configurer_spec.rb +167 -60
- data/spec/unit/face/generate_spec.rb +64 -0
- data/spec/unit/file_system/uniquefile_spec.rb +7 -1
- data/spec/unit/file_system_spec.rb +34 -4
- data/spec/unit/forge/module_release_spec.rb +3 -3
- data/spec/unit/functions/versioncmp_spec.rb +40 -4
- data/spec/unit/http/client_spec.rb +58 -1
- data/spec/unit/network/formats_spec.rb +6 -0
- data/spec/unit/node_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/validator/validator_spec.rb +5 -0
- data/spec/unit/provider/package/pkg_spec.rb +15 -0
- 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/useradd_spec.rb +40 -0
- data/spec/unit/resource/catalog_spec.rb +14 -1
- data/spec/unit/resource_spec.rb +58 -2
- 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 +67 -45
- data/spec/unit/util/autoload_spec.rb +25 -8
- data/spec/unit/util/json_spec.rb +126 -0
- data/spec/unit/util/yaml_spec.rb +37 -13
- metadata +15 -5
data/spec/unit/resource_spec.rb
CHANGED
@@ -638,19 +638,68 @@ describe Puppet::Resource do
|
|
638
638
|
it "should use the resource type's :new method to create the resource if the resource is of a builtin type" do
|
639
639
|
resource = Puppet::Resource.new("file", basepath+"/my/file")
|
640
640
|
result = resource.to_ral
|
641
|
+
|
641
642
|
expect(result).to be_instance_of(Puppet::Type.type(:file))
|
642
643
|
expect(result[:path]).to eq(basepath+"/my/file")
|
643
644
|
end
|
644
645
|
|
645
|
-
it "should convert to a component instance if the resource
|
646
|
+
it "should convert to a component instance if the resource is not a compilable_type" do
|
646
647
|
resource = Puppet::Resource.new("foobar", "somename")
|
647
648
|
result = resource.to_ral
|
648
649
|
|
649
650
|
expect(result).to be_instance_of(Puppet::Type.type(:component))
|
650
651
|
expect(result.title).to eq("Foobar[somename]")
|
651
652
|
end
|
652
|
-
end
|
653
653
|
|
654
|
+
it "should convert to a component instance if the resource is a class" do
|
655
|
+
resource = Puppet::Resource.new("Class", "somename")
|
656
|
+
result = resource.to_ral
|
657
|
+
|
658
|
+
expect(result).to be_instance_of(Puppet::Type.type(:component))
|
659
|
+
expect(result.title).to eq("Class[Somename]")
|
660
|
+
end
|
661
|
+
|
662
|
+
it "should convert to component when the resource is a defined_type" do
|
663
|
+
resource = Puppet::Resource.new("Unknown", "type", :kind => 'defined_type')
|
664
|
+
|
665
|
+
result = resource.to_ral
|
666
|
+
expect(result).to be_instance_of(Puppet::Type.type(:component))
|
667
|
+
end
|
668
|
+
|
669
|
+
it "should raise if a resource type is a compilable_type and it wasn't found" do
|
670
|
+
resource = Puppet::Resource.new("Unknown", "type", :kind => 'compilable_type')
|
671
|
+
|
672
|
+
expect { resource.to_ral }.to raise_error(Puppet::Error, "Resource type 'Unknown' was not found")
|
673
|
+
end
|
674
|
+
|
675
|
+
it "should use the old behaviour when the catalog_format is equal to 1" do
|
676
|
+
resource = Puppet::Resource.new("Unknown", "type")
|
677
|
+
catalog = Puppet::Resource::Catalog.new("mynode")
|
678
|
+
|
679
|
+
resource.catalog = catalog
|
680
|
+
resource.catalog.catalog_format = 1
|
681
|
+
|
682
|
+
result = resource.to_ral
|
683
|
+
expect(result).to be_instance_of(Puppet::Type.type(:component))
|
684
|
+
end
|
685
|
+
|
686
|
+
it "should use the new behaviour and fail when the catalog_format is greater than 1" do
|
687
|
+
resource = Puppet::Resource.new("Unknown", "type", :kind => 'compilable_type')
|
688
|
+
catalog = Puppet::Resource::Catalog.new("mynode")
|
689
|
+
|
690
|
+
resource.catalog = catalog
|
691
|
+
resource.catalog.catalog_format = 2
|
692
|
+
|
693
|
+
expect { resource.to_ral }.to raise_error(Puppet::Error, "Resource type 'Unknown' was not found")
|
694
|
+
end
|
695
|
+
|
696
|
+
it "should use the resource type when the resource doesn't respond to kind and the resource type can be found" do
|
697
|
+
resource = Puppet::Resource.new("file", basepath+"/my/file")
|
698
|
+
|
699
|
+
result = resource.to_ral
|
700
|
+
expect(result).to be_instance_of(Puppet::Type.type(:file))
|
701
|
+
end
|
702
|
+
end
|
654
703
|
describe "when converting to puppet code" do
|
655
704
|
before do
|
656
705
|
@resource = Puppet::Resource.new("one::two", "/my/file",
|
@@ -766,6 +815,13 @@ describe Puppet::Resource do
|
|
766
815
|
expect(Puppet::Resource.from_data_hash(JSON.parse(resource.to_json)).line).to eq(50)
|
767
816
|
end
|
768
817
|
|
818
|
+
it "should include the kind if one is set" do
|
819
|
+
resource = Puppet::Resource.new("File", "/foo")
|
820
|
+
resource.kind = 'im_a_file'
|
821
|
+
|
822
|
+
expect(Puppet::Resource.from_data_hash(JSON.parse(resource.to_json)).kind).to eq('im_a_file')
|
823
|
+
end
|
824
|
+
|
769
825
|
it "should include the 'exported' value if one is set" do
|
770
826
|
resource = Puppet::Resource.new("File", "/foo")
|
771
827
|
resource.exported = true
|
@@ -138,6 +138,57 @@ describe Puppet::Transaction::Persistence do
|
|
138
138
|
persistence = Puppet::Transaction::Persistence.new
|
139
139
|
expect(persistence.load.dig("File[/tmp/audit]", "parameters", "mtime", "system_value")).to contain_exactly(be_a(Time))
|
140
140
|
end
|
141
|
+
|
142
|
+
it 'should load Regexp' do
|
143
|
+
write_state_file(<<~END)
|
144
|
+
system_value:
|
145
|
+
- !ruby/regexp /regexp/
|
146
|
+
END
|
147
|
+
|
148
|
+
persistence = Puppet::Transaction::Persistence.new
|
149
|
+
expect(persistence.load.dig("system_value")).to contain_exactly(be_a(Regexp))
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'should load semantic puppet version' do
|
153
|
+
write_state_file(<<~END)
|
154
|
+
system_value:
|
155
|
+
- !ruby/object:SemanticPuppet::Version
|
156
|
+
major: 1
|
157
|
+
minor: 0
|
158
|
+
patch: 0
|
159
|
+
prerelease:
|
160
|
+
build:
|
161
|
+
END
|
162
|
+
|
163
|
+
persistence = Puppet::Transaction::Persistence.new
|
164
|
+
expect(persistence.load.dig("system_value")).to contain_exactly(be_a(SemanticPuppet::Version))
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'should load puppet time related objects' do
|
168
|
+
write_state_file(<<~END)
|
169
|
+
system_value:
|
170
|
+
- !ruby/object:Puppet::Pops::Time::Timestamp
|
171
|
+
nsecs: 1638316135955087259
|
172
|
+
- !ruby/object:Puppet::Pops::Time::TimeData
|
173
|
+
nsecs: 1495789430910161286
|
174
|
+
- !ruby/object:Puppet::Pops::Time::Timespan
|
175
|
+
nsecs: 1495789430910161286
|
176
|
+
END
|
177
|
+
|
178
|
+
persistence = Puppet::Transaction::Persistence.new
|
179
|
+
expect(persistence.load.dig("system_value")).to contain_exactly(be_a(Puppet::Pops::Time::Timestamp), be_a(Puppet::Pops::Time::TimeData), be_a(Puppet::Pops::Time::Timespan))
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'should load binary objects' do
|
183
|
+
write_state_file(<<~END)
|
184
|
+
system_value:
|
185
|
+
- !ruby/object:Puppet::Pops::Types::PBinaryType::Binary
|
186
|
+
binary_buffer: ''
|
187
|
+
END
|
188
|
+
|
189
|
+
persistence = Puppet::Transaction::Persistence.new
|
190
|
+
expect(persistence.load.dig("system_value")).to contain_exactly(be_a(Puppet::Pops::Types::PBinaryType::Binary))
|
191
|
+
end
|
141
192
|
end
|
142
193
|
end
|
143
194
|
|
@@ -27,6 +27,13 @@ describe Puppet::Type.type(:file).attrclass(:group) do
|
|
27
27
|
expect { group.insync?(5) }.to raise_error(/Could not find group foos/)
|
28
28
|
end
|
29
29
|
|
30
|
+
it "should return false if a group's id can't be found by name in noop" do
|
31
|
+
Puppet[:noop] = true
|
32
|
+
allow(resource.provider).to receive(:name2gid).and_return(nil)
|
33
|
+
|
34
|
+
expect(group.insync?('notcreatedyet')).to eq(false)
|
35
|
+
end
|
36
|
+
|
30
37
|
it "should use the id for comparisons, not the name" do
|
31
38
|
expect(group.insync?('foos')).to be_falsey
|
32
39
|
end
|
@@ -25,6 +25,13 @@ describe Puppet::Type.type(:file).attrclass(:owner) do
|
|
25
25
|
expect { owner.insync?(5) }.to raise_error(/Could not find user foo/)
|
26
26
|
end
|
27
27
|
|
28
|
+
it "should return false if an owner's id can't be found by name in noop" do
|
29
|
+
Puppet[:noop] = true
|
30
|
+
allow(resource.provider).to receive(:name2uid).and_return(nil)
|
31
|
+
|
32
|
+
expect(owner.insync?('notcreatedyet')).to eq(false)
|
33
|
+
end
|
34
|
+
|
28
35
|
it "should use the id for comparisons, not the name" do
|
29
36
|
expect(owner.insync?('foo')).to be_falsey
|
30
37
|
end
|
@@ -158,6 +158,33 @@ describe test_title, "when validating attribute values" do
|
|
158
158
|
expect(srv[:timeout]).to eq(int)
|
159
159
|
end
|
160
160
|
end
|
161
|
+
|
162
|
+
it "should default :timeout to 10 when provider has no default value" do
|
163
|
+
srv = Puppet::Type.type(:service).new(:name => "yay")
|
164
|
+
expect(srv[:timeout]).to eq(10)
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should default :timeout to provider given default time when it has one" do
|
168
|
+
provider_class_with_timeout = Puppet::Type.type(:service).provide(:simple) do
|
169
|
+
has_features :configurable_timeout
|
170
|
+
def default_timeout
|
171
|
+
30
|
172
|
+
end
|
173
|
+
end
|
174
|
+
allow(Puppet::Type.type(:service)).to receive(:defaultprovider).and_return(provider_class_with_timeout)
|
175
|
+
|
176
|
+
srv = Puppet::Type.type(:service).new(:name => "yay")
|
177
|
+
expect(srv[:timeout]).to eq(30)
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should accept string as value" do
|
181
|
+
srv = Puppet::Type.type(:service).new(:name => "yay", :timeout => "25")
|
182
|
+
expect(srv[:timeout]).to eq(25)
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should not support values that cannot be converted to Integer such as Array" do
|
186
|
+
expect { Puppet::Type.type(:service).new(:name => "yay", :timeout => [25]) }.to raise_error(Puppet::Error)
|
187
|
+
end
|
161
188
|
end
|
162
189
|
|
163
190
|
describe "the service logon credentials" do
|
data/spec/unit/type/user_spec.rb
CHANGED
@@ -174,51 +174,6 @@ describe Puppet::Type.type(:user) do
|
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
177
|
-
describe "when managing the purge_ssh_keys property" do
|
178
|
-
context "with valid input" do
|
179
|
-
it "should support a :true value" do
|
180
|
-
expect { described_class.new(:name => 'foo', :purge_ssh_keys => :true) }.to_not raise_error
|
181
|
-
end
|
182
|
-
|
183
|
-
it "should support a :false value" do
|
184
|
-
expect { described_class.new(:name => 'foo', :purge_ssh_keys => :false) }.to_not raise_error
|
185
|
-
end
|
186
|
-
|
187
|
-
it "should support a String value" do
|
188
|
-
expect { described_class.new(:name => 'foo', :purge_ssh_keys => File.expand_path('home/foo/.ssh/authorized_keys')) }.to_not raise_error
|
189
|
-
end
|
190
|
-
|
191
|
-
it "should support an Array value" do
|
192
|
-
expect { described_class.new(:name => 'foo', :purge_ssh_keys => [File.expand_path('home/foo/.ssh/authorized_keys'),
|
193
|
-
File.expand_path('custom/authorized_keys')]) }.to_not raise_error
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
context "with faulty input" do
|
198
|
-
it "should raise error for relative path" do
|
199
|
-
expect { described_class.new(:name => 'foo', :purge_ssh_keys => 'home/foo/.ssh/authorized_keys') }.to raise_error(Puppet::ResourceError,
|
200
|
-
/Paths to keyfiles must be absolute/ )
|
201
|
-
end
|
202
|
-
|
203
|
-
it "should raise error for invalid type" do
|
204
|
-
expect { described_class.new(:name => 'foo', :purge_ssh_keys => :invalid) }.to raise_error(Puppet::ResourceError,
|
205
|
-
/purge_ssh_keys must be true, false, or an array of file names/ )
|
206
|
-
end
|
207
|
-
|
208
|
-
it "should raise error for array with relative path" do
|
209
|
-
expect { described_class.new(:name => 'foo', :purge_ssh_keys => ['home/foo/.ssh/authorized_keys',
|
210
|
-
File.expand_path('custom/authorized_keys')]) }.to raise_error(Puppet::ResourceError,
|
211
|
-
/Paths to keyfiles must be absolute/ )
|
212
|
-
end
|
213
|
-
|
214
|
-
it "should raise error for array with invalid type" do
|
215
|
-
expect { described_class.new(:name => 'foo', :purge_ssh_keys => [:invalid,
|
216
|
-
File.expand_path('custom/authorized_keys')]) }.to raise_error(Puppet::ResourceError,
|
217
|
-
/Each entry for purge_ssh_keys must be a string/ )
|
218
|
-
end
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
177
|
describe "when managing the uid property" do
|
223
178
|
it "should convert number-looking strings into actual numbers" do
|
224
179
|
expect(described_class.new(:name => 'foo', :uid => '50')[:uid]).to eq(50)
|
@@ -334,6 +289,73 @@ describe Puppet::Type.type(:user) do
|
|
334
289
|
end
|
335
290
|
end
|
336
291
|
|
292
|
+
describe "when managing the purge_ssh_keys property" do
|
293
|
+
context "with valid input" do
|
294
|
+
['true', :true, true].each do |input|
|
295
|
+
it "should support #{input} as value" do
|
296
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => input) }.to_not raise_error
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
['false', :false, false].each do |input|
|
301
|
+
it "should support #{input} as value" do
|
302
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => input) }.to_not raise_error
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
it "should support a String value" do
|
307
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => File.expand_path('home/foo/.ssh/authorized_keys')) }.to_not raise_error
|
308
|
+
end
|
309
|
+
|
310
|
+
it "should support an Array value" do
|
311
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => [File.expand_path('home/foo/.ssh/authorized_keys'),
|
312
|
+
File.expand_path('custom/authorized_keys')]) }.to_not raise_error
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
context "with faulty input" do
|
317
|
+
it "should raise error for relative path" do
|
318
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => 'home/foo/.ssh/authorized_keys') }.to raise_error(Puppet::ResourceError,
|
319
|
+
/Paths to keyfiles must be absolute/ )
|
320
|
+
end
|
321
|
+
|
322
|
+
it "should raise error for invalid type" do
|
323
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => :invalid) }.to raise_error(Puppet::ResourceError,
|
324
|
+
/purge_ssh_keys must be true, false, or an array of file names/ )
|
325
|
+
end
|
326
|
+
|
327
|
+
it "should raise error for array with relative path" do
|
328
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => ['home/foo/.ssh/authorized_keys',
|
329
|
+
File.expand_path('custom/authorized_keys')]) }.to raise_error(Puppet::ResourceError,
|
330
|
+
/Paths to keyfiles must be absolute/ )
|
331
|
+
end
|
332
|
+
|
333
|
+
it "should raise error for array with invalid type" do
|
334
|
+
expect { described_class.new(:name => 'foo', :purge_ssh_keys => [:invalid,
|
335
|
+
File.expand_path('custom/authorized_keys')]) }.to raise_error(Puppet::ResourceError,
|
336
|
+
/Each entry for purge_ssh_keys must be a string/ )
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
context "homedir retrieval" do
|
341
|
+
it "should accept the home provided" do
|
342
|
+
expect(Puppet).not_to receive(:debug).with("User 'foo' does not exist")
|
343
|
+
described_class.new(:name => 'foo', :purge_ssh_keys => true, :home => '/my_home')
|
344
|
+
end
|
345
|
+
|
346
|
+
it "should accept the home provided" do
|
347
|
+
expect(Dir).to receive(:home).with('foo').and_return('/my_home')
|
348
|
+
expect(Puppet).not_to receive(:debug).with("User 'foo' does not exist")
|
349
|
+
described_class.new(:name => 'foo', :purge_ssh_keys => true)
|
350
|
+
end
|
351
|
+
|
352
|
+
it "should output debug message when home directory cannot be retrieved" do
|
353
|
+
allow(Dir).to receive(:home).with('foo').and_raise(ArgumentError)
|
354
|
+
expect(Puppet).to receive(:debug).with("User 'foo' does not exist")
|
355
|
+
described_class.new(:name => 'foo', :purge_ssh_keys => true)
|
356
|
+
end
|
357
|
+
end
|
358
|
+
end
|
337
359
|
|
338
360
|
describe "when managing expiry" do
|
339
361
|
it "should fail if given an invalid date" do
|
@@ -178,15 +178,14 @@ describe Puppet::Util::Autoload do
|
|
178
178
|
end
|
179
179
|
|
180
180
|
describe "when loading all files" do
|
181
|
+
let(:basedir) { tmpdir('autoloader') }
|
182
|
+
let(:path) { File.join(basedir, @autoload.path, 'file.rb') }
|
183
|
+
|
181
184
|
before do
|
182
|
-
|
183
|
-
|
184
|
-
allow(Dir).to receive(:glob).and_return([make_absolute("/a/foo/file.rb")])
|
185
|
-
allow(Puppet::FileSystem).to receive(:exist?).and_return(true)
|
186
|
-
@time_a = Time.utc(2010, 'jan', 1, 6, 30)
|
187
|
-
allow(File).to receive(:mtime).and_return(@time_a)
|
185
|
+
FileUtils.mkdir_p(File.dirname(path))
|
186
|
+
FileUtils.touch(path)
|
188
187
|
|
189
|
-
allow(@autoload.class).to receive(:
|
188
|
+
allow(@autoload.class).to receive(:search_directories).and_return([basedir])
|
190
189
|
end
|
191
190
|
|
192
191
|
[RuntimeError, LoadError, SyntaxError].each do |error|
|
@@ -198,7 +197,25 @@ describe Puppet::Util::Autoload do
|
|
198
197
|
end
|
199
198
|
|
200
199
|
it "should require the full path to the file" do
|
201
|
-
expect(Kernel).to receive(:load).with(
|
200
|
+
expect(Kernel).to receive(:load).with(path, any_args)
|
201
|
+
|
202
|
+
@autoload.loadall(env)
|
203
|
+
end
|
204
|
+
|
205
|
+
it "autoloads from a directory whose ancestor is Windows 8.3", if: Puppet::Util::Platform.windows? do
|
206
|
+
# File.expand_path will expand ~ in the last directory component only(!)
|
207
|
+
# so create an ancestor directory with a long path
|
208
|
+
dir = File.join(tmpdir('longpath'), 'short')
|
209
|
+
path = File.join(dir, @autoload.path, 'file.rb')
|
210
|
+
|
211
|
+
FileUtils.mkdir_p(File.dirname(path))
|
212
|
+
FileUtils.touch(path)
|
213
|
+
|
214
|
+
dir83 = File.join(File.dirname(basedir), 'longpa~1', 'short')
|
215
|
+
path83 = File.join(dir83, @autoload.path, 'file.rb')
|
216
|
+
|
217
|
+
allow(@autoload.class).to receive(:search_directories).and_return([dir83])
|
218
|
+
expect(Kernel).to receive(:load).with(path83, any_args)
|
202
219
|
|
203
220
|
@autoload.loadall(env)
|
204
221
|
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'puppet/util/json'
|
4
|
+
|
5
|
+
describe Puppet::Util::Json do
|
6
|
+
include PuppetSpec::Files
|
7
|
+
|
8
|
+
shared_examples_for 'json file loader' do |load_method|
|
9
|
+
it 'reads a JSON file from disk' do
|
10
|
+
file_path = file_containing('input', JSON.dump({ "my" => "data" }))
|
11
|
+
|
12
|
+
expect(load_method.call(file_path)).to eq({ "my" => "data" })
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'reads JSON as UTF-8' do
|
16
|
+
file_path = file_containing('input', JSON.dump({ "my" => "𠜎" }))
|
17
|
+
|
18
|
+
expect(load_method.call(file_path)).to eq({ "my" => "𠜎" })
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "#load" do
|
23
|
+
it 'raises an error if JSON is invalid' do
|
24
|
+
expect {
|
25
|
+
Puppet::Util::Json.load('{ invalid')
|
26
|
+
}.to raise_error(Puppet::Util::Json::ParseError, /unexpected token at '{ invalid'/)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'raises an error if the content is empty' do
|
30
|
+
expect {
|
31
|
+
Puppet::Util::Json.load('')
|
32
|
+
}.to raise_error(Puppet::Util::Json::ParseError)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'loads true' do
|
36
|
+
expect(Puppet::Util::Json.load('true')).to eq(true)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'loads false' do
|
40
|
+
expect(Puppet::Util::Json.load('false')).to eq(false)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'loads a numeric' do
|
44
|
+
expect(Puppet::Util::Json.load('42')).to eq(42)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'loads a string' do
|
48
|
+
expect(Puppet::Util::Json.load('"puppet"')).to eq('puppet')
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'loads an array' do
|
52
|
+
expect(Puppet::Util::Json.load(<<~JSON)).to eq([1, 2])
|
53
|
+
[1, 2]
|
54
|
+
JSON
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'loads a hash' do
|
58
|
+
expect(Puppet::Util::Json.load(<<~JSON)).to eq('a' => 1, 'b' => 2)
|
59
|
+
{
|
60
|
+
"a": 1,
|
61
|
+
"b": 2
|
62
|
+
}
|
63
|
+
JSON
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "load_file_if_valid" do
|
68
|
+
before do
|
69
|
+
Puppet[:log_level] = 'debug'
|
70
|
+
end
|
71
|
+
|
72
|
+
it_should_behave_like 'json file loader', Puppet::Util::Json.method(:load_file_if_valid)
|
73
|
+
|
74
|
+
it 'returns nil when the file is invalid JSON and debug logs about it' do
|
75
|
+
file_path = file_containing('input', '{ invalid')
|
76
|
+
expect(Puppet).to receive(:debug)
|
77
|
+
.with(/Could not retrieve JSON content .+: unexpected token at '{ invalid'/).and_call_original
|
78
|
+
|
79
|
+
expect(Puppet::Util::Json.load_file_if_valid(file_path)).to eql(nil)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'returns nil when the filename is illegal and debug logs about it' do
|
83
|
+
expect(Puppet).to receive(:debug)
|
84
|
+
.with(/Could not retrieve JSON content .+: pathname contains null byte/).and_call_original
|
85
|
+
|
86
|
+
expect(Puppet::Util::Json.load_file_if_valid("not\0allowed")).to eql(nil)
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'returns nil when the file does not exist and debug logs about it' do
|
90
|
+
expect(Puppet).to receive(:debug)
|
91
|
+
.with(/Could not retrieve JSON content .+: No such file or directory/).and_call_original
|
92
|
+
|
93
|
+
expect(Puppet::Util::Json.load_file_if_valid('does/not/exist.json')).to eql(nil)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context '#load_file' do
|
98
|
+
it_should_behave_like 'json file loader', Puppet::Util::Json.method(:load_file)
|
99
|
+
|
100
|
+
it 'raises an error when the file is invalid JSON' do
|
101
|
+
file_path = file_containing('input', '{ invalid')
|
102
|
+
|
103
|
+
expect {
|
104
|
+
Puppet::Util::Json.load_file(file_path)
|
105
|
+
}.to raise_error(Puppet::Util::Json::ParseError, /unexpected token at '{ invalid'/)
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'raises an error when the filename is illegal' do
|
109
|
+
expect {
|
110
|
+
Puppet::Util::Json.load_file("not\0allowed")
|
111
|
+
}.to raise_error(ArgumentError, /null byte/)
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'raises an error when the file does not exist' do
|
115
|
+
expect {
|
116
|
+
Puppet::Util::Json.load_file('does/not/exist.json')
|
117
|
+
}.to raise_error(Errno::ENOENT, /No such file or directory/)
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'writes data formatted as JSON to disk' do
|
121
|
+
file_path = file_containing('input', Puppet::Util::Json.dump({ "my" => "data" }))
|
122
|
+
|
123
|
+
expect(Puppet::Util::Json.load_file(file_path)).to eq({ "my" => "data" })
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
data/spec/unit/util/yaml_spec.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
require 'spec_helper'
|
3
|
-
|
4
3
|
require 'puppet/util/yaml'
|
5
4
|
|
6
5
|
describe Puppet::Util::Yaml do
|
@@ -10,21 +9,21 @@ describe Puppet::Util::Yaml do
|
|
10
9
|
|
11
10
|
shared_examples_for 'yaml file loader' do |load_method|
|
12
11
|
it 'returns false when the file is empty' do
|
13
|
-
|
12
|
+
file_path = file_containing('input', '')
|
14
13
|
|
15
|
-
expect(load_method.call(
|
14
|
+
expect(load_method.call(file_path)).to eq(false)
|
16
15
|
end
|
17
16
|
|
18
17
|
it 'reads a YAML file from disk' do
|
19
|
-
|
18
|
+
file_path = file_containing('input', YAML.dump({ "my" => "data" }))
|
20
19
|
|
21
|
-
expect(load_method.call(
|
20
|
+
expect(load_method.call(file_path)).to eq({ "my" => "data" })
|
22
21
|
end
|
23
22
|
|
24
23
|
it 'reads YAML as UTF-8' do
|
25
|
-
|
24
|
+
file_path = file_containing('input', YAML.dump({ "my" => "𠜎" }))
|
26
25
|
|
27
|
-
expect(load_method.call(
|
26
|
+
expect(load_method.call(file_path)).to eq({ "my" => "𠜎" })
|
28
27
|
end
|
29
28
|
end
|
30
29
|
|
@@ -119,11 +118,11 @@ FACTS
|
|
119
118
|
it_should_behave_like 'yaml file loader', Puppet::Util::Yaml.method(:safe_load_file)
|
120
119
|
|
121
120
|
it 'raises an error when the file is invalid YAML' do
|
122
|
-
|
121
|
+
file_path = file_containing('input', '{ invalid')
|
123
122
|
|
124
123
|
expect {
|
125
|
-
Puppet::Util::Yaml.safe_load_file(
|
126
|
-
}.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r[\(#{
|
124
|
+
Puppet::Util::Yaml.safe_load_file(file_path)
|
125
|
+
}.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r[\(#{file_path}\): .* at line \d+ column \d+])
|
127
126
|
end
|
128
127
|
|
129
128
|
it 'raises an error when the filename is illegal' do
|
@@ -139,9 +138,34 @@ FACTS
|
|
139
138
|
end
|
140
139
|
end
|
141
140
|
|
142
|
-
|
143
|
-
|
144
|
-
|
141
|
+
context "#safe_load_file_if_valid" do
|
142
|
+
before do
|
143
|
+
Puppet[:log_level] = 'debug'
|
144
|
+
end
|
145
|
+
|
146
|
+
it_should_behave_like 'yaml file loader', Puppet::Util::Yaml.method(:safe_load_file_if_valid)
|
147
|
+
|
148
|
+
it 'returns nil when the file is invalid YAML and debug logs about it' do
|
149
|
+
file_path = file_containing('input', '{ invalid')
|
150
|
+
|
151
|
+
expect(Puppet).to receive(:debug)
|
152
|
+
.with(/Could not retrieve YAML content .+ expected ',' or '}'/).and_call_original
|
153
|
+
|
154
|
+
expect(Puppet::Util::Yaml.safe_load_file_if_valid(file_path)).to eql(nil)
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'returns nil when the filename is illegal and debug logs about it' do
|
158
|
+
expect(Puppet).to receive(:debug)
|
159
|
+
.with(/Could not retrieve YAML content .+: pathname contains null byte/).and_call_original
|
160
|
+
|
161
|
+
expect(Puppet::Util::Yaml.safe_load_file_if_valid("not\0allowed")).to eql(nil)
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'returns nil when the file does not exist and debug logs about it' do
|
165
|
+
expect(Puppet).to receive(:debug)
|
166
|
+
.with(/Could not retrieve YAML content .+: No such file or directory/).and_call_original
|
167
|
+
|
168
|
+
expect(Puppet::Util::Yaml.safe_load_file_if_valid('does/not/exist.yaml')).to eql(nil)
|
145
169
|
end
|
146
170
|
end
|
147
171
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.14.0
|
5
5
|
platform: x86-mingw32
|
6
6
|
authors:
|
7
7
|
- Puppet Labs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: facter
|
@@ -68,16 +68,22 @@ dependencies:
|
|
68
68
|
name: fast_gettext
|
69
69
|
requirement: !ruby/object:Gem::Requirement
|
70
70
|
requirements:
|
71
|
-
- - "
|
71
|
+
- - ">="
|
72
72
|
- !ruby/object:Gem::Version
|
73
73
|
version: '1.1'
|
74
|
+
- - "<"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '3'
|
74
77
|
type: :runtime
|
75
78
|
prerelease: false
|
76
79
|
version_requirements: !ruby/object:Gem::Requirement
|
77
80
|
requirements:
|
78
|
-
- - "
|
81
|
+
- - ">="
|
79
82
|
- !ruby/object:Gem::Version
|
80
83
|
version: '1.1'
|
84
|
+
- - "<"
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '3'
|
81
87
|
- !ruby/object:Gem::Dependency
|
82
88
|
name: locale
|
83
89
|
requirement: !ruby/object:Gem::Requirement
|
@@ -1869,6 +1875,7 @@ files:
|
|
1869
1875
|
- spec/unit/application_spec.rb
|
1870
1876
|
- spec/unit/certificate_factory_spec.rb
|
1871
1877
|
- spec/unit/concurrent/lock_spec.rb
|
1878
|
+
- spec/unit/concurrent/thread_local_singleton_spec.rb
|
1872
1879
|
- spec/unit/configurer/downloader_spec.rb
|
1873
1880
|
- spec/unit/configurer/fact_handler_spec.rb
|
1874
1881
|
- spec/unit/configurer/plugin_handler_spec.rb
|
@@ -2465,6 +2472,7 @@ files:
|
|
2465
2472
|
- spec/unit/util/filetype_spec.rb
|
2466
2473
|
- spec/unit/util/inifile_spec.rb
|
2467
2474
|
- spec/unit/util/json_lockfile_spec.rb
|
2475
|
+
- spec/unit/util/json_spec.rb
|
2468
2476
|
- spec/unit/util/ldap/connection_spec.rb
|
2469
2477
|
- spec/unit/util/ldap/generator_spec.rb
|
2470
2478
|
- spec/unit/util/ldap/manager_spec.rb
|
@@ -2563,7 +2571,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
2563
2571
|
- !ruby/object:Gem::Version
|
2564
2572
|
version: 1.3.1
|
2565
2573
|
requirements: []
|
2566
|
-
rubygems_version: 3.
|
2574
|
+
rubygems_version: 3.1.2
|
2567
2575
|
signing_key:
|
2568
2576
|
specification_version: 4
|
2569
2577
|
summary: Puppet, an automated configuration management tool
|
@@ -3126,6 +3134,7 @@ test_files:
|
|
3126
3134
|
- spec/unit/application_spec.rb
|
3127
3135
|
- spec/unit/certificate_factory_spec.rb
|
3128
3136
|
- spec/unit/concurrent/lock_spec.rb
|
3137
|
+
- spec/unit/concurrent/thread_local_singleton_spec.rb
|
3129
3138
|
- spec/unit/configurer/downloader_spec.rb
|
3130
3139
|
- spec/unit/configurer/fact_handler_spec.rb
|
3131
3140
|
- spec/unit/configurer/plugin_handler_spec.rb
|
@@ -3722,6 +3731,7 @@ test_files:
|
|
3722
3731
|
- spec/unit/util/filetype_spec.rb
|
3723
3732
|
- spec/unit/util/inifile_spec.rb
|
3724
3733
|
- spec/unit/util/json_lockfile_spec.rb
|
3734
|
+
- spec/unit/util/json_spec.rb
|
3725
3735
|
- spec/unit/util/ldap/connection_spec.rb
|
3726
3736
|
- spec/unit/util/ldap/generator_spec.rb
|
3727
3737
|
- spec/unit/util/ldap/manager_spec.rb
|