puppet 6.25.0-x64-mingw32 → 6.27.0-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CODEOWNERS +1 -1
- data/Gemfile +2 -2
- data/Gemfile.lock +39 -32
- data/lib/puppet/application/lookup.rb +74 -24
- data/lib/puppet/concurrent/thread_local_singleton.rb +5 -3
- data/lib/puppet/configurer.rb +65 -11
- data/lib/puppet/defaults.rb +19 -3
- 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/windows.rb +4 -4
- data/lib/puppet/file_system.rb +1 -1
- data/lib/puppet/functions/next.rb +18 -1
- data/lib/puppet/functions/tree_each.rb +0 -1
- data/lib/puppet/functions/versioncmp.rb +6 -2
- data/lib/puppet/generate/type.rb +9 -0
- 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 +813 -794
- data/lib/puppet/pops/serialization/to_data_converter.rb +6 -18
- data/lib/puppet/provider/service/init.rb +5 -4
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/resource.rb +38 -5
- data/lib/puppet/ssl/ssl_provider.rb +10 -7
- data/lib/puppet/ssl/verifier.rb +6 -0
- data/lib/puppet/transaction/persistence.rb +22 -12
- data/lib/puppet/type/exec.rb +1 -1
- data/lib/puppet/type/file/data_sync.rb +1 -1
- data/lib/puppet/type/user.rb +40 -38
- data/lib/puppet/util/json.rb +17 -0
- data/lib/puppet/util/log.rb +7 -2
- data/lib/puppet/util/monkey_patches.rb +6 -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 +21 -2
- data/lib/puppet/util.rb +1 -2
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet.rb +1 -0
- data/locales/puppet.pot +5 -10454
- 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-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +9 -6
- data/man/man8/puppet-man.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-ssl.8 +1 -1
- data/man/man8/puppet-status.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 +81 -50
- data/spec/integration/application/resource_spec.rb +6 -2
- data/spec/integration/http/client_spec.rb +30 -0
- data/spec/integration/parser/pcore_resource_spec.rb +10 -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 +197 -73
- data/spec/unit/face/generate_spec.rb +64 -0
- 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/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/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/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/user_spec.rb +0 -45
- data/spec/unit/util/json_spec.rb +126 -0
- data/spec/unit/util/windows_spec.rb +23 -0
- data/spec/unit/util/yaml_spec.rb +54 -29
- metadata +9 -3
data/spec/unit/resource_spec.rb
CHANGED
@@ -694,19 +694,68 @@ describe Puppet::Resource do
|
|
694
694
|
it "should use the resource type's :new method to create the resource if the resource is of a builtin type" do
|
695
695
|
resource = Puppet::Resource.new("file", basepath+"/my/file")
|
696
696
|
result = resource.to_ral
|
697
|
+
|
697
698
|
expect(result).to be_instance_of(Puppet::Type.type(:file))
|
698
699
|
expect(result[:path]).to eq(basepath+"/my/file")
|
699
700
|
end
|
700
701
|
|
701
|
-
it "should convert to a component instance if the resource
|
702
|
+
it "should convert to a component instance if the resource is not a compilable_type" do
|
702
703
|
resource = Puppet::Resource.new("foobar", "somename")
|
703
704
|
result = resource.to_ral
|
704
705
|
|
705
706
|
expect(result).to be_instance_of(Puppet::Type.type(:component))
|
706
707
|
expect(result.title).to eq("Foobar[somename]")
|
707
708
|
end
|
708
|
-
end
|
709
709
|
|
710
|
+
it "should convert to a component instance if the resource is a class" do
|
711
|
+
resource = Puppet::Resource.new("Class", "somename")
|
712
|
+
result = resource.to_ral
|
713
|
+
|
714
|
+
expect(result).to be_instance_of(Puppet::Type.type(:component))
|
715
|
+
expect(result.title).to eq("Class[Somename]")
|
716
|
+
end
|
717
|
+
|
718
|
+
it "should convert to component when the resource is a defined_type" do
|
719
|
+
resource = Puppet::Resource.new("Unknown", "type", :kind => 'defined_type')
|
720
|
+
|
721
|
+
result = resource.to_ral
|
722
|
+
expect(result).to be_instance_of(Puppet::Type.type(:component))
|
723
|
+
end
|
724
|
+
|
725
|
+
it "should raise if a resource type is a compilable_type and it wasn't found" do
|
726
|
+
resource = Puppet::Resource.new("Unknown", "type", :kind => 'compilable_type')
|
727
|
+
|
728
|
+
expect { resource.to_ral }.to raise_error(Puppet::Error, "Resource type 'Unknown' was not found")
|
729
|
+
end
|
730
|
+
|
731
|
+
it "should use the old behaviour when the catalog_format is equal to 1" do
|
732
|
+
resource = Puppet::Resource.new("Unknown", "type")
|
733
|
+
catalog = Puppet::Resource::Catalog.new("mynode")
|
734
|
+
|
735
|
+
resource.catalog = catalog
|
736
|
+
resource.catalog.catalog_format = 1
|
737
|
+
|
738
|
+
result = resource.to_ral
|
739
|
+
expect(result).to be_instance_of(Puppet::Type.type(:component))
|
740
|
+
end
|
741
|
+
|
742
|
+
it "should use the new behaviour and fail when the catalog_format is greater than 1" do
|
743
|
+
resource = Puppet::Resource.new("Unknown", "type", :kind => 'compilable_type')
|
744
|
+
catalog = Puppet::Resource::Catalog.new("mynode")
|
745
|
+
|
746
|
+
resource.catalog = catalog
|
747
|
+
resource.catalog.catalog_format = 2
|
748
|
+
|
749
|
+
expect { resource.to_ral }.to raise_error(Puppet::Error, "Resource type 'Unknown' was not found")
|
750
|
+
end
|
751
|
+
|
752
|
+
it "should use the resource type when the resource doesn't respond to kind and the resource type can be found" do
|
753
|
+
resource = Puppet::Resource.new("file", basepath+"/my/file")
|
754
|
+
|
755
|
+
result = resource.to_ral
|
756
|
+
expect(result).to be_instance_of(Puppet::Type.type(:file))
|
757
|
+
end
|
758
|
+
end
|
710
759
|
describe "when converting to puppet code" do
|
711
760
|
before do
|
712
761
|
@resource = Puppet::Resource.new("one::two", "/my/file",
|
@@ -822,6 +871,13 @@ describe Puppet::Resource do
|
|
822
871
|
expect(Puppet::Resource.from_data_hash(JSON.parse(resource.to_json)).line).to eq(50)
|
823
872
|
end
|
824
873
|
|
874
|
+
it "should include the kind if one is set" do
|
875
|
+
resource = Puppet::Resource.new("File", "/foo")
|
876
|
+
resource.kind = 'im_a_file'
|
877
|
+
|
878
|
+
expect(Puppet::Resource.from_data_hash(JSON.parse(resource.to_json)).kind).to eq('im_a_file')
|
879
|
+
end
|
880
|
+
|
825
881
|
it "should include the 'exported' value if one is set" do
|
826
882
|
resource = Puppet::Resource.new("File", "/foo")
|
827
883
|
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
|
|
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)
|
@@ -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
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Puppet::Util::Windows do
|
6
|
+
%w[
|
7
|
+
ADSI
|
8
|
+
ADSI::ADSIObject
|
9
|
+
ADSI::User
|
10
|
+
ADSI::UserProfile
|
11
|
+
ADSI::Group
|
12
|
+
EventLog
|
13
|
+
File
|
14
|
+
Process
|
15
|
+
Registry
|
16
|
+
Service
|
17
|
+
SID
|
18
|
+
].each do |name|
|
19
|
+
it "defines Puppet::Util::Windows::#{name}" do
|
20
|
+
expect(described_class.const_get(name)).to be
|
21
|
+
end
|
22
|
+
end
|
23
|
+
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,15 +138,46 @@ FACTS
|
|
139
138
|
end
|
140
139
|
end
|
141
140
|
|
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)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
142
172
|
context '#load_file' do
|
143
173
|
it_should_behave_like 'yaml file loader', Puppet::Util::Yaml.method(:load_file)
|
144
174
|
|
145
175
|
it 'raises an error when the file is invalid YAML' do
|
146
|
-
|
176
|
+
file_path = file_containing('input', '{ invalid')
|
147
177
|
|
148
178
|
expect {
|
149
|
-
Puppet::Util::Yaml.load_file(
|
150
|
-
}.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r{\(#{
|
179
|
+
Puppet::Util::Yaml.load_file(file_path)
|
180
|
+
}.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r{\(#{file_path}\): .* at line \d+ column \d+})
|
151
181
|
end
|
152
182
|
|
153
183
|
it 'raises an error when the filename is illegal' do
|
@@ -163,39 +193,34 @@ FACTS
|
|
163
193
|
end
|
164
194
|
|
165
195
|
it 'allows return value to be overridden' do
|
166
|
-
|
196
|
+
file_path = file_containing('input', '')
|
167
197
|
|
168
|
-
expect(Puppet::Util::Yaml.load_file(
|
198
|
+
expect(Puppet::Util::Yaml.load_file(file_path, {})).to eq({})
|
169
199
|
end
|
170
200
|
|
171
201
|
it 'loads arbitrary objects' do
|
172
|
-
|
202
|
+
file_path = file_containing('input', "--- !ruby/object {}\n")
|
173
203
|
|
174
|
-
expect(Puppet::Util::Yaml.load_file(
|
204
|
+
expect(Puppet::Util::Yaml.load_file(file_path, {})).to be_instance_of(Object)
|
175
205
|
end
|
176
206
|
|
177
207
|
it 'should allow one to strip ruby tags that would otherwise not parse' do
|
178
|
-
|
208
|
+
file_path = file_containing('input', "---\nweirddata: !ruby/hash:Not::A::Valid::Class {}")
|
179
209
|
|
180
|
-
expect(Puppet::Util::Yaml.load_file(
|
210
|
+
expect(Puppet::Util::Yaml.load_file(file_path, {}, true)).to eq({"weirddata" => {}})
|
181
211
|
end
|
182
212
|
|
183
213
|
it 'should not strip non-ruby tags' do
|
184
|
-
|
214
|
+
file_path = file_containing('input', "---\nweirddata: !binary |-\n e21kNX04MTE4ZGY2NmM5MTc3OTg4ZWE4Y2JiOWEzMjMyNzFkYg==")
|
185
215
|
|
186
|
-
expect(Puppet::Util::Yaml.load_file(
|
216
|
+
expect(Puppet::Util::Yaml.load_file(file_path, {}, true)).to eq({"weirddata" => "{md5}8118df66c9177988ea8cbb9a323271db"})
|
187
217
|
end
|
188
218
|
|
189
219
|
it 'writes data formatted as YAML to disk' do
|
190
|
-
|
191
|
-
|
192
|
-
expect(Puppet::Util::Yaml.load_file(filename)).to eq({ "my" => "data" })
|
193
|
-
end
|
194
|
-
end
|
220
|
+
file_path = file_containing('input', '')
|
221
|
+
Puppet::Util::Yaml.dump({ "my" => "data" }, file_path)
|
195
222
|
|
196
|
-
|
197
|
-
File.open(name, "w:UTF-8") do |fh|
|
198
|
-
fh.write(contents)
|
223
|
+
expect(Puppet::Util::Yaml.load_file(file_path)).to eq({ "my" => "data" })
|
199
224
|
end
|
200
225
|
end
|
201
226
|
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: 6.
|
4
|
+
version: 6.27.0
|
5
5
|
platform: x64-mingw32
|
6
6
|
authors:
|
7
7
|
- Puppet Labs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: facter
|
@@ -1983,6 +1983,7 @@ files:
|
|
1983
1983
|
- spec/unit/capability_spec.rb
|
1984
1984
|
- spec/unit/certificate_factory_spec.rb
|
1985
1985
|
- spec/unit/concurrent/lock_spec.rb
|
1986
|
+
- spec/unit/concurrent/thread_local_singleton_spec.rb
|
1986
1987
|
- spec/unit/configurer/downloader_spec.rb
|
1987
1988
|
- spec/unit/configurer/fact_handler_spec.rb
|
1988
1989
|
- spec/unit/configurer/plugin_handler_spec.rb
|
@@ -2607,6 +2608,7 @@ files:
|
|
2607
2608
|
- spec/unit/util/http_proxy_spec.rb
|
2608
2609
|
- spec/unit/util/inifile_spec.rb
|
2609
2610
|
- spec/unit/util/json_lockfile_spec.rb
|
2611
|
+
- spec/unit/util/json_spec.rb
|
2610
2612
|
- spec/unit/util/ldap/connection_spec.rb
|
2611
2613
|
- spec/unit/util/ldap/generator_spec.rb
|
2612
2614
|
- spec/unit/util/ldap/manager_spec.rb
|
@@ -2667,6 +2669,7 @@ files:
|
|
2667
2669
|
- spec/unit/util/windows/service_spec.rb
|
2668
2670
|
- spec/unit/util/windows/sid_spec.rb
|
2669
2671
|
- spec/unit/util/windows/string_spec.rb
|
2672
|
+
- spec/unit/util/windows_spec.rb
|
2670
2673
|
- spec/unit/util/yaml_spec.rb
|
2671
2674
|
- spec/unit/util_spec.rb
|
2672
2675
|
- spec/unit/version_spec.rb
|
@@ -2706,7 +2709,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
2706
2709
|
- !ruby/object:Gem::Version
|
2707
2710
|
version: 1.3.1
|
2708
2711
|
requirements: []
|
2709
|
-
rubygems_version: 3.
|
2712
|
+
rubygems_version: 3.1.6
|
2710
2713
|
signing_key:
|
2711
2714
|
specification_version: 4
|
2712
2715
|
summary: Puppet, an automated configuration management tool
|
@@ -3269,6 +3272,7 @@ test_files:
|
|
3269
3272
|
- spec/unit/capability_spec.rb
|
3270
3273
|
- spec/unit/certificate_factory_spec.rb
|
3271
3274
|
- spec/unit/concurrent/lock_spec.rb
|
3275
|
+
- spec/unit/concurrent/thread_local_singleton_spec.rb
|
3272
3276
|
- spec/unit/configurer/downloader_spec.rb
|
3273
3277
|
- spec/unit/configurer/fact_handler_spec.rb
|
3274
3278
|
- spec/unit/configurer/plugin_handler_spec.rb
|
@@ -3893,6 +3897,7 @@ test_files:
|
|
3893
3897
|
- spec/unit/util/http_proxy_spec.rb
|
3894
3898
|
- spec/unit/util/inifile_spec.rb
|
3895
3899
|
- spec/unit/util/json_lockfile_spec.rb
|
3900
|
+
- spec/unit/util/json_spec.rb
|
3896
3901
|
- spec/unit/util/ldap/connection_spec.rb
|
3897
3902
|
- spec/unit/util/ldap/generator_spec.rb
|
3898
3903
|
- spec/unit/util/ldap/manager_spec.rb
|
@@ -3953,6 +3958,7 @@ test_files:
|
|
3953
3958
|
- spec/unit/util/windows/service_spec.rb
|
3954
3959
|
- spec/unit/util/windows/sid_spec.rb
|
3955
3960
|
- spec/unit/util/windows/string_spec.rb
|
3961
|
+
- spec/unit/util/windows_spec.rb
|
3956
3962
|
- spec/unit/util/yaml_spec.rb
|
3957
3963
|
- spec/unit/util_spec.rb
|
3958
3964
|
- spec/unit/version_spec.rb
|