puppet 6.17.0-x64-mingw32 → 6.18.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.

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
@@ -25,11 +25,10 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
25
25
  server.start_server do |port|
26
26
  Puppet[:masterport] = port
27
27
  expect {
28
- expect {
29
- agent.command_line.args << '--test'
30
- agent.run
31
- }.to exit_with(0)
32
- }.to output(%r{HTTP GET https://127.0.0.1:#{port}/status/v1/simple/master returned 200 OK}).to_stdout
28
+ agent.command_line.args << '--test'
29
+ agent.run
30
+ }.to exit_with(0)
31
+ .and output(%r{HTTP GET https://127.0.0.1:#{port}/status/v1/simple/master returned 200 OK}).to_stdout
33
32
  end
34
33
  end
35
34
 
@@ -39,11 +38,10 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
39
38
  server.start_server do |port|
40
39
  Puppet[:masterport] = port
41
40
  expect {
42
- expect {
43
- agent.command_line.args << '--test'
44
- agent.run
45
- }.to exit_with(0)
46
- }.to output(%r{Unable to connect to server from server_list setting: Request to https://puppet.example.com:#{port}/status/v1/simple/master failed}).to_stdout
41
+ agent.command_line.args << '--test'
42
+ agent.run
43
+ }.to exit_with(0)
44
+ .and output(%r{Unable to connect to server from server_list setting: Request to https://puppet.example.com:#{port}/status/v1/simple/master failed}).to_stdout
47
45
 
48
46
  report = Puppet::Transaction::Report.convert_from(:yaml, File.read(Puppet[:lastrunreport]))
49
47
  expect(report.master_used).to eq("127.0.0.1:#{port}")
@@ -54,13 +52,11 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
54
52
  Puppet[:server_list] = "puppet.example.com"
55
53
 
56
54
  expect {
57
- expect {
58
- expect {
59
- agent.command_line.args << '--test'
60
- agent.run
61
- }.to exit_with(1)
62
- }.to output(%r{Unable to connect to server from server_list setting: Could not select a functional puppet master from server_list: 'puppet.example.com'}).to_stdout
63
- }.to output(/Error: Could not run Puppet configuration client: Could not select a functional puppet master from server_list: 'puppet.example.com'/).to_stderr
55
+ agent.command_line.args << '--test'
56
+ agent.run
57
+ }.to exit_with(1)
58
+ .and output(%r{Unable to connect to server from server_list setting: Could not select a functional puppet master from server_list: 'puppet.example.com'}).to_stdout
59
+ .and output(/Error: Could not run Puppet configuration client: Could not select a functional puppet master from server_list: 'puppet.example.com'/).to_stderr
64
60
 
65
61
  # I'd expect puppet to update the last run report even if the server_list was
66
62
  # exhausted, but it doesn't work that way currently, see PUP-6708
@@ -71,11 +67,10 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
71
67
  server.start_server do |port|
72
68
  Puppet[:masterport] = port
73
69
  expect {
74
- expect {
75
- agent.command_line.args << '--test'
76
- agent.run
77
- }.to exit_with(0)
78
- }.to output(%r{Resolved service 'puppet' to https://127.0.0.1:#{port}/puppet/v3}).to_stdout
70
+ agent.command_line.args << '--test'
71
+ agent.run
72
+ }.to exit_with(0)
73
+ .and output(%r{Resolved service 'puppet' to https://127.0.0.1:#{port}/puppet/v3}).to_stdout
79
74
  end
80
75
 
81
76
  report = Puppet::Transaction::Report.convert_from(:yaml, File.read(Puppet[:lastrunreport]))
@@ -116,11 +111,10 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
116
111
  server.start_server(mounts: {catalog: catalog_handler}) do |port|
117
112
  Puppet[:masterport] = port
118
113
  expect {
119
- expect {
120
- agent.command_line.args << '--test'
121
- agent.run
122
- }.to exit_with(2)
123
- }.to output(%r{Notice: /Stage\[main\]/Main/Notify\[deferred\]/message: defined 'message' as '1:2:3'}).to_stdout
114
+ agent.command_line.args << '--test'
115
+ agent.run
116
+ }.to exit_with(2)
117
+ .and output(%r{Notice: /Stage\[main\]/Main/Notify\[deferred\]/message: defined 'message' as '1:2:3'}).to_stdout
124
118
  end
125
119
  end
126
120
 
@@ -139,11 +133,10 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
139
133
  server.start_server(mounts: {catalog: catalog_handler}) do |port|
140
134
  Puppet[:masterport] = port
141
135
  expect {
142
- expect {
143
- agent.command_line.args << '--test'
144
- agent.run
145
- }.to exit_with(2)
146
- }.to output(a_string_matching(
136
+ agent.command_line.args << '--test'
137
+ agent.run
138
+ }.to exit_with(2)
139
+ .and output(a_string_matching(
147
140
  /Notice: Sensitive \[value redacted\]/
148
141
  ).and matching(
149
142
  /Notify\[sensitive\]\/message: changed \[redacted\] to \[redacted\]/
@@ -249,11 +242,10 @@ describe "puppet agent", unless: Puppet::Util::Platform.jruby? do
249
242
  server.start_server(mounts: mounts) do |port|
250
243
  Puppet[:masterport] = port
251
244
  expect {
252
- expect {
253
- agent.command_line.args << '--test'
254
- agent.run
255
- }.to exit_with(2)
256
- }.to output(/content changed '{md5}d41d8cd98f00b204e9800998ecf8427e' to '{md5}4cf49285ae567157ebfba72bd04ccf32'/).to_stdout
245
+ agent.command_line.args << '--test'
246
+ agent.run
247
+ }.to exit_with(2)
248
+ .and output(/content changed '{md5}d41d8cd98f00b204e9800998ecf8427e' to '{md5}4cf49285ae567157ebfba72bd04ccf32'/).to_stdout
257
249
 
258
250
  # verify puppet restored binary content
259
251
  expect(File.binread(path)).to eq(binary_content)
@@ -6,6 +6,8 @@ require 'puppet_spec/https'
6
6
  describe "apply", unless: Puppet::Util::Platform.jruby? do
7
7
  include PuppetSpec::Files
8
8
 
9
+ let(:apply) { Puppet::Application[:apply] }
10
+
9
11
  before :each do
10
12
  Puppet[:reports] = "none"
11
13
  # Let exceptions be raised instead of exiting
@@ -19,76 +21,51 @@ describe "apply", unless: Puppet::Util::Platform.jruby? do
19
21
  resource = Puppet::Resource.new(:file, file_to_create, :parameters => {:content => "my stuff"})
20
22
  catalog.add_resource resource
21
23
 
22
- manifest = file_containing("manifest", catalog.to_json)
23
-
24
- puppet = Puppet::Application[:apply]
25
- puppet.options[:catalog] = manifest
26
-
27
- puppet.apply
24
+ apply.command_line.args = ['--catalog', file_containing("manifest", catalog.to_json)]
25
+ expect {
26
+ apply.run
27
+ }.to output(/ensure: defined content as/).to_stdout
28
28
 
29
29
  expect(Puppet::FileSystem.exist?(file_to_create)).to be_truthy
30
30
  expect(File.read(file_to_create)).to eq("my stuff")
31
31
  end
32
32
 
33
- context 'from environment with a pcore defined resource type' do
34
- include PuppetSpec::Compiler
35
-
36
- let!(:envdir) { tmpdir('environments') }
33
+ context 'and pcore types are available' do
34
+ let(:envdir) { my_fixture('environments') }
37
35
  let(:env_name) { 'spec' }
38
- let(:dir_structure) {
39
- {
40
- '.resource_types' => {
41
- 'applytest.pp' => <<-CODE
42
- Puppet::Resource::ResourceType3.new(
43
- 'applytest',
44
- [Puppet::Resource::Param.new(String, 'message')],
45
- [Puppet::Resource::Param.new(String, 'name', true)])
46
- CODE
47
- },
48
- 'modules' => {
49
- 'amod' => {
50
- 'lib' => {
51
- 'puppet' => {
52
- 'type' => { 'applytest.rb' => <<-CODE
53
- Puppet::Type.newtype(:applytest) do
54
- newproperty(:message) do
55
- def sync
56
- Puppet.send(@resource[:loglevel], self.should)
57
- end
58
36
 
59
- def retrieve
60
- :absent
61
- end
37
+ before(:each) do
38
+ Puppet[:environmentpath] = envdir
39
+ Puppet[:environment] = env_name
40
+ end
62
41
 
63
- def insync?(is)
64
- false
65
- end
42
+ it 'does not load the pcore type' do
43
+ apply = Puppet::Application[:apply]
44
+ apply.command_line.args = [ '-e', "Applytest { message => 'the default'} applytest { 'applytest was here': }" ]
66
45
 
67
- defaultto { @resource[:name] }
68
- end
46
+ expect {
47
+ apply.run
48
+ }.to exit_with(0)
49
+ .and output(a_string_matching(
50
+ /the Puppet::Type says hello/
51
+ ).and matching(
52
+ /applytest was here/
53
+ )).to_stdout
54
+ end
55
+ end
69
56
 
70
- newparam(:name) do
71
- desc "An arbitrary tag for your own reference; the name of the message."
72
- Puppet.notice('the Puppet::Type says hello')
73
- isnamevar
74
- end
75
- end
76
- CODE
77
- }
78
- }
79
- }
80
- }
81
- }
82
- }
83
- }
57
+ context 'from environment with a pcore defined resource type' do
58
+ include PuppetSpec::Compiler
84
59
 
60
+ let(:envdir) { my_fixture('environments') }
61
+ let(:env_name) { 'spec' }
85
62
  let(:environments) { Puppet::Environments::Directories.new(envdir, []) }
86
63
  let(:env) { Puppet::Node::Environment.create(:'spec', [File.join(envdir, 'spec', 'modules')]) }
87
64
  let(:node) { Puppet::Node.new('test', :environment => env) }
65
+
88
66
  around(:each) do |example|
89
67
  Puppet::Type.rmtype(:applytest)
90
68
  Puppet[:environment] = env_name
91
- dir_contained_in(envdir, env_name => dir_structure)
92
69
  Puppet.override(:environments => environments, :current_environment => env) do
93
70
  example.run
94
71
  end
@@ -96,12 +73,13 @@ end
96
73
 
97
74
  it 'does not load the pcore type' do
98
75
  catalog = compile_to_catalog('applytest { "applytest was here":}', node)
99
- apply = Puppet::Application[:apply]
100
- apply.options[:catalog] = file_containing('manifest', catalog.to_json)
76
+ apply.command_line.args = ['--catalog', file_containing('manifest', catalog.to_json)]
101
77
 
102
78
  Puppet[:environmentpath] = envdir
103
79
  expect_any_instance_of(Puppet::Pops::Loader::Runtime3TypeLoader).not_to receive(:find)
104
- expect { apply.run }.to have_printed(/the Puppet::Type says hello.*applytest was here/m)
80
+ expect {
81
+ apply.run
82
+ }.to output(/the Puppet::Type says hello.*applytest was here/m).to_stdout
105
83
  end
106
84
 
107
85
  # Test just to verify that the Pcore Resource Type and not the Ruby one is produced when the catalog is produced
@@ -113,7 +91,9 @@ end
113
91
 
114
92
  expect(compiler.loaders.runtime3_type_loader.instance_variable_get(:@resource_3x_loader)).to receive(:set_entry).once.with(tn, rt, instance_of(String))
115
93
  .and_return(Puppet::Pops::Loader::Loader::NamedEntry.new(tn, rt, nil))
116
- expect { compiler.compile }.not_to have_printed(/the Puppet::Type says hello/)
94
+ expect {
95
+ compiler.compile
96
+ }.not_to output(/the Puppet::Type says hello/).to_stdout
117
97
  end
118
98
 
119
99
  it "does not fail when pcore type is loaded twice" do
@@ -226,36 +206,36 @@ end
226
206
  catalog = compile_to_catalog('include mod', node)
227
207
 
228
208
  Puppet[:environment] = env_name
229
- apply = Puppet::Application[:apply]
230
- apply.options[:catalog] = file_containing('manifest', catalog.to_json)
231
- expect { apply.run_command; exit(0) }.to exit_with(0)
232
- expect(@logs.map(&:to_s)).to include('The Street 23')
209
+ apply.command_line.args = ['--catalog', file_containing('manifest', catalog.to_json)]
210
+
211
+ expect {
212
+ apply.run
213
+ }.to output(%r{Notify\[The Street 23\]/message: defined 'message' as 'The Street 23'}).to_stdout
233
214
  end
234
215
  end
235
216
 
236
- it "applies a given file even when a directory environment is specified" do
217
+ it "raises if the environment directory does not exist" do
237
218
  manifest = file_containing("manifest.pp", "notice('it was applied')")
219
+ apply.command_line.args = [manifest]
238
220
 
239
221
  special = Puppet::Node::Environment.create(:special, [])
240
222
  Puppet.override(:current_environment => special) do
241
223
  Puppet[:environment] = 'special'
242
- puppet = Puppet::Application[:apply]
243
- allow(puppet).to receive(:command_line).and_return(double('command_line', :args => [manifest]))
244
- expect { puppet.run_command }.to exit_with(0)
224
+ expect {
225
+ apply.run
226
+ }.to raise_error(Puppet::Environments::EnvironmentNotFound,
227
+ /Could not find a directory environment named 'special' anywhere in the path/)
245
228
  end
246
-
247
- expect(@logs.map(&:to_s)).to include('it was applied')
248
229
  end
249
230
 
250
231
  it "adds environment to the $server_facts variable" do
251
232
  manifest = file_containing("manifest.pp", "notice(\"$server_facts\")")
233
+ apply.command_line.args = [manifest]
252
234
 
253
- puppet = Puppet::Application[:apply]
254
- allow(puppet).to receive(:command_line).and_return(double('command_line', :args => [manifest]))
255
-
256
- expect { puppet.run_command }.to exit_with(0)
257
-
258
- expect(@logs.map(&:to_s)).to include(/{environment =>.*/)
235
+ expect {
236
+ apply.run
237
+ }.to exit_with(0)
238
+ .and output(/{environment => production}/).to_stdout
259
239
  end
260
240
 
261
241
  it "applies a given file even when an ENC is configured", :unless => Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
@@ -271,48 +251,36 @@ end
271
251
  Puppet[:environment] = 'special'
272
252
  Puppet[:node_terminus] = 'exec'
273
253
  Puppet[:external_nodes] = enc
274
- puppet = Puppet::Application[:apply]
275
- allow(puppet).to receive(:command_line).and_return(double('command_line', :args => [manifest]))
276
- expect { puppet.run_command }.to exit_with(0)
254
+ apply.command_line.args = [manifest]
255
+ expect {
256
+ apply.run
257
+ }.to exit_with(0)
258
+ .and output(/Notice: Scope\(Class\[main\]\): specific manifest applied/).to_stdout
277
259
  end
278
-
279
- expect(@logs.map(&:to_s)).to include('specific manifest applied')
280
260
  end
281
261
 
282
262
  context "handles errors" do
283
263
  it "logs compile errors once" do
284
- Puppet.initialize_settings([])
285
- apply = Puppet::Application.find(:apply).new(double('command_line', :subcommand_name => :apply, :args => []))
286
- apply.options[:code] = '08'
287
-
288
- msg = 'valid octal'
289
- callback = Proc.new do |actual|
290
- expect(actual.scan(Regexp.new(msg))).to eq([msg])
291
- end
292
-
293
- expect do
264
+ apply.command_line.args = ['-e', '08']
265
+ expect {
294
266
  apply.run
295
- end.to have_printed(callback).and_exit_with(1)
267
+ }.to exit_with(1)
268
+ .and output(/Not a valid octal number/).to_stderr
296
269
  end
297
270
 
298
271
  it "logs compile post processing errors once" do
299
- Puppet.initialize_settings([])
300
- apply = Puppet::Application.find(:apply).new(double('command_line', :subcommand_name => :apply, :args => []))
301
272
  path = File.expand_path('/tmp/content_file_test.Q634Dlmtime')
302
- apply.options[:code] = "file { '#{path}':
273
+ apply.command_line.args = ['-e', "file { '#{path}':
303
274
  content => 'This is the test file content',
304
275
  ensure => present,
305
276
  checksum => mtime
306
- }"
277
+ }"]
307
278
 
308
- msg = 'You cannot specify content when using checksum'
309
- callback = Proc.new do |actual|
310
- expect(actual.scan(Regexp.new(msg))).to eq([msg])
311
- end
312
-
313
- expect do
279
+ expect {
314
280
  apply.run
315
- end.to have_printed(callback).and_exit_with(1)
281
+ }.to exit_with(1)
282
+ .and output(/Compiled catalog/).to_stdout
283
+ .and output(/You cannot specify content when using checksum/).to_stderr
316
284
  end
317
285
  end
318
286
 
@@ -337,51 +305,42 @@ end
337
305
  Puppet[:environmentpath] = envdir
338
306
  end
339
307
 
340
- def init_cli_args_and_apply_app(args, execute)
341
- Puppet.initialize_settings(args)
342
- puppet = Puppet::Application.find(:apply).new(double('command_line', :subcommand_name => :apply, :args => args))
343
- puppet.options[:code] = execute
344
- return puppet
345
- end
308
+ context "given a modulepath" do
309
+ let(:args) { ['-e', execute] }
346
310
 
347
- context "given the --modulepath option" do
348
- let(:args) { ['-e', execute, '--modulepath', modulepath] }
311
+ before :each do
312
+ Puppet[:modulepath] = modulepath
349
313
 
350
- it "looks in --modulepath even when the default directory environment exists" do
351
- apply = init_cli_args_and_apply_app(args, execute)
314
+ apply.command_line.args = args
315
+ end
352
316
 
353
- expect do
354
- expect { apply.run }.to exit_with(0)
355
- end.to have_printed('amod class included')
317
+ it "looks in modulepath even when the default directory environment exists" do
318
+ expect {
319
+ apply.run
320
+ }.to exit_with(0)
321
+ .and output(/amod class included/).to_stdout
356
322
  end
357
323
 
358
- it "looks in --modulepath even when given a specific directory --environment" do
359
- args << '--environment' << 'production'
360
- apply = init_cli_args_and_apply_app(args, execute)
324
+ it "looks in modulepath even when given a specific directory --environment" do
325
+ apply.command_line.args = args << '--environment' << 'production'
361
326
 
362
- expect do
363
- expect { apply.run }.to exit_with(0)
364
- end.to have_printed('amod class included')
327
+ expect {
328
+ apply.run
329
+ }.to exit_with(0)
330
+ .and output(/amod class included/).to_stdout
365
331
  end
366
332
 
367
- it "looks in --modulepath when given multiple paths in --modulepath" do
368
- args = ['-e', execute, '--modulepath', [tmpdir('notmodulepath'), modulepath].join(File::PATH_SEPARATOR)]
369
- apply = init_cli_args_and_apply_app(args, execute)
333
+ it "looks in modulepath when given multiple paths in modulepath" do
334
+ Puppet[:modulepath] = [tmpdir('notmodulepath'), modulepath].join(File::PATH_SEPARATOR)
370
335
 
371
- expect do
372
- expect { apply.run }.to exit_with(0)
373
- end.to have_printed('amod class included')
336
+ expect {
337
+ apply.run
338
+ }.to exit_with(0)
339
+ .and output(/amod class included/).to_stdout
374
340
  end
375
341
  end
376
342
 
377
- # When executing an ENC script, output cannot be captured using
378
- # expect { }.to have_printed(...)
379
- # External node script execution will fail, likely due to the tampering
380
- # with the basic file descriptors.
381
- # Workaround: Define a log destination and merely inspect logs.
382
343
  context "with an ENC" do
383
- let(:logdest) { tmpfile('logdest') }
384
- let(:args) { ['-e', execute, '--logdest', logdest ] }
385
344
  let(:enc) do
386
345
  script_containing('enc_script',
387
346
  :windows => '@echo environment: spec',
@@ -394,17 +353,23 @@ end
394
353
  end
395
354
 
396
355
  it "should use the environment that the ENC mandates" do
397
- apply = init_cli_args_and_apply_app(args, execute)
398
- expect { apply.run }.to exit_with(0)
399
- expect(@logs.map(&:to_s)).to include('amod class included')
356
+ apply.command_line.args = ['-e', execute]
357
+
358
+ expect {
359
+ apply.run
360
+ }.to exit_with(0)
361
+ .and output(a_string_matching(/amod class included/)
362
+ .and matching(/Compiled catalog for .* in environment spec/)).to_stdout
400
363
  end
401
364
 
402
365
  it "should prefer the ENC environment over the configured one and emit a warning" do
403
- apply = init_cli_args_and_apply_app(args + [ '--environment', 'production' ], execute)
404
- expect { apply.run }.to exit_with(0)
405
- logs = @logs.map(&:to_s)
406
- expect(logs).to include('amod class included')
407
- expect(logs).to include(match(/doesn't match server specified environment/))
366
+ apply.command_line.args = ['-e', execute, '--environment', 'production']
367
+
368
+ expect {
369
+ apply.run
370
+ }.to exit_with(0)
371
+ .and output(a_string_matching('amod class included')
372
+ .and matching(/doesn't match server specified environment/)).to_stdout
408
373
  end
409
374
  end
410
375
  end
@@ -475,8 +440,7 @@ class amod::bad_type {
475
440
  context 'and the file is not serialized with rich_data' do
476
441
  it 'will notify a string that is the result of Regexp#inspect (from Runtime3xConverter)' do
477
442
  catalog = compile_to_catalog(execute, node)
478
- apply = Puppet::Application[:apply]
479
- apply.options[:catalog] = file_containing('manifest', catalog.to_json)
443
+ apply.command_line.args = ['--catalog', file_containing('manifest', catalog.to_json)]
480
444
  expect(apply).to receive(:apply_catalog) do |cat|
481
445
  expect(cat.resource(:notify, 'rx')['message']).to be_a(String)
482
446
  expect(cat.resource(:notify, 'bin')['message']).to be_a(String)
@@ -491,8 +455,7 @@ class amod::bad_type {
491
455
 
492
456
  it 'will notify a string that is the result of to_s on uknown data types' do
493
457
  json = compile_to_catalog('include amod::bad_type', node).to_json
494
- apply = Puppet::Application[:apply]
495
- apply.options[:catalog] = file_containing('manifest', json)
458
+ apply.command_line.args = ['--catalog', file_containing('manifest', json)]
496
459
  expect(apply).to receive(:apply_catalog) do |catalog|
497
460
  expect(catalog.resource(:notify, 'bogus')['message']).to be_a(String)
498
461
  end
@@ -514,11 +477,10 @@ class amod::bad_type {
514
477
  context 'and the file is serialized with rich_data' do
515
478
  it 'will notify a regexp using Regexp#to_s' do
516
479
  catalog = compile_to_catalog(execute, node)
517
- apply = Puppet::Application[:apply]
518
480
  serialized_catalog = Puppet.override(rich_data: true) do
519
481
  catalog.to_json
520
482
  end
521
- apply.options[:catalog] = file_containing('manifest', serialized_catalog)
483
+ apply.command_line.args = ['--catalog', file_containing('manifest', serialized_catalog)]
522
484
  expect(apply).to receive(:apply_catalog) do |cat|
523
485
  expect(cat.resource(:notify, 'rx')['message']).to be_a(Regexp)
524
486
  # The resource return in this expect is a String, but since it was a Binary type that
@@ -541,7 +503,6 @@ class amod::bad_type {
541
503
  let(:env_dir) { File.join(Puppet[:environmentpath], env_name) }
542
504
  let(:env) { Puppet::Node::Environment.create(env_name.to_sym, [File.join(env_dir, 'modules')]) }
543
505
  let(:node) { Puppet::Node.new(Puppet[:certname], environment: environment) }
544
- let(:apply) { Puppet::Application[:apply] }
545
506
 
546
507
  before :each do
547
508
  Puppet[:environment] = env_name
@@ -564,7 +525,7 @@ class amod::bad_type {
564
525
 
565
526
  expect {
566
527
  apply.command_line.args << manifest
567
- apply.run
528
+ apply.run
568
529
  }.to exit_with(0)
569
530
  .and output(a_string_matching(
570
531
  /dir1\]\/ensure: created/
@@ -579,6 +540,46 @@ class amod::bad_type {
579
540
  end
580
541
  end
581
542
 
543
+ context 'http file sources' do
544
+ include_context 'https client'
545
+
546
+ it "requires the caller to URL encode special characters in the request path and query" do
547
+ Puppet[:server] = '127.0.0.1'
548
+ request = nil
549
+
550
+ response_proc = -> (req, res) {
551
+ request = req
552
+
553
+ res['Content-Type'] = 'text/plain'
554
+ res.body = "from the server"
555
+ }
556
+
557
+ https = PuppetSpec::HTTPSServer.new
558
+ https.start_server(response_proc: response_proc) do |https_port|
559
+ dest = tmpfile('http_file_source')
560
+
561
+ # spaces in path are encoded as %20 and '[' in query is encoded as %5B,
562
+ # but ':', '=', '-' are not encoded
563
+ manifest = file_containing("manifest.pp", <<~MANIFEST)
564
+ file { "#{dest}":
565
+ ensure => file,
566
+ source => "https://#{Puppet[:server]}:#{https_port}/path%20to%20file?x=b%5Bc&sv=2019-02-02&st=2020-07-28T20:18:53Z&se=2020-07-28T21:03:00Z&sr=b&sp=r&sig=JaZhcqxT4akJcOwUdUGrQB2m1geUoh89iL8WMag8a8c=",
567
+ }
568
+ MANIFEST
569
+
570
+ expect {
571
+ apply.command_line.args << manifest
572
+ apply.run
573
+ }.to exit_with(0)
574
+ .and output(%r{Main/File\[#{dest}\]/ensure: defined content as}).to_stdout
575
+
576
+ expect(request.path).to eq('/path to file')
577
+ expect(request.query).to include('x' => 'b[c')
578
+ expect(request.query).to include('sig' => 'JaZhcqxT4akJcOwUdUGrQB2m1geUoh89iL8WMag8a8c=')
579
+ end
580
+ end
581
+ end
582
+
582
583
  context 'http report processor' do
583
584
  include_context 'https client'
584
585
 
@@ -586,7 +587,6 @@ class amod::bad_type {
586
587
  Puppet[:reports] = 'http'
587
588
  end
588
589
 
589
- let(:apply) { Puppet::Application[:apply] }
590
590
  let(:unknown_server) do
591
591
  unknown_ca_cert = cert_fixture('unknown-ca.pem')
592
592
  PuppetSpec::HTTPSServer.new(