apt_key_provider_spec.rb 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. require 'spec_helper_acceptance'
  2. PUPPETLABS_GPG_KEY_ID = '4BD6EC30'
  3. PUPPETLABS_APT_URL = 'apt.puppetlabs.com'
  4. PUPPETLABS_GPG_KEY_FILE = 'pubkey.gpg'
  5. CENTOS_GPG_KEY_ID = 'C105B9DE'
  6. CENTOS_REPO_URL = 'ftp.cvut.cz/centos'
  7. CENTOS_GPG_KEY_FILE = 'RPM-GPG-KEY-CentOS-6'
  8. describe 'apt_key' do
  9. before(:each) do
  10. shell("apt-key del #{PUPPETLABS_GPG_KEY_ID}",
  11. :acceptable_exit_codes => [0,1,2])
  12. end
  13. describe 'default options' do
  14. key_versions = {
  15. '32bit key id' => '4BD6EC30',
  16. '64bit key id' => '1054B7A24BD6EC30',
  17. '32bit lowercase key id' => '4bd6ec30',
  18. '64bit lowercase key id' => '1054b7a24bd6ec30',
  19. '0x formatted 32bit key id' => '0x4BD6EC30',
  20. '0x formatted 64bit key id' => '0x1054B7A24BD6EC30',
  21. '0x formatted 32bit lowercase key id' => '0x4bd6ec30',
  22. '0x formatted 64bit lowercase key id' => '0x1054b7a24bd6ec30',
  23. }
  24. key_versions.each do |key, value|
  25. context "#{key}" do
  26. it 'works' do
  27. pp = <<-EOS
  28. apt_key { 'puppetlabs':
  29. id => '#{value}',
  30. ensure => 'present',
  31. }
  32. EOS
  33. apply_manifest(pp, :catch_failures => true)
  34. expect(apply_manifest(pp, :catch_failures => true).exit_code).to be_zero
  35. shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
  36. end
  37. end
  38. end
  39. context 'invalid length key id' do
  40. it 'fails' do
  41. pp = <<-EOS
  42. apt_key { 'puppetlabs':
  43. id => '4B7A24BD6EC30',
  44. }
  45. EOS
  46. apply_manifest(pp, :expect_failures => true) do |r|
  47. expect(r.stderr).to match(/Valid values match/)
  48. end
  49. end
  50. end
  51. end
  52. describe 'ensure =>' do
  53. context 'absent' do
  54. it 'is removed' do
  55. pp = <<-EOS
  56. apt_key { 'puppetlabs':
  57. id => '#{PUPPETLABS_GPG_KEY_ID}',
  58. ensure => 'absent',
  59. }
  60. EOS
  61. # Install the key first
  62. shell("apt-key adv --keyserver keyserver.ubuntu.com \
  63. --recv-keys #{PUPPETLABS_GPG_KEY_ID}")
  64. shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
  65. # Time to remove it using Puppet
  66. apply_manifest(pp, :catch_failures => true)
  67. expect(apply_manifest(pp, :catch_failures => true).exit_code).to be_zero
  68. shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}",
  69. :acceptable_exit_codes => [1])
  70. end
  71. end
  72. end
  73. describe 'content =>' do
  74. context 'puppetlabs gpg key' do
  75. it 'works' do
  76. pp = <<-EOS
  77. apt_key { 'puppetlabs':
  78. id => '#{PUPPETLABS_GPG_KEY_ID}',
  79. ensure => 'present',
  80. content => "-----BEGIN PGP PUBLIC KEY BLOCK-----
  81. Version: GnuPG v1.4.12 (GNU/Linux)
  82. Comment: GPGTools - http://gpgtools.org
  83. mQINBEw3u0ABEAC1+aJQpU59fwZ4mxFjqNCgfZgDhONDSYQFMRnYC1dzBpJHzI6b
  84. fUBQeaZ8rh6N4kZ+wq1eL86YDXkCt4sCvNTP0eF2XaOLbmxtV9bdpTIBep9bQiKg
  85. 5iZaz+brUZlFk/MyJ0Yz//VQ68N1uvXccmD6uxQsVO+gx7rnarg/BGuCNaVtGwy+
  86. S98g8Begwxs9JmGa8pMCcSxtC7fAfAEZ02cYyrw5KfBvFI3cHDdBqrEJQKwKeLKY
  87. GHK3+H1TM4ZMxPsLuR/XKCbvTyl+OCPxU2OxPjufAxLlr8BWUzgJv6ztPe9imqpH
  88. Ppp3KuLFNorjPqWY5jSgKl94W/CO2x591e++a1PhwUn7iVUwVVe+mOEWnK5+Fd0v
  89. VMQebYCXS+3dNf6gxSvhz8etpw20T9Ytg4EdhLvCJRV/pYlqhcq+E9le1jFOHOc0
  90. Nc5FQweUtHGaNVyn8S1hvnvWJBMxpXq+Bezfk3X8PhPT/l9O2lLFOOO08jo0OYiI
  91. wrjhMQQOOSZOb3vBRvBZNnnxPrcdjUUm/9cVB8VcgI5KFhG7hmMCwH70tpUWcZCN
  92. NlI1wj/PJ7Tlxjy44f1o4CQ5FxuozkiITJvh9CTg+k3wEmiaGz65w9jRl9ny2gEl
  93. f4CR5+ba+w2dpuDeMwiHJIs5JsGyJjmA5/0xytB7QvgMs2q25vWhygsmUQARAQAB
  94. tEdQdXBwZXQgTGFicyBSZWxlYXNlIEtleSAoUHVwcGV0IExhYnMgUmVsZWFzZSBL
  95. ZXkpIDxpbmZvQHB1cHBldGxhYnMuY29tPokCPgQTAQIAKAUCTDe7QAIbAwUJA8Jn
  96. AAYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQEFS3okvW7DAZaw//aLmE/eob
  97. pXpIUVyCUWQxEvPtM/h/SAJsG3KoHN9u216ews+UHsL/7F91ceVXQQdD2e8CtYWF
  98. eLNM0RSM9i/KM60g4CvIQlmNqdqhi1HsgGqInZ72/XLAXun0gabfC36rLww2kel+
  99. aMpRf58SrSuskY321NnMEJl4OsHV2hfNtAIgw2e/zm9RhoMpGKxoHZCvFhnP7u2M
  100. 2wMq7iNDDWb6dVsLpzdlVf242zCbubPCxxQXOpA56rzkUPuJ85mdVw4i19oPIFIZ
  101. VL5owit1SxCOxBg4b8oaMS36hEl3qtZG834rtLfcqAmqjhx6aJuJLOAYN84QjDEU
  102. 3NI5IfNRMvluIeTcD4Dt5FCYahN045tW1Rc6s5GAR8RW45GYwQDzG+kkkeeGxwEh
  103. qCW7nOHuwZIoVJufNhd28UFn83KGJHCQt4NBBr3K5TcY6bDQEIrpSplWSDBbd3p1
  104. IaoZY1WSDdP9OTVOSbsz0JiglWmUWGWCdd/CMSW/D7/3VUOJOYRDwptvtSYcjJc8
  105. 1UV+1zB+rt5La/OWe4UOORD+jU1ATijQEaFYxBbqBBkFboAEXq9btRQyegqk+eVp
  106. HhzacP5NYFTMThvHuTapNytcCso5au/cMywqCgY1DfcMJyjocu4bCtrAd6w4kGKN
  107. MUdwNDYQulHZDI+UjJInhramyngdzZLjdeGJARwEEAECAAYFAkw3wEYACgkQIVr+
  108. UOQUcDKvEwgAoBuOPnPioBwYp8oHVPTo/69cJn1225kfraUYGebCcrRwuoKd8Iyh
  109. R165nXYJmD8yrAFBk8ScUVKsQ/pSnqNrBCrlzQD6NQvuIWVFegIdjdasrWX6Szj+
  110. N1OllbzIJbkE5eo0WjCMEKJVI/GTY2AnTWUAm36PLQC5HnSATykqwxeZDsJ/s8Rc
  111. kd7+QN5sBVytG3qb45Q7jLJpLcJO6KYH4rz9ZgN7LzyyGbu9DypPrulADG9OrL7e
  112. lUnsGDG4E1M8Pkgk9Xv9MRKao1KjYLD5zxOoVtdeoKEQdnM+lWMJin1XvoqJY7FT
  113. DJk6o+cVqqHkdKL+sgsscFVQljgCEd0EgIkCHAQQAQgABgUCTPlA6QAKCRBcE9bb
  114. kwUuAxdYD/40FxAeNCYByxkr/XRT0gFT+NCjPuqPWCM5tf2NIhSapXtb2+32WbAf
  115. DzVfqWjC0G0RnQBve+vcjpY4/rJu4VKIDGIT8CtnKOIyEcXTNFOehi65xO4ypaei
  116. BPSb3ip3P0of1iZZDQrNHMW5VcyL1c+PWT/6exXSGsePtO/89tc6mupqZtC05f5Z
  117. XG4jswMF0U6Q5s3S0tG7Y+oQhKNFJS4sH4rHe1o5CxKwNRSzqccA0hptKy3MHUZ2
  118. +zeHzuRdRWGjb2rUiVxnIvPPBGxF2JHhB4ERhGgbTxRZ6wZbdW06BOE8r7pGrUpU
  119. fCw/WRT3gGXJHpGPOzFAvr3Xl7VcDUKTVmIajnpd3SoyD1t2XsvJlSQBOWbViucH
  120. dvE4SIKQ77vBLRlZIoXXVb6Wu7Vq+eQs1ybjwGOhnnKjz8llXcMnLzzN86STpjN4
  121. qGTXQy/E9+dyUP1sXn3RRwb+ZkdI77m1YY95QRNgG/hqh77IuWWg1MtTSgQnP+F2
  122. 7mfo0/522hObhdAe73VO3ttEPiriWy7tw3bS9daP2TAVbYyFqkvptkBb1OXRUSzq
  123. UuWjBmZ35UlXjKQsGeUHlOiEh84aondF90A7gx0X/ktNIPRrfCGkHJcDu+HVnR7x
  124. Kk+F0qb9+/pGLiT3rqeQTr8fYsb4xLHT7uEg1gVFB1g0kd+RQHzV74kCPgQTAQIA
  125. KAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AFAk/x5PoFCQtIMjoACgkQEFS3
  126. okvW7DAIKQ/9HvZyf+LHVSkCk92Kb6gckniin3+5ooz67hSr8miGBfK4eocqQ0H7
  127. bdtWjAILzR/IBY0xj6OHKhYP2k8TLc7QhQjt0dRpNkX+Iton2AZryV7vUADreYz4
  128. 4B0bPmhiE+LL46ET5IThLKu/KfihzkEEBa9/t178+dO9zCM2xsXaiDhMOxVE32gX
  129. vSZKP3hmvnK/FdylUY3nWtPedr+lHpBLoHGaPH7cjI+MEEugU3oAJ0jpq3V8n4w0
  130. jIq2V77wfmbD9byIV7dXcxApzciK+ekwpQNQMSaceuxLlTZKcdSqo0/qmS2A863Y
  131. ZQ0ZBe+Xyf5OI33+y+Mry+vl6Lre2VfPm3udgR10E4tWXJ9Q2CmG+zNPWt73U1FD
  132. 7xBI7PPvOlyzCX4QJhy2Fn/fvzaNjHp4/FSiCw0HvX01epcersyun3xxPkRIjwwR
  133. M9m5MJ0o4hhPfa97zibXSh8XXBnosBQxeg6nEnb26eorVQbqGx0ruu/W2m5/JpUf
  134. REsFmNOBUbi8xlKNS5CZypH3Zh88EZiTFolOMEh+hT6s0l6znBAGGZ4m/Unacm5y
  135. DHmg7unCk4JyVopQ2KHMoqG886elu+rm0ASkhyqBAk9sWKptMl3NHiYTRE/m9VAk
  136. ugVIB2pi+8u84f+an4Hml4xlyijgYu05pqNvnLRyJDLd61hviLC8GYU=
  137. =a34C
  138. -----END PGP PUBLIC KEY BLOCK-----",
  139. }
  140. EOS
  141. apply_manifest(pp, :catch_failures => true)
  142. expect(apply_manifest(pp, :catch_failures => true).exit_code).to be_zero
  143. shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
  144. end
  145. end
  146. context 'bogus key' do
  147. it 'fails' do
  148. pp = <<-EOS
  149. apt_key { 'puppetlabs':
  150. id => '#{PUPPETLABS_GPG_KEY_ID}',
  151. ensure => 'present',
  152. content => 'For posterity: such content, much bogus, wow',
  153. }
  154. EOS
  155. apply_manifest(pp, :expect_failures => true) do |r|
  156. expect(r.stderr).to match(/no valid OpenPGP data found/)
  157. end
  158. end
  159. end
  160. end
  161. describe 'server =>' do
  162. context 'pgp.mit.edu' do
  163. it 'works' do
  164. pp = <<-EOS
  165. apt_key { 'puppetlabs':
  166. id => '#{PUPPETLABS_GPG_KEY_ID}',
  167. ensure => 'present',
  168. server => 'pgp.mit.edu',
  169. }
  170. EOS
  171. apply_manifest(pp, :catch_failures => true)
  172. expect(apply_manifest(pp, :catch_failures => true).exit_code).to be_zero
  173. shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
  174. end
  175. end
  176. context 'nonexistant.key.server' do
  177. it 'fails' do
  178. pp = <<-EOS
  179. apt_key { 'puppetlabs':
  180. id => '#{PUPPETLABS_GPG_KEY_ID}',
  181. ensure => 'present',
  182. server => 'nonexistant.key.server',
  183. }
  184. EOS
  185. apply_manifest(pp, :expect_failures => true) do |r|
  186. expect(r.stderr).to match(/Host not found/)
  187. end
  188. end
  189. end
  190. end
  191. describe 'source =>' do
  192. context 'http://' do
  193. it 'works' do
  194. pp = <<-EOS
  195. apt_key { 'puppetlabs':
  196. id => '#{PUPPETLABS_GPG_KEY_ID}',
  197. ensure => 'present',
  198. source => 'http://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}',
  199. }
  200. EOS
  201. apply_manifest(pp, :catch_failures => true)
  202. expect(apply_manifest(pp, :catch_failures => true).exit_code).to be_zero
  203. shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
  204. end
  205. it 'fails with a 404' do
  206. pp = <<-EOS
  207. apt_key { 'puppetlabs':
  208. id => '#{PUPPETLABS_GPG_KEY_ID}',
  209. ensure => 'present',
  210. source => 'http://#{PUPPETLABS_APT_URL}/herpderp.gpg',
  211. }
  212. EOS
  213. apply_manifest(pp, :expect_failures => true) do |r|
  214. expect(r.stderr).to match(/404 Not Found/)
  215. end
  216. end
  217. it 'fails with a socket error' do
  218. pp = <<-EOS
  219. apt_key { 'puppetlabs':
  220. id => '#{PUPPETLABS_GPG_KEY_ID}',
  221. ensure => 'present',
  222. source => 'http://apt.puppetlabss.com/herpderp.gpg',
  223. }
  224. EOS
  225. apply_manifest(pp, :expect_failures => true) do |r|
  226. expect(r.stderr).to match(/could not resolve/)
  227. end
  228. end
  229. end
  230. context 'ftp://' do
  231. before(:each) do
  232. shell("apt-key del #{CENTOS_GPG_KEY_ID}",
  233. :acceptable_exit_codes => [0,1,2])
  234. end
  235. it 'works' do
  236. pp = <<-EOS
  237. apt_key { 'CentOS 6':
  238. id => '#{CENTOS_GPG_KEY_ID}',
  239. ensure => 'present',
  240. source => 'ftp://#{CENTOS_REPO_URL}/#{CENTOS_GPG_KEY_FILE}',
  241. }
  242. EOS
  243. apply_manifest(pp, :catch_failures => true)
  244. expect(apply_manifest(pp, :catch_failures => true).exit_code).to be_zero
  245. shell("apt-key list | grep #{CENTOS_GPG_KEY_ID}")
  246. end
  247. it 'fails with a 550' do
  248. pp = <<-EOS
  249. apt_key { 'CentOS 6':
  250. id => '#{CENTOS_GPG_KEY_ID}',
  251. ensure => 'present',
  252. source => 'ftp://#{CENTOS_REPO_URL}/herpderp.gpg',
  253. }
  254. EOS
  255. apply_manifest(pp, :expect_failures => true) do |r|
  256. expect(r.stderr).to match(/550 Failed to open/)
  257. end
  258. end
  259. it 'fails with a socket error' do
  260. pp = <<-EOS
  261. apt_key { 'puppetlabs':
  262. id => '#{PUPPETLABS_GPG_KEY_ID}',
  263. ensure => 'present',
  264. source => 'ftp://apt.puppetlabss.com/herpderp.gpg',
  265. }
  266. EOS
  267. apply_manifest(pp, :expect_failures => true) do |r|
  268. expect(r.stderr).to match(/could not resolve/)
  269. end
  270. end
  271. end
  272. context 'https://' do
  273. it 'works' do
  274. pp = <<-EOS
  275. apt_key { 'puppetlabs':
  276. id => '#{PUPPETLABS_GPG_KEY_ID}',
  277. ensure => 'present',
  278. source => 'https://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}',
  279. }
  280. EOS
  281. apply_manifest(pp, :catch_failures => true)
  282. expect(apply_manifest(pp, :catch_failures => true).exit_code).to be_zero
  283. shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
  284. end
  285. it 'fails with a 404' do
  286. pp = <<-EOS
  287. apt_key { 'puppetlabs':
  288. id => '4BD6EC30',
  289. ensure => 'present',
  290. source => 'https://#{PUPPETLABS_APT_URL}/herpderp.gpg',
  291. }
  292. EOS
  293. apply_manifest(pp, :expect_failures => true) do |r|
  294. expect(r.stderr).to match(/404 Not Found/)
  295. end
  296. end
  297. it 'fails with a socket error' do
  298. pp = <<-EOS
  299. apt_key { 'puppetlabs':
  300. id => '4BD6EC30',
  301. ensure => 'present',
  302. source => 'https://apt.puppetlabss.com/herpderp.gpg',
  303. }
  304. EOS
  305. apply_manifest(pp, :expect_failures => true) do |r|
  306. expect(r.stderr).to match(/could not resolve/)
  307. end
  308. end
  309. end
  310. context '/path/that/exists' do
  311. before(:each) do
  312. shell("curl -o /tmp/puppetlabs-pubkey.gpg \
  313. http://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}")
  314. end
  315. after(:each) do
  316. shell('rm /tmp/puppetlabs-pubkey.gpg')
  317. end
  318. it 'works' do
  319. pp = <<-EOS
  320. apt_key { 'puppetlabs':
  321. id => '4BD6EC30',
  322. ensure => 'present',
  323. source => '/tmp/puppetlabs-pubkey.gpg',
  324. }
  325. EOS
  326. apply_manifest(pp, :catch_failures => true)
  327. expect(apply_manifest(pp, :catch_failures => true).exit_code).to be_zero
  328. shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
  329. end
  330. end
  331. context '/path/that/does/not/exist' do
  332. it 'fails' do
  333. pp = <<-EOS
  334. apt_key { 'puppetlabs':
  335. id => '#{PUPPETLABS_GPG_KEY_ID}',
  336. ensure => 'present',
  337. source => '/tmp/totally_bogus.file',
  338. }
  339. EOS
  340. apply_manifest(pp, :expect_failures => true) do |r|
  341. expect(r.stderr).to match(/does not exist/)
  342. end
  343. end
  344. end
  345. context '/path/that/exists/with/bogus/content' do
  346. before(:each) do
  347. shell('echo "here be dragons" > /tmp/fake-key.gpg')
  348. end
  349. after(:each) do
  350. shell('rm /tmp/fake-key.gpg')
  351. end
  352. it 'fails' do
  353. pp = <<-EOS
  354. apt_key { 'puppetlabs':
  355. id => '#{PUPPETLABS_GPG_KEY_ID}',
  356. ensure => 'present',
  357. source => '/tmp/fake-key.gpg',
  358. }
  359. EOS
  360. apply_manifest(pp, :expect_failures => true) do |r|
  361. expect(r.stderr).to match(/no valid OpenPGP data found/)
  362. end
  363. end
  364. end
  365. end
  366. describe 'keyserver_options =>' do
  367. context 'debug' do
  368. it 'works' do
  369. pp = <<-EOS
  370. apt_key { 'puppetlabs':
  371. id => '#{PUPPETLABS_GPG_KEY_ID}',
  372. ensure => 'present',
  373. keyserver_options => 'debug',
  374. }
  375. EOS
  376. apply_manifest(pp, :catch_failures => true)
  377. expect(apply_manifest(pp, :catch_failures => true).exit_code).to be_zero
  378. shell("apt-key list | grep #{PUPPETLABS_GPG_KEY_ID}")
  379. end
  380. it 'fails on invalid options' do
  381. pp = <<-EOS
  382. apt_key { 'puppetlabs':
  383. id => '#{PUPPETLABS_GPG_KEY_ID}',
  384. ensure => 'present',
  385. keyserver_options => 'this is totally bonkers',
  386. }
  387. EOS
  388. apply_manifest(pp, :expect_failures => true) do |r|
  389. expect(r.stderr).to match(/--keyserver-options this is totally/)
  390. end
  391. end
  392. end
  393. end
  394. end