puppet 6.15.0 → 6.16.0
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 +2 -7
- data/Gemfile.lock +17 -14
- data/lib/puppet.rb +32 -8
- data/lib/puppet/agent.rb +18 -4
- data/lib/puppet/application/agent.rb +1 -2
- data/lib/puppet/application/device.rb +1 -1
- data/lib/puppet/application/plugin.rb +1 -0
- data/lib/puppet/application/ssl.rb +1 -1
- data/lib/puppet/configurer.rb +2 -2
- data/lib/puppet/context/trusted_information.rb +14 -8
- data/lib/puppet/daemon.rb +13 -27
- data/lib/puppet/defaults.rb +19 -0
- data/lib/puppet/face/facts.rb +1 -1
- data/lib/puppet/face/help.rb +29 -3
- data/lib/puppet/face/module/search.rb +5 -0
- data/lib/puppet/face/plugin.rb +1 -1
- data/lib/puppet/file_serving/http_metadata.rb +1 -1
- data/lib/puppet/file_system/uniquefile.rb +4 -0
- data/lib/puppet/forge/repository.rb +7 -6
- data/lib/puppet/functions/filter.rb +1 -0
- data/lib/puppet/http/client.rb +22 -11
- data/lib/puppet/http/external_client.rb +0 -6
- data/lib/puppet/indirector/file_content/http.rb +5 -0
- data/lib/puppet/indirector/file_metadata/http.rb +4 -4
- data/lib/puppet/indirector/rest.rb +7 -1
- data/lib/puppet/network/http/compression.rb +7 -0
- data/lib/puppet/network/http/connection.rb +2 -0
- data/lib/puppet/network/http/connection_adapter.rb +182 -0
- data/lib/puppet/network/http/nocache_pool.rb +1 -0
- data/lib/puppet/network/http_pool.rb +2 -2
- data/lib/puppet/pal/catalog_compiler.rb +5 -0
- data/lib/puppet/pal/pal_impl.rb +4 -1
- data/lib/puppet/parser/compiler.rb +28 -25
- data/lib/puppet/parser/functions/filter.rb +1 -0
- data/lib/puppet/provider/package/aix.rb +17 -2
- data/lib/puppet/provider/package/apt.rb +4 -1
- data/lib/puppet/provider/package/dnfmodule.rb +24 -4
- data/lib/puppet/provider/package/pip.rb +60 -37
- data/lib/puppet/provider/package/portage.rb +2 -2
- data/lib/puppet/provider/package/yum.rb +7 -0
- data/lib/puppet/provider/package/zypper.rb +59 -1
- data/lib/puppet/provider/service/systemd.rb +21 -4
- data/lib/puppet/provider/user/useradd.rb +5 -1
- data/lib/puppet/reports/http.rb +5 -3
- data/lib/puppet/runtime.rb +25 -2
- data/lib/puppet/ssl/state_machine.rb +33 -8
- data/lib/puppet/ssl/verifier_adapter.rb +9 -1
- data/lib/puppet/test/test_helper.rb +1 -1
- data/lib/puppet/type/file/source.rb +1 -1
- data/lib/puppet/type/package.rb +16 -1
- data/lib/puppet/type/service.rb +6 -8
- data/lib/puppet/type/user.rb +1 -7
- data/lib/puppet/util/autoload.rb +1 -18
- data/lib/puppet/util/log/destinations.rb +1 -10
- data/lib/puppet/util/package/version/range.rb +4 -1
- data/lib/puppet/util/package/version/range/eq.rb +14 -0
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +191 -111
- 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 +6 -3
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +4 -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/unit/provider/package/dnfmodule/{dnf-module-list-enabled.txt → dnf-module-list.txt} +6 -0
- data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
- data/spec/integration/application/agent_spec.rb +66 -1
- data/spec/integration/application/plugin_spec.rb +23 -0
- data/spec/integration/http/client_spec.rb +6 -1
- data/spec/integration/network/http_pool_spec.rb +56 -0
- data/spec/integration/util/windows/adsi_spec.rb +5 -0
- data/spec/lib/puppet_spec/https.rb +6 -0
- data/spec/unit/agent_spec.rb +47 -1
- data/spec/unit/application/agent_spec.rb +4 -4
- data/spec/unit/context/trusted_information_spec.rb +17 -0
- data/spec/unit/daemon_spec.rb +5 -64
- data/spec/unit/face/module/search_spec.rb +17 -0
- data/spec/unit/file_system/uniquefile_spec.rb +11 -0
- data/spec/unit/http/client_spec.rb +10 -10
- data/spec/unit/http/external_client_spec.rb +9 -9
- data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
- data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
- data/spec/unit/indirector/file_metadata/rest_spec.rb +15 -14
- data/spec/unit/indirector/rest_spec.rb +13 -0
- data/spec/unit/network/http/connection_spec.rb +542 -190
- data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
- data/spec/unit/network/http_pool_spec.rb +63 -57
- data/spec/unit/network/http_spec.rb +1 -1
- data/spec/unit/provider/package/aix_spec.rb +29 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +25 -5
- data/spec/unit/provider/package/pip_spec.rb +42 -16
- data/spec/unit/provider/package/portage_spec.rb +5 -0
- data/spec/unit/provider/package/yum_spec.rb +16 -8
- data/spec/unit/provider/package/zypper_spec.rb +84 -0
- data/spec/unit/provider/service/init_spec.rb +1 -0
- data/spec/unit/provider/service/openbsd_spec.rb +9 -0
- data/spec/unit/provider/service/openwrt_spec.rb +1 -0
- data/spec/unit/provider/service/redhat_spec.rb +9 -0
- data/spec/unit/provider/service/systemd_spec.rb +84 -13
- data/spec/unit/provider/user/useradd_spec.rb +8 -0
- data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
- data/spec/unit/puppet_spec.rb +33 -0
- data/spec/unit/reports/http_spec.rb +1 -1
- data/spec/unit/ssl/state_machine_spec.rb +52 -8
- data/spec/unit/type/service_spec.rb +9 -8
- data/spec/unit/type/user_spec.rb +1 -1
- data/spec/unit/util/autoload_spec.rb +2 -1
- data/spec/unit/util/log/destinations_spec.rb +1 -29
- data/spec/unit/util/package/version/range_spec.rb +22 -1
- data/tasks/manpages.rake +5 -35
- metadata +10 -4
@@ -132,7 +132,12 @@ describe Puppet::HTTP::Client, unless: Puppet::Util::Platform.jruby? do
|
|
132
132
|
it "detects when the server has closed the connection and reconnects" do
|
133
133
|
Puppet[:http_debug] = true
|
134
134
|
|
135
|
-
|
135
|
+
# advertise that we support keep-alive, but we don't really
|
136
|
+
response_proc = -> (req, res) {
|
137
|
+
res['Connection'] = 'Keep-Alive'
|
138
|
+
}
|
139
|
+
|
140
|
+
https_server.start_server(response_proc: response_proc) do |port|
|
136
141
|
uri = URI("https://127.0.0.1:#{port}")
|
137
142
|
kwargs = {headers: {'Content-Type' => 'text/plain'}, options: {ssl_context: root_context}}
|
138
143
|
|
@@ -116,6 +116,62 @@ describe Puppet::Network::HttpPool, unless: Puppet::Util::Platform.jruby? do
|
|
116
116
|
|
117
117
|
include_examples 'HTTPS client'
|
118
118
|
end
|
119
|
+
|
120
|
+
shared_examples_for "an HttpPool connection" do |klass, legacy_api|
|
121
|
+
before :each do
|
122
|
+
Puppet::Network::HttpPool.http_client_class = klass
|
123
|
+
end
|
124
|
+
|
125
|
+
it "connects using the scheme, host and port from the http instance" do
|
126
|
+
request_line = nil
|
127
|
+
|
128
|
+
response_proc = -> (req, res) {
|
129
|
+
request_line = req.request_line
|
130
|
+
}
|
131
|
+
|
132
|
+
server.start_server(response_proc: response_proc) do |port|
|
133
|
+
http = Puppet::Network::HttpPool.http_instance(hostname, port, true)
|
134
|
+
path = "http://bogus.example.com:443/foo"
|
135
|
+
http.get(path)
|
136
|
+
|
137
|
+
if legacy_api
|
138
|
+
# The old API passed the bogus hostname which didn't match
|
139
|
+
# the host we connected to.
|
140
|
+
expect(request_line).to eq("GET http://bogus.example.com:443/foo HTTP/1.1\r\n")
|
141
|
+
else
|
142
|
+
expect(request_line).to eq("GET /foo HTTP/1.1\r\n")
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
it "requires the caller to URL encode the path" do
|
148
|
+
request_line = nil
|
149
|
+
|
150
|
+
response_proc = -> (req, res) {
|
151
|
+
request_line = req.request_line
|
152
|
+
}
|
153
|
+
|
154
|
+
server.start_server(response_proc: response_proc) do |port|
|
155
|
+
http = Puppet::Network::HttpPool.http_instance(hostname, port, true)
|
156
|
+
encoded_url = "https://#{hostname}:#{port}/foo%20bar"
|
157
|
+
http.get(encoded_url)
|
158
|
+
|
159
|
+
if legacy_api
|
160
|
+
expect(request_line).to eq("GET #{encoded_url} HTTP/1.1\r\n")
|
161
|
+
else
|
162
|
+
expect(request_line).to eq("GET /foo%20bar HTTP/1.1\r\n")
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe Puppet::Network::HTTP::Connection do
|
169
|
+
it_behaves_like "an HttpPool connection", described_class, true
|
170
|
+
end
|
171
|
+
|
172
|
+
describe Puppet::Network::HTTP::ConnectionAdapter do
|
173
|
+
it_behaves_like "an HttpPool connection", described_class, false
|
174
|
+
end
|
119
175
|
end
|
120
176
|
|
121
177
|
context "when calling HttpPool.connection method" do
|
@@ -82,6 +82,9 @@ describe Puppet::Util::Windows::ADSI::Group,
|
|
82
82
|
it 'should return a list of members resolvable with Puppet::Util::Windows::ADSI::Group.name_sid_hash' do
|
83
83
|
temp_groupname = "g#{SecureRandom.uuid}"
|
84
84
|
temp_username = "u#{SecureRandom.uuid}"[0..12]
|
85
|
+
# From https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/password-must-meet-complexity-requirements
|
86
|
+
specials = "~!@#$%^&*_-+=`|\(){}[]:;\"'<>,.?/"
|
87
|
+
temp_password = "p#{SecureRandom.uuid[0..7]}-#{SecureRandom.uuid.upcase[0..7]}-#{specials[rand(specials.length)]}"
|
85
88
|
|
86
89
|
# select a virtual account that requires an authority to be able to resolve to SID
|
87
90
|
# the Dhcp service is chosen for no particular reason aside from it's a service available on all Windows versions
|
@@ -110,6 +113,8 @@ describe Puppet::Util::Windows::ADSI::Group,
|
|
110
113
|
begin
|
111
114
|
# :SidTypeUser as user on localhost, can be resolved with or without authority prefix
|
112
115
|
user = Puppet::Util::Windows::ADSI::User.create(temp_username)
|
116
|
+
# appveyor sometimes requires a password
|
117
|
+
user.password = temp_password
|
113
118
|
user.commit()
|
114
119
|
users.push({ :sid => user.sid.sid, :name => Puppet::Util::Windows::ADSI.computer_name + '\\' + temp_username })
|
115
120
|
|
@@ -24,6 +24,12 @@ class PuppetSpec::HTTPSServer
|
|
24
24
|
res = WEBrick::HTTPResponse.new(@config)
|
25
25
|
res.status = 200
|
26
26
|
res.body = 'OK'
|
27
|
+
# The server explicitly closes the connection after handling it,
|
28
|
+
# so explicitly tell the client we're not going to keep it open.
|
29
|
+
# Without this, ruby will add `Connection: Keep-Alive`, which
|
30
|
+
# confuses the client when it tries to reuse the half-closed
|
31
|
+
# connection.
|
32
|
+
res['Connection'] = 'close'
|
27
33
|
response_proc.call(req, res) if response_proc
|
28
34
|
|
29
35
|
res.send_response(ssl)
|
data/spec/unit/agent_spec.rb
CHANGED
@@ -179,6 +179,52 @@ describe Puppet::Agent do
|
|
179
179
|
expect(@agent.run).to eq(:result)
|
180
180
|
end
|
181
181
|
|
182
|
+
describe "and a puppet agent is already running" do
|
183
|
+
before(:each) do
|
184
|
+
allow_any_instance_of(Object).to receive(:sleep)
|
185
|
+
lockfile = double('lockfile')
|
186
|
+
expect(@agent).to receive(:lockfile).and_return(lockfile).at_least(:once)
|
187
|
+
# so the lock method raises Puppet::LockError
|
188
|
+
allow(lockfile).to receive(:lock).and_return(false)
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should notify that a run is already in progres" do
|
192
|
+
client = AgentTestClient.new
|
193
|
+
expect(AgentTestClient).to receive(:new).and_return(client)
|
194
|
+
expect(Puppet).to receive(:notice).with(/Run of .* already in progress; skipping .* exists/)
|
195
|
+
@agent.run
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should inform that a run is already in progres and try to run every X seconds if waitforlock is used" do
|
199
|
+
# so the locked file exists
|
200
|
+
allow(File).to receive(:file?).and_return(true)
|
201
|
+
# so we don't have to wait again for the run to exit (default maxwaitforcert is 60)
|
202
|
+
# first 0 is to get the time, second 0 is to inform user, then 1000 so the time expires
|
203
|
+
allow(Time).to receive(:now).and_return(0, 0, 1000)
|
204
|
+
allow(Puppet).to receive(:info)
|
205
|
+
client = AgentTestClient.new
|
206
|
+
expect(AgentTestClient).to receive(:new).and_return(client)
|
207
|
+
|
208
|
+
Puppet[:waitforlock] = 1
|
209
|
+
Puppet[:maxwaitforlock] = 2
|
210
|
+
expect(Puppet).to receive(:info).with(/Another puppet instance is already running; --waitforlock flag used, waiting for running instance to finish./)
|
211
|
+
expect(Puppet).to receive(:info).with(/Will try again in #{Puppet[:waitforlock]} seconds./)
|
212
|
+
@agent.run
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should notify that the run is exiting if waitforlock is used and maxwaitforlock is exceeded" do
|
216
|
+
# so we don't have to wait again for the run to exit (default maxwaitforcert is 60)
|
217
|
+
# first 0 is to get the time, then 1000 so that the time expires
|
218
|
+
allow(Time).to receive(:now).and_return(0, 1000)
|
219
|
+
client = AgentTestClient.new
|
220
|
+
expect(AgentTestClient).to receive(:new).and_return(client)
|
221
|
+
|
222
|
+
Puppet[:waitforlock] = 1
|
223
|
+
expect(Puppet).to receive(:notice).with(/Exiting now because the maxwaitforlock timeout has been exceeded./)
|
224
|
+
@agent.run
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
182
228
|
describe "when should_fork is true", :if => Puppet.features.posix? && RUBY_PLATFORM != 'java' do
|
183
229
|
before do
|
184
230
|
@agent = Puppet::Agent.new(AgentTestClient, true)
|
@@ -291,7 +337,7 @@ describe Puppet::Agent do
|
|
291
337
|
expect(client).not_to receive(:handling)
|
292
338
|
expect(Puppet).to receive(:log_exception).with(be_an_instance_of(Puppet::Agent::RunTimeoutError), anything)
|
293
339
|
|
294
|
-
expect(@agent.run).to eq(
|
340
|
+
expect(@agent.run).to eq(nil)
|
295
341
|
end
|
296
342
|
end
|
297
343
|
end
|
@@ -12,16 +12,16 @@ describe Puppet::Application::Agent do
|
|
12
12
|
before :each do
|
13
13
|
@puppetd = Puppet::Application[:agent]
|
14
14
|
|
15
|
-
@
|
15
|
+
@agent = double('agent')
|
16
|
+
allow(Puppet::Agent).to receive(:new).and_return(@agent)
|
17
|
+
|
18
|
+
@daemon = Puppet::Daemon.new(@agent, nil)
|
16
19
|
allow(@daemon).to receive(:daemonize)
|
17
20
|
allow(@daemon).to receive(:start)
|
18
21
|
allow(@daemon).to receive(:stop)
|
19
22
|
allow(Puppet::Daemon).to receive(:new).and_return(@daemon)
|
20
23
|
Puppet[:daemonize] = false
|
21
24
|
|
22
|
-
@agent = double('agent')
|
23
|
-
allow(Puppet::Agent).to receive(:new).and_return(@agent)
|
24
|
-
|
25
25
|
@puppetd.preinit
|
26
26
|
allow(Puppet::Util::Log).to receive(:newdestination)
|
27
27
|
|
@@ -90,6 +90,23 @@ describe Puppet::Context::TrustedInformation, :unless => RUBY_PLATFORM == 'java'
|
|
90
90
|
|
91
91
|
expect(trusted.external).to eq(external_data)
|
92
92
|
end
|
93
|
+
|
94
|
+
it 'does not run the trusted external command when creating a trusted context' do
|
95
|
+
Puppet[:trusted_external_command] = '/usr/bin/generate_data.sh'
|
96
|
+
|
97
|
+
expect(Puppet::Util::Execution).to receive(:execute).never
|
98
|
+
Puppet::Context::TrustedInformation.remote(true, 'cert name', cert)
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'only runs the trusted external command the first time it is invoked' do
|
102
|
+
Puppet[:trusted_external_command] = '/usr/bin/generate_data.sh'
|
103
|
+
|
104
|
+
expect(Puppet::Util::Execution).to receive(:execute).with(['/usr/bin/generate_data.sh', 'cert name'], anything).and_return(JSON.dump(external_data)).once
|
105
|
+
|
106
|
+
trusted = Puppet::Context::TrustedInformation.remote(true, 'cert name', cert)
|
107
|
+
trusted.external
|
108
|
+
trusted.external
|
109
|
+
end
|
93
110
|
end
|
94
111
|
|
95
112
|
context "when local" do
|
data/spec/unit/daemon_spec.rb
CHANGED
@@ -32,13 +32,17 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
|
|
32
32
|
let(:pidfile) { double("PidFile", :lock => true, :unlock => true, :file_path => 'fake.pid') }
|
33
33
|
let(:scheduler) { RecordingScheduler.new }
|
34
34
|
|
35
|
-
let(:daemon) { Puppet::Daemon.new(pidfile, scheduler) }
|
35
|
+
let(:daemon) { Puppet::Daemon.new(agent, pidfile, scheduler) }
|
36
36
|
|
37
37
|
before(:each) do
|
38
38
|
allow(Signal).to receive(:trap)
|
39
39
|
allow(daemon).to receive(:close_streams).and_return(nil)
|
40
40
|
end
|
41
41
|
|
42
|
+
it "should fail when no agent is provided" do
|
43
|
+
expect { Puppet::Daemon.new(nil, pidfile, scheduler) }.to raise_error(Puppet::DevError)
|
44
|
+
end
|
45
|
+
|
42
46
|
it "should reopen the Log logs when told to reopen logs" do
|
43
47
|
expect(Puppet::Util::Log).to receive(:reopen)
|
44
48
|
daemon.reopen_logs
|
@@ -72,65 +76,21 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
|
|
72
76
|
allow(daemon).to receive(:set_signal_traps)
|
73
77
|
end
|
74
78
|
|
75
|
-
it "should fail if it has neither agent nor server" do
|
76
|
-
expect { daemon.start }.to raise_error(Puppet::DevError)
|
77
|
-
end
|
78
|
-
|
79
79
|
it "should create its pidfile" do
|
80
80
|
expect(pidfile).to receive(:lock).and_return(true)
|
81
|
-
|
82
|
-
daemon.agent = agent
|
83
81
|
daemon.start
|
84
82
|
end
|
85
83
|
|
86
84
|
it "should fail if it cannot lock" do
|
87
85
|
expect(pidfile).to receive(:lock).and_return(false)
|
88
|
-
daemon.agent = agent
|
89
|
-
|
90
86
|
expect { daemon.start }.to raise_error(RuntimeError, "Could not create PID file: #{pidfile.file_path}")
|
91
87
|
end
|
92
88
|
|
93
|
-
it "should start its server if one is configured" do
|
94
|
-
daemon.server = server
|
95
|
-
|
96
|
-
expect(server).to receive(:start)
|
97
|
-
|
98
|
-
daemon.start
|
99
|
-
end
|
100
|
-
|
101
89
|
it "disables the reparse of configs if the filetimeout is 0" do
|
102
90
|
Puppet[:filetimeout] = 0
|
103
|
-
daemon.agent = agent
|
104
|
-
|
105
91
|
daemon.start
|
106
|
-
|
107
92
|
expect(scheduler.jobs[0]).not_to be_enabled
|
108
93
|
end
|
109
|
-
|
110
|
-
it "disables the agent run when there is no agent" do
|
111
|
-
Puppet[:filetimeout] = 0
|
112
|
-
daemon.server = server
|
113
|
-
|
114
|
-
daemon.start
|
115
|
-
|
116
|
-
expect(scheduler.jobs[1]).not_to be_enabled
|
117
|
-
end
|
118
|
-
|
119
|
-
it "waits for the server to shutdown when there is one" do
|
120
|
-
daemon.server = server
|
121
|
-
|
122
|
-
expect(server).to receive(:wait_for_shutdown)
|
123
|
-
|
124
|
-
daemon.start
|
125
|
-
end
|
126
|
-
|
127
|
-
it "waits for the server to shutdown when there is one" do
|
128
|
-
daemon.server = server
|
129
|
-
|
130
|
-
expect(server).to receive(:wait_for_shutdown)
|
131
|
-
|
132
|
-
daemon.start
|
133
|
-
end
|
134
94
|
end
|
135
95
|
|
136
96
|
describe "when stopping" do
|
@@ -146,14 +106,6 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
|
|
146
106
|
without_warnings { Puppet::Application = Puppet::Application.superclass }
|
147
107
|
end
|
148
108
|
|
149
|
-
it "should stop its server if one is configured" do
|
150
|
-
expect(server).to receive(:stop)
|
151
|
-
|
152
|
-
daemon.server = server
|
153
|
-
|
154
|
-
expect { daemon.stop }.to exit_with 0
|
155
|
-
end
|
156
|
-
|
157
109
|
it 'should request a stop from Puppet::Application' do
|
158
110
|
expect(Puppet::Application).to receive(:stop!)
|
159
111
|
expect { daemon.stop }.to exit_with 0
|
@@ -161,7 +113,6 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
|
|
161
113
|
|
162
114
|
it "should remove its pidfile" do
|
163
115
|
expect(pidfile).to receive(:unlock)
|
164
|
-
|
165
116
|
expect { daemon.stop }.to exit_with 0
|
166
117
|
end
|
167
118
|
|
@@ -188,8 +139,6 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
|
|
188
139
|
expect(agent).to receive(:run).with({:splay => false}).and_raise(Puppet::LockError, 'Failed to aquire lock')
|
189
140
|
expect(Puppet).to receive(:notice).with('Not triggering already-running agent')
|
190
141
|
|
191
|
-
daemon.agent = agent
|
192
|
-
|
193
142
|
daemon.reload
|
194
143
|
end
|
195
144
|
|
@@ -197,8 +146,6 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
|
|
197
146
|
expect(agent).to receive(:run).with({:splay => false})
|
198
147
|
expect(Puppet).not_to receive(:notice).with('Not triggering already-running agent')
|
199
148
|
|
200
|
-
daemon.agent = agent
|
201
|
-
|
202
149
|
daemon.reload
|
203
150
|
end
|
204
151
|
end
|
@@ -220,15 +167,11 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
|
|
220
167
|
|
221
168
|
it "should reexec itself if no agent is available" do
|
222
169
|
expect(daemon).to receive(:reexec)
|
223
|
-
|
224
170
|
daemon.restart
|
225
171
|
end
|
226
172
|
|
227
173
|
it "should reexec itself if the agent is not running" do
|
228
|
-
expect(agent).to receive(:running?).and_return(false)
|
229
|
-
daemon.agent = agent
|
230
174
|
expect(daemon).to receive(:reexec)
|
231
|
-
|
232
175
|
daemon.restart
|
233
176
|
end
|
234
177
|
end
|
@@ -247,14 +190,12 @@ describe Puppet::Daemon, :unless => Puppet::Util::Platform.windows? do
|
|
247
190
|
it "should shut down without exiting" do
|
248
191
|
daemon.argv = %w{foo}
|
249
192
|
expect(daemon).to receive(:stop).with(:exit => false)
|
250
|
-
|
251
193
|
daemon.reexec
|
252
194
|
end
|
253
195
|
|
254
196
|
it "should call 'exec' with the original executable and arguments" do
|
255
197
|
daemon.argv = %w{foo}
|
256
198
|
expect(daemon).to receive(:exec).with($0 + " foo")
|
257
|
-
|
258
199
|
daemon.reexec
|
259
200
|
end
|
260
201
|
end
|
@@ -211,4 +211,21 @@ describe "puppet module search" do
|
|
211
211
|
end
|
212
212
|
end
|
213
213
|
end
|
214
|
+
|
215
|
+
it "should include a deprecation warning" do
|
216
|
+
stub_request(:get, "https://forgeapi.puppet.com/v3/modules?query=puppetlabs-apache").to_return(status: 200, body: [answers: [], result: :success])
|
217
|
+
|
218
|
+
subject.search("puppetlabs-apache")
|
219
|
+
|
220
|
+
expect(@logs).to include(an_object_having_attributes(level: :warning, message: /This action has been deprecated. Please use the Puppet Forge to search for modules./))
|
221
|
+
end
|
222
|
+
|
223
|
+
it "omits the warning when deprecations are disabled" do
|
224
|
+
stub_request(:get, "https://forgeapi.puppet.com/v3/modules?query=puppetlabs-apache").to_return(status: 200, body: [answers: [], result: :success])
|
225
|
+
|
226
|
+
Puppet[:disable_warnings] = 'deprecations'
|
227
|
+
subject.search("puppetlabs-apache")
|
228
|
+
|
229
|
+
expect(@logs).not_to include(an_object_having_attributes(level: :warning))
|
230
|
+
end
|
214
231
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Puppet::FileSystem::Uniquefile do
|
4
|
+
include PuppetSpec::Files
|
5
|
+
|
4
6
|
it "makes the name of the file available" do
|
5
7
|
Puppet::FileSystem::Uniquefile.open_tmp('foo') do |file|
|
6
8
|
expect(file.path).to match(/foo/)
|
@@ -73,6 +75,15 @@ describe Puppet::FileSystem::Uniquefile do
|
|
73
75
|
Puppet::FileSystem::Uniquefile.open_tmp('foo') { |tmp| }
|
74
76
|
end
|
75
77
|
|
78
|
+
it "reports when a parent directory does not exist" do
|
79
|
+
dir = tmpdir('uniquefile')
|
80
|
+
lock = File.join(dir, 'path', 'to', 'lock')
|
81
|
+
|
82
|
+
expect {
|
83
|
+
Puppet::FileSystem::Uniquefile.open_tmp(lock) { |tmp| }
|
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
|
+
end
|
86
|
+
|
76
87
|
context "Ruby 1.9.3 Tempfile tests" do
|
77
88
|
# the remaining tests in this file are ported directly from the ruby 1.9.3 source,
|
78
89
|
# since most of this file was ported from there
|
@@ -474,38 +474,38 @@ describe Puppet::HTTP::Client do
|
|
474
474
|
it "submits credentials for GET requests" do
|
475
475
|
stub_request(:get, uri).with(basic_auth: credentials)
|
476
476
|
|
477
|
-
client.get(uri, options: {user: 'user', password: 'pass'})
|
477
|
+
client.get(uri, options: {basic_auth: {user: 'user', password: 'pass'}})
|
478
478
|
end
|
479
479
|
|
480
480
|
it "submits credentials for PUT requests" do
|
481
481
|
stub_request(:put, uri).with(basic_auth: credentials)
|
482
482
|
|
483
|
-
client.put(uri, "hello", headers: {'Content-Type' => 'text/plain'}, options: {user: 'user', password: 'pass'})
|
483
|
+
client.put(uri, "hello", headers: {'Content-Type' => 'text/plain'}, options: {basic_auth: {user: 'user', password: 'pass'}})
|
484
484
|
end
|
485
485
|
|
486
486
|
it "returns response containing access denied" do
|
487
487
|
stub_request(:get, uri).with(basic_auth: credentials).to_return(status: [403, "Ye Shall Not Pass"])
|
488
488
|
|
489
|
-
response = client.get(uri, options: {user: 'user', password: 'pass'})
|
489
|
+
response = client.get(uri, options: {basic_auth: {user: 'user', password: 'pass'}})
|
490
490
|
expect(response.code).to eq(403)
|
491
491
|
expect(response.reason).to eq("Ye Shall Not Pass")
|
492
492
|
expect(response).to_not be_success
|
493
493
|
end
|
494
494
|
|
495
|
-
it '
|
495
|
+
it 'includes basic auth if user is nil' do
|
496
496
|
stub_request(:get, uri).with do |req|
|
497
|
-
expect(req.headers).
|
497
|
+
expect(req.headers).to include('Authorization')
|
498
498
|
end
|
499
499
|
|
500
|
-
client.get(uri, options: {user: nil, password: 'pass'})
|
500
|
+
client.get(uri, options: {basic_auth: {user: nil, password: 'pass'}})
|
501
501
|
end
|
502
502
|
|
503
|
-
it '
|
503
|
+
it 'includes basic auth if password is nil' do
|
504
504
|
stub_request(:get, uri).with do |req|
|
505
|
-
expect(req.headers).
|
505
|
+
expect(req.headers).to include('Authorization')
|
506
506
|
end
|
507
507
|
|
508
|
-
client.get(uri, options: {user: 'user', password: nil})
|
508
|
+
client.get(uri, options: {basic_auth: {user: 'user', password: nil}})
|
509
509
|
end
|
510
510
|
end
|
511
511
|
|
@@ -557,7 +557,7 @@ describe Puppet::HTTP::Client do
|
|
557
557
|
stub_request(:get, start_url).with(basic_auth: credentials).to_return(redirect_to(url: bar_url))
|
558
558
|
stub_request(:get, bar_url).with(basic_auth: credentials).to_return(status: 200)
|
559
559
|
|
560
|
-
client.get(start_url, options: {user: 'user', password: 'pass'})
|
560
|
+
client.get(start_url, options: {basic_auth: {user: 'user', password: 'pass'}})
|
561
561
|
end
|
562
562
|
|
563
563
|
it "redirects given a relative location" do
|