puppet 7.1.0-x64-mingw32 → 7.6.1-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 (198) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +38 -30
  3. data/ext/build_defaults.yaml +0 -1
  4. data/lib/puppet/application.rb +10 -6
  5. data/lib/puppet/application/agent.rb +1 -0
  6. data/lib/puppet/application/apply.rb +3 -2
  7. data/lib/puppet/application/device.rb +1 -0
  8. data/lib/puppet/application/script.rb +1 -0
  9. data/lib/puppet/application/ssl.rb +11 -0
  10. data/lib/puppet/configurer.rb +16 -3
  11. data/lib/puppet/defaults.rb +14 -19
  12. data/lib/puppet/environments.rb +16 -1
  13. data/lib/puppet/face/facts.rb +26 -2
  14. data/lib/puppet/ffi/windows/api_types.rb +1 -1
  15. data/lib/puppet/ffi/windows/constants.rb +1 -1
  16. data/lib/puppet/file_serving/configuration/parser.rb +5 -2
  17. data/lib/puppet/file_system/memory_file.rb +8 -1
  18. data/lib/puppet/file_system/windows.rb +2 -0
  19. data/lib/puppet/functions.rb +1 -1
  20. data/lib/puppet/functions/partition.rb +8 -0
  21. data/lib/puppet/http/factory.rb +4 -0
  22. data/lib/puppet/indirector/facts/facter.rb +1 -0
  23. data/lib/puppet/loaders.rb +0 -4
  24. data/lib/puppet/module.rb +1 -0
  25. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  26. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  27. data/lib/puppet/network/formats.rb +67 -0
  28. data/lib/puppet/network/http.rb +5 -2
  29. data/lib/puppet/network/http/api.rb +10 -6
  30. data/lib/puppet/network/http/api/master.rb +3 -2
  31. data/lib/puppet/network/http/api/master/v3.rb +2 -25
  32. data/lib/puppet/network/http/api/master/v3/environments.rb +2 -33
  33. data/lib/puppet/network/http/api/server.rb +10 -0
  34. data/lib/puppet/network/http/api/server/v3.rb +39 -0
  35. data/lib/puppet/network/http/api/server/v3/environments.rb +48 -0
  36. data/lib/puppet/node/environment.rb +12 -5
  37. data/lib/puppet/parser/ast/leaf.rb +3 -2
  38. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  39. data/lib/puppet/pops/loader/base_loader.rb +42 -32
  40. data/lib/puppet/pops/loader/dependency_loader.rb +2 -2
  41. data/lib/puppet/pops/loader/loader.rb +15 -5
  42. data/lib/puppet/pops/loader/module_loaders.rb +8 -8
  43. data/lib/puppet/pops/loader/predefined_loader.rb +4 -0
  44. data/lib/puppet/pops/loader/runtime3_type_loader.rb +1 -1
  45. data/lib/puppet/pops/loader/static_loader.rb +4 -0
  46. data/lib/puppet/pops/loaders.rb +4 -4
  47. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  48. data/lib/puppet/pops/parser/lexer2.rb +0 -4
  49. data/lib/puppet/pops/types/p_type_set_type.rb +1 -1
  50. data/lib/puppet/pops/validation/checker4_0.rb +0 -1
  51. data/lib/puppet/property/list.rb +1 -1
  52. data/lib/puppet/provider/group/groupadd.rb +13 -8
  53. data/lib/puppet/provider/package/apt.rb +34 -2
  54. data/lib/puppet/provider/package/aptitude.rb +6 -0
  55. data/lib/puppet/provider/package/dnfmodule.rb +1 -1
  56. data/lib/puppet/provider/package/puppet_gem.rb +12 -1
  57. data/lib/puppet/provider/service/debian.rb +2 -0
  58. data/lib/puppet/provider/service/systemd.rb +1 -1
  59. data/lib/puppet/provider/user/useradd.rb +62 -8
  60. data/lib/puppet/reference/configuration.rb +6 -5
  61. data/lib/puppet/settings.rb +36 -30
  62. data/lib/puppet/settings/alias_setting.rb +37 -0
  63. data/lib/puppet/settings/environment_conf.rb +1 -0
  64. data/lib/puppet/type/package.rb +3 -3
  65. data/lib/puppet/util/autoload.rb +1 -8
  66. data/lib/puppet/util/monkey_patches.rb +7 -0
  67. data/lib/puppet/util/posix.rb +1 -1
  68. data/lib/puppet/util/windows/adsi.rb +46 -0
  69. data/lib/puppet/util/windows/principal.rb +9 -2
  70. data/lib/puppet/util/windows/sid.rb +4 -2
  71. data/lib/puppet/version.rb +1 -1
  72. data/locales/puppet.pot +166 -146
  73. data/man/man5/puppet.conf.5 +14 -6
  74. data/man/man8/puppet-agent.8 +2 -2
  75. data/man/man8/puppet-apply.8 +2 -2
  76. data/man/man8/puppet-catalog.8 +1 -1
  77. data/man/man8/puppet-config.8 +1 -1
  78. data/man/man8/puppet-describe.8 +1 -1
  79. data/man/man8/puppet-device.8 +2 -2
  80. data/man/man8/puppet-doc.8 +1 -1
  81. data/man/man8/puppet-epp.8 +1 -1
  82. data/man/man8/puppet-facts.8 +8 -2
  83. data/man/man8/puppet-filebucket.8 +1 -1
  84. data/man/man8/puppet-generate.8 +1 -1
  85. data/man/man8/puppet-help.8 +1 -1
  86. data/man/man8/puppet-lookup.8 +1 -1
  87. data/man/man8/puppet-module.8 +1 -1
  88. data/man/man8/puppet-node.8 +1 -1
  89. data/man/man8/puppet-parser.8 +1 -1
  90. data/man/man8/puppet-plugin.8 +1 -1
  91. data/man/man8/puppet-report.8 +1 -1
  92. data/man/man8/puppet-resource.8 +1 -1
  93. data/man/man8/puppet-script.8 +2 -2
  94. data/man/man8/puppet-ssl.8 +5 -1
  95. data/man/man8/puppet.8 +2 -2
  96. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  97. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services_vendor_preset +9 -0
  98. data/spec/integration/application/agent_spec.rb +160 -3
  99. data/spec/integration/application/apply_spec.rb +19 -0
  100. data/spec/integration/application/plugin_spec.rb +1 -1
  101. data/spec/integration/defaults_spec.rb +0 -7
  102. data/spec/integration/http/client_spec.rb +12 -0
  103. data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
  104. data/spec/integration/indirector/file_content/file_server_spec.rb +0 -2
  105. data/spec/integration/indirector/file_metadata/file_server_spec.rb +0 -2
  106. data/spec/integration/parser/collection_spec.rb +10 -0
  107. data/spec/integration/resource/type_collection_spec.rb +2 -6
  108. data/spec/integration/transaction_spec.rb +4 -9
  109. data/spec/integration/util/windows/adsi_spec.rb +21 -1
  110. data/spec/integration/util/windows/principal_spec.rb +21 -0
  111. data/spec/integration/util/windows/registry_spec.rb +6 -10
  112. data/spec/spec_helper.rb +12 -5
  113. data/spec/unit/agent_spec.rb +8 -6
  114. data/spec/unit/application/agent_spec.rb +0 -1
  115. data/spec/unit/application/facts_spec.rb +58 -7
  116. data/spec/unit/application/filebucket_spec.rb +0 -2
  117. data/spec/unit/application/ssl_spec.rb +23 -0
  118. data/spec/unit/application_spec.rb +17 -9
  119. data/spec/unit/confine/feature_spec.rb +1 -1
  120. data/spec/unit/confine_spec.rb +8 -2
  121. data/spec/unit/environments_spec.rb +164 -88
  122. data/spec/unit/face/node_spec.rb +0 -11
  123. data/spec/unit/file_serving/configuration/parser_spec.rb +8 -1
  124. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  125. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  126. data/spec/unit/file_system_spec.rb +9 -0
  127. data/spec/unit/forge/module_release_spec.rb +2 -7
  128. data/spec/unit/http/factory_spec.rb +19 -0
  129. data/spec/unit/indirector/face_spec.rb +0 -1
  130. data/spec/unit/indirector/facts/facter_spec.rb +20 -5
  131. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  132. data/spec/unit/indirector/indirection_spec.rb +8 -12
  133. data/spec/unit/indirector_spec.rb +2 -2
  134. data/spec/unit/module_spec.rb +1 -1
  135. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  136. data/spec/unit/network/formats_spec.rb +41 -0
  137. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -4
  138. data/spec/unit/network/http/api/master_spec.rb +38 -0
  139. data/spec/unit/network/http/api/{master → server}/v3/environments_spec.rb +2 -2
  140. data/spec/unit/network/http/api/{master → server}/v3_spec.rb +19 -19
  141. data/spec/unit/network/http/api_spec.rb +11 -11
  142. data/spec/unit/parser/compiler_spec.rb +3 -19
  143. data/spec/unit/parser/resource_spec.rb +14 -8
  144. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  145. data/spec/unit/pops/loaders/dependency_loader_spec.rb +1 -1
  146. data/spec/unit/pops/parser/lexer2_spec.rb +0 -4
  147. data/spec/unit/pops/types/type_parser_spec.rb +2 -1
  148. data/spec/unit/pops/validator/validator_spec.rb +20 -43
  149. data/spec/unit/property_spec.rb +1 -0
  150. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  151. data/spec/unit/provider/nameservice_spec.rb +66 -65
  152. data/spec/unit/provider/package/apt_spec.rb +28 -23
  153. data/spec/unit/provider/package/aptitude_spec.rb +1 -1
  154. data/spec/unit/provider/package/base_spec.rb +6 -5
  155. data/spec/unit/provider/package/dnfmodule_spec.rb +10 -1
  156. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  157. data/spec/unit/provider/package/pip_spec.rb +6 -11
  158. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  159. data/spec/unit/provider/package/puppet_gem_spec.rb +28 -0
  160. data/spec/unit/provider/service/systemd_spec.rb +11 -0
  161. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  162. data/spec/unit/provider/user/useradd_spec.rb +70 -3
  163. data/spec/unit/provider_spec.rb +6 -8
  164. data/spec/unit/resource/type_spec.rb +1 -1
  165. data/spec/unit/resource_spec.rb +11 -10
  166. data/spec/unit/settings_spec.rb +13 -6
  167. data/spec/unit/ssl/base_spec.rb +0 -1
  168. data/spec/unit/ssl/certificate_request_spec.rb +4 -10
  169. data/spec/unit/ssl/ssl_provider_spec.rb +5 -2
  170. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  171. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  172. data/spec/unit/transaction_spec.rb +13 -4
  173. data/spec/unit/type/file/content_spec.rb +0 -1
  174. data/spec/unit/type/file/selinux_spec.rb +0 -2
  175. data/spec/unit/type/file_spec.rb +0 -6
  176. data/spec/unit/type/group_spec.rb +13 -6
  177. data/spec/unit/type/resources_spec.rb +7 -7
  178. data/spec/unit/type/service_spec.rb +1 -1
  179. data/spec/unit/type/tidy_spec.rb +0 -1
  180. data/spec/unit/type_spec.rb +2 -2
  181. data/spec/unit/util/at_fork_spec.rb +2 -2
  182. data/spec/unit/util/autoload_spec.rb +5 -1
  183. data/spec/unit/util/backups_spec.rb +1 -2
  184. data/spec/unit/util/execution_spec.rb +15 -11
  185. data/spec/unit/util/inifile_spec.rb +6 -14
  186. data/spec/unit/util/log_spec.rb +8 -7
  187. data/spec/unit/util/logging_spec.rb +3 -3
  188. data/spec/unit/util/posix_spec.rb +16 -10
  189. data/spec/unit/util/selinux_spec.rb +76 -52
  190. data/spec/unit/util/suidmanager_spec.rb +44 -41
  191. data/spec/unit/util/windows/sid_spec.rb +6 -0
  192. data/spec/unit/util_spec.rb +13 -6
  193. metadata +18 -16
  194. data/spec/lib/matchers/include.rb +0 -27
  195. data/spec/lib/matchers/include_spec.rb +0 -32
  196. data/spec/unit/pops/parser/parse_application_spec.rb +0 -13
  197. data/spec/unit/pops/parser/parse_capabilities_spec.rb +0 -23
  198. data/spec/unit/pops/parser/parse_site_spec.rb +0 -43
@@ -146,16 +146,6 @@ describe Puppet::Util::Windows::Registry do
146
146
  utf_8_bytes = ENDASH_UTF_8 + TM_UTF_8
147
147
  utf_8_str = utf_8_bytes.pack('c*').force_encoding(Encoding::UTF_8)
148
148
 
149
- # this problematic Ruby codepath triggers a conversion of UTF-16LE to
150
- # a local codepage which can totally break when that codepage has no
151
- # conversion from the given UTF-16LE characters to local codepage
152
- # a prime example is that IBM437 has no conversion from a Unicode en-dash
153
- expect(Win32::Registry).not_to receive(:export_string)
154
-
155
- # also, expect that we're using our variants of keys / values, not Rubys
156
- expect(Win32::Registry).not_to receive(:each_key)
157
- expect(Win32::Registry).not_to receive(:each_value)
158
-
159
149
  hklm.create("#{puppet_key}\\#{subkey_name}", Win32::Registry::KEY_ALL_ACCESS | regsam) do |reg|
160
150
  reg.write("#{guid}", Win32::Registry::REG_SZ, utf_16_str)
161
151
 
@@ -273,6 +263,12 @@ describe Puppet::Util::Windows::Registry do
273
263
  type: Win32::Registry::REG_EXPAND_SZ,
274
264
  value: "\0\0\0reg expand string",
275
265
  expected_value: ""
266
+ },
267
+ {
268
+ name: 'REG_EXPAND_SZ_2',
269
+ type: Win32::Registry::REG_EXPAND_SZ,
270
+ value: "1\x002\x003\x004\x00\x00\x00\x90\xD8UoY".force_encoding("UTF-16LE"),
271
+ expected_value: "1234"
276
272
  }
277
273
  ].each do |pair|
278
274
  it 'reads up to the first wide null' do
data/spec/spec_helper.rb CHANGED
@@ -84,10 +84,7 @@ RSpec.configure do |config|
84
84
  config.filter_run_when_matching :focus
85
85
 
86
86
  config.mock_with :rspec do |mocks|
87
- # We really should have this on, but it breaks a _lot_ of tests. We'll
88
- # need to go through and fix those tests first before it can be enabled
89
- # for real.
90
- mocks.verify_partial_doubles = false
87
+ mocks.verify_partial_doubles = true
91
88
  end
92
89
 
93
90
  tmpdir = Puppet::FileSystem.expand_path(Dir.mktmpdir("rspecrun"))
@@ -165,10 +162,20 @@ RSpec.configure do |config|
165
162
  PUPPET_FACTER_2_GCE_URL = %r{^http://metadata/computeMetadata/v1(beta1)?}.freeze
166
163
  PUPPET_FACTER_3_GCE_URL = "http://metadata.google.internal/computeMetadata/v1/?recursive=true&alt=json".freeze
167
164
 
165
+ # Facter azure metadata endpoint
166
+ PUPPET_FACTER_AZ_URL = "http://169.254.169.254/metadata/instance?api-version=2020-09-01"
167
+
168
+ # Facter EC2 endpoint
169
+ PUPPET_FACTER_EC2_METADATA = 'http://169.254.169.254/latest/meta-data/'
170
+ PUPPET_FACTER_EC2_USERDATA = 'http://169.254.169.254/latest/user-data/'
171
+
168
172
  config.around :each do |example|
169
- # Ignore requests from Facter GCE fact in Travis
173
+ # Ignore requests from Facter to external services
170
174
  stub_request(:get, PUPPET_FACTER_2_GCE_URL)
171
175
  stub_request(:get, PUPPET_FACTER_3_GCE_URL)
176
+ stub_request(:get, PUPPET_FACTER_AZ_URL)
177
+ stub_request(:get, PUPPET_FACTER_EC2_METADATA)
178
+ stub_request(:get, PUPPET_FACTER_EC2_USERDATA)
172
179
 
173
180
  # Enable VCR if the example is tagged with `:vcr` metadata.
174
181
  if example.metadata[:vcr]
@@ -3,9 +3,13 @@ require 'puppet/agent'
3
3
  require 'puppet/configurer'
4
4
 
5
5
  class AgentTestClient
6
- def run
6
+ def initialize(transaction_uuid = nil, job_id = nil)
7
+ end
8
+
9
+ def run(client_args)
7
10
  # no-op
8
11
  end
12
+
9
13
  def stop
10
14
  # no-op
11
15
  end
@@ -49,11 +53,10 @@ describe Puppet::Agent do
49
53
 
50
54
  it "should create an instance of its client class and run it when asked to run" do
51
55
  client = double('client')
52
- expect(AgentTestClient).to receive(:new).and_return(client)
53
-
54
- expect(client).to receive(:run)
56
+ allow(AgentTestClient).to receive(:new).with(nil, nil).and_return(client)
55
57
 
56
58
  allow(@agent).to receive(:disabled?).and_return(false)
59
+ expect(client).to receive(:run)
57
60
  @agent.run
58
61
  end
59
62
 
@@ -90,7 +93,6 @@ describe Puppet::Agent do
90
93
 
91
94
  describe "when being run" do
92
95
  before do
93
- allow(AgentTestClient).to receive(:lockfile_path).and_return("/my/lock")
94
96
  allow(@agent).to receive(:disabled?).and_return(false)
95
97
  end
96
98
 
@@ -186,7 +188,7 @@ describe Puppet::Agent do
186
188
  allow(lockfile).to receive(:lock).and_return(false)
187
189
  end
188
190
 
189
- it "should notify that a run is already in progres" do
191
+ it "should notify that a run is already in progress" do
190
192
  client = AgentTestClient.new
191
193
  expect(AgentTestClient).to receive(:new).and_return(client)
192
194
  expect(Puppet).to receive(:notice).with(/Run of .* already in progress; skipping .* exists/)
@@ -202,7 +202,6 @@ describe Puppet::Application::Agent do
202
202
  allow(Puppet::Resource::Catalog.indirection).to receive(:terminus_class=)
203
203
  allow(Puppet::Resource::Catalog.indirection).to receive(:cache_class=)
204
204
  allow(Puppet::Node::Facts.indirection).to receive(:terminus_class=)
205
- allow(Puppet).to receive(:settraps)
206
205
  end
207
206
 
208
207
  it "should not run with extra arguments" do
@@ -3,7 +3,7 @@ require 'puppet/application/facts'
3
3
 
4
4
  describe Puppet::Application::Facts do
5
5
  let(:app) { Puppet::Application[:facts] }
6
- let(:values) { {"filesystems" => "apfs,autofs,devfs", "macaddress" => "64:52:11:22:03:25"} }
6
+ let(:values) { {"filesystems" => "apfs,autofs,devfs", "macaddress" => "64:52:11:22:03:2e"} }
7
7
 
8
8
  before :each do
9
9
  Puppet::Node::Facts.indirection.terminus_class = :memory
@@ -21,7 +21,7 @@ describe Puppet::Application::Facts do
21
21
  name: whatever
22
22
  values:
23
23
  filesystems: apfs,autofs,devfs
24
- macaddress: "64:52:11:22:03:25"
24
+ macaddress: "64:52:11:22:03:2e"
25
25
  END
26
26
 
27
27
  expect {
@@ -42,7 +42,7 @@ describe Puppet::Application::Facts do
42
42
  name: #{Puppet[:certname]}
43
43
  values:
44
44
  filesystems: apfs,autofs,devfs
45
- macaddress: "64:52:11:22:03:25"
45
+ macaddress: "64:52:11:22:03:2e"
46
46
  END
47
47
 
48
48
  expect {
@@ -52,7 +52,12 @@ describe Puppet::Application::Facts do
52
52
  end
53
53
 
54
54
  context 'when show action is called' do
55
- let(:expected) { "{\n \"filesystems\": \"apfs,autofs,devfs\",\n \"macaddress\": \"64:52:11:22:03:25\"\n}\n" }
55
+ let(:expected) { <<~END }
56
+ {
57
+ "filesystems": "apfs,autofs,devfs",
58
+ "macaddress": "64:52:11:22:03:2e"
59
+ }
60
+ END
56
61
 
57
62
  before :each do
58
63
  Puppet::Node::Facts.indirection.terminus_class = :facter
@@ -64,12 +69,58 @@ describe Puppet::Application::Facts do
64
69
  expect {
65
70
  app.run
66
71
  }.to exit_with(0)
67
- .and output(expected).to_stdout
72
+ .and output(expected).to_stdout
73
+ end
74
+
75
+ it 'displays a single fact value' do
76
+ app.command_line.args << 'filesystems' << '--value-only'
77
+ expect {
78
+ app.run
79
+ }.to exit_with(0)
80
+ .and output("apfs,autofs,devfs\n").to_stdout
81
+ end
82
+
83
+ it "warns and ignores value-only when multiple fact names are specified" do
84
+ app.command_line.args << 'filesystems' << 'macaddress' << '--value-only'
85
+ expect {
86
+ app.run
87
+ }.to exit_with(0)
88
+ .and output(expected).to_stdout
89
+ .and output(/it can only be used when querying for a single fact/).to_stderr
90
+ end
91
+
92
+ {
93
+ "type_hash" => [{'a' => 2}, "{\n \"a\": 2\n}"],
94
+ "type_array" => [[], "[\n\n]"],
95
+ "type_string" => ["str", "str"],
96
+ "type_int" => [1, "1"],
97
+ "type_float" => [1.0, "1.0"],
98
+ "type_true" => [true, "true"],
99
+ "type_false" => [false, "false"],
100
+ "type_nil" => [nil, ""],
101
+ "type_sym" => [:sym, "sym"]
102
+ }.each_pair do |name, values|
103
+ it "renders '#{name}' as '#{values.last}'" do
104
+ fact_value = values.first
105
+ fact_output = values.last
106
+
107
+ allow(Facter).to receive(:resolve).and_return({name => fact_value})
108
+
109
+ app.command_line.args << name << '--value-only'
110
+ expect {
111
+ app.run
112
+ }.to exit_with(0)
113
+ .and output("#{fact_output}\n").to_stdout
114
+ end
68
115
  end
69
116
  end
70
117
 
71
118
  context 'when default action is called' do
72
- let(:expected) { "---\nfilesystems: apfs,autofs,devfs\nmacaddress: 64:52:11:22:03:25\n" }
119
+ let(:expected) { <<~END }
120
+ ---
121
+ filesystems: apfs,autofs,devfs
122
+ macaddress: 64:52:11:22:03:2e
123
+ END
73
124
 
74
125
  before :each do
75
126
  Puppet::Node::Facts.indirection.terminus_class = :facter
@@ -81,7 +132,7 @@ describe Puppet::Application::Facts do
81
132
  expect {
82
133
  app.run
83
134
  }.to exit_with(0)
84
- .and output(expected).to_stdout
135
+ .and output(expected).to_stdout
85
136
  expect(app.action.name).to eq(:show)
86
137
  end
87
138
  end
@@ -42,7 +42,6 @@ describe Puppet::Application::Filebucket do
42
42
  describe "during setup" do
43
43
  before :each do
44
44
  allow(Puppet::Log).to receive(:newdestination)
45
- allow(Puppet).to receive(:settraps)
46
45
  allow(Puppet::FileBucket::Dipper).to receive(:new)
47
46
  allow(@filebucket.options).to receive(:[])
48
47
  end
@@ -159,7 +158,6 @@ describe Puppet::Application::Filebucket do
159
158
  describe "when running" do
160
159
  before :each do
161
160
  allow(Puppet::Log).to receive(:newdestination)
162
- allow(Puppet).to receive(:settraps)
163
161
  allow(Puppet::FileBucket::Dipper).to receive(:new)
164
162
  allow(@filebucket.options).to receive(:[])
165
163
 
@@ -432,4 +432,27 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
432
432
  expects_command_to_pass
433
433
  end
434
434
  end
435
+
436
+ context 'when showing' do
437
+ before do
438
+ ssl.command_line.args << 'show'
439
+ File.write(Puppet[:hostcert], @host[:cert].to_pem)
440
+ end
441
+
442
+ it 'reports if the key is missing' do
443
+ File.delete(Puppet[:hostprivkey])
444
+
445
+ expects_command_to_fail(/The private key is missing from/)
446
+ end
447
+
448
+ it 'reports if the cert is missing' do
449
+ File.delete(Puppet[:hostcert])
450
+
451
+ expects_command_to_fail(/The client certificate is missing from/)
452
+ end
453
+
454
+ it 'prints certificate information' do
455
+ expects_command_to_pass(@host[:cert].to_text)
456
+ end
457
+ end
435
458
  end
@@ -7,8 +7,10 @@ require 'timeout'
7
7
 
8
8
  describe Puppet::Application do
9
9
  before(:each) do
10
- @app = Class.new(Puppet::Application).new
11
- @appclass = @app.class
10
+ @appclass = Class.new(Puppet::Application) do
11
+ def handle_unknown(opt, arg); end
12
+ end
13
+ @app = @appclass.new
12
14
 
13
15
  allow(@app).to receive(:name).and_return("test_app")
14
16
  end
@@ -594,13 +596,6 @@ describe Puppet::Application do
594
596
  end
595
597
 
596
598
  it "should raise an error if dispatch returns no command" do
597
- allow(@app).to receive(:get_command).and_return(nil)
598
- expect(Puppet).to receive(:send_log).with(:err, "Could not run: No valid command or main")
599
- expect { @app.run }.to exit_with 1
600
- end
601
-
602
- it "should raise an error if dispatch returns an invalid command" do
603
- allow(@app).to receive(:get_command).and_return(:this_function_doesnt_exist)
604
599
  expect(Puppet).to receive(:send_log).with(:err, "Could not run: No valid command or main")
605
600
  expect { @app.run }.to exit_with 1
606
601
  end
@@ -718,5 +713,18 @@ describe Puppet::Application do
718
713
 
719
714
  @app.handle_logdest_arg(nil)
720
715
  end
716
+
717
+ it "accepts multiple destinations as a comma sepparated list" do
718
+ dest1 = '/tmp/path1'
719
+ dest2 = 'console'
720
+ dest3 = '/tmp/path2'
721
+ dest_args = [dest1, dest2, dest3].join(' , ')
722
+
723
+ [dest1, dest2, dest3].each do |dest|
724
+ expect(Puppet::Util::Log).to receive(:newdestination).with(dest)
725
+ end
726
+
727
+ @app.handle_logdest_arg(dest_args)
728
+ end
721
729
  end
722
730
  end
@@ -22,7 +22,7 @@ describe Puppet::Confine::Feature do
22
22
  end
23
23
 
24
24
  it "should use the Puppet features instance to test validity" do
25
- expect(Puppet.features).to receive(:myfeature?)
25
+ Puppet.features.add(:myfeature) do true end
26
26
  @confine.valid?
27
27
  end
28
28
 
@@ -2,6 +2,12 @@ require 'spec_helper'
2
2
 
3
3
  require 'puppet/confine'
4
4
 
5
+ class Puppet::TestConfine < Puppet::Confine
6
+ def pass?(value)
7
+ false
8
+ end
9
+ end
10
+
5
11
  describe Puppet::Confine do
6
12
  it "should require a value" do
7
13
  expect { Puppet::Confine.new }.to raise_error(ArgumentError)
@@ -33,7 +39,7 @@ describe Puppet::Confine do
33
39
 
34
40
  describe "when testing all values" do
35
41
  before do
36
- @confine = Puppet::Confine.new(%w{a b c})
42
+ @confine = Puppet::TestConfine.new(%w{a b c})
37
43
  @confine.label = "foo"
38
44
  end
39
45
 
@@ -64,7 +70,7 @@ describe Puppet::Confine do
64
70
  end
65
71
 
66
72
  describe "when testing the result of the values" do
67
- before { @confine = Puppet::Confine.new(%w{a b c d}) }
73
+ before { @confine = Puppet::TestConfine.new(%w{a b c d}) }
68
74
 
69
75
  it "should return an array with the result of the test for each value" do
70
76
  allow(@confine).to receive(:pass?).and_return(true)
@@ -1,13 +1,8 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/environments'
3
3
  require 'puppet/file_system'
4
- require 'matchers/include'
5
- require 'matchers/include_in_order'
6
4
 
7
- module PuppetEnvironments
8
5
  describe Puppet::Environments do
9
- include Matchers::Include
10
-
11
6
  FS = Puppet::FileSystem
12
7
 
13
8
  before(:each) do
@@ -49,7 +44,7 @@ describe Puppet::Environments do
49
44
  loader_from(:filesystem => [directory_tree, global_path_1, global_path_2],
50
45
  :directory => directory_tree.children.first,
51
46
  :modulepath => [global_path_1_location, global_path_2_location]) do |loader|
52
- expect(loader.list).to include_in_any_order(
47
+ expect(loader.list).to contain_exactly(
53
48
  environment(:an_environment).
54
49
  with_manifest("#{FS.path_string(directory_tree)}/envdir/an_environment/manifests").
55
50
  with_modulepath(["#{FS.path_string(directory_tree)}/envdir/an_environment/modules",
@@ -87,7 +82,7 @@ describe Puppet::Environments do
87
82
 
88
83
  loader_from(:filesystem => [envdir],
89
84
  :directory => envdir) do |loader|
90
- expect(loader.list).to include_in_any_order(environment(:env1), environment(:env2))
85
+ expect(loader.list).to contain_exactly(environment(:env1), environment(:env2))
91
86
  end
92
87
  end
93
88
 
@@ -406,33 +401,29 @@ config_version=$vardir/random/scripts
406
401
  ]),
407
402
  ])
408
403
 
409
- FS.overlay(original_envdir) do
410
- dir_loader = Puppet::Environments::Directories.new(original_envdir, [])
411
- loader = Puppet::Environments::Cached.new(dir_loader)
412
- Puppet.override(:environments => loader) do
413
- original_env = loader.get("env3") # force the environment.conf to be read
414
-
415
- changed_envdir = FS::MemoryFile.a_directory(base_dir, [
416
- FS::MemoryFile.a_directory("env3", [
417
- FS::MemoryFile.a_regular_file_containing("environment.conf", <<-EOF)
418
- manifest=/manifest_changed
419
- modulepath=/modules_changed
420
- environment_timeout=0
421
- EOF
422
- ]),
423
- ])
404
+ cached_loader_from(:filesystem => [original_envdir], :directory => original_envdir) do |loader|
405
+ original_env = loader.get("env3") # force the environment.conf to be read
424
406
 
425
- FS.overlay(changed_envdir) do
426
- changed_env = loader.get("env3")
407
+ changed_envdir = FS::MemoryFile.a_directory(base_dir, [
408
+ FS::MemoryFile.a_directory("env3", [
409
+ FS::MemoryFile.a_regular_file_containing("environment.conf", <<-EOF)
410
+ manifest=/manifest_changed
411
+ modulepath=/modules_changed
412
+ environment_timeout=0
413
+ EOF
414
+ ]),
415
+ ])
427
416
 
428
- expect(original_env).to environment(:env3).
429
- with_manifest(File.expand_path("/manifest_orig")).
430
- with_full_modulepath([File.expand_path("/modules_orig")])
417
+ FS.overlay(changed_envdir) do
418
+ changed_env = loader.get("env3")
431
419
 
432
- expect(changed_env).to environment(:env3).
433
- with_manifest(File.expand_path("/manifest_changed")).
434
- with_full_modulepath([File.expand_path("/modules_changed")])
435
- end
420
+ expect(original_env).to environment(:env3).
421
+ with_manifest(File.expand_path("/manifest_orig")).
422
+ with_full_modulepath([File.expand_path("/modules_orig")])
423
+
424
+ expect(changed_env).to environment(:env3).
425
+ with_manifest(File.expand_path("/manifest_changed")).
426
+ with_full_modulepath([File.expand_path("/modules_changed")])
436
427
  end
437
428
  end
438
429
  end
@@ -558,24 +549,49 @@ config_version=$vardir/random/scripts
558
549
 
559
550
  describe "cached loaders" do
560
551
  it "lists environments" do
561
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
562
- expect(Puppet::Environments::Cached.new(loader).list).to include_in_any_order(
552
+ cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
553
+ expect(loader.list).to contain_exactly(
563
554
  environment(:an_environment),
564
555
  environment(:another_environment),
565
556
  environment(:symlinked_environment))
566
557
  end
567
558
  end
568
559
 
560
+ it "returns the same cached environment object for list and get methods" do
561
+ cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
562
+ env = loader.list.find { |e| e.name == :an_environment }
563
+
564
+ expect(env).to equal(loader.get(:an_environment)) # same object
565
+ end
566
+ end
567
+
568
+ it "returns the same cached environment object for multiple list calls" do
569
+ cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
570
+ expect(loader.list.first).to equal(loader.list.first) # same object
571
+ end
572
+ end
573
+
574
+ it "expires environments and returns a new environment object with the same value" do
575
+ Puppet[:environment_timeout] = "0"
576
+
577
+ cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
578
+ a = loader.list.first
579
+ b = loader.list.first
580
+ expect(a).to eq(b) # same value
581
+ expect(a).to_not equal(b) # not same object
582
+ end
583
+ end
584
+
569
585
  it "has search_paths" do
570
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
571
- expect(Puppet::Environments::Cached.new(loader).search_paths).to eq(["file://#{directory_tree.children.first}"])
586
+ cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
587
+ expect(loader.search_paths).to eq(["file://#{directory_tree.children.first}"])
572
588
  end
573
589
  end
574
590
 
575
591
  context "#get" do
576
592
  it "gets an environment" do
577
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
578
- expect(Puppet::Environments::Cached.new(loader).get(:an_environment)).to environment(:an_environment)
593
+ cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
594
+ expect(loader.get(:an_environment)).to environment(:an_environment)
579
595
  end
580
596
  end
581
597
 
@@ -592,16 +608,16 @@ config_version=$vardir/random/scripts
592
608
  end
593
609
 
594
610
  it "returns nil if env not found" do
595
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
596
- expect(Puppet::Environments::Cached.new(loader).get(:doesnotexist)).to be_nil
611
+ cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
612
+ expect(loader.get(:doesnotexist)).to be_nil
597
613
  end
598
614
  end
599
615
  end
600
616
 
601
617
  context "#get!" do
602
618
  it "gets an environment" do
603
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
604
- expect(Puppet::Environments::Cached.new(loader).get!(:an_environment)).to environment(:an_environment)
619
+ cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
620
+ expect(loader.get!(:an_environment)).to environment(:an_environment)
605
621
  end
606
622
  end
607
623
 
@@ -618,14 +634,41 @@ config_version=$vardir/random/scripts
618
634
  end
619
635
 
620
636
  it "raises error if environment is not found" do
621
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
637
+ cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
622
638
  expect do
623
- Puppet::Environments::Cached.new(loader).get!(:doesnotexist)
639
+ loader.get!(:doesnotexist)
624
640
  end.to raise_error(Puppet::Environments::EnvironmentNotFound)
625
641
  end
626
642
  end
627
643
  end
628
644
 
645
+ context "#get_conf" do
646
+ it "loads environment.conf" do
647
+ cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
648
+ expect(loader.get_conf(:an_environment)).to match_environment_conf(:an_environment).
649
+ with_env_path(directory_tree.children.first).
650
+ with_global_module_path([])
651
+ end
652
+ end
653
+
654
+ it "always reloads environment.conf" do
655
+ env = Puppet::Node::Environment.create(:cached, [])
656
+ mocked_loader = double('loader')
657
+ expect(mocked_loader).to receive(:get_conf).with(:cached).and_return(Puppet::Settings::EnvironmentConf.static_for(env, 20)).twice
658
+
659
+ cached = Puppet::Environments::Cached.new(mocked_loader)
660
+
661
+ cached.get_conf(:cached)
662
+ cached.get_conf(:cached)
663
+ end
664
+
665
+ it "returns nil if environment is not found" do
666
+ cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
667
+ expect(loader.get_conf(:doesnotexist)).to be_nil
668
+ end
669
+ end
670
+ end
671
+
629
672
  context "expiration policies" do
630
673
  let(:service) { ReplayExpirationService.new }
631
674
 
@@ -647,8 +690,6 @@ config_version=$vardir/random/scripts
647
690
  end
648
691
 
649
692
  it "evicts an expired environment" do
650
- service = ReplayExpirationService.new
651
-
652
693
  expect(service).to receive(:expired?).and_return(true)
653
694
 
654
695
  with_environment_loaded(service) do |cached|
@@ -700,13 +741,15 @@ config_version=$vardir/random/scripts
700
741
  expect(service.created_envs).to eq([:an_environment, :an_environment])
701
742
  expect(service.evicted_envs).to eq([:an_environment])
702
743
  end
703
- end
704
744
 
705
- it "gets an environment.conf" do
706
- loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
707
- expect(Puppet::Environments::Cached.new(loader).get_conf(:an_environment)).to match_environment_conf(:an_environment).
708
- with_env_path(directory_tree.children.first).
709
- with_global_module_path([])
745
+ it "evicts expired environments when listing" do
746
+ expect(service).to receive(:expired?).with(:an_environment).and_return(true)
747
+
748
+ with_environment_loaded(service) do |cached|
749
+ cached.list
750
+ end
751
+
752
+ expect(service.evicted_envs).to eq([:an_environment])
710
753
  end
711
754
  end
712
755
 
@@ -724,6 +767,30 @@ config_version=$vardir/random/scripts
724
767
 
725
768
  context '#clear_all' do
726
769
  let(:service) { ReplayExpirationService.new }
770
+ let(:envdir) { File.expand_path("envdir") }
771
+ let(:default_dir) { File.join(envdir, "cached_env", "modules") }
772
+ let(:expected_dir) { File.join(envdir, "cached_env", "site") }
773
+
774
+ let(:base_dir) do
775
+ FS::MemoryFile.a_directory(envdir, [
776
+ FS::MemoryFile.a_directory("cached_env", [
777
+ FS::MemoryFile.a_missing_file("environment.conf")
778
+ ])
779
+ ])
780
+ end
781
+
782
+ let(:updated_dir) do
783
+ FS::MemoryFile.a_directory(envdir, [
784
+ FS::MemoryFile.a_directory("cached_env", [
785
+ FS::MemoryFile.a_directory("site"),
786
+ FS::MemoryFile.a_missing_directory("modules"),
787
+ FS::MemoryFile.a_regular_file_containing("environment.conf", <<-EOF)
788
+ modulepath=site
789
+ environment_timeout=unlimited
790
+ EOF
791
+ ])
792
+ ])
793
+ end
727
794
 
728
795
  it 'evicts all environments' do
729
796
  with_environment_loaded(service) do |cached|
@@ -735,48 +802,44 @@ config_version=$vardir/random/scripts
735
802
  end
736
803
  end
737
804
 
738
- it 'clears cached environment settings' do
739
- base_dir = File.expand_path("envdir")
740
- original_envdir = FS::MemoryFile.a_directory(base_dir, [
741
- FS::MemoryFile.a_directory("env3", [
742
- FS::MemoryFile.a_regular_file_containing("environment.conf", <<-EOF)
743
- manifest=/manifest_orig
744
- modulepath=/modules_orig
745
- environment_timeout=60
746
- EOF
747
- ]),
748
- ])
805
+ it "recomputes modulepath if 'get' is called before 'clear_all'" do
806
+ cached_loader_from(:filesystem => [base_dir], :directory => base_dir) do |loader|
807
+ loader.get(:cached_env)
749
808
 
750
- FS.overlay(original_envdir) do
751
- dir_loader = Puppet::Environments::Directories.new(original_envdir, [])
752
- loader = Puppet::Environments::Cached.new(dir_loader)
753
- Puppet.override(:environments => loader) do
754
- original_env = loader.get("env3") # force the environment.conf to be read
755
-
756
- changed_envdir = FS::MemoryFile.a_directory(base_dir, [
757
- FS::MemoryFile.a_directory("env3", [
758
- FS::MemoryFile.a_regular_file_containing("environment.conf", <<-EOF)
759
- manifest=/manifest_changed
760
- modulepath=/modules_changed
761
- environment_timeout=60
762
- EOF
763
- ]),
764
- ])
809
+ expect(Puppet.settings.value(:modulepath, :cached_env)).to eq(default_dir)
765
810
 
766
- #Clear all cached environments
811
+ FS.overlay(updated_dir) do
767
812
  loader.clear_all
768
813
 
769
- FS.overlay(changed_envdir) do
770
- changed_env = loader.get("env3")
814
+ expect(loader.get(:cached_env).modulepath).to contain_exactly(expected_dir)
815
+ end
816
+ end
817
+ end
818
+
819
+ it "recomputes modulepath if 'list' is called before 'clear_all'" do
820
+ cached_loader_from(:filesystem => [base_dir], :directory => base_dir) do |loader|
821
+ loader.list
771
822
 
772
- expect(original_env).to environment(:env3).
773
- with_manifest(File.expand_path("/manifest_orig")).
774
- with_full_modulepath([File.expand_path("/modules_orig")])
823
+ expect(Puppet.settings.value(:modulepath, :cached_env)).to eq(default_dir)
775
824
 
776
- expect(changed_env).to environment(:env3).
777
- with_manifest(File.expand_path("/manifest_changed")).
778
- with_full_modulepath([File.expand_path("/modules_changed")])
779
- end
825
+ FS.overlay(updated_dir) do
826
+ loader.clear_all
827
+
828
+ expect(loader.get(:cached_env).modulepath).to contain_exactly(expected_dir)
829
+ end
830
+ end
831
+ end
832
+
833
+ it "recomputes modulepath if 'get_conf' is called before 'clear_all'" do
834
+ cached_loader_from(:filesystem => [base_dir], :directory => base_dir) do |loader|
835
+ loader.get_conf(:cached_env)
836
+
837
+ expect(Puppet.settings.value(:modulepath, :cached_env)).to eq(default_dir)
838
+
839
+ FS.overlay(updated_dir) do
840
+ loader.clear_all
841
+
842
+ expect(loader.get(:cached_env).modulepath).to contain_exactly(expected_dir)
780
843
  end
781
844
  end
782
845
  end
@@ -862,6 +925,20 @@ config_version=$vardir/random/scripts
862
925
  end
863
926
  end
864
927
 
928
+ def cached_loader_from(options, &block)
929
+ FS.overlay(*options[:filesystem]) do
930
+ environments = Puppet::Environments::Cached.new(
931
+ Puppet::Environments::Directories.new(
932
+ options[:directory],
933
+ options[:modulepath] || []
934
+ )
935
+ )
936
+ Puppet.override(:environments => environments) do
937
+ yield environments
938
+ end
939
+ end
940
+ end
941
+
865
942
  def loader_from(options, &block)
866
943
  FS.overlay(*options[:filesystem]) do
867
944
  environments = Puppet::Environments::Directories.new(
@@ -914,4 +991,3 @@ config_version=$vardir/random/scripts
914
991
  end
915
992
  end
916
993
  end
917
- end