puppet 6.19.0-x64-mingw32 → 6.22.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 (212) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +3 -1
  4. data/Gemfile.lock +50 -39
  5. data/ext/project_data.yaml +2 -2
  6. data/lib/puppet/application.rb +10 -6
  7. data/lib/puppet/application/agent.rb +1 -0
  8. data/lib/puppet/application/apply.rb +3 -2
  9. data/lib/puppet/application/device.rb +1 -0
  10. data/lib/puppet/application/filebucket.rb +2 -2
  11. data/lib/puppet/application/script.rb +1 -0
  12. data/lib/puppet/application/ssl.rb +11 -0
  13. data/lib/puppet/application_support.rb +7 -0
  14. data/lib/puppet/configurer.rb +28 -18
  15. data/lib/puppet/defaults.rb +46 -20
  16. data/lib/puppet/environments.rb +54 -55
  17. data/lib/puppet/face/config.rb +10 -0
  18. data/lib/puppet/face/epp.rb +12 -2
  19. data/lib/puppet/face/facts.rb +158 -0
  20. data/lib/puppet/ffi/posix.rb +10 -0
  21. data/lib/puppet/ffi/posix/constants.rb +14 -0
  22. data/lib/puppet/ffi/posix/functions.rb +24 -0
  23. data/lib/puppet/file_system/memory_file.rb +8 -1
  24. data/lib/puppet/file_system/windows.rb +2 -0
  25. data/lib/puppet/functions/epp.rb +1 -0
  26. data/lib/puppet/functions/inline_epp.rb +1 -0
  27. data/lib/puppet/functions/partition.rb +8 -0
  28. data/lib/puppet/indirector/fact_search.rb +60 -0
  29. data/lib/puppet/indirector/facts/facter.rb +24 -3
  30. data/lib/puppet/indirector/facts/json.rb +27 -0
  31. data/lib/puppet/indirector/facts/yaml.rb +3 -58
  32. data/lib/puppet/indirector/json.rb +5 -1
  33. data/lib/puppet/indirector/node/json.rb +8 -0
  34. data/lib/puppet/indirector/report/json.rb +34 -0
  35. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  36. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  37. data/lib/puppet/network/formats.rb +69 -1
  38. data/lib/puppet/network/http/factory.rb +4 -0
  39. data/lib/puppet/pal/pal_impl.rb +70 -17
  40. data/lib/puppet/parser/ast/leaf.rb +3 -2
  41. data/lib/puppet/parser/templatewrapper.rb +1 -1
  42. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  43. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  44. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  45. data/lib/puppet/property/list.rb +1 -1
  46. data/lib/puppet/provider/group/groupadd.rb +13 -8
  47. data/lib/puppet/provider/package/apt.rb +34 -2
  48. data/lib/puppet/provider/package/aptitude.rb +6 -0
  49. data/lib/puppet/provider/package/dnfmodule.rb +1 -1
  50. data/lib/puppet/provider/service/debian.rb +2 -0
  51. data/lib/puppet/provider/service/systemd.rb +1 -1
  52. data/lib/puppet/provider/user/aix.rb +2 -2
  53. data/lib/puppet/provider/user/useradd.rb +62 -8
  54. data/lib/puppet/reference/configuration.rb +6 -5
  55. data/lib/puppet/settings.rb +43 -15
  56. data/lib/puppet/settings/alias_setting.rb +37 -0
  57. data/lib/puppet/settings/base_setting.rb +26 -2
  58. data/lib/puppet/settings/environment_conf.rb +1 -0
  59. data/lib/puppet/type/package.rb +3 -3
  60. data/lib/puppet/util/autoload.rb +1 -8
  61. data/lib/puppet/util/fact_dif.rb +81 -0
  62. data/lib/puppet/util/monkey_patches.rb +7 -0
  63. data/lib/puppet/util/posix.rb +54 -5
  64. data/lib/puppet/util/rubygems.rb +5 -1
  65. data/lib/puppet/util/windows/adsi.rb +46 -0
  66. data/lib/puppet/util/windows/api_types.rb +1 -1
  67. data/lib/puppet/util/windows/principal.rb +9 -2
  68. data/lib/puppet/util/windows/service.rb +1 -1
  69. data/lib/puppet/util/windows/sid.rb +4 -2
  70. data/lib/puppet/version.rb +1 -1
  71. data/locales/puppet.pot +295 -219
  72. data/man/man5/puppet.conf.5 +15 -7
  73. data/man/man8/puppet-agent.8 +2 -2
  74. data/man/man8/puppet-apply.8 +2 -2
  75. data/man/man8/puppet-catalog.8 +1 -1
  76. data/man/man8/puppet-config.8 +1 -1
  77. data/man/man8/puppet-describe.8 +1 -1
  78. data/man/man8/puppet-device.8 +2 -2
  79. data/man/man8/puppet-doc.8 +1 -1
  80. data/man/man8/puppet-epp.8 +1 -1
  81. data/man/man8/puppet-facts.8 +90 -1
  82. data/man/man8/puppet-filebucket.8 +3 -3
  83. data/man/man8/puppet-generate.8 +1 -1
  84. data/man/man8/puppet-help.8 +1 -1
  85. data/man/man8/puppet-key.8 +1 -1
  86. data/man/man8/puppet-lookup.8 +1 -1
  87. data/man/man8/puppet-man.8 +1 -1
  88. data/man/man8/puppet-module.8 +1 -1
  89. data/man/man8/puppet-node.8 +4 -1
  90. data/man/man8/puppet-parser.8 +1 -1
  91. data/man/man8/puppet-plugin.8 +1 -1
  92. data/man/man8/puppet-report.8 +4 -1
  93. data/man/man8/puppet-resource.8 +1 -1
  94. data/man/man8/puppet-script.8 +2 -2
  95. data/man/man8/puppet-ssl.8 +5 -1
  96. data/man/man8/puppet-status.8 +1 -1
  97. data/man/man8/puppet.8 +2 -2
  98. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  99. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services_vendor_preset +9 -0
  100. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  101. data/spec/integration/application/agent_spec.rb +160 -3
  102. data/spec/integration/application/apply_spec.rb +19 -0
  103. data/spec/integration/application/plugin_spec.rb +1 -1
  104. data/spec/integration/defaults_spec.rb +0 -7
  105. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  106. data/spec/integration/http/client_spec.rb +12 -0
  107. data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
  108. data/spec/integration/resource/type_collection_spec.rb +2 -6
  109. data/spec/integration/transaction_spec.rb +4 -9
  110. data/spec/integration/util/windows/adsi_spec.rb +21 -1
  111. data/spec/integration/util/windows/principal_spec.rb +21 -0
  112. data/spec/integration/util/windows/registry_spec.rb +6 -10
  113. data/spec/lib/puppet_spec/settings.rb +6 -1
  114. data/spec/spec_helper.rb +12 -5
  115. data/spec/unit/agent_spec.rb +8 -6
  116. data/spec/unit/application/agent_spec.rb +0 -1
  117. data/spec/unit/application/config_spec.rb +224 -4
  118. data/spec/unit/application/facts_spec.rb +482 -3
  119. data/spec/unit/application/filebucket_spec.rb +0 -2
  120. data/spec/unit/application/ssl_spec.rb +23 -0
  121. data/spec/unit/application_spec.rb +51 -9
  122. data/spec/unit/confine/feature_spec.rb +1 -1
  123. data/spec/unit/confine_spec.rb +8 -2
  124. data/spec/unit/defaults_spec.rb +36 -1
  125. data/spec/unit/environments_spec.rb +221 -68
  126. data/spec/unit/face/config_spec.rb +27 -32
  127. data/spec/unit/face/facts_spec.rb +4 -0
  128. data/spec/unit/face/node_spec.rb +0 -11
  129. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  130. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  131. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  132. data/spec/unit/file_system_spec.rb +9 -0
  133. data/spec/unit/forge/module_release_spec.rb +2 -7
  134. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  135. data/spec/unit/http/service/compiler_spec.rb +49 -0
  136. data/spec/unit/http/service_spec.rb +1 -1
  137. data/spec/unit/indirector/face_spec.rb +0 -1
  138. data/spec/unit/indirector/facts/facter_spec.rb +95 -1
  139. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  140. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  141. data/spec/unit/indirector/indirection_spec.rb +8 -12
  142. data/spec/unit/indirector/key/file_spec.rb +0 -1
  143. data/spec/unit/indirector/node/json_spec.rb +33 -0
  144. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  145. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  146. data/spec/unit/indirector_spec.rb +2 -2
  147. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  148. data/spec/unit/network/authconfig_spec.rb +0 -3
  149. data/spec/unit/network/formats_spec.rb +41 -0
  150. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  151. data/spec/unit/network/http/factory_spec.rb +19 -0
  152. data/spec/unit/network/http/handler_spec.rb +0 -5
  153. data/spec/unit/parser/compiler_spec.rb +3 -19
  154. data/spec/unit/parser/resource_spec.rb +14 -8
  155. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  156. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  157. data/spec/unit/property_spec.rb +1 -0
  158. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  159. data/spec/unit/provider/nameservice_spec.rb +66 -65
  160. data/spec/unit/provider/package/apt_spec.rb +28 -23
  161. data/spec/unit/provider/package/aptitude_spec.rb +1 -1
  162. data/spec/unit/provider/package/base_spec.rb +6 -5
  163. data/spec/unit/provider/package/dnfmodule_spec.rb +10 -1
  164. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  165. data/spec/unit/provider/package/pip_spec.rb +6 -11
  166. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  167. data/spec/unit/provider/service/systemd_spec.rb +11 -0
  168. data/spec/unit/provider/user/aix_spec.rb +5 -0
  169. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  170. data/spec/unit/provider/user/pw_spec.rb +2 -0
  171. data/spec/unit/provider/user/useradd_spec.rb +71 -3
  172. data/spec/unit/provider_spec.rb +8 -10
  173. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  174. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  175. data/spec/unit/resource/catalog_spec.rb +1 -1
  176. data/spec/unit/resource/type_spec.rb +1 -1
  177. data/spec/unit/resource_spec.rb +11 -10
  178. data/spec/unit/settings_spec.rb +543 -228
  179. data/spec/unit/ssl/base_spec.rb +0 -1
  180. data/spec/unit/ssl/host_spec.rb +0 -5
  181. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  182. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  183. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  184. data/spec/unit/transaction_spec.rb +13 -4
  185. data/spec/unit/type/file/content_spec.rb +0 -1
  186. data/spec/unit/type/file/selinux_spec.rb +0 -2
  187. data/spec/unit/type/file_spec.rb +0 -6
  188. data/spec/unit/type/group_spec.rb +13 -6
  189. data/spec/unit/type/resources_spec.rb +7 -7
  190. data/spec/unit/type/service_spec.rb +1 -1
  191. data/spec/unit/type/tidy_spec.rb +0 -1
  192. data/spec/unit/type_spec.rb +2 -2
  193. data/spec/unit/util/at_fork_spec.rb +2 -2
  194. data/spec/unit/util/autoload_spec.rb +5 -1
  195. data/spec/unit/util/backups_spec.rb +1 -2
  196. data/spec/unit/util/execution_spec.rb +15 -11
  197. data/spec/unit/util/inifile_spec.rb +6 -14
  198. data/spec/unit/util/log_spec.rb +8 -7
  199. data/spec/unit/util/logging_spec.rb +3 -3
  200. data/spec/unit/util/posix_spec.rb +363 -15
  201. data/spec/unit/util/rubygems_spec.rb +2 -2
  202. data/spec/unit/util/selinux_spec.rb +76 -52
  203. data/spec/unit/util/storage_spec.rb +3 -1
  204. data/spec/unit/util/suidmanager_spec.rb +44 -41
  205. data/spec/unit/util/windows/sid_spec.rb +6 -0
  206. data/spec/unit/util_spec.rb +13 -6
  207. metadata +31 -16
  208. data/spec/integration/application/config_spec.rb +0 -74
  209. data/spec/lib/matchers/include.rb +0 -27
  210. data/spec/lib/matchers/include_spec.rb +0 -32
  211. data/spec/unit/face/catalog_spec.rb +0 -6
  212. data/spec/unit/face/module_spec.rb +0 -3
@@ -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 {
@@ -50,4 +50,483 @@ describe Puppet::Application::Facts do
50
50
  }.to exit_with(0)
51
51
  .and output(expected).to_stdout
52
52
  end
53
+
54
+ context 'when show action is called' do
55
+ let(:expected) { <<~END }
56
+ {
57
+ "filesystems": "apfs,autofs,devfs",
58
+ "macaddress": "64:52:11:22:03:2e"
59
+ }
60
+ END
61
+
62
+ before :each do
63
+ Puppet::Node::Facts.indirection.terminus_class = :facter
64
+ allow(Facter).to receive(:resolve).and_return(values)
65
+ app.command_line.args = %w{show}
66
+ end
67
+
68
+ it 'correctly displays facts with default formatting' do
69
+ expect {
70
+ app.run
71
+ }.to exit_with(0)
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
115
+ end
116
+ end
117
+
118
+ context 'when diff action is called' do
119
+ let(:facter3_facts) { <<~END }
120
+ {
121
+ "hypervisors": {
122
+ "vmware": {
123
+ "version": ""
124
+ }
125
+ },
126
+ "networking": {
127
+ "interfaces": {
128
+ "lo": {
129
+ "bindings6": [
130
+ {
131
+ "network": "::1"
132
+ }
133
+ ]
134
+ },
135
+ "em0.1": {
136
+ "ip": "0.0.0.0"
137
+ }
138
+ }
139
+ },
140
+ "macaddress": "64:52:11:22:03:2e",
141
+ "obsolete_fact": "true",
142
+ "mountpoints": {
143
+ "/var": {
144
+ "options": [
145
+ "noatime",
146
+ "journaled",
147
+ "nobrowse"
148
+ ]
149
+ }
150
+ }
151
+ }
152
+ END
153
+
154
+ let(:facter4_facts) { <<~END }
155
+ {
156
+ "hypervisors": {
157
+ "vmware": {
158
+ "version": "ESXi 6.7"
159
+ }
160
+ },
161
+ "networking": {
162
+ "interfaces": {
163
+ "lo": {
164
+ "bindings6": [
165
+ {
166
+ "network": "::1",
167
+ "scope6": "host"
168
+ }
169
+ ]
170
+ },
171
+ "em0.1": {
172
+ "ip": "127.0.0.1"
173
+ }
174
+ }
175
+ },
176
+ "macaddress": "64:52:11:22:03:2e",
177
+ "mountpoints": {
178
+ "/var": {
179
+ "options": [
180
+ "noatime",
181
+ "nobrowse",
182
+ "journaled"
183
+ ]
184
+ }
185
+ }
186
+ }
187
+ END
188
+
189
+ before :each do
190
+ Puppet::Node::Facts.indirection.terminus_class = :facter
191
+ app.command_line.args = %w{diff}
192
+
193
+ allow(Facter).to receive(:value).with('facterversion').and_return('3.99.0')
194
+ allow(Puppet::Util::Execution).to receive(:execute).with(/puppet facts show --no-facterng/, combine:false).and_return(facter3_facts)
195
+ allow(Puppet::Util::Execution).to receive(:execute).with(/puppet facts show --facterng/, combine:false).and_return(facter4_facts)
196
+ end
197
+
198
+ # Workaround for YAML issue on Ubuntu where null values get space as key
199
+ let(:regex) { false }
200
+ shared_examples_for 'correctly rendering output' do |render_format|
201
+ it 'correctly displays output' do
202
+ app.command_line.args << '--structured' if structured
203
+ app.command_line.args << '--exclude' << exclude if exclude
204
+ app.command_line.args << '--render-as' << render_format if render_format
205
+ expect {
206
+ app.run
207
+ }.to exit_with(0)
208
+ .and output(regex ? /#{expected_output}/ : expected_output).to_stdout
209
+ end
210
+ end
211
+
212
+ context 'when no exclude regex is provided via CLI' do
213
+ let(:exclude) { nil }
214
+ context 'when structured is requested' do
215
+ let(:structured) { true }
216
+ context 'when rendering is set to default' do
217
+ let(:expected_output) { <<~END }
218
+ {
219
+ "hypervisors": {
220
+ "vmware": {
221
+ "version": {
222
+ "new_value": "ESXi 6.7",
223
+ "old_value": ""
224
+ }
225
+ }
226
+ },
227
+ "mountpoints": {
228
+ "/var": {
229
+ "options": {
230
+ "1": {
231
+ "new_value": "nobrowse",
232
+ "old_value": "journaled"
233
+ },
234
+ "2": {
235
+ "new_value": "journaled",
236
+ "old_value": "nobrowse"
237
+ }
238
+ }
239
+ }
240
+ },
241
+ "networking": {
242
+ "interfaces": {
243
+ "em0.1": {
244
+ "ip": {
245
+ "new_value": "127.0.0.1",
246
+ "old_value": "0.0.0.0"
247
+ }
248
+ },
249
+ "lo": {
250
+ "bindings6": {
251
+ "0": {
252
+ "scope6": {
253
+ "new_value": "host",
254
+ "old_value": null
255
+ }
256
+ }
257
+ }
258
+ }
259
+ }
260
+ },
261
+ "obsolete_fact": {
262
+ "new_value": null,
263
+ "old_value": "true"
264
+ }
265
+ }
266
+ END
267
+
268
+ it_behaves_like 'correctly rendering output'
269
+ end
270
+
271
+ context 'when rendering is set to yaml' do
272
+ # Workaround for YAML issue on Ubuntu where null values get space as key
273
+ let(:regex) { true }
274
+ let(:expected_output) { <<~END }
275
+ ---
276
+ hypervisors:
277
+ vmware:
278
+ version:
279
+ :new_value: ESXi 6\.7
280
+ :old_value: ''
281
+ mountpoints:
282
+ "/var":
283
+ options:
284
+ 1:
285
+ :new_value: nobrowse
286
+ :old_value: journaled
287
+ 2:
288
+ :new_value: journaled
289
+ :old_value: nobrowse
290
+ networking:
291
+ interfaces:
292
+ em0\.1:
293
+ ip:
294
+ :new_value: 127\.0\.0\.1
295
+ :old_value: 0\.0\.0\.0
296
+ lo:
297
+ bindings6:
298
+ 0:
299
+ scope6:
300
+ :new_value: host
301
+ :old_value:\s?
302
+ obsolete_fact:
303
+ :new_value:\s?
304
+ :old_value: 'true'
305
+ END
306
+
307
+ it_behaves_like 'correctly rendering output', 'yaml'
308
+ end
309
+
310
+ context 'when rendering is set to json' do
311
+ let(:expected_output) { <<~END }
312
+ {"hypervisors":{"vmware":{"version":{"new_value":"ESXi 6.7","old_value":""}}},\
313
+ "mountpoints":{"/var":{"options":{"1":{"new_value":"nobrowse","old_value":"journaled"},\
314
+ "2":{"new_value":"journaled","old_value":"nobrowse"}}}},"networking":{"interfaces":\
315
+ {"em0.1":{"ip":{"new_value":"127.0.0.1","old_value":"0.0.0.0"}},"lo":{"bindings6":\
316
+ {"0":{"scope6":{"new_value":"host","old_value":null}}}}}},"obsolete_fact":\
317
+ {"new_value":null,"old_value":"true"}}
318
+ END
319
+
320
+ it_behaves_like 'correctly rendering output', 'json'
321
+ end
322
+ end
323
+
324
+ context 'when structured is not requested' do
325
+ let(:structured) { false }
326
+ context 'when rendering is set to default' do
327
+ let(:expected_output) { <<~END }
328
+ {
329
+ "hypervisors.vmware.version": {
330
+ "new_value": "ESXi 6.7",
331
+ "old_value": ""
332
+ },
333
+ "mountpoints./var.options.1": {
334
+ "new_value": "nobrowse",
335
+ "old_value": "journaled"
336
+ },
337
+ "mountpoints./var.options.2": {
338
+ "new_value": "journaled",
339
+ "old_value": "nobrowse"
340
+ },
341
+ "networking.interfaces.\\"em0.1\\".ip": {
342
+ "new_value": "127.0.0.1",
343
+ "old_value": "0.0.0.0"
344
+ },
345
+ "networking.interfaces.lo.bindings6.0.scope6": {
346
+ "new_value": "host",
347
+ "old_value": null
348
+ },
349
+ "obsolete_fact": {
350
+ "new_value": null,
351
+ "old_value": "true"
352
+ }
353
+ }
354
+ END
355
+
356
+ it_behaves_like 'correctly rendering output'
357
+ end
358
+
359
+ context 'when rendering is set to yaml' do
360
+ # Workaround for YAML issue on Ubuntu where null values get space as key
361
+ let(:regex) { true }
362
+ let(:expected_output) { <<~END }
363
+ ---
364
+ hypervisors\.vmware\.version:
365
+ :new_value: ESXi 6\.7
366
+ :old_value: ''
367
+ mountpoints\./var\.options\.1:
368
+ :new_value: nobrowse
369
+ :old_value: journaled
370
+ mountpoints\./var\.options\.2:
371
+ :new_value: journaled
372
+ :old_value: nobrowse
373
+ networking\.interfaces\."em0\.1"\.ip:
374
+ :new_value: 127\.0\.0\.1
375
+ :old_value: 0\.0\.0\.0
376
+ networking\.interfaces\.lo\.bindings6\.0\.scope6:
377
+ :new_value: host
378
+ :old_value:\s?
379
+ obsolete_fact:
380
+ :new_value:\s?
381
+ :old_value: 'true'
382
+ END
383
+
384
+ it_behaves_like 'correctly rendering output', 'yaml'
385
+ end
386
+
387
+ context 'when rendering is set to json' do
388
+ let(:expected_output) { <<~END }
389
+ {"hypervisors.vmware.version":{"new_value":"ESXi 6.7","old_value":""},\
390
+ "mountpoints./var.options.1":{"new_value":"nobrowse","old_value":"journaled"},\
391
+ "mountpoints./var.options.2":{"new_value":"journaled","old_value":"nobrowse"},\
392
+ "networking.interfaces.\\"em0.1\\".ip":{"new_value":"127.0.0.1",\
393
+ "old_value":"0.0.0.0"},"networking.interfaces.lo.bindings6.0.scope6":\
394
+ {"new_value":"host","old_value":null},"obsolete_fact":{"new_value":null,\
395
+ "old_value":"true"}}
396
+ END
397
+
398
+ it_behaves_like 'correctly rendering output', 'json'
399
+ end
400
+ end
401
+ end
402
+
403
+ context 'when unwanted facts are excluded from diff via CLI option' do
404
+ let(:exclude) { '^mountpoints\./var\.options.*$|^obsolete_fact$|^hypervisors' }
405
+ context 'when structured is requested' do
406
+ let(:structured) { true }
407
+ context 'when rendering is set to default' do
408
+ let(:expected_output) { <<~END }
409
+ {
410
+ "networking": {
411
+ "interfaces": {
412
+ "em0.1": {
413
+ "ip": {
414
+ "new_value": "127.0.0.1",
415
+ "old_value": "0.0.0.0"
416
+ }
417
+ },
418
+ "lo": {
419
+ "bindings6": {
420
+ "0": {
421
+ "scope6": {
422
+ "new_value": "host",
423
+ "old_value": null
424
+ }
425
+ }
426
+ }
427
+ }
428
+ }
429
+ }
430
+ }
431
+ END
432
+
433
+ it_behaves_like 'correctly rendering output'
434
+ end
435
+
436
+ context 'when rendering is set to yaml' do
437
+ # Workaround for YAML issue on Ubuntu where null values get space as key
438
+ let(:regex) { true }
439
+ let(:expected_output) { <<~END }
440
+ ---
441
+ networking:
442
+ interfaces:
443
+ em0\.1:
444
+ ip:
445
+ :new_value: 127\.0\.0\.1
446
+ :old_value: 0\.0\.0\.0
447
+ lo:
448
+ bindings6:
449
+ 0:
450
+ scope6:
451
+ :new_value: host
452
+ :old_value:\s?
453
+ END
454
+
455
+ it_behaves_like 'correctly rendering output', 'yaml'
456
+ end
457
+
458
+ context 'when rendering is set to json' do
459
+ let(:expected_output) { <<~END }
460
+ {"networking":{"interfaces":{"em0.1":{"ip":{"new_value":"127.0.0.1",\
461
+ "old_value":"0.0.0.0"}},"lo":{"bindings6":{"0":{"scope6":{"new_value":\
462
+ "host","old_value":null}}}}}}}
463
+ END
464
+
465
+ it_behaves_like 'correctly rendering output', 'json'
466
+ end
467
+ end
468
+
469
+ context 'when structured is not requested' do
470
+ let(:structured) { false }
471
+ context 'when rendering is set to default' do
472
+ let(:expected_output) { <<~END }
473
+ {
474
+ "networking.interfaces.\\"em0.1\\".ip": {
475
+ "new_value": "127.0.0.1",
476
+ "old_value": "0.0.0.0"
477
+ },
478
+ "networking.interfaces.lo.bindings6.0.scope6": {
479
+ "new_value": "host",
480
+ "old_value": null
481
+ }
482
+ }
483
+ END
484
+
485
+ it_behaves_like 'correctly rendering output'
486
+ end
487
+
488
+ context 'when rendering is set to yaml' do
489
+ # Workaround for YAML issue on Ubuntu where null values get space as key
490
+ let(:regex) { true }
491
+ let(:expected_output) { <<~END }
492
+ ---
493
+ networking\.interfaces\."em0\.1"\.ip:
494
+ :new_value: 127\.0\.0\.1
495
+ :old_value: 0\.0\.0\.0
496
+ networking\.interfaces\.lo\.bindings6\.0\.scope6:
497
+ :new_value: host
498
+ :old_value:\s?
499
+ END
500
+
501
+ it_behaves_like 'correctly rendering output', 'yaml'
502
+ end
503
+
504
+ context 'when rendering is set to json' do
505
+ let(:expected_output) { <<~END }
506
+ {"networking.interfaces.\\"em0.1\\".ip":{"new_value":"127.0.0.1",\
507
+ "old_value":"0.0.0.0"},"networking.interfaces.lo.bindings6.0.scope6":\
508
+ {"new_value":"host","old_value":null}}
509
+ END
510
+
511
+ it_behaves_like 'correctly rendering output', 'json'
512
+ end
513
+ end
514
+ end
515
+ end
516
+
517
+ context 'when default action is called' do
518
+ before :each do
519
+ Puppet::Node::Facts.indirection.terminus_class = :memory
520
+ facts = Puppet::Node::Facts.new('whatever', values)
521
+ Puppet::Node::Facts.indirection.save(facts)
522
+ end
523
+
524
+ it 'calls find action' do
525
+ expect {
526
+ app.run
527
+ }.to exit_with(0)
528
+ .and output(anything).to_stdout
529
+ expect(app.action.name).to eq(:find)
530
+ end
531
+ end
53
532
  end