puppet 4.4.2 → 4.5.0

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 (218) hide show
  1. data/CONTRIBUTING.md +5 -5
  2. data/Gemfile +2 -2
  3. data/LICENSE +2 -2
  4. data/README.md +5 -0
  5. data/ext/project_data.yaml +2 -0
  6. data/lib/hiera_puppet.rb +6 -14
  7. data/lib/puppet/application/agent.rb +2 -3
  8. data/lib/puppet/data_providers/hiera_config.rb +2 -4
  9. data/lib/puppet/data_providers/hiera_interpolate.rb +12 -154
  10. data/lib/puppet/data_providers/json_data_provider_factory.rb +0 -7
  11. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -8
  12. data/lib/puppet/defaults.rb +70 -7
  13. data/lib/puppet/functions.rb +69 -0
  14. data/lib/puppet/functions/dig.rb +39 -0
  15. data/lib/puppet/functions/lest.rb +53 -0
  16. data/lib/puppet/functions/lookup.rb +40 -27
  17. data/lib/puppet/functions/new.rb +502 -0
  18. data/lib/puppet/functions/regsubst.rb +11 -10
  19. data/lib/puppet/functions/then.rb +74 -0
  20. data/lib/puppet/functions/type.rb +4 -4
  21. data/lib/puppet/functions/with.rb +1 -1
  22. data/lib/puppet/indirector/catalog/compiler.rb +2 -0
  23. data/lib/puppet/indirector/resource_type/parser.rb +5 -0
  24. data/lib/puppet/indirector/rest.rb +5 -1
  25. data/lib/puppet/loaders.rb +2 -0
  26. data/lib/puppet/metatype/manager.rb +19 -2
  27. data/lib/puppet/module_tool/applications/application.rb +1 -1
  28. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +6 -2
  29. data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
  30. data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +1 -1
  31. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +0 -1
  32. data/lib/puppet/network/http/api/master/v3/environment.rb +6 -2
  33. data/lib/puppet/parser/ast/pops_bridge.rb +20 -3
  34. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +24 -2
  35. data/lib/puppet/parser/e4_parser_adapter.rb +13 -12
  36. data/lib/puppet/parser/environment_compiler.rb +2 -2
  37. data/lib/puppet/parser/resource.rb +14 -5
  38. data/lib/puppet/parser/scope.rb +18 -15
  39. data/lib/puppet/plugins/data_providers/data_provider.rb +19 -8
  40. data/lib/puppet/pops.rb +6 -0
  41. data/lib/puppet/pops/adapters.rb +5 -1
  42. data/lib/puppet/pops/evaluator/access_operator.rb +52 -14
  43. data/lib/puppet/pops/evaluator/compare_operator.rb +34 -4
  44. data/lib/puppet/pops/evaluator/evaluator_impl.rb +75 -22
  45. data/lib/puppet/pops/evaluator/literal_evaluator.rb +7 -6
  46. data/lib/puppet/pops/evaluator/runtime3_converter.rb +13 -1
  47. data/lib/puppet/pops/evaluator/runtime3_support.rb +14 -4
  48. data/lib/puppet/pops/functions/dispatcher.rb +1 -1
  49. data/lib/puppet/pops/issues.rb +18 -2
  50. data/lib/puppet/pops/loader/base_loader.rb +48 -7
  51. data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
  52. data/lib/puppet/pops/loader/loader.rb +12 -0
  53. data/lib/puppet/pops/loader/predefined_loader.rb +29 -0
  54. data/lib/puppet/pops/loader/runtime3_type_loader.rb +57 -0
  55. data/lib/puppet/pops/loader/static_loader.rb +92 -5
  56. data/lib/puppet/pops/loader/type_definition_instantiator.rb +25 -3
  57. data/lib/puppet/pops/loaders.rb +84 -14
  58. data/lib/puppet/pops/lookup/explainer.rb +38 -1
  59. data/lib/puppet/pops/lookup/interpolation.rb +115 -0
  60. data/lib/puppet/pops/lookup/sub_lookup.rb +86 -0
  61. data/lib/puppet/pops/model/ast_transformer.rb +8 -1
  62. data/lib/puppet/pops/model/factory.rb +31 -8
  63. data/lib/puppet/pops/model/model.rb +8 -0
  64. data/lib/puppet/pops/model/model_label_provider.rb +1 -0
  65. data/lib/puppet/pops/model/model_meta.rb +7 -1
  66. data/lib/puppet/pops/model/model_tree_dumper.rb +4 -0
  67. data/lib/puppet/pops/parser/egrammar.ra +24 -7
  68. data/lib/puppet/pops/parser/eparser.rb +863 -798
  69. data/lib/puppet/pops/parser/evaluating_parser.rb +4 -0
  70. data/lib/puppet/pops/parser/locator.rb +8 -4
  71. data/lib/puppet/pops/pcore.rb +30 -0
  72. data/lib/puppet/pops/types/class_loader.rb +2 -4
  73. data/lib/puppet/pops/types/implementation_registry.rb +146 -0
  74. data/lib/puppet/pops/types/iterable.rb +4 -4
  75. data/lib/puppet/pops/types/p_object_type.rb +846 -0
  76. data/lib/puppet/pops/types/p_runtime_type.rb +102 -0
  77. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +164 -0
  78. data/lib/puppet/pops/types/p_sem_ver_type.rb +113 -0
  79. data/lib/puppet/pops/types/puppet_object.rb +21 -0
  80. data/lib/puppet/pops/types/ruby_generator.rb +258 -0
  81. data/lib/puppet/pops/types/string_converter.rb +922 -0
  82. data/lib/puppet/pops/types/type_calculator.rb +29 -5
  83. data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
  84. data/lib/puppet/pops/types/type_factory.rb +49 -16
  85. data/lib/puppet/pops/types/type_formatter.rb +335 -112
  86. data/lib/puppet/pops/types/type_mismatch_describer.rb +110 -29
  87. data/lib/puppet/pops/types/type_parser.rb +205 -197
  88. data/lib/puppet/pops/types/types.rb +481 -103
  89. data/lib/puppet/pops/validation.rb +1 -1
  90. data/lib/puppet/pops/validation/checker4_0.rb +66 -4
  91. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  92. data/lib/puppet/pops/visitor.rb +3 -1
  93. data/lib/puppet/property.rb +1 -1
  94. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  95. data/lib/puppet/provider/package/pip.rb +64 -20
  96. data/lib/puppet/provider/package/rpm.rb +112 -0
  97. data/lib/puppet/provider/package/yum.rb +7 -68
  98. data/lib/puppet/provider/service/daemontools.rb +3 -3
  99. data/lib/puppet/provider/service/init.rb +4 -2
  100. data/lib/puppet/provider/service/runit.rb +3 -3
  101. data/lib/puppet/provider/service/smf.rb +6 -3
  102. data/lib/puppet/provider/service/systemd.rb +59 -73
  103. data/lib/puppet/reference/providers.rb +1 -2
  104. data/lib/puppet/resource.rb +54 -37
  105. data/lib/puppet/resource/catalog.rb +31 -29
  106. data/lib/puppet/resource/type_collection.rb +23 -8
  107. data/lib/puppet/settings.rb +4 -2
  108. data/lib/puppet/settings/base_setting.rb +9 -3
  109. data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
  110. data/lib/puppet/test/test_helper.rb +0 -1
  111. data/lib/puppet/type.rb +9 -3
  112. data/lib/puppet/type/exec.rb +17 -17
  113. data/lib/puppet/type/file.rb +12 -0
  114. data/lib/puppet/type/file/content.rb +6 -6
  115. data/lib/puppet/type/file/ensure.rb +4 -4
  116. data/lib/puppet/type/file/source.rb +4 -4
  117. data/lib/puppet/type/file/target.rb +2 -2
  118. data/lib/puppet/type/mount.rb +18 -1
  119. data/lib/puppet/type/package.rb +3 -3
  120. data/lib/puppet/type/schedule.rb +4 -4
  121. data/lib/puppet/type/service.rb +15 -0
  122. data/lib/puppet/type/sshkey.rb +5 -3
  123. data/lib/puppet/type/tidy.rb +3 -3
  124. data/lib/puppet/type/zone.rb +5 -5
  125. data/lib/puppet/util/feature.rb +1 -1
  126. data/lib/puppet/util/monkey_patches.rb +8 -0
  127. data/lib/puppet/util/network_device/cisco/device.rb +16 -6
  128. data/lib/puppet/util/network_device/cisco/interface.rb +5 -6
  129. data/lib/puppet/util/plist.rb +3 -3
  130. data/lib/puppet/version.rb +1 -1
  131. data/spec/fixtures/unit/application/environments/production/data/common.yaml +13 -0
  132. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +2 -1
  133. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/manifests/init.pp +2 -1
  134. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/data/empty_key.json +1 -0
  135. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/hiera.yaml +5 -0
  136. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
  137. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/metadata.json +9 -0
  138. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
  139. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
  140. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
  141. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/metadata.json +9 -0
  142. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  143. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/type/usee_type.rb +5 -0
  144. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +6 -0
  145. data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
  146. data/spec/integration/module_tool/tar/mini_spec.rb +27 -27
  147. data/spec/integration/parser/catalog_spec.rb +14 -2
  148. data/spec/integration/parser/compiler_spec.rb +94 -3
  149. data/spec/integration/parser/resource_expressions_spec.rb +1 -1
  150. data/spec/integration/resource/type_collection_spec.rb +8 -0
  151. data/spec/lib/puppet_spec/compiler.rb +11 -4
  152. data/spec/shared_contexts/types_setup.rb +4 -0
  153. data/spec/unit/application/lookup_spec.rb +91 -9
  154. data/spec/unit/appmgmt_spec.rb +44 -35
  155. data/spec/unit/capability_spec.rb +33 -53
  156. data/spec/unit/data_providers/function_data_provider_spec.rb +19 -1
  157. data/spec/unit/data_providers/hiera_data_provider_spec.rb +1 -1
  158. data/spec/unit/defaults_spec.rb +18 -0
  159. data/spec/unit/functions/assert_type_spec.rb +1 -1
  160. data/spec/unit/functions/dig_spec.rb +58 -0
  161. data/spec/unit/functions/lest_spec.rb +34 -0
  162. data/spec/unit/functions/lookup_spec.rb +108 -2
  163. data/spec/unit/functions/new_spec.rb +543 -0
  164. data/spec/unit/functions/regsubst_spec.rb +8 -0
  165. data/spec/unit/functions/then_spec.rb +40 -0
  166. data/spec/unit/functions4_spec.rb +78 -10
  167. data/spec/unit/hiera_puppet_spec.rb +49 -8
  168. data/spec/unit/indirector/resource_type/parser_spec.rb +5 -0
  169. data/spec/unit/indirector/rest_spec.rb +12 -0
  170. data/spec/unit/network/http/api/master/v3/environment_spec.rb +60 -0
  171. data/spec/unit/node/environment_spec.rb +10 -0
  172. data/spec/unit/parser/compiler_spec.rb +20 -1
  173. data/spec/unit/parser/functions/create_resources_spec.rb +2 -2
  174. data/spec/unit/parser/functions/shared.rb +1 -1
  175. data/spec/unit/parser/resource_spec.rb +8 -1
  176. data/spec/unit/parser/scope_spec.rb +45 -0
  177. data/spec/unit/pops/evaluator/access_ops_spec.rb +14 -0
  178. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +13 -5
  179. data/spec/unit/pops/loaders/static_loader_spec.rb +92 -1
  180. data/spec/unit/{data_providers/hiera_interpolation_spec.rb → pops/lookup/interpolation_spec.rb} +7 -5
  181. data/spec/unit/pops/parser/lexer2_spec.rb +2 -9
  182. data/spec/unit/pops/parser/parse_application_spec.rb +3 -8
  183. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +19 -0
  184. data/spec/unit/pops/parser/parse_capabilities_spec.rb +3 -10
  185. data/spec/unit/pops/parser/parse_site_spec.rb +19 -10
  186. data/spec/unit/pops/parser/parser_rspec_helper.rb +0 -4
  187. data/spec/unit/pops/types/enumeration_spec.rb +13 -12
  188. data/spec/unit/pops/types/iterable_spec.rb +2 -2
  189. data/spec/unit/pops/types/p_object_type_spec.rb +1060 -0
  190. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +285 -0
  191. data/spec/unit/pops/types/recursion_guard_spec.rb +19 -17
  192. data/spec/unit/pops/types/ruby_generator_spec.rb +261 -0
  193. data/spec/unit/pops/types/string_converter_spec.rb +904 -0
  194. data/spec/unit/pops/types/type_calculator_spec.rb +430 -406
  195. data/spec/unit/pops/types/type_factory_spec.rb +119 -104
  196. data/spec/unit/pops/types/type_formatter_spec.rb +73 -6
  197. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
  198. data/spec/unit/pops/types/type_parser_spec.rb +54 -15
  199. data/spec/unit/pops/types/types_spec.rb +113 -8
  200. data/spec/unit/pops/validator/validator_spec.rb +84 -10
  201. data/spec/unit/provider/package/pip3_spec.rb +9 -270
  202. data/spec/unit/provider/package/pip_spec.rb +85 -30
  203. data/spec/unit/provider/package/rpm_spec.rb +160 -3
  204. data/spec/unit/provider/package/yum_spec.rb +23 -134
  205. data/spec/unit/provider/service/smf_spec.rb +14 -2
  206. data/spec/unit/provider/service/systemd_spec.rb +33 -41
  207. data/spec/unit/resource/capability_finder_spec.rb +10 -2
  208. data/spec/unit/settings/file_setting_spec.rb +6 -0
  209. data/spec/unit/transaction/additional_resource_generator_spec.rb +80 -65
  210. data/spec/unit/type/mount_spec.rb +51 -10
  211. data/spec/unit/type/service_spec.rb +16 -0
  212. data/spec/unit/type_spec.rb +14 -0
  213. data/spec/unit/util/feature_spec.rb +1 -1
  214. data/spec/unit/util/monkey_patches_spec.rb +60 -0
  215. data/spec/unit/util/network_device/cisco/device_spec.rb +1 -1
  216. metadata +63 -11
  217. data/lib/puppet/pops/types/types_meta.rb +0 -0
  218. data/spec/integration/provider/package_spec.rb +0 -35
@@ -114,7 +114,7 @@ describe "Puppet resource expressions" do
114
114
 
115
115
  fails( "define a::b { notify { testing: } } 'a::b' { title: }" => /Illegal Resource Type expression.*got String/)
116
116
 
117
- fails( "Does::Not::Exist { title: }" => /Invalid resource type does::not::exist/)
117
+ fails( "Does::Not::Exist { title: }" => /Resource type not found: Does::Not::Exist/)
118
118
  end
119
119
 
120
120
  context "local defaults" do
@@ -12,6 +12,14 @@ describe Puppet::Resource::TypeCollection do
12
12
  @dir = tmpfile("autoload_testing")
13
13
  FileUtils.mkdir_p @dir
14
14
 
15
+ loader = Object.new
16
+ loader.stubs(:load).returns nil
17
+ loader.stubs(:set_entry)
18
+
19
+ loaders = Object.new
20
+ loaders.expects(:runtime3_type_loader).at_most_once.returns loader
21
+ Puppet::Pops::Loaders.expects(:loaders).at_most_once.returns loaders
22
+
15
23
  environment = Puppet::Node::Environment.create(:env, [@dir])
16
24
  @code = environment.known_resource_types
17
25
  end
@@ -1,14 +1,14 @@
1
1
  module PuppetSpec::Compiler
2
2
  module_function
3
3
 
4
- def compile_to_catalog(string, node = Puppet::Node.new('foonode'))
4
+ def compile_to_catalog(string, node = Puppet::Node.new('test'))
5
5
  Puppet[:code] = string
6
6
  # see lib/puppet/indirector/catalog/compiler.rb#filter
7
7
  Puppet::Parser::Compiler.compile(node).filter { |r| r.virtual? }
8
8
  end
9
9
 
10
- def compile_to_ral(manifest)
11
- catalog = compile_to_catalog(manifest)
10
+ def compile_to_ral(manifest, node = Puppet::Node.new('test'))
11
+ catalog = compile_to_catalog(manifest, node)
12
12
  ral = catalog.to_ral
13
13
  ral.finalize
14
14
  ral
@@ -60,7 +60,14 @@ module PuppetSpec::Compiler
60
60
 
61
61
  def eval_and_collect_notices(code, node = Puppet::Node.new('foonode'))
62
62
  collect_notices(code, node) do |compiler|
63
- compiler.compile
63
+ if block_given?
64
+ compiler.compile do |catalog|
65
+ yield(compiler.topscope, catalog)
66
+ catalog
67
+ end
68
+ else
69
+ compiler.compile
70
+ end
64
71
  end
65
72
  end
66
73
  end
@@ -32,6 +32,8 @@ shared_context 'types_setup' do
32
32
  Puppet::Pops::Types::PDefaultType,
33
33
  Puppet::Pops::Types::PTypeReferenceType,
34
34
  Puppet::Pops::Types::PTypeAliasType,
35
+ Puppet::Pops::Types::PSemVerType,
36
+ Puppet::Pops::Types::PSemVerRangeType,
35
37
  ]
36
38
  end
37
39
 
@@ -47,6 +49,8 @@ shared_context 'types_setup' do
47
49
  Puppet::Pops::Types::PBooleanType,
48
50
  Puppet::Pops::Types::PPatternType,
49
51
  Puppet::Pops::Types::PEnumType,
52
+ Puppet::Pops::Types::PSemVerType,
53
+ Puppet::Pops::Types::PSemVerRangeType,
50
54
  ]
51
55
  end
52
56
 
@@ -166,7 +166,8 @@ describe Puppet::Application::Lookup do
166
166
  lookup.options[:node] = node
167
167
  lookup.options[:explain] = true
168
168
  lookup.command_line.stubs(:args).returns(['a'])
169
- expect { lookup.run_command }.to output(<<-EXPLANATION).to_stdout
169
+ begin
170
+ expect { lookup.run_command }.to output(<<-EXPLANATION).to_stdout
170
171
  Merge strategy first
171
172
  Data Binding "hiera"
172
173
  No such key: "a"
@@ -177,13 +178,17 @@ Merge strategy first
177
178
  Original path: "common"
178
179
  Found key: "a" value: "This is A"
179
180
  Merged result: "This is A"
180
- EXPLANATION
181
+ EXPLANATION
182
+ rescue SystemExit => e
183
+ expect(e.status).to eq(0)
184
+ end
181
185
  end
182
186
 
183
187
  it '--explain produces human readable text of a hash merge when using --explain-options' do
184
188
  lookup.options[:node] = node
185
189
  lookup.options[:explain_options] = true
186
- expect { lookup.run_command }.to output(<<-EXPLANATION).to_stdout
190
+ begin
191
+ expect { lookup.run_command }.to output(<<-EXPLANATION).to_stdout
187
192
  Merge strategy hash
188
193
  Data Binding "hiera"
189
194
  No such key: "lookup_options"
@@ -198,7 +203,10 @@ Merge strategy hash
198
203
  Merged result: {
199
204
  "a" => "first"
200
205
  }
201
- EXPLANATION
206
+ EXPLANATION
207
+ rescue SystemExit => e
208
+ expect(e.status).to eq(0)
209
+ end
202
210
  end
203
211
 
204
212
  it '--explain produces human readable text of a hash merge when using both --explain and --explain-options' do
@@ -206,7 +214,8 @@ Merge strategy hash
206
214
  lookup.options[:explain] = true
207
215
  lookup.options[:explain_options] = true
208
216
  lookup.command_line.stubs(:args).returns(['a'])
209
- expect { lookup.run_command }.to output(<<-EXPLANATION).to_stdout
217
+ begin
218
+ expect { lookup.run_command }.to output(<<-EXPLANATION).to_stdout
210
219
  Searching for "lookup_options"
211
220
  Merge strategy hash
212
221
  Data Binding "hiera"
@@ -233,7 +242,10 @@ Searching for "a"
233
242
  Original path: "common"
234
243
  Found key: "a" value: "This is A"
235
244
  Merged result: "This is A"
236
- EXPLANATION
245
+ EXPLANATION
246
+ rescue SystemExit => e
247
+ expect(e.status).to eq(0)
248
+ end
237
249
  end
238
250
 
239
251
  it 'can produce a yaml explanation' do
@@ -247,6 +259,8 @@ Searching for "a"
247
259
  $stdout = StringIO.new
248
260
  lookup.run_command
249
261
  output = $stdout.string
262
+ rescue SystemExit => e
263
+ expect(e.status).to eq(0)
250
264
  ensure
251
265
  $stdout = save_stdout
252
266
  end
@@ -264,12 +278,68 @@ Searching for "a"
264
278
  $stdout = StringIO.new
265
279
  lookup.run_command
266
280
  output = $stdout.string
281
+ rescue SystemExit => e
282
+ expect(e.status).to eq(0)
267
283
  ensure
268
284
  $stdout = save_stdout
269
285
  end
270
286
  expect(JSON.parse(output)).to eq(expected_json_hash)
271
287
  end
272
288
 
289
+ it 'can access values using dotted keys' do
290
+ lookup.options[:node] = node
291
+ lookup.options[:render_as] = :json
292
+ lookup.command_line.stubs(:args).returns(['d.one.two.three'])
293
+ save_stdout = $stdout
294
+ output = nil
295
+ begin
296
+ $stdout = StringIO.new
297
+ lookup.run_command
298
+ output = $stdout.string
299
+ rescue SystemExit => e
300
+ expect(e.status).to eq(0)
301
+ ensure
302
+ $stdout = save_stdout
303
+ end
304
+ expect(JSON.parse("[#{output}]")).to eq(['the value'])
305
+ end
306
+
307
+ it 'can access values using quoted dotted keys' do
308
+ lookup.options[:node] = node
309
+ lookup.options[:render_as] = :json
310
+ lookup.command_line.stubs(:args).returns(['"e.one.two.three"'])
311
+ save_stdout = $stdout
312
+ output = nil
313
+ begin
314
+ $stdout = StringIO.new
315
+ lookup.run_command
316
+ output = $stdout.string
317
+ rescue SystemExit => e
318
+ expect(e.status).to eq(0)
319
+ ensure
320
+ $stdout = save_stdout
321
+ end
322
+ expect(JSON.parse("[#{output}]")).to eq(['the value'])
323
+ end
324
+
325
+ it 'can access values using mix of dotted keys and quoted dotted keys' do
326
+ lookup.options[:node] = node
327
+ lookup.options[:render_as] = :json
328
+ lookup.command_line.stubs(:args).returns(['"f.one"."two.three".1'])
329
+ save_stdout = $stdout
330
+ output = nil
331
+ begin
332
+ $stdout = StringIO.new
333
+ lookup.run_command
334
+ output = $stdout.string
335
+ rescue SystemExit => e
336
+ expect(e.status).to eq(0)
337
+ ensure
338
+ $stdout = save_stdout
339
+ end
340
+ expect(JSON.parse("[#{output}]")).to eq(['second value'])
341
+ end
342
+
273
343
  context 'the global scope' do
274
344
  it "is unaffected by global variables unless '--compile' is used" do
275
345
  lookup.options[:node] = node
@@ -281,7 +351,11 @@ Searching for "a"
281
351
  lookup.options[:node] = node
282
352
  lookup.options[:compile] = true
283
353
  lookup.command_line.stubs(:args).returns(['c'])
284
- expect { lookup.run_command }.to output("--- This is C from site.pp\n...\n").to_stdout
354
+ begin
355
+ expect { lookup.run_command }.to output("--- This is C from site.pp\n...\n").to_stdout
356
+ rescue SystemExit => e
357
+ expect(e.status).to eq(0)
358
+ end
285
359
  end
286
360
  end
287
361
 
@@ -291,14 +365,22 @@ Searching for "a"
291
365
  it "works OK in the absense of '--compile'" do
292
366
  lookup.options[:node] = node
293
367
  lookup.command_line.stubs(:args).returns(['c'])
294
- expect { lookup.run_command }.to output("--- This is C from data.pp\n...\n").to_stdout
368
+ begin
369
+ expect { lookup.run_command }.to output("--- This is C from data.pp\n...\n").to_stdout
370
+ rescue SystemExit => e
371
+ expect(e.status).to eq(0)
372
+ end
295
373
  end
296
374
 
297
375
  it "global scope is affected by global variables when '--compile' is used" do
298
376
  lookup.options[:node] = node
299
377
  lookup.options[:compile] = true
300
378
  lookup.command_line.stubs(:args).returns(['c'])
301
- expect { lookup.run_command }.to output("--- This is C from site.pp\n...\n").to_stdout
379
+ begin
380
+ expect { lookup.run_command }.to output("--- This is C from site.pp\n...\n").to_stdout
381
+ rescue SystemExit => e
382
+ expect(e.status).to eq(0)
383
+ end
302
384
  end
303
385
  end
304
386
  end
@@ -1,34 +1,33 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
  require 'puppet_spec/compiler'
4
- require_relative 'pops/parser/parser_rspec_helper'
5
4
  require 'puppet/parser/environment_compiler'
6
5
 
7
6
  describe "Application instantiation" do
8
7
  include PuppetSpec::Compiler
9
- # We pull this in because we need access to with_app_management; and
10
- # since that has to root around in the guts of the Pops parser, there's
11
- # no really elegant way to do this
12
- include ParserRspecHelper
13
8
 
14
- def compile_to_env_catalog(string)
9
+ let(:env) { Puppet::Node::Environment.create(:testing, []) }
10
+ let(:node) { Puppet::Node.new('test', :environment => env) }
11
+ let(:loaders) { Puppet::Pops::Loaders.new(env) }
12
+
13
+ def compile_to_env_catalog(string, code_id=nil)
15
14
  Puppet[:code] = string
16
- env = Puppet::Node::Environment.create("test", ["/dev/null"])
17
- Puppet::Parser::EnvironmentCompiler.compile(env).filter { |r| r.virtual? }
15
+ Puppet::Parser::EnvironmentCompiler.compile(env, code_id).filter { |r| r.virtual? }
18
16
  end
19
17
 
20
-
21
- before :each do
22
- with_app_management(true)
23
- Puppet::Type.newtype :cap, :is_capability => true do
24
- newparam :name
25
- newparam :host
18
+ around :each do |example|
19
+ Puppet[:app_management] = true
20
+ Puppet::Parser::Compiler.any_instance.stubs(:loaders).returns(loaders)
21
+ Puppet::Parser::EnvironmentCompiler.any_instance.stubs(:loaders).returns(loaders)
22
+ Puppet.override(:loaders => loaders, :current_environment => env) do
23
+ Puppet::Type.newtype :cap, :is_capability => true do
24
+ newparam :name
25
+ newparam :host
26
+ end
27
+ example.run
28
+ Puppet::Type.rmtype(:cap)
26
29
  end
27
- end
28
-
29
- after :each do
30
- Puppet::Type.rmtype(:cap)
31
- with_app_management(false)
30
+ Puppet[:app_management] = false
32
31
  end
33
32
 
34
33
  MANIFEST = <<-EOS
@@ -318,29 +317,29 @@ MANIFEST_WITH_CLASS = <<-EOS
318
317
  EOS
319
318
 
320
319
 
321
- describe "a node catalog" do
320
+ context 'a node catalog' do
322
321
  it "is unaffected for a non-participating node" do
323
- catalog = compile_to_catalog(MANIFEST, Puppet::Node.new('other'))
322
+ catalog = compile_to_catalog(MANIFEST, Puppet::Node.new('other', :environment => env))
324
323
  types = catalog.resource_keys.map { |type, _| type }.uniq.sort
325
324
  expect(types).to eq(["Class", "Stage"])
326
325
  end
327
326
 
328
327
  it "an application instance must be contained in a site" do
329
- expect { compile_to_catalog(FAULTY_MANIFEST, Puppet::Node.new('first'))
328
+ expect { compile_to_catalog(FAULTY_MANIFEST, Puppet::Node.new('first', :environment => env))
330
329
  }.to raise_error(/Application instances .* can only be contained within a Site/)
331
330
  end
332
331
 
333
332
  it "does not raise an error when node mappings are not provided" do
334
- expect { compile_to_catalog(MANIFEST_WO_NODE) }.to_not raise_error
333
+ expect { compile_to_catalog(MANIFEST_WO_NODE, node) }.to_not raise_error
335
334
  end
336
335
 
337
336
  it "raises an error if node mapping is a string" do
338
- expect { compile_to_catalog(MANIFEST_WITH_STRING_NODES)
337
+ expect { compile_to_catalog(MANIFEST_WITH_STRING_NODES, node)
339
338
  }.to raise_error(/Invalid node mapping in .*: Mapping must be a hash/)
340
339
  end
341
340
 
342
341
  it "raises an error if node mapping is false" do
343
- expect { compile_to_catalog(MANIFEST_WITH_FALSE_NODES)
342
+ expect { compile_to_catalog(MANIFEST_WITH_FALSE_NODES, node)
344
343
  }.to raise_error(/Invalid node mapping in .*: Mapping must be a hash/)
345
344
  end
346
345
 
@@ -360,7 +359,7 @@ EOS
360
359
  end
361
360
 
362
361
  context "for producing node" do
363
- let(:compiled_node) { Puppet::Node.new('first') }
362
+ let(:compiled_node) { Puppet::Node.new('first', :environment => env) }
364
363
  let(:compiled_catalog) { compile_to_catalog(MANIFEST, compiled_node)}
365
364
 
366
365
  { "App[anapp]" => 'application instance',
@@ -379,7 +378,7 @@ EOS
379
378
  end
380
379
 
381
380
  context "for consuming node" do
382
- let(:compiled_node) { Puppet::Node.new('second') }
381
+ let(:compiled_node) { Puppet::Node.new('second', :environment => env) }
383
382
  let(:compiled_catalog) { compile_to_catalog(MANIFEST, compiled_node)}
384
383
  let(:cap) {
385
384
  the_cap = Puppet::Resource.new("Cap", "cap")
@@ -407,7 +406,7 @@ EOS
407
406
  end
408
407
 
409
408
  context "for node with class producer" do
410
- let(:compiled_node) { Puppet::Node.new('first') }
409
+ let(:compiled_node) { Puppet::Node.new('first', :environment => env) }
411
410
  let(:compiled_catalog) { compile_to_catalog(MANIFEST_WITH_CLASS, compiled_node)}
412
411
 
413
412
  { "App[anapp]" => 'application instance',
@@ -427,7 +426,7 @@ EOS
427
426
  end
428
427
 
429
428
  context "for node with class consumer" do
430
- let(:compiled_node) { Puppet::Node.new('second') }
429
+ let(:compiled_node) { Puppet::Node.new('second', :environment => env) }
431
430
  let(:compiled_catalog) { compile_to_catalog(MANIFEST_WITH_CLASS, compiled_node)}
432
431
  let(:cap) {
433
432
  the_cap = Puppet::Resource.new("Cap", "cap")
@@ -460,7 +459,7 @@ EOS
460
459
  # that are used to instantiate an application. The application instances are needed.
461
460
  #
462
461
  it "the node expressions is evaluated" do
463
- catalog = compile_to_catalog(MANIFEST_WITH_SITE, Puppet::Node.new('other'))
462
+ catalog = compile_to_catalog(MANIFEST_WITH_SITE, Puppet::Node.new('other', :environment => env))
464
463
  types = catalog.resource_keys.map { |type, _| type }.uniq.sort
465
464
  expect(types).to eq(["Class", "Node", "Notify", "Stage"])
466
465
  expect(catalog.resource("Notify[on a node]")).to_not be_nil
@@ -471,7 +470,7 @@ EOS
471
470
 
472
471
  context "when using a site expression" do
473
472
  it "the site expression is not evaluated in a node compilation" do
474
- catalog = compile_to_catalog(MANIFEST_WITH_SITE, Puppet::Node.new('other'))
473
+ catalog = compile_to_catalog(MANIFEST_WITH_SITE, Puppet::Node.new('other', :environment => env))
475
474
  types = catalog.resource_keys.map { |type, _| type }.uniq.sort
476
475
  expect(types).to eq(["Class", "Node", "Notify", "Stage"])
477
476
  expect(catalog.resource("Notify[on a node]")).to_not be_nil
@@ -574,12 +573,22 @@ EOS
574
573
  }.to raise_error(/Only application components can appear inside a site - Notify\[fail me\] is not allowed at line 20/)
575
574
  end
576
575
  end
576
+
577
+ it "includes code_id if specified" do
578
+ catalog = compile_to_env_catalog(MANIFEST_WITH_SITE, "12345")
579
+ expect(catalog.code_id).to eq("12345")
580
+ end
581
+
582
+ it "omits code_id if unspecified" do
583
+ catalog = compile_to_env_catalog(MANIFEST_WITH_SITE)
584
+ expect(catalog.code_id).to be_nil
585
+ end
577
586
  end
578
587
 
579
588
 
580
589
  describe "when validation of nodes" do
581
590
  it 'validates that the key of a node mapping is a Node' do
582
- expect { compile_to_catalog(<<-EOS, Puppet::Node.new('other'))
591
+ expect { compile_to_catalog(<<-EOS, Puppet::Node.new('other', :environment => env))
583
592
  application app {
584
593
  }
585
594
 
@@ -595,7 +604,7 @@ EOS
595
604
  end
596
605
 
597
606
  it 'validates that the value of a node mapping is a resource' do
598
- expect { compile_to_catalog(<<-EOS, Puppet::Node.new('other'))
607
+ expect { compile_to_catalog(<<-EOS, Puppet::Node.new('other', :environment => env))
599
608
  application app {
600
609
  }
601
610
 
@@ -611,7 +620,7 @@ EOS
611
620
  end
612
621
 
613
622
  it 'validates that the value can be an array or resources' do
614
- expect { compile_to_catalog(<<-EOS, Puppet::Node.new('other'))
623
+ expect { compile_to_catalog(<<-EOS, Puppet::Node.new('other', :environment => env))
615
624
  define p {
616
625
  notify {$title:}
617
626
  }
@@ -633,7 +642,7 @@ EOS
633
642
  end
634
643
 
635
644
  it 'validates that the is bound to exactly one node' do
636
- expect { compile_to_catalog(<<-EOS, Puppet::Node.new('first'))
645
+ expect { compile_to_catalog(<<-EOS, Puppet::Node.new('first', :environment => env))
637
646
  define p {
638
647
  notify {$title:}
639
648
  }
@@ -1,33 +1,30 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
  require 'puppet_spec/compiler'
4
- require_relative 'pops/parser/parser_rspec_helper'
5
4
 
6
- describe "Capability types" do
5
+ describe 'Capability types' do
7
6
  include PuppetSpec::Compiler
8
- # We pull this in because we need access to with_app_management; and
9
- # since that has to root around in the guts of the Pops parser, there's
10
- # no really elegant way to do this
11
- include ParserRspecHelper
12
-
13
- def make_cap_type
14
- Puppet::Type.newtype :cap, :is_capability => true do
15
- newparam :name
16
- newparam :host
7
+ let(:env) { Puppet::Node::Environment.create(:testing, []) }
8
+ let(:node) { Puppet::Node.new('test', :environment => env) }
9
+ let(:loaders) { Puppet::Pops::Loaders.new(env) }
10
+
11
+ around :each do |example|
12
+ Puppet[:app_management] = true
13
+ Puppet::Parser::Compiler.any_instance.stubs(:loaders).returns(loaders)
14
+ Puppet.override(:loaders => loaders, :current_environment => env) do
15
+ Puppet::Type.newtype :cap, :is_capability => true do
16
+ newparam :name
17
+ newparam :host
18
+ end
19
+ example.run
20
+ Puppet::Type.rmtype(:cap)
17
21
  end
22
+ Puppet[:app_management] = false
18
23
  end
19
24
 
20
- before :each do
21
- with_app_management(true)
22
- end
23
-
24
- after :each do
25
- with_app_management(false)
26
- end
27
-
28
- describe "annotations" do
25
+ context 'annotations' do
29
26
  it "adds a blueprint for a produced resource" do
30
- catalog = compile_to_catalog(<<-MANIFEST)
27
+ catalog = compile_to_catalog(<<-MANIFEST, node)
31
28
  define test($hostname) {
32
29
  notify { "hostname ${hostname}":}
33
30
  }
@@ -49,7 +46,7 @@ describe "Capability types" do
49
46
  end
50
47
 
51
48
  it "adds a blueprint for a consumed resource" do
52
- catalog = compile_to_catalog(<<-MANIFEST)
49
+ catalog = compile_to_catalog(<<-MANIFEST, node)
53
50
  define test($hostname) {
54
51
  notify { "hostname ${hostname}":}
55
52
  }
@@ -136,7 +133,7 @@ describe "Capability types" do
136
133
  end
137
134
  it "does not allow operator '+>' in a mapping" do
138
135
  expect do
139
- compile_to_catalog(<<-MANIFEST)
136
+ compile_to_catalog(<<-MANIFEST, node)
140
137
  define test($hostname) {
141
138
  notify { "hostname ${hostname}":}
142
139
  }
@@ -150,7 +147,7 @@ describe "Capability types" do
150
147
 
151
148
  it "does not allow operator '*=>' in a mapping" do
152
149
  expect do
153
- compile_to_catalog(<<-MANIFEST)
150
+ compile_to_catalog(<<-MANIFEST, node)
154
151
  define test($hostname) {
155
152
  notify { "hostname ${hostname}":}
156
153
  }
@@ -163,9 +160,8 @@ describe "Capability types" do
163
160
  end
164
161
 
165
162
  it "does not allow 'before' relationship to capability mapping" do
166
- make_cap_type
167
163
  expect do
168
- compile_to_catalog(<<-MANIFEST)
164
+ compile_to_catalog(<<-MANIFEST, node)
169
165
  define test() {
170
166
  notify { "hello":}
171
167
  }
@@ -186,22 +182,14 @@ describe "Capability types" do
186
182
  MANIFEST
187
183
 
188
184
  expect {
189
- compile_to_catalog(manifest)
185
+ compile_to_catalog(manifest, node)
190
186
  }.to raise_error(Puppet::Error,
191
187
  /#{kw} clause references nonexistent type Test/)
192
188
  end
193
189
  end
194
190
  end
195
191
 
196
- describe "exporting a capability" do
197
- before(:each) do
198
- make_cap_type
199
- end
200
-
201
- after :each do
202
- Puppet::Type.rmtype(:cap)
203
- end
204
-
192
+ context 'exporting a capability' do
205
193
  it "does not add produced resources that are not exported" do
206
194
  manifest = <<-MANIFEST
207
195
  define test($hostname) {
@@ -214,7 +202,7 @@ Test produces Cap {
214
202
 
215
203
  test { one: hostname => "ahost" }
216
204
  MANIFEST
217
- catalog = compile_to_catalog(manifest)
205
+ catalog = compile_to_catalog(manifest, node)
218
206
  expect(catalog.resource("Test[one]")).to be_instance_of(Puppet::Resource)
219
207
  expect(catalog.resource_keys.find { |type, _| type == "Cap" }).to be_nil
220
208
  end
@@ -236,7 +224,7 @@ Test produces Cap {
236
224
 
237
225
  test { one: hostname => "ahost", export => Cap[two] }
238
226
  MANIFEST
239
- catalog = compile_to_catalog(manifest)
227
+ catalog = compile_to_catalog(manifest, node)
240
228
  expect(catalog.resource("Test[one]")).to be_instance_of(Puppet::Resource)
241
229
 
242
230
  caps = catalog.resource_keys.select { |type, _| type == "Cap" }
@@ -247,19 +235,11 @@ test { one: hostname => "ahost", export => Cap[two] }
247
235
  expect(cap["require"]).to eq("Test[one]")
248
236
  expect(cap["host"]).to eq("ahost")
249
237
  expect(cap.resource_type).to eq(Puppet::Type::Cap)
250
- expect(cap.tags.any? { |t| t == "producer:production" }).to eq(true)
238
+ expect(cap.tags.any? { |t| t == 'producer:testing' }).to eq(true)
251
239
  end
252
240
  end
253
241
 
254
- describe "consuming a capability" do
255
- before(:each) do
256
- make_cap_type
257
- end
258
-
259
- after :each do
260
- Puppet::Type.rmtype(:cap)
261
- end
262
-
242
+ context 'consuming a capability' do
263
243
  def make_catalog(instance)
264
244
  manifest = <<-MANIFEST
265
245
  define test($hostname = nohost) {
@@ -270,7 +250,7 @@ test { one: hostname => "ahost", export => Cap[two] }
270
250
  hostname => $host
271
251
  }
272
252
  MANIFEST
273
- compile_to_catalog(manifest + instance)
253
+ compile_to_catalog(manifest + instance, node)
274
254
  end
275
255
 
276
256
  def mock_cap_finding
@@ -322,10 +302,10 @@ test { one: hostname => "ahost", export => Cap[two] }
322
302
  end
323
303
  end
324
304
 
325
- describe 'producing/consuming resources' do
305
+ context 'producing/consuming resources' do
326
306
 
327
307
  let(:ral) do
328
- compile_to_ral(<<-MANIFEST)
308
+ compile_to_ral(<<-MANIFEST, node)
329
309
  define producer() {
330
310
  notify { "producer":}
331
311
  }
@@ -365,10 +345,10 @@ test { one: hostname => "ahost", export => Cap[two] }
365
345
  end
366
346
  end
367
347
 
368
- describe 'producing/consuming resources to/from classes' do
348
+ context 'producing/consuming resources to/from classes' do
369
349
 
370
350
  let(:ral) do
371
- compile_to_ral(<<-MANIFEST)
351
+ compile_to_ral(<<-MANIFEST, node)
372
352
  define test($hostname) {
373
353
  notify { $hostname:}
374
354
  }