Merge remote-tracking branch 'upstream/1.6.x' into merge_1.6.x
[puppet-modules/puppetlabs-apt.git] / spec / acceptance / apt_key_provider_spec.rb
1 require 'spec_helper_acceptance'
2
3 PUPPETLABS_GPG_KEY_ID        = '4BD6EC30'
4 PUPPETLABS_GPG_LONG_KEY_ID   = '1054B7A24BD6EC30'
5 PUPPETLABS_APT_URL           = 'apt.puppetlabs.com'
6 PUPPETLABS_GPG_KEY_FILE      = 'pubkey.gpg'
7 CENTOS_GPG_KEY_ID            = 'C105B9DE'
8 CENTOS_REPO_URL              = 'ftp.cvut.cz/centos'
9 CENTOS_GPG_KEY_FILE          = 'RPM-GPG-KEY-CentOS-6'
10
11 describe 'apt_key' do
12   before(:each) do
13     # Delete twice to make sure everything is cleaned
14     # up after the short key collision
15     shell("apt-key del #{PUPPETLABS_GPG_KEY_ID}",
16           :acceptable_exit_codes => [0,1,2])
17     shell("apt-key del #{PUPPETLABS_GPG_KEY_ID}",
18           :acceptable_exit_codes => [0,1,2])
19   end
20
21   describe 'default options' do
22     key_versions = {
23       '32bit key id'                        => '4BD6EC30',
24       '64bit key id'                        => '1054B7A24BD6EC30',
25       '32bit lowercase key id'              => '4bd6ec30',
26       '64bit lowercase key id'              => '1054b7a24bd6ec30',
27       '0x formatted 32bit key id'           => '0x4BD6EC30',
28       '0x formatted 64bit key id'           => '0x1054B7A24BD6EC30',
29       '0x formatted 32bit lowercase key id' => '0x4bd6ec30',
30       '0x formatted 64bit lowercase key id' => '0x1054b7a24bd6ec30',
31     }
32
33     key_versions.each do |key, value|
34       context "#{key}" do
35         it 'works' do
36           pp = <<-EOS
37           apt_key { 'puppetlabs':
38             id     => '#{value}',
39             ensure => 'present',
40           }
41           EOS
42
43           apply_manifest(pp, :catch_failures => true)
44           apply_manifest(pp, :catch_changes => true)
45           shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
46         end
47       end
48     end
49
50     context 'invalid length key id' do
51       it 'fails' do
52         pp = <<-EOS
53         apt_key { 'puppetlabs':
54           id => '4B7A24BD6EC30',
55         }
56         EOS
57
58         apply_manifest(pp, :expect_failures => true) do |r|
59           expect(r.stderr).to match(/Valid values match/)
60         end
61       end
62     end
63   end
64
65   describe 'ensure =>' do
66     context 'absent' do
67       it 'is removed' do
68         pp = <<-EOS
69         apt_key { 'centos':
70           id     => '#{CENTOS_GPG_KEY_ID}',
71           ensure => 'absent',
72         }
73         EOS
74
75         # Install the key first
76         shell("apt-key adv --keyserver keyserver.ubuntu.com \
77               --recv-keys #{CENTOS_GPG_KEY_ID}")
78         shell("apt-key list | grep #{CENTOS_GPG_KEY_ID}")
79
80         # Time to remove it using Puppet
81         apply_manifest(pp, :catch_failures => true)
82         apply_manifest(pp, :catch_failures => true)
83
84         shell("apt-key list | grep #{CENTOS_GPG_KEY_ID}",
85               :acceptable_exit_codes => [1])
86
87         shell("apt-key adv --keyserver keyserver.ubuntu.com \
88               --recv-keys #{CENTOS_GPG_KEY_ID}")
89       end
90     end
91
92     context 'absent, added with long key', :unless => (fact('operatingsystem') == 'Debian' and fact('operatingsystemmajrelease') == '6') do
93       it 'is removed' do
94         pp = <<-EOS
95         apt_key { 'puppetlabs':
96           id     => '#{PUPPETLABS_GPG_KEY_ID}',
97           ensure => 'absent',
98         }
99         EOS
100
101         # Install the key first
102         shell("apt-key adv --keyserver keyserver.ubuntu.com \
103               --recv-keys #{PUPPETLABS_GPG_LONG_KEY_ID}")
104         shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
105
106         # Time to remove it using Puppet
107         apply_manifest(pp, :catch_failures => true)
108         apply_manifest(pp, :catch_failures => true)
109
110         shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}",
111               :acceptable_exit_codes => [1])
112       end
113     end
114   end
115
116   describe 'content =>' do
117     context 'puppetlabs gpg key' do
118       it 'works' do
119         pp = <<-EOS
120           apt_key { 'puppetlabs':
121             id      => '#{PUPPETLABS_GPG_KEY_ID}',
122             ensure  => 'present',
123             content => "-----BEGIN PGP PUBLIC KEY BLOCK-----
124 Version: GnuPG v1.4.12 (GNU/Linux)
125 Comment: GPGTools - http://gpgtools.org
126
127 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
181 =a34C
182 -----END PGP PUBLIC KEY BLOCK-----",
183           }
184         EOS
185
186         apply_manifest(pp, :catch_failures => true)
187         apply_manifest(pp, :catch_failures => true)
188         shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
189       end
190     end
191
192     context 'bogus key' do
193       it 'fails' do
194         pp = <<-EOS
195         apt_key { 'puppetlabs':
196           id      => '#{PUPPETLABS_GPG_KEY_ID}',
197           ensure  => 'present',
198           content => 'For posterity: such content, much bogus, wow',
199         }
200         EOS
201
202         apply_manifest(pp, :expect_failures => true) do |r|
203           expect(r.stderr).to match(/no valid OpenPGP data found/)
204         end
205       end
206     end
207   end
208
209   describe 'server =>' do
210     context 'pgp.mit.edu' do
211       it 'works' do
212         pp = <<-EOS
213         apt_key { 'puppetlabs':
214           id     => '#{PUPPETLABS_GPG_KEY_ID}',
215           ensure => 'present',
216           server => 'pgp.mit.edu',
217         }
218         EOS
219
220         apply_manifest(pp, :catch_failures => true)
221         apply_manifest(pp, :catch_failures => true)
222         shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
223       end
224     end
225
226     context 'hkp://pgp.mit.edu:80' do
227       it 'works' do
228         pp = <<-EOS
229         apt_key { 'puppetlabs':
230           id     => '#{PUPPETLABS_GPG_KEY_ID}',
231           ensure => 'present',
232           server => 'hkp://pgp.mit.edu:80',
233         }
234         EOS
235
236         apply_manifest(pp, :catch_failures => true)
237         apply_manifest(pp, :catch_failures => true)
238         shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
239       end
240     end
241
242     context 'nonexistant.key.server' do
243       it 'fails' do
244         pp = <<-EOS
245         apt_key { 'puppetlabs':
246           id     => '#{PUPPETLABS_GPG_KEY_ID}',
247           ensure => 'present',
248           server => 'nonexistant.key.server',
249         }
250         EOS
251
252         apply_manifest(pp, :expect_failures => true) do |r|
253           expect(r.stderr).to match(/(Host not found|Couldn't resolve host)/)
254         end
255       end
256     end
257
258     context 'key server start with dot' do
259       it 'fails' do
260         pp = <<-EOS
261         apt_key { 'puppetlabs':
262           id     => '#{PUPPETLABS_GPG_KEY_ID}',
263           ensure => 'present',
264           server => '.pgp.key.server',
265         }
266         EOS
267
268         apply_manifest(pp, :expect_failures => true) do |r|
269           expect(r.stderr).to match(/Invalid value \".pgp.key.server\"/)
270         end
271       end
272     end
273   end
274
275   describe 'source =>' do
276     context 'http://' do
277       it 'works' do
278         pp = <<-EOS
279         apt_key { 'puppetlabs':
280           id     => '#{PUPPETLABS_GPG_KEY_ID}',
281           ensure => 'present',
282           source => 'http://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}',
283         }
284         EOS
285
286         apply_manifest(pp, :catch_failures => true)
287         apply_manifest(pp, :catch_failures => true)
288         shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
289       end
290
291       it 'fails with a 404' do
292         pp = <<-EOS
293         apt_key { 'puppetlabs':
294           id     => '#{PUPPETLABS_GPG_KEY_ID}',
295           ensure => 'present',
296           source => 'http://#{PUPPETLABS_APT_URL}/herpderp.gpg',
297         }
298         EOS
299
300         apply_manifest(pp, :expect_failures => true) do |r|
301           expect(r.stderr).to match(/404 Not Found/)
302         end
303       end
304
305       it 'fails with a socket error' do
306         pp = <<-EOS
307         apt_key { 'puppetlabs':
308           id     => '#{PUPPETLABS_GPG_KEY_ID}',
309           ensure => 'present',
310           source => 'http://apt.puppetlabss.com/herpderp.gpg',
311         }
312         EOS
313
314         apply_manifest(pp, :expect_failures => true) do |r|
315           expect(r.stderr).to match(/could not resolve/)
316         end
317       end
318     end
319
320     context 'ftp://' do
321       before(:each) do
322         shell("apt-key del #{CENTOS_GPG_KEY_ID}",
323               :acceptable_exit_codes => [0,1,2])
324       end
325
326       it 'works' do
327         pp = <<-EOS
328         apt_key { 'CentOS 6':
329           id     => '#{CENTOS_GPG_KEY_ID}',
330           ensure => 'present',
331           source => 'ftp://#{CENTOS_REPO_URL}/#{CENTOS_GPG_KEY_FILE}',
332         }
333         EOS
334
335         apply_manifest(pp, :catch_failures => true)
336         apply_manifest(pp, :catch_failures => true)
337         shell("apt-key list | grep #{CENTOS_GPG_KEY_ID}")
338       end
339
340       it 'fails with a 550' do
341         pp = <<-EOS
342         apt_key { 'CentOS 6':
343           id     => '#{CENTOS_GPG_KEY_ID}',
344           ensure => 'present',
345           source => 'ftp://#{CENTOS_REPO_URL}/herpderp.gpg',
346         }
347         EOS
348
349         apply_manifest(pp, :expect_failures => true) do |r|
350           expect(r.stderr).to match(/550 Failed to open/)
351         end
352       end
353
354       it 'fails with a socket error' do
355         pp = <<-EOS
356         apt_key { 'puppetlabs':
357           id     => '#{PUPPETLABS_GPG_KEY_ID}',
358           ensure => 'present',
359           source => 'ftp://apt.puppetlabss.com/herpderp.gpg',
360         }
361         EOS
362
363         apply_manifest(pp, :expect_failures => true) do |r|
364           expect(r.stderr).to match(/could not resolve/)
365         end
366       end
367     end
368
369     context 'https://' do
370       it 'works' do
371         pp = <<-EOS
372         apt_key { 'puppetlabs':
373           id     => '#{PUPPETLABS_GPG_KEY_ID}',
374           ensure => 'present',
375           source => 'https://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}',
376         }
377         EOS
378
379         apply_manifest(pp, :catch_failures => true)
380         apply_manifest(pp, :catch_failures => true)
381         shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
382       end
383
384       it 'fails with a 404' do
385         pp = <<-EOS
386         apt_key { 'puppetlabs':
387           id     => '4BD6EC30',
388           ensure => 'present',
389           source => 'https://#{PUPPETLABS_APT_URL}/herpderp.gpg',
390         }
391         EOS
392
393         apply_manifest(pp, :expect_failures => true) do |r|
394           expect(r.stderr).to match(/404 Not Found/)
395         end
396       end
397
398       it 'fails with a socket error' do
399         pp = <<-EOS
400         apt_key { 'puppetlabs':
401           id     => '4BD6EC30',
402           ensure => 'present',
403           source => 'https://apt.puppetlabss.com/herpderp.gpg',
404         }
405         EOS
406
407         apply_manifest(pp, :expect_failures => true) do |r|
408           expect(r.stderr).to match(/could not resolve/)
409         end
410       end
411     end
412
413     context '/path/that/exists' do
414       before(:each) do
415         shell("curl -o /tmp/puppetlabs-pubkey.gpg \
416               http://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}")
417       end
418
419       after(:each) do
420         shell('rm /tmp/puppetlabs-pubkey.gpg')
421       end
422
423       it 'works' do
424         pp = <<-EOS
425         apt_key { 'puppetlabs':
426           id     => '4BD6EC30',
427           ensure => 'present',
428           source => '/tmp/puppetlabs-pubkey.gpg',
429         }
430         EOS
431
432         apply_manifest(pp, :catch_failures => true)
433         apply_manifest(pp, :catch_failures => true)
434         shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
435       end
436     end
437
438     context '/path/that/does/not/exist' do
439       it 'fails' do
440         pp = <<-EOS
441         apt_key { 'puppetlabs':
442           id     => '#{PUPPETLABS_GPG_KEY_ID}',
443           ensure => 'present',
444           source => '/tmp/totally_bogus.file',
445         }
446         EOS
447
448         apply_manifest(pp, :expect_failures => true) do |r|
449           expect(r.stderr).to match(/does not exist/)
450         end
451       end
452     end
453
454     context '/path/that/exists/with/bogus/content' do
455       before(:each) do
456         shell('echo "here be dragons" > /tmp/fake-key.gpg')
457       end
458
459       after(:each) do
460         shell('rm /tmp/fake-key.gpg')
461       end
462       it 'fails' do
463         pp = <<-EOS
464         apt_key { 'puppetlabs':
465           id     => '#{PUPPETLABS_GPG_KEY_ID}',
466           ensure => 'present',
467           source => '/tmp/fake-key.gpg',
468         }
469         EOS
470
471         apply_manifest(pp, :expect_failures => true) do |r|
472           expect(r.stderr).to match(/no valid OpenPGP data found/)
473         end
474       end
475     end
476   end
477
478   describe 'keyserver_options =>' do
479     context 'debug' do
480       it 'works' do
481         pp = <<-EOS
482         apt_key { 'puppetlabs':
483           id                => '#{PUPPETLABS_GPG_KEY_ID}',
484           ensure            => 'present',
485           keyserver_options => 'debug',
486         }
487         EOS
488
489         apply_manifest(pp, :catch_failures => true)
490         apply_manifest(pp, :catch_failures => true)
491         shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
492       end
493
494       it 'fails on invalid options' do
495         pp = <<-EOS
496         apt_key { 'puppetlabs':
497           id                => '#{PUPPETLABS_GPG_KEY_ID}',
498           ensure            => 'present',
499           keyserver_options => 'this is totally bonkers',
500         }
501         EOS
502
503         shell("apt-key del #{PUPPETLABS_GPG_KEY_ID}", :acceptable_exit_codes => [0,1,2])
504         apply_manifest(pp, :expect_failures => true) do |r|
505           expect(r.stderr).to match(/--keyserver-options this is totally/)
506         end
507       end
508     end
509   end
510 end