puppet 6.17.0-universal-darwin → 6.18.0-universal-darwin

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.

Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +6 -5
  3. data/lib/puppet/application/apply.rb +18 -20
  4. data/lib/puppet/application/lookup.rb +16 -4
  5. data/lib/puppet/configurer/downloader.rb +31 -10
  6. data/lib/puppet/confine.rb +1 -1
  7. data/lib/puppet/confine/any.rb +1 -1
  8. data/lib/puppet/defaults.rb +21 -3
  9. data/lib/puppet/feature/base.rb +1 -1
  10. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  11. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  12. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  13. data/lib/puppet/file_system/file_impl.rb +3 -3
  14. data/lib/puppet/functions/lstrip.rb +4 -4
  15. data/lib/puppet/functions/reverse_each.rb +1 -1
  16. data/lib/puppet/functions/rstrip.rb +4 -4
  17. data/lib/puppet/functions/step.rb +1 -1
  18. data/lib/puppet/functions/strip.rb +4 -4
  19. data/lib/puppet/gettext/config.rb +5 -5
  20. data/lib/puppet/gettext/module_translations.rb +4 -4
  21. data/lib/puppet/indirector/exec.rb +1 -1
  22. data/lib/puppet/indirector/facts/facter.rb +3 -3
  23. data/lib/puppet/indirector/file_metadata/http.rb +1 -0
  24. data/lib/puppet/indirector/hiera.rb +4 -0
  25. data/lib/puppet/indirector/indirection.rb +1 -1
  26. data/lib/puppet/indirector/report/processor.rb +2 -2
  27. data/lib/puppet/module.rb +1 -2
  28. data/lib/puppet/network/format_support.rb +2 -2
  29. data/lib/puppet/network/http/route.rb +2 -2
  30. data/lib/puppet/node/environment.rb +12 -5
  31. data/lib/puppet/pal/pal_impl.rb +27 -3
  32. data/lib/puppet/parameter.rb +1 -1
  33. data/lib/puppet/parser/functions.rb +21 -17
  34. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  35. data/lib/puppet/parser/type_loader.rb +2 -2
  36. data/lib/puppet/pops/adaptable.rb +7 -13
  37. data/lib/puppet/pops/adapters.rb +8 -4
  38. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  39. data/lib/puppet/pops/loaders.rb +18 -11
  40. data/lib/puppet/pops/lookup/context.rb +1 -1
  41. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  42. data/lib/puppet/pops/types/iterable.rb +34 -8
  43. data/lib/puppet/pops/validation/checker4_0.rb +19 -15
  44. data/lib/puppet/provider/file/windows.rb +1 -1
  45. data/lib/puppet/provider/package/apt.rb +34 -0
  46. data/lib/puppet/provider/package/gem.rb +4 -2
  47. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  48. data/lib/puppet/provider/package/zypper.rb +3 -0
  49. data/lib/puppet/provider/user/aix.rb +1 -1
  50. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  51. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  52. data/lib/puppet/settings.rb +1 -1
  53. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  54. data/lib/puppet/test/test_helper.rb +10 -3
  55. data/lib/puppet/transaction.rb +2 -2
  56. data/lib/puppet/transaction/persistence.rb +1 -1
  57. data/lib/puppet/transaction/report.rb +1 -1
  58. data/lib/puppet/trusted_external.rb +2 -2
  59. data/lib/puppet/type.rb +4 -3
  60. data/lib/puppet/type/file.rb +2 -2
  61. data/lib/puppet/type/file/source.rb +27 -7
  62. data/lib/puppet/type/notify.rb +2 -2
  63. data/lib/puppet/type/service.rb +4 -0
  64. data/lib/puppet/type/user.rb +18 -3
  65. data/lib/puppet/util.rb +26 -12
  66. data/lib/puppet/util/autoload.rb +9 -7
  67. data/lib/puppet/util/character_encoding.rb +9 -5
  68. data/lib/puppet/util/execution.rb +2 -2
  69. data/lib/puppet/util/windows.rb +1 -0
  70. data/lib/puppet/util/windows/api_types.rb +15 -1
  71. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  72. data/lib/puppet/util/windows/security.rb +4 -4
  73. data/lib/puppet/util/windows/user.rb +219 -0
  74. data/lib/puppet/version.rb +1 -1
  75. data/locales/puppet.pot +78 -69
  76. data/man/man5/puppet.conf.5 +22 -3
  77. data/man/man8/puppet-agent.8 +1 -1
  78. data/man/man8/puppet-apply.8 +1 -1
  79. data/man/man8/puppet-catalog.8 +1 -1
  80. data/man/man8/puppet-config.8 +1 -1
  81. data/man/man8/puppet-describe.8 +1 -1
  82. data/man/man8/puppet-device.8 +1 -1
  83. data/man/man8/puppet-doc.8 +1 -1
  84. data/man/man8/puppet-epp.8 +1 -1
  85. data/man/man8/puppet-facts.8 +1 -1
  86. data/man/man8/puppet-filebucket.8 +1 -1
  87. data/man/man8/puppet-generate.8 +1 -1
  88. data/man/man8/puppet-help.8 +1 -1
  89. data/man/man8/puppet-key.8 +1 -1
  90. data/man/man8/puppet-lookup.8 +2 -2
  91. data/man/man8/puppet-man.8 +1 -1
  92. data/man/man8/puppet-module.8 +1 -1
  93. data/man/man8/puppet-node.8 +1 -1
  94. data/man/man8/puppet-parser.8 +1 -1
  95. data/man/man8/puppet-plugin.8 +1 -1
  96. data/man/man8/puppet-report.8 +1 -1
  97. data/man/man8/puppet-resource.8 +1 -1
  98. data/man/man8/puppet-script.8 +1 -1
  99. data/man/man8/puppet-ssl.8 +1 -1
  100. data/man/man8/puppet-status.8 +1 -1
  101. data/man/man8/puppet.8 +2 -2
  102. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  103. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  104. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  105. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  106. data/spec/integration/application/agent_spec.rb +29 -37
  107. data/spec/integration/application/apply_spec.rb +149 -149
  108. data/spec/integration/application/config_spec.rb +74 -0
  109. data/spec/integration/application/doc_spec.rb +16 -6
  110. data/spec/integration/application/filebucket_spec.rb +65 -16
  111. data/spec/integration/application/help_spec.rb +42 -0
  112. data/spec/integration/application/lookup_spec.rb +13 -0
  113. data/spec/integration/application/module_spec.rb +68 -0
  114. data/spec/integration/application/plugin_spec.rb +50 -0
  115. data/spec/integration/data_binding_spec.rb +82 -0
  116. data/spec/integration/directory_environments_spec.rb +17 -17
  117. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  118. data/spec/integration/node/environment_spec.rb +1 -1
  119. data/spec/integration/util/execution_spec.rb +22 -0
  120. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  121. data/spec/integration/util/windows/process_spec.rb +26 -32
  122. data/spec/integration/util/windows/user_spec.rb +7 -0
  123. data/spec/integration/util_spec.rb +7 -33
  124. data/spec/lib/puppet_spec/matchers.rb +0 -80
  125. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  126. data/spec/unit/application/agent_spec.rb +3 -4
  127. data/spec/unit/application/face_base_spec.rb +6 -4
  128. data/spec/unit/application/facts_spec.rb +39 -10
  129. data/spec/unit/application/man_spec.rb +52 -0
  130. data/spec/unit/application/resource_spec.rb +3 -1
  131. data/spec/unit/application/ssl_spec.rb +15 -2
  132. data/spec/unit/configurer/downloader_spec.rb +10 -0
  133. data/spec/unit/configurer_spec.rb +47 -31
  134. data/spec/unit/confine_spec.rb +2 -1
  135. data/spec/unit/face/config_spec.rb +3 -1
  136. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  137. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  138. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  139. data/spec/unit/file_system/uniquefile_spec.rb +18 -0
  140. data/spec/unit/http/client_spec.rb +0 -1
  141. data/spec/unit/http/resolver_spec.rb +0 -1
  142. data/spec/unit/http/service/ca_spec.rb +0 -1
  143. data/spec/unit/http/service/compiler_spec.rb +0 -1
  144. data/spec/unit/http/service/file_server_spec.rb +0 -1
  145. data/spec/unit/http/service/report_spec.rb +0 -1
  146. data/spec/unit/http/service_spec.rb +0 -1
  147. data/spec/unit/http/session_spec.rb +0 -1
  148. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  149. data/spec/unit/network/format_support_spec.rb +3 -2
  150. data/spec/unit/node/environment_spec.rb +18 -1
  151. data/spec/unit/pops/loaders/loaders_spec.rb +70 -0
  152. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  153. data/spec/unit/provider/package/apt_spec.rb +77 -0
  154. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  155. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  156. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  157. data/spec/unit/provider/service/init_spec.rb +41 -0
  158. data/spec/unit/provider/service/systemd_spec.rb +1 -6
  159. data/spec/unit/provider/service/windows_spec.rb +28 -0
  160. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  161. data/spec/unit/puppet_pal_2pec.rb +40 -0
  162. data/spec/unit/reports/store_spec.rb +17 -13
  163. data/spec/unit/transaction/persistence_spec.rb +15 -0
  164. data/spec/unit/type/service_spec.rb +35 -2
  165. data/spec/unit/type/user_spec.rb +31 -2
  166. data/spec/unit/util/character_encoding_spec.rb +4 -4
  167. data/spec/unit/util/command_line_spec.rb +11 -6
  168. metadata +21 -44
  169. data/spec/integration/faces/config_spec.rb +0 -91
  170. data/spec/integration/faces/documentation_spec.rb +0 -57
  171. data/spec/integration/file_bucket/file_spec.rb +0 -50
  172. data/spec/integration/file_serving/content_spec.rb +0 -7
  173. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  174. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  175. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  176. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  177. data/spec/integration/module_tool/forge_spec.rb +0 -51
  178. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  179. data/spec/integration/provider/service/init_spec.rb +0 -48
  180. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  181. data/spec/integration/provider/service/windows_spec.rb +0 -50
  182. data/spec/integration/reference/providers_spec.rb +0 -21
  183. data/spec/integration/reports_spec.rb +0 -13
  184. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  185. data/spec/integration/ssl/host_spec.rb +0 -72
  186. data/spec/integration/ssl/key_spec.rb +0 -99
  187. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  188. data/spec/unit/face/man_spec.rb +0 -25
  189. data/spec/unit/man_spec.rb +0 -31
@@ -0,0 +1,74 @@
1
+ # coding: utf-8
2
+ require 'spec_helper'
3
+ require 'puppet/application/config'
4
+
5
+ #describe "puppet config" do
6
+ describe Puppet::Face[:config, '0.0.1'] do
7
+ include PuppetSpec::Files
8
+
9
+ # different UTF-8 widths
10
+ # 1-byte A
11
+ # 2-byte ۿ - http://www.fileformat.info/info/unicode/char/06ff/index.htm - 0xDB 0xBF / 219 191
12
+ # 3-byte ᚠ - http://www.fileformat.info/info/unicode/char/16A0/index.htm - 0xE1 0x9A 0xA0 / 225 154 160
13
+ # 4-byte 𠜎 - http://www.fileformat.info/info/unicode/char/2070E/index.htm - 0xF0 0xA0 0x9C 0x8E / 240 160 156 142
14
+ MIXED_UTF8 = "A\u06FF\u16A0\u{2070E}" # Aۿᚠ𠜎
15
+
16
+ let(:tmp_config) { tmpfile('puppet.conf') }
17
+ let(:config) { Puppet::Application[:config] }
18
+
19
+ def read_utf8(path)
20
+ File.read(tmp_config, :encoding => 'UTF-8')
21
+ end
22
+
23
+ def write_utf8(path, content)
24
+ File.write(tmp_config, content, 0, :encoding => 'UTF-8')
25
+ end
26
+
27
+ it "reads a UTF-8 value" do
28
+ write_utf8(tmp_config, <<~EOF)
29
+ [main]
30
+ tags=#{MIXED_UTF8}
31
+ EOF
32
+
33
+ Puppet.initialize_settings(['--config', tmp_config])
34
+ config.command_line.args = ['print', 'tags' ]
35
+
36
+ expect {
37
+ config.run
38
+ }.to exit_with(0)
39
+ .and output("#{MIXED_UTF8}\n").to_stdout
40
+ end
41
+
42
+ it "sets a UTF-8 value" do
43
+ Puppet.initialize_settings(['--config', tmp_config])
44
+ config.command_line.args = ['set', 'tags', MIXED_UTF8 ]
45
+
46
+ expect {
47
+ config.run
48
+ }.to exit_with(0)
49
+
50
+ expect(read_utf8(tmp_config)).to eq(<<~EOF)
51
+ [main]
52
+ tags = #{MIXED_UTF8}
53
+ EOF
54
+ end
55
+
56
+ it "deletes a key" do
57
+ write_utf8(tmp_config, <<~EOF)
58
+ [main]
59
+ tags=#{MIXED_UTF8}
60
+ EOF
61
+
62
+ Puppet.initialize_settings(['--config', tmp_config])
63
+ config.command_line.args = ['delete', 'tags']
64
+
65
+ expect {
66
+ config.run
67
+ }.to exit_with(0)
68
+ .and output(/Deleted setting from 'main': 'tags=#{MIXED_UTF8}'/).to_stdout
69
+
70
+ expect(read_utf8(tmp_config)).to eq(<<~EOF)
71
+ [main]
72
+ EOF
73
+ end
74
+ end
@@ -1,14 +1,24 @@
1
1
  require 'spec_helper'
2
- require 'puppet_spec/files'
3
2
  require 'puppet/application/doc'
4
3
 
5
4
  describe Puppet::Application::Doc do
6
5
  include PuppetSpec::Files
7
6
 
8
- it "should respect the -o option" do
9
- puppetdoc = Puppet::Application[:doc]
10
- allow(puppetdoc.command_line).to receive(:args).and_return(['foo', '-o', 'bar'])
11
- puppetdoc.parse_options
12
- expect(puppetdoc.options[:outputdir]).to eq('bar')
7
+ let(:app) { Puppet::Application[:doc] }
8
+
9
+ it 'lists references' do
10
+ app.command_line.args = ['-l']
11
+ expect {
12
+ app.run
13
+ }.to exit_with(0)
14
+ .and output(/configuration - A reference for all settings/).to_stdout
15
+ end
16
+
17
+ it 'generates markdown' do
18
+ app.command_line.args = ['-r', 'report']
19
+ expect {
20
+ app.run
21
+ }.to exit_with(0)
22
+ .and output(/# Report Reference/).to_stdout
13
23
  end
14
24
  end
@@ -10,20 +10,34 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
10
10
  let(:server) { PuppetSpec::Puppetserver.new }
11
11
  let(:filebucket) { Puppet::Application[:filebucket] }
12
12
  let(:backup_file) { tmpfile('backup_file') }
13
+ let(:text) { 'some random text' }
14
+ let(:md5) { Digest::MD5.file(backup_file).to_s }
13
15
 
14
16
  before :each do
15
17
  Puppet[:log_level] = 'debug'
18
+ File.binwrite(backup_file, text)
16
19
  end
17
20
 
18
- it "backs up files to the filebucket server" do
19
- File.binwrite(backup_file, 'some random text')
20
- md5 = Digest::MD5.file(backup_file).to_s
21
+ it "backs up to and restores from the local filebucket" do
22
+ filebucket.command_line.args = ['backup', backup_file, '--local']
23
+ expect {
24
+ filebucket.run
25
+ }.to output(/: #{md5}/).to_stdout
21
26
 
27
+ dest = tmpfile('file_bucket_restore')
28
+ filebucket.command_line.args = ['restore', dest, md5, '--local']
29
+ expect {
30
+ filebucket.run
31
+ }.to output(/FileBucket read #{md5}/).to_stdout
32
+
33
+ expect(FileUtils.compare_file(backup_file, dest)).to eq(true)
34
+ end
35
+
36
+ it "backs up text files to the filebucket server" do
22
37
  server.start_server do |port|
23
38
  Puppet[:masterport] = port
24
39
  expect {
25
- filebucket.command_line.args << 'backup'
26
- filebucket.command_line.args << backup_file
40
+ filebucket.command_line.args = ['backup', backup_file]
27
41
  filebucket.run
28
42
  }.to output(a_string_matching(
29
43
  %r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/#{md5}\/#{File.realpath(backup_file)}\?environment\=production returned 404 Not Found}
@@ -32,22 +46,58 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
32
46
  ).and matching(
33
47
  %r{#{backup_file}: #{md5}}
34
48
  )).to_stdout
49
+
50
+ expect(File.binread(File.join(server.upload_directory, 'filebucket'))).to eq(text)
51
+ end
52
+ end
53
+
54
+ it "backs up binary files to the filebucket server" do
55
+ binary = "\xD1\xF2\r\n\x81NuSc\x00".force_encoding(Encoding::ASCII_8BIT)
56
+ File.binwrite(backup_file, binary)
57
+
58
+ server.start_server do |port|
59
+ Puppet[:masterport] = port
60
+ expect {
61
+ filebucket.command_line.args = ['backup', backup_file]
62
+ filebucket.run
63
+ }.to output(a_string_matching(
64
+ %r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file/md5/b10778ecd8b08dff525e367cf15b2622/}
65
+ ).and matching(
66
+ %r{Debug: HTTP PUT https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file/md5/b10778ecd8b08dff525e367cf15b2622/}
67
+ )).to_stdout
68
+
69
+ expect(File.binread(File.join(server.upload_directory, 'filebucket'))).to eq(binary)
70
+ end
71
+ end
72
+
73
+ it "backs up utf-8 encoded files to the filebucket server" do
74
+ utf8 = "\u2603".force_encoding(Encoding::UTF_8)
75
+ File.binwrite(backup_file, utf8)
76
+
77
+ server.start_server do |port|
78
+ Puppet[:masterport] = port
79
+ expect {
80
+ filebucket.command_line.args = ['backup', backup_file]
81
+ filebucket.run
82
+ }.to output(a_string_matching(
83
+ %r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file/md5/48856faf4534a876adeadc72aec53cb2/}
84
+ ).and matching(
85
+ %r{Debug: HTTP PUT https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file/md5/48856faf4534a876adeadc72aec53cb2/}
86
+ )).to_stdout
87
+
88
+ expect(File.read(File.join(server.upload_directory, 'filebucket'), encoding: 'utf-8')).to eq(utf8)
35
89
  end
36
90
  end
37
91
 
38
92
  it "doesn't attempt to back up file that already exists on the filebucket server" do
39
93
  file_exists_handler = -> (req, res) {
40
- res.status = 200
94
+ res.status = 200
41
95
  }
42
96
 
43
- File.binwrite(backup_file, 'some random text')
44
- md5 = Digest::MD5.file(backup_file).to_s
45
-
46
97
  server.start_server(mounts: {filebucket: file_exists_handler}) do |port|
47
98
  Puppet[:masterport] = port
48
99
  expect {
49
- filebucket.command_line.args << 'backup'
50
- filebucket.command_line.args << backup_file
100
+ filebucket.command_line.args = ['backup', backup_file]
51
101
  filebucket.run
52
102
  }.to output(a_string_matching(
53
103
  %r{Debug: HTTP HEAD https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/#{md5}\/#{File.realpath(backup_file)}\?environment\=production returned 200 OK}
@@ -66,8 +116,7 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
66
116
  server.start_server(mounts: {filebucket: get_handler}) do |port|
67
117
  Puppet[:masterport] = port
68
118
  expect {
69
- filebucket.command_line.args << 'get'
70
- filebucket.command_line.args << 'fac251367c9e083c6b1f0f3181'
119
+ filebucket.command_line.args = ['get', 'fac251367c9e083c6b1f0f3181']
71
120
  filebucket.run
72
121
  }.to output(a_string_matching(
73
122
  %r{Debug: HTTP GET https:\/\/127.0.0.1:#{port}\/puppet\/v3\/file_bucket_file\/md5\/fac251367c9e083c6b1f0f3181\?environment\=production returned 200 OK}
@@ -90,7 +139,7 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
90
139
  server.start_server(mounts: {filebucket: get_handler}) do |port|
91
140
  Puppet[:masterport] = port
92
141
  expect {
93
- filebucket.command_line.args += ['diff', 'fac251367c9e083c6b1f0f3181', backup_file, '--remote']
142
+ filebucket.command_line.args = ['diff', 'fac251367c9e083c6b1f0f3181', backup_file, '--remote']
94
143
  filebucket.run
95
144
  }.to output(a_string_matching(
96
145
  /[-<] ?foo/
@@ -118,7 +167,7 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
118
167
  server.start_server(mounts: {filebucket: get_handler}) do |port|
119
168
  Puppet[:masterport] = port
120
169
  expect {
121
- filebucket.command_line.args += ['diff', 'd3b07384d113edec49eaa6238ad5ff00', "99b999207e287afffc86c053e5693247", '--remote']
170
+ filebucket.command_line.args = ['diff', 'd3b07384d113edec49eaa6238ad5ff00', "99b999207e287afffc86c053e5693247", '--remote']
122
171
  filebucket.run
123
172
  }.to output(a_string_matching(
124
173
  /[-<] ?foo/
@@ -187,4 +236,4 @@ describe "puppet filebucket", unless: Puppet::Util::Platform.jruby? do
187
236
  end
188
237
  end
189
238
  end
190
- end
239
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+ require 'puppet/application/help'
3
+
4
+ describe "puppet help" do
5
+ let(:app) { Puppet::Application[:help] }
6
+
7
+ it "generates global help" do
8
+ expect {
9
+ app.run
10
+ }.to exit_with(0)
11
+ .and output(Regexp.new(Regexp.escape(<<~END), Regexp::MULTILINE)).to_stdout
12
+
13
+ Usage: puppet <subcommand> [options] <action> [options]
14
+
15
+ Available subcommands:
16
+ END
17
+ end
18
+
19
+ Puppet::Face.faces.sort.each do |face_name|
20
+ context "for #{face_name}" do
21
+ it "generates help" do
22
+ app.command_line.args = ['help', face_name]
23
+
24
+ expect {
25
+ app.run
26
+ }.to exit_with(0)
27
+ .and output(/USAGE: puppet #{face_name} <action>/).to_stdout
28
+ end
29
+
30
+ Puppet::Face[face_name, :current].actions.sort.each do |action_name|
31
+ it "for action #{action_name}" do
32
+ app.command_line.args = ['help', face_name, action_name]
33
+
34
+ expect {
35
+ app.run
36
+ }.to exit_with(0)
37
+ .and output(/USAGE: puppet #{face_name}/).to_stdout
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -90,6 +90,19 @@ describe 'lookup' do
90
90
  expect(lookup('a')).to eql('value a')
91
91
  end
92
92
 
93
+ it 'loads external facts when running without --node' do
94
+ expect(Puppet::Util).not_to receive(:skip_external_facts)
95
+ expect(Facter).not_to receive(:load_external)
96
+ lookup('a')
97
+ end
98
+
99
+ it 'skip loading of external facts when run with --node' do
100
+ app.options[:node] = "random_node"
101
+ expect(Facter).to receive(:load_external).once.with(false)
102
+ expect(Facter).to receive(:load_external).once.with(true)
103
+ lookup('a')
104
+ end
105
+
93
106
  context 'uses node_terminus' do
94
107
  require 'puppet/indirector/node/exec'
95
108
  require 'puppet/indirector/node/plain'
@@ -0,0 +1,68 @@
1
+ # coding: utf-8
2
+ require 'spec_helper'
3
+ require 'puppet/forge'
4
+ require 'puppet_spec/https'
5
+
6
+ describe 'puppet module', unless: Puppet::Util::Platform.jruby? do
7
+ include PuppetSpec::Files
8
+ include_context "https client"
9
+
10
+ let(:app) { Puppet::Application[:module] }
11
+ let(:wrong_hostname) { 'localhost' }
12
+ let(:server) { PuppetSpec::HTTPSServer.new }
13
+ let(:ssl_provider) { Puppet::SSL::SSLProvider.new }
14
+
15
+ let(:release_response) { File.read(fixtures('unit/forge/bacula-releases.json')) }
16
+ let(:release_tarball) { File.binread(fixtures('unit/forge/bacula.tar.gz')) }
17
+ let(:target_dir) { tmpdir('bacula') }
18
+
19
+ before :each do
20
+ SemanticPuppet::Dependency.clear_sources
21
+ end
22
+
23
+ it 'installs a module' do
24
+ # create a temp cacert bundle
25
+ ssl_file = tmpfile('systemstore')
26
+ File.write(ssl_file, server.ca_cert)
27
+
28
+ response_proc = -> (req, res) {
29
+ if req.path == '/v3/releases'
30
+ res['Content-Type'] = 'application/json'
31
+ res.body = release_response
32
+ else
33
+ res['Content-Type'] = 'application/octet-stream'
34
+ res.body = release_tarball
35
+ end
36
+ res.status = 200
37
+ }
38
+
39
+ # override path to system cacert bundle, this must be done before
40
+ # the SSLContext is created and the call to X509::Store.set_default_paths
41
+ Puppet::Util.withenv("SSL_CERT_FILE" => ssl_file) do
42
+ server.start_server(response_proc: response_proc) do |port|
43
+ Puppet[:module_repository] = "https://127.0.0.1:#{port}"
44
+
45
+ # On Windows, CP437 encoded output can't be matched against UTF-8 regexp,
46
+ # so encode the regexp to the external encoding and match against that.
47
+ app.command_line.args = ['install', 'puppetlabs-bacula', '--target-dir', target_dir]
48
+ expect {
49
+ app.run
50
+ }.to exit_with(0)
51
+ .and output(Regexp.new("└── puppetlabs-bacula".encode(Encoding.default_external))).to_stdout
52
+ end
53
+ end
54
+ end
55
+
56
+ it 'returns a valid exception when there is an SSL verification problem' do
57
+ server.start_server do |port|
58
+ Puppet[:module_repository] = "https://#{wrong_hostname}:#{port}"
59
+
60
+ expect {
61
+ app.command_line.args = ['install', 'puppetlabs-bacula', '--target-dir', target_dir]
62
+ app.run
63
+ }.to exit_with(1)
64
+ .and output(%r{Notice: Downloading from https://#{wrong_hostname}:#{port}}).to_stdout
65
+ .and output(%r{Unable to verify the SSL certificate}).to_stderr
66
+ end
67
+ end
68
+ end
@@ -70,4 +70,54 @@ describe "puppet plugin" do
70
70
  end
71
71
  end
72
72
 
73
+ context "pluginsync for external facts uses source permissions to preserve fact executable-ness" do
74
+ before :all do
75
+ WebMock.enable!
76
+ end
77
+
78
+ after :all do
79
+ WebMock.disable!
80
+ end
81
+
82
+ before :each do
83
+ metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":420,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
84
+ stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
85
+
86
+ # response retains owner/group/mode due to source_permissions => use
87
+ facts_metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":500,\"group\":500,\"mode\":493,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
88
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(status: 200, body: facts_metadata, headers: {'Content-Type' => 'application/json'})
89
+ end
90
+
91
+ it "processes a download request resulting in no changes" do
92
+ # Create these so there are no changes
93
+ Puppet::FileSystem.mkpath(Puppet[:plugindest])
94
+ Puppet::FileSystem.mkpath(Puppet[:localedest])
95
+
96
+ # /opt/puppetlabs/puppet/cache/facts.d will be created based on our umask.
97
+ # If the mode on disk is not 0755, then the mode from the metadata response
98
+ # (493 => 0755) will be applied, resulting in "plugins were downloaded"
99
+ # message. Enforce a umask so the results are consistent.
100
+ Puppet::FileSystem.mkpath(Puppet[:pluginfactdest])
101
+ Puppet::FileSystem.chmod(0755, Puppet[:pluginfactdest])
102
+
103
+ app = Puppet::Application[:plugin]
104
+ app.command_line.args << 'download'
105
+ expect {
106
+ app.run
107
+ }.to exit_with(0)
108
+ .and output(/No plugins downloaded/).to_stdout
109
+ end
110
+
111
+ it "updates the facts.d mode", unless: Puppet::Util::Platform.windows? do
112
+ Puppet::FileSystem.mkpath(Puppet[:pluginfactdest])
113
+ Puppet::FileSystem.chmod(0775, Puppet[:pluginfactdest])
114
+
115
+ app = Puppet::Application[:plugin]
116
+ app.command_line.args << 'download'
117
+ expect {
118
+ app.run
119
+ }.to exit_with(0)
120
+ .and output(/Downloaded these plugins: .*facts\.d/).to_stdout
121
+ end
122
+ end
73
123
  end
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
  require 'puppet/indirector/hiera'
3
3
 
4
4
  require 'puppet_spec/compiler'
5
+ require 'puppet/indirector/data_binding/hiera'
5
6
 
6
7
  describe "Data binding" do
7
8
  include PuppetSpec::Files
@@ -140,6 +141,71 @@ describe "Data binding" do
140
141
  end
141
142
  end
142
143
 
144
+ context "with plan_hierarchy key" do
145
+ context "using Hiera 5" do
146
+ let(:hiera_config) { <<~CONF }
147
+ ---
148
+ version: 5
149
+ plan_hierarchy:
150
+ - path: global
151
+ name: Common
152
+ CONF
153
+
154
+ it "ignores plan_hierarchy outside of a Bolt plan" do
155
+ configure_hiera_for_plan_hierarchy(data, hiera_config)
156
+
157
+ create_manifest_in_module("testing", "binding.pp",
158
+ <<-MANIFEST)
159
+ class testing::binding($value) {}
160
+ MANIFEST
161
+
162
+ expect { compile_to_catalog("include testing::binding") }
163
+ .to raise_error(/Class\[Testing::Binding\]: expects a value for parameter 'value'/)
164
+ end
165
+ end
166
+
167
+ context "with invalid data" do
168
+ let(:hiera_config) { <<~CONF }
169
+ ---
170
+ version: 5
171
+ plan_hierarchy:
172
+ - pop: the question
173
+ CONF
174
+
175
+ it "raises a validation error" do
176
+ configure_hiera_for_plan_hierarchy(data, hiera_config)
177
+
178
+ create_manifest_in_module("testing", "binding.pp",
179
+ <<-MANIFEST)
180
+ class testing::binding($value) {}
181
+ MANIFEST
182
+
183
+ expect { compile_to_catalog("include testing::binding") }
184
+ .to raise_error(/entry 'plan_hierarchy' index 0 unrecognized key 'pop'/)
185
+ end
186
+ end
187
+
188
+ context "with Hiera 3" do
189
+ let(:hiera_config) { <<~CONF }
190
+ ---
191
+ plan_hierarchy: ['global']
192
+ CONF
193
+
194
+ it "errors with plan_hierarchy key" do
195
+ configure_hiera_for_plan_hierarchy(data, hiera_config)
196
+
197
+ create_manifest_in_module("testing", "binding.pp",
198
+ <<-MANIFEST)
199
+ class testing::binding($value) {}
200
+ MANIFEST
201
+
202
+ expect { compile_to_catalog("include testing::binding") }
203
+ .to raise_error(/unrecognized key 'plan_hierarchy'/)
204
+
205
+ end
206
+ end
207
+ end
208
+
143
209
 
144
210
  def configure_hiera_for_one_tier(data)
145
211
  hiera_config_file = tmpfile("hiera.yaml")
@@ -163,6 +229,22 @@ describe "Data binding" do
163
229
  Puppet[:hiera_config] = hiera_config_file
164
230
  end
165
231
 
232
+ def configure_hiera_for_plan_hierarchy(data, config)
233
+ hiera_config_file = tmpfile("hiera.yaml")
234
+
235
+ File.open(hiera_config_file, 'w:UTF-8') do |f|
236
+ f.write(config)
237
+ end
238
+
239
+ data.each do | file, contents |
240
+ File.open(File.join(dir, "#{file}.yaml"), 'w:UTF-8') do |f|
241
+ f.write(YAML.dump(contents))
242
+ end
243
+ end
244
+
245
+ Puppet[:hiera_config] = hiera_config_file
246
+ end
247
+
166
248
  def configure_hiera_for_two_tier(data)
167
249
  hiera_config_file = tmpfile("hiera.yaml")
168
250