puppet 4.7.1 → 4.8.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 (276) hide show
  1. data/Gemfile +0 -3
  2. data/MAINTAINERS +76 -0
  3. data/README.md +0 -6
  4. data/Rakefile +2 -2
  5. data/lib/puppet/agent.rb +3 -3
  6. data/lib/puppet/application/apply.rb +1 -1
  7. data/lib/puppet/configurer.rb +2 -2
  8. data/lib/puppet/data_providers.rb +1 -0
  9. data/lib/puppet/data_providers/data_adapter.rb +1 -0
  10. data/lib/puppet/data_providers/data_function_support.rb +1 -0
  11. data/lib/puppet/data_providers/function_env_data_provider.rb +1 -0
  12. data/lib/puppet/data_providers/function_module_data_provider.rb +1 -0
  13. data/lib/puppet/data_providers/hiera_config.rb +1 -0
  14. data/lib/puppet/data_providers/hiera_env_data_provider.rb +1 -0
  15. data/lib/puppet/data_providers/hiera_interpolate.rb +1 -0
  16. data/lib/puppet/data_providers/hiera_module_data_provider.rb +1 -0
  17. data/lib/puppet/data_providers/hiera_support.rb +1 -2
  18. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -0
  19. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -0
  20. data/lib/puppet/defaults.rb +20 -1
  21. data/lib/puppet/environments.rb +5 -2
  22. data/lib/puppet/face/catalog.rb +1 -1
  23. data/lib/puppet/face/epp.rb +57 -11
  24. data/lib/puppet/face/module/install.rb +6 -6
  25. data/lib/puppet/functions.rb +23 -24
  26. data/lib/puppet/functions/alert.rb +14 -0
  27. data/lib/puppet/functions/binary_file.rb +25 -0
  28. data/lib/puppet/functions/break.rb +22 -0
  29. data/lib/puppet/functions/contain.rb +33 -0
  30. data/lib/puppet/functions/crit.rb +14 -0
  31. data/lib/puppet/functions/debug.rb +14 -0
  32. data/lib/puppet/functions/emerg.rb +14 -0
  33. data/lib/puppet/functions/epp.rb +1 -1
  34. data/lib/puppet/functions/err.rb +14 -0
  35. data/lib/puppet/functions/find_file.rb +31 -0
  36. data/lib/puppet/functions/include.rb +21 -0
  37. data/lib/puppet/functions/info.rb +14 -0
  38. data/lib/puppet/functions/new.rb +1 -1
  39. data/lib/puppet/functions/next.rb +23 -0
  40. data/lib/puppet/functions/notice.rb +14 -0
  41. data/lib/puppet/functions/regsubst.rb +12 -16
  42. data/lib/puppet/functions/require.rb +37 -0
  43. data/lib/puppet/functions/return.rb +22 -0
  44. data/lib/puppet/functions/strftime.rb +35 -0
  45. data/lib/puppet/functions/warning.rb +14 -0
  46. data/lib/puppet/generate/models/type/type.rb +4 -0
  47. data/lib/puppet/generate/templates/type/pcore.erb +2 -1
  48. data/lib/puppet/indirector/face.rb +6 -1
  49. data/lib/puppet/network/http/error.rb +2 -2
  50. data/lib/puppet/network/http/handler.rb +2 -2
  51. data/lib/puppet/node/environment.rb +11 -0
  52. data/lib/puppet/parser/ast.rb +5 -0
  53. data/lib/puppet/parser/ast/pops_bridge.rb +17 -4
  54. data/lib/puppet/parser/compiler.rb +29 -1
  55. data/lib/puppet/parser/functions.rb +6 -0
  56. data/lib/puppet/parser/functions/assert_type.rb +1 -1
  57. data/lib/puppet/parser/functions/binary_file.rb +24 -0
  58. data/lib/puppet/parser/functions/break.rb +39 -0
  59. data/lib/puppet/parser/functions/contain.rb +7 -15
  60. data/lib/puppet/parser/functions/defined.rb +2 -2
  61. data/lib/puppet/parser/functions/dig.rb +1 -1
  62. data/lib/puppet/parser/functions/each.rb +1 -1
  63. data/lib/puppet/parser/functions/epp.rb +2 -2
  64. data/lib/puppet/parser/functions/filter.rb +1 -1
  65. data/lib/puppet/parser/functions/find_file.rb +28 -0
  66. data/lib/puppet/parser/functions/hiera.rb +4 -4
  67. data/lib/puppet/parser/functions/hiera_array.rb +1 -1
  68. data/lib/puppet/parser/functions/hiera_hash.rb +1 -1
  69. data/lib/puppet/parser/functions/hiera_include.rb +1 -1
  70. data/lib/puppet/parser/functions/include.rb +4 -8
  71. data/lib/puppet/parser/functions/inline_epp.rb +1 -1
  72. data/lib/puppet/parser/functions/lest.rb +1 -1
  73. data/lib/puppet/parser/functions/lookup.rb +4 -2
  74. data/lib/puppet/parser/functions/map.rb +1 -1
  75. data/lib/puppet/parser/functions/match.rb +1 -1
  76. data/lib/puppet/parser/functions/new.rb +414 -18
  77. data/lib/puppet/parser/functions/next.rb +38 -0
  78. data/lib/puppet/parser/functions/reduce.rb +1 -1
  79. data/lib/puppet/parser/functions/regsubst.rb +4 -2
  80. data/lib/puppet/parser/functions/require.rb +4 -27
  81. data/lib/puppet/parser/functions/return.rb +71 -0
  82. data/lib/puppet/parser/functions/reverse_each.rb +1 -1
  83. data/lib/puppet/parser/functions/scanf.rb +13 -8
  84. data/lib/puppet/parser/functions/slice.rb +1 -1
  85. data/lib/puppet/parser/functions/split.rb +1 -1
  86. data/lib/puppet/parser/functions/step.rb +1 -1
  87. data/lib/puppet/parser/functions/strftime.rb +185 -0
  88. data/lib/puppet/parser/functions/then.rb +1 -1
  89. data/lib/puppet/parser/functions/type.rb +1 -1
  90. data/lib/puppet/parser/functions/with.rb +3 -3
  91. data/lib/puppet/parser/resource.rb +8 -5
  92. data/lib/puppet/parser/scope.rb +1 -1
  93. data/lib/puppet/plugins/configuration.rb +8 -0
  94. data/lib/puppet/plugins/data_providers.rb +1 -0
  95. data/lib/puppet/plugins/data_providers/data_provider.rb +7 -28
  96. data/lib/puppet/plugins/data_providers/registry.rb +1 -0
  97. data/lib/puppet/pops.rb +4 -0
  98. data/lib/puppet/pops/evaluator/access_operator.rb +36 -5
  99. data/lib/puppet/pops/evaluator/closure.rb +81 -12
  100. data/lib/puppet/pops/evaluator/compare_operator.rb +24 -1
  101. data/lib/puppet/pops/evaluator/evaluator_impl.rb +29 -5
  102. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +1 -1
  103. data/lib/puppet/pops/evaluator/runtime3_converter.rb +53 -62
  104. data/lib/puppet/pops/evaluator/runtime3_support.rb +15 -6
  105. data/lib/puppet/pops/functions/dispatch.rb +9 -2
  106. data/lib/puppet/pops/functions/dispatcher.rb +3 -1
  107. data/lib/puppet/pops/functions/function.rb +19 -2
  108. data/lib/puppet/pops/issues.rb +9 -0
  109. data/lib/puppet/pops/label_provider.rb +2 -2
  110. data/lib/puppet/pops/loader/loader.rb +17 -0
  111. data/lib/puppet/pops/loader/static_loader.rb +0 -41
  112. data/lib/puppet/pops/lookup.rb +12 -0
  113. data/lib/puppet/pops/lookup/context.rb +86 -0
  114. data/lib/puppet/pops/lookup/explainer.rb +46 -6
  115. data/lib/puppet/pops/lookup/invocation.rb +19 -0
  116. data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
  117. data/lib/puppet/pops/model/factory.rb +20 -8
  118. data/lib/puppet/pops/model/model_label_provider.rb +3 -0
  119. data/lib/puppet/pops/model/model_meta.rb +2 -0
  120. data/lib/puppet/pops/model/model_tree_dumper.rb +14 -0
  121. data/lib/puppet/pops/parser/egrammar.ra +11 -6
  122. data/lib/puppet/pops/parser/eparser.rb +1112 -1086
  123. data/lib/puppet/pops/parser/heredoc_support.rb +1 -2
  124. data/lib/puppet/pops/pcore.rb +1 -0
  125. data/lib/puppet/pops/puppet_stack.rb +3 -3
  126. data/lib/puppet/pops/resource/param.rb +5 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +8 -4
  128. data/lib/puppet/pops/resource/resource_type_set.pcore +1 -0
  129. data/lib/puppet/pops/serialization/abstract_reader.rb +19 -2
  130. data/lib/puppet/pops/serialization/abstract_writer.rb +16 -3
  131. data/lib/puppet/pops/serialization/deserializer.rb +5 -1
  132. data/lib/puppet/pops/serialization/extension.rb +2 -0
  133. data/lib/puppet/pops/serialization/json.rb +76 -26
  134. data/lib/puppet/pops/serialization/serializer.rb +5 -1
  135. data/lib/puppet/pops/serialization/time_factory.rb +2 -1
  136. data/lib/puppet/pops/time/timespan.rb +718 -0
  137. data/lib/puppet/pops/time/timestamp.rb +148 -0
  138. data/lib/puppet/pops/types/p_binary_type.rb +220 -0
  139. data/lib/puppet/pops/types/p_object_type.rb +12 -6
  140. data/lib/puppet/pops/types/p_sensitive_type.rb +5 -1
  141. data/lib/puppet/pops/types/p_timespan_type.rb +141 -0
  142. data/lib/puppet/pops/types/p_timestamp_type.rb +69 -0
  143. data/lib/puppet/pops/types/string_converter.rb +62 -0
  144. data/lib/puppet/pops/types/type_asserter.rb +1 -1
  145. data/lib/puppet/pops/types/type_calculator.rb +17 -3
  146. data/lib/puppet/pops/types/type_factory.rb +35 -1
  147. data/lib/puppet/pops/types/type_formatter.rb +64 -11
  148. data/lib/puppet/pops/types/type_mismatch_describer.rb +110 -61
  149. data/lib/puppet/pops/types/type_parser.rb +18 -4
  150. data/lib/puppet/pops/types/types.rb +98 -63
  151. data/lib/puppet/pops/validation.rb +9 -1
  152. data/lib/puppet/pops/validation/checker4_0.rb +7 -0
  153. data/lib/puppet/property.rb +1 -1
  154. data/lib/puppet/provider.rb +3 -6
  155. data/lib/puppet/provider/mcx/mcxcontent.rb +1 -1
  156. data/lib/puppet/provider/mount/parsed.rb +18 -4
  157. data/lib/puppet/provider/nameservice/directoryservice.rb +15 -7
  158. data/lib/puppet/provider/package/gem.rb +6 -1
  159. data/lib/puppet/provider/package/pip.rb +0 -1
  160. data/lib/puppet/provider/package/pkg.rb +5 -1
  161. data/lib/puppet/provider/package/pkgng.rb +1 -1
  162. data/lib/puppet/provider/package/yum.rb +10 -0
  163. data/lib/puppet/provider/service/launchd.rb +1 -0
  164. data/lib/puppet/provider/user/directoryservice.rb +6 -6
  165. data/lib/puppet/provider/yumrepo/inifile.rb +1 -1
  166. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  167. data/lib/puppet/resource.rb +54 -12
  168. data/lib/puppet/resource/capability_finder.rb +15 -9
  169. data/lib/puppet/resource/catalog.rb +25 -6
  170. data/lib/puppet/resource/type.rb +3 -1
  171. data/lib/puppet/settings.rb +1 -1
  172. data/lib/puppet/settings/environment_conf.rb +12 -4
  173. data/lib/puppet/syntax_checkers/base64.rb +41 -0
  174. data/lib/puppet/syntax_checkers/json.rb +0 -2
  175. data/lib/puppet/transaction.rb +6 -0
  176. data/lib/puppet/transaction/additional_resource_generator.rb +5 -0
  177. data/lib/puppet/transaction/report.rb +7 -2
  178. data/lib/puppet/type.rb +2 -1
  179. data/lib/puppet/type/file/checksum.rb +1 -0
  180. data/lib/puppet/type/file/content.rb +4 -4
  181. data/lib/puppet/type/mount.rb +44 -0
  182. data/lib/puppet/type/ssh_authorized_key.rb +1 -1
  183. data/lib/puppet/type/tidy.rb +3 -0
  184. data/lib/puppet/type/user.rb +12 -6
  185. data/lib/puppet/util/log.rb +25 -0
  186. data/lib/puppet/util/plist.rb +8 -3
  187. data/lib/puppet/version.rb +1 -1
  188. data/lib/puppet_x.rb +7 -1
  189. data/spec/integration/application/apply_spec.rb +118 -0
  190. data/spec/integration/parser/compiler_spec.rb +28 -0
  191. data/spec/integration/parser/pcore_resource_spec.rb +40 -3
  192. data/spec/integration/provider/mount_spec.rb +2 -1
  193. data/spec/integration/util/windows/principal_spec.rb +2 -2
  194. data/spec/integration/util/windows/registry_spec.rb +4 -4
  195. data/spec/lib/puppet_spec/compiler.rb +5 -1
  196. data/spec/lib/puppet_spec/unindent.rb +5 -0
  197. data/spec/shared_contexts/types_setup.rb +6 -0
  198. data/spec/shared_examples/rhel_package_provider.rb +16 -0
  199. data/spec/spec_helper.rb +1 -0
  200. data/spec/unit/agent_spec.rb +11 -0
  201. data/spec/unit/application/lookup_spec.rb +94 -3
  202. data/spec/unit/capability_spec.rb +22 -0
  203. data/spec/unit/configurer_spec.rb +8 -0
  204. data/spec/unit/face/epp_face_spec.rb +22 -3
  205. data/spec/unit/functions/assert_type_spec.rb +3 -3
  206. data/spec/unit/functions/binary_file_spec.rb +46 -0
  207. data/spec/unit/functions/break_spec.rb +89 -0
  208. data/spec/unit/{parser/functions → functions}/contain_spec.rb +68 -3
  209. data/spec/unit/functions/find_file_spec.rb +69 -0
  210. data/spec/unit/functions/include_spec.rb +175 -0
  211. data/spec/unit/functions/logging_spec.rb +54 -0
  212. data/spec/unit/functions/lookup_spec.rb +3 -3
  213. data/spec/unit/functions/new_spec.rb +105 -5
  214. data/spec/unit/functions/next_spec.rb +93 -0
  215. data/spec/unit/functions/require_spec.rb +83 -0
  216. data/spec/unit/functions/return_spec.rb +105 -0
  217. data/spec/unit/{parser/functions → functions}/shared.rb +14 -11
  218. data/spec/unit/functions/strftime_spec.rb +152 -0
  219. data/spec/unit/functions4_spec.rb +22 -0
  220. data/spec/unit/indirector/face_spec.rb +10 -2
  221. data/spec/unit/network/http/error_spec.rb +1 -2
  222. data/spec/unit/network/http/handler_spec.rb +6 -5
  223. data/spec/unit/parser/functions/hiera_array_spec.rb +1 -1
  224. data/spec/unit/parser/functions/hiera_hash_spec.rb +1 -1
  225. data/spec/unit/parser/functions/hiera_include_spec.rb +1 -1
  226. data/spec/unit/parser/functions/hiera_spec.rb +1 -1
  227. data/spec/unit/parser/functions/lookup_spec.rb +1 -1
  228. data/spec/unit/parser/functions/regsubst_spec.rb +1 -1
  229. data/spec/unit/parser/functions/split_spec.rb +1 -1
  230. data/spec/unit/pops/evaluator/access_ops_spec.rb +81 -1
  231. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +170 -0
  232. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +29 -4
  233. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +112 -4
  234. data/spec/unit/pops/loaders/dependency_loader_spec.rb +12 -0
  235. data/spec/unit/pops/loaders/static_loader_spec.rb +0 -26
  236. data/spec/unit/pops/lookup/context_spec.rb +149 -0
  237. data/spec/unit/pops/parser/parse_functions_spec.rb +19 -0
  238. data/spec/unit/pops/parser/parse_lambda_spec.rb +19 -0
  239. data/spec/unit/pops/puppet_stack_spec.rb +1 -1
  240. data/spec/unit/pops/resource/resource_type_impl_spec.rb +74 -0
  241. data/spec/unit/pops/serialization/packer_spec.rb +34 -14
  242. data/spec/unit/pops/serialization/serialization_spec.rb +67 -5
  243. data/spec/unit/pops/time/timespan_spec.rb +121 -0
  244. data/spec/unit/pops/types/p_binary_type_spec.rb +243 -0
  245. data/spec/unit/pops/types/p_object_type_spec.rb +7 -7
  246. data/spec/unit/pops/types/p_sensitive_type_spec.rb +1 -1
  247. data/spec/unit/pops/types/p_timespan_type_spec.rb +273 -0
  248. data/spec/unit/pops/types/p_timestamp_type_spec.rb +311 -0
  249. data/spec/unit/pops/types/p_type_set_type_spec.rb +13 -13
  250. data/spec/unit/pops/types/ruby_generator_spec.rb +12 -12
  251. data/spec/unit/pops/types/string_converter_spec.rb +89 -0
  252. data/spec/unit/pops/types/type_asserter_spec.rb +3 -3
  253. data/spec/unit/pops/types/type_calculator_spec.rb +113 -5
  254. data/spec/unit/pops/types/type_formatter_spec.rb +40 -0
  255. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +49 -38
  256. data/spec/unit/pops/types/type_parser_spec.rb +87 -4
  257. data/spec/unit/pops/types/types_spec.rb +1 -1
  258. data/spec/unit/pops/validator/validator_spec.rb +23 -0
  259. data/spec/unit/provider/mount/parsed_spec.rb +47 -29
  260. data/spec/unit/provider/package/pkg_spec.rb +109 -99
  261. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +1 -0
  262. data/spec/unit/provider/user/aix_spec.rb +1 -1
  263. data/spec/unit/provider/user/directoryservice_spec.rb +101 -30
  264. data/spec/unit/resource/capability_finder_spec.rb +29 -7
  265. data/spec/unit/resource/catalog_spec.rb +127 -0
  266. data/spec/unit/ssl/certificate_request_spec.rb +1 -1
  267. data/spec/unit/transaction/additional_resource_generator_spec.rb +30 -0
  268. data/spec/unit/transaction/persistence_spec.rb +1 -6
  269. data/spec/unit/transaction/report_spec.rb +23 -0
  270. data/spec/unit/transaction_spec.rb +38 -0
  271. data/spec/unit/type/mount_spec.rb +5 -0
  272. data/spec/unit/util/plist_spec.rb +14 -2
  273. metadata +71 -12
  274. data/spec/integration/parser/functions/require_spec.rb +0 -43
  275. data/spec/unit/parser/functions/include_spec.rb +0 -55
  276. data/spec/unit/parser/functions/require_spec.rb +0 -68
@@ -92,13 +92,23 @@ class CompareOperator
92
92
  end
93
93
  end
94
94
 
95
+ def cmp_Timespan(a, b)
96
+ raise ArgumentError.new('Timespans are only comparable to Timespans, Integers, and Floats') unless b.is_a?(Time::Timespan) || b.is_a?(Integer) || b.is_a?(Float)
97
+ a <=> b
98
+ end
99
+
100
+ def cmp_Timestamp(a, b)
101
+ raise ArgumentError.new('Timestamps are only comparable to Timestamps, Integers, and Floats') unless b.is_a?(Time::Timestamp) || b.is_a?(Integer) || b.is_a?(Float)
102
+ a <=> b
103
+ end
104
+
95
105
  def cmp_Version(a, b)
96
106
  raise ArgumentError.new('Versions not comparable to non Versions') unless b.is_a?(Semantic::Version)
97
107
  a <=> b
98
108
  end
99
109
 
100
110
  def cmp_Object(a, b)
101
- raise ArgumentError.new('Only Strings, Numbers, and Versions are comparable')
111
+ raise ArgumentError.new('Only Strings, Numbers, Timespans, Timestamps, and Versions are comparable')
102
112
  end
103
113
 
104
114
 
@@ -137,6 +147,19 @@ class CompareOperator
137
147
  end
138
148
  end
139
149
 
150
+ def include_Binary(a, b, scope)
151
+ case b
152
+ when Puppet::Pops::Types::PBinaryType::Binary
153
+ a.binary_buffer.include?(b.binary_buffer)
154
+ when String
155
+ a.binary_buffer.include?(b)
156
+ when Numeric
157
+ a.binary_buffer.bytes.include?(b)
158
+ else
159
+ false
160
+ end
161
+ end
162
+
140
163
  def include_Array(a, b, scope)
141
164
  case b
142
165
  when Regexp
@@ -117,6 +117,10 @@ class EvaluatorImpl
117
117
  # call stack instead
118
118
  fail(Issues::RUNTIME_ERROR, target, {:detail => e.message}, e.original || e)
119
119
 
120
+ rescue StopIteration => e
121
+ # Ensure these are not rescued as StandardError
122
+ raise e
123
+
120
124
  rescue StandardError => e
121
125
  # All other errors, use its message and call stack
122
126
  fail(Issues::RUNTIME_ERROR, target, {:detail => e.message}, e)
@@ -407,7 +411,20 @@ class EvaluatorImpl
407
411
  begin
408
412
  if operator == :'%' && (left.is_a?(Float) || right.is_a?(Float))
409
413
  # Deny users the fun of seeing severe rounding errors and confusing results
410
- fail(Issues::OPERATOR_NOT_APPLICABLE, left_o, {:operator => operator, :left_value => left})
414
+ fail(Issues::OPERATOR_NOT_APPLICABLE, left_o, {:operator => operator, :left_value => left}) if left.is_a?(Float)
415
+ fail(Issues::OPERATOR_NOT_APPLICABLE_WHEN, left_o, {:operator => operator, :left_value => left, :right_value => right})
416
+ end
417
+ if right.is_a?(Time::TimeData) && !left.is_a?(Time::TimeData)
418
+ if operator == :'+' || operator == :'*' && right.is_a?(Time::Timespan)
419
+ # Switch places. Let the TimeData do the arithmetic
420
+ x = left
421
+ left = right
422
+ right = x
423
+ elsif operator == :'-' && right.is_a?(Time::Timespan)
424
+ left = Time::Timespan.new((left * Time::NSECS_PER_SEC).to_i)
425
+ else
426
+ fail(Issues::OPERATOR_NOT_APPLICABLE_WHEN, left_o, {:operator => operator, :left_value => left, :right_value => right})
427
+ end
411
428
  end
412
429
  result = left.send(operator, right)
413
430
  rescue NoMethodError => e
@@ -618,9 +635,7 @@ class EvaluatorImpl
618
635
  # Evaluates all statements and produces the last evaluated value
619
636
  #
620
637
  def eval_BlockExpression o, scope
621
- r = nil
622
- o.statements.each {|s| r = evaluate(s, scope)}
623
- r
638
+ o.statements.reduce(nil) {|memo, s| evaluate(s, scope)}
624
639
  end
625
640
 
626
641
  # Performs optimized search over case option values, lazily evaluating each
@@ -693,7 +708,16 @@ class EvaluatorImpl
693
708
  end
694
709
 
695
710
  def eval_Program(o, scope)
696
- evaluate(o.body, scope)
711
+ begin
712
+ file = o.locator.file
713
+ line = 0
714
+ # Add stack frame for "top scope" logic. See Puppet::Pops::PuppetStack
715
+ return Puppet::Pops::PuppetStack.stack(file, line, self, 'evaluate', [o.body, scope])
716
+ #evaluate(o.body, scope)
717
+ rescue Puppet::Pops::Evaluator::PuppetStopIteration => ex
718
+ # breaking out of a file level program is not allowed
719
+ raise Puppet::ParseError.new("break() from context where this is illegal", ex.file, ex.line)
720
+ end
697
721
  end
698
722
 
699
723
  # Produces Array[PAnyType], an array of resource references
@@ -16,7 +16,7 @@ require 'rgen/ecore/ecore'
16
16
  # * Default is not accepted as being literal
17
17
  # * Regular Expression is not accepted as being literal
18
18
  # * Hash with non String keys
19
- # * String with interpolatin
19
+ # * String with interpolation
20
20
  #
21
21
  class Puppet::Pops::Evaluator::JsonStrictLiteralEvaluator
22
22
  #include Puppet::Pops::Utils
@@ -15,7 +15,7 @@ class Runtime3Converter
15
15
  # @return [Array] The converted values
16
16
  #
17
17
  def self.map_args(args, scope, undef_value)
18
- @@instance.map_args(args, scope, undef_value)
18
+ @instance.map_args(args, scope, undef_value)
19
19
  end
20
20
 
21
21
  # Converts 4x supported values to a 3x values. Same as calling Runtime3Converter.instance.convert(...)
@@ -26,13 +26,13 @@ class Runtime3Converter
26
26
  # @return [Object] The converted value
27
27
  #
28
28
  def self.convert(o, scope, undef_value)
29
- @@instance.convert(o, scope, undef_value)
29
+ @instance.convert(o, scope, undef_value)
30
30
  end
31
31
 
32
32
  # Returns the singleton instance of this class.
33
33
  # @return [Runtime3Converter] The singleton instance
34
34
  def self.instance
35
- @@instance
35
+ @instance
36
36
  end
37
37
 
38
38
  # Converts 4x supported values to a 3x values.
@@ -58,79 +58,41 @@ class Runtime3Converter
58
58
  end
59
59
 
60
60
  def convert_NilClass(o, scope, undef_value)
61
- undef_value
62
- end
63
-
64
- def convert2_NilClass(o, scope, undef_value)
65
- :undef
61
+ @inner ? :undef : undef_value
66
62
  end
67
63
 
68
64
  def convert_String(o, scope, undef_value)
69
65
  # although wasteful, needed because user code may mutate these strings in Resources
70
66
  o.frozen? ? o.dup : o
71
67
  end
72
- alias convert2_String :convert_String
73
68
 
74
69
  def convert_Object(o, scope, undef_value)
75
70
  o
76
71
  end
77
- alias :convert2_Object :convert_Object
78
72
 
79
73
  def convert_Array(o, scope, undef_value)
80
- o.map {|x| convert2(x, scope, undef_value) }
74
+ ic = @inner_converter
75
+ o.map {|x| ic.convert(x, scope, undef_value) }
81
76
  end
82
- alias :convert2_Array :convert_Array
83
77
 
84
78
  def convert_Hash(o, scope, undef_value)
85
79
  result = {}
86
- o.each {|k,v| result[convert2(k, scope, undef_value)] = convert2(v, scope, undef_value) }
80
+ ic = @inner_converter
81
+ o.each {|k,v| result[ic.convert(k, scope, undef_value)] = ic.convert(v, scope, undef_value) }
87
82
  result
88
83
  end
89
- alias :convert2_Hash :convert_Hash
90
84
 
91
85
  def convert_Iterator(o, scope, undef_value)
92
86
  raise Puppet::Error, 'Use of an Iterator is not supported here'
93
87
  end
94
- alias :convert2_Iterator :convert_Iterator
95
-
96
- def convert_Regexp(o, scope, undef_value)
97
- # Puppet 3x cannot handle parameter values that are reqular expressions. Turn into regexp string in
98
- # source form
99
- o.inspect
100
- end
101
- alias :convert2_Regexp :convert_Regexp
102
-
103
- def convert_SemVer(o, scope, undef_value)
104
- # Puppet 3x cannot handle SemVers. Use the string form
105
- o.to_s
106
- end
107
- alias :convert2_SemVer :convert_SemVer
108
-
109
- def convert_SemVerRange(o, scope, undef_value)
110
- # Puppet 3x cannot handle SemVerRanges. Use the string form
111
- o.to_s
112
- end
113
- alias :convert2_SemVerRange :convert_SemVerRange
114
88
 
115
89
  def convert_Symbol(o, scope, undef_value)
116
- case o
117
- # Support :undef since it may come from a 3x structure
118
- when :undef
119
- undef_value # 3x wants undef as either empty string or :undef
120
- else
121
- o # :default, and all others are verbatim since they are new in future evaluator
122
- end
123
- end
124
-
125
- # The :undef symbol should not be converted when nested in arrays or hashes
126
- def convert2_Symbol(o, scope, undef_value)
127
- o
90
+ o == :undef && !@inner ? undef_value : o
128
91
  end
129
92
 
130
93
  def convert_PAnyType(o, scope, undef_value)
131
94
  o
132
95
  end
133
- alias :convert2_PAnyType :convert_PAnyType
134
96
 
135
97
  def convert_PCatalogEntryType(o, scope, undef_value)
136
98
  # Since 4x does not support dynamic scoping, all names are absolute and can be
@@ -142,7 +104,6 @@ class Runtime3Converter
142
104
  t = Runtime3ResourceSupport.find_resource_type(scope, t) unless t == 'class' || t == 'node'
143
105
  Puppet::Resource.new(t, title)
144
106
  end
145
- alias :convert2_PCatalogEntryType :convert_PCatalogEntryType
146
107
 
147
108
  # Produces an array with [type, title] from a PCatalogEntryType
148
109
  # This method is used to produce the arguments for creation of reference resource instances
@@ -170,24 +131,54 @@ class Runtime3Converter
170
131
  end
171
132
  end
172
133
 
173
- private
134
+ protected
174
135
 
175
- def initialize
176
- @convert_visitor = Puppet::Pops::Visitor.new(self, 'convert', 2, 2)
177
- @convert2_visitor = Puppet::Pops::Visitor.new(self, 'convert2', 2, 2)
136
+ def initialize(inner = false)
137
+ @inner = inner
138
+ @inner_converter = inner ? self : self.class.new(true)
139
+ @convert_visitor = Puppet::Pops::Visitor.new(self, 'convert', 2, 2)
178
140
  end
179
141
 
180
- @@instance = self.new
142
+ @instance = self.new
143
+ end
181
144
 
182
- # Converts a nested 4x supported value to a 3x value.
183
- #
184
- # @param o [Object]The value to convert
185
- # @param scope [Puppet::Parser::Scope] The scope to use when converting
186
- # @param undef_value [Object] The value that nil is converted to
187
- # @return [Object] The converted value
188
- #
189
- def convert2(o, scope, undef_value)
190
- @convert2_visitor.visit_this_2(self, o, scope, undef_value)
145
+ # A Ruby function written for the 3.x API cannot be expected to handle extended data types. This
146
+ # converter ensures that they are converted to String format
147
+ # @api private
148
+ class Runtime3FunctionArgumentConverter < Runtime3Converter
149
+
150
+ def convert_Regexp(o, scope, undef_value)
151
+ # Puppet 3x cannot handle parameter values that are reqular expressions. Turn into regexp string in
152
+ # source form
153
+ o.inspect
154
+ end
155
+
156
+ def convert_Version(o, scope, undef_value)
157
+ # Puppet 3x cannot handle SemVers. Use the string form
158
+ o.to_s
159
+ end
160
+
161
+ def convert_VersionRange(o, scope, undef_value)
162
+ # Puppet 3x cannot handle SemVerRanges. Use the string form
163
+ o.to_s
191
164
  end
165
+
166
+ def convert_Binary(o, scope, undef_value)
167
+ # Puppet 3x cannot handle Binary. Use the string form
168
+ o.to_s
169
+ end
170
+
171
+ def convert_Timespan(o, scope, undef_value)
172
+ # Puppet 3x cannot handle Timespans. Use the string form
173
+ o.to_s
174
+ end
175
+
176
+ def convert_Timestamp(o, scope, undef_value)
177
+ # Puppet 3x cannot handle Timestamps. Use the string form
178
+ o.to_s
179
+ end
180
+
181
+ @instance = self.new
192
182
  end
183
+
193
184
  end
@@ -59,11 +59,19 @@ module Runtime3Support
59
59
  # The error is not specific enough to allow catching it - need to check the actual message text.
60
60
  # TODO: Improve the messy implementation in Scope.
61
61
  #
62
+ if name == "server_facts"
63
+ if Puppet[:trusted_server_facts] || Puppet[:strict] == :error
64
+ fail(Issues::ILLEGAL_RESERVED_ASSIGNMENT, o, {:name => name} )
65
+ elsif Puppet[:strict] == :warning
66
+ file, line = extract_file_line(o)
67
+ msg = "Assignment to $server_facts is deprecated"
68
+ Puppet.warn_once(:deprecation, msg, msg, file, line)
69
+ end
70
+ end
71
+
62
72
  if scope.bound?(name)
63
73
  if Puppet::Parser::Scope::RESERVED_VARIABLE_NAMES.include?(name)
64
74
  fail(Issues::ILLEGAL_RESERVED_ASSIGNMENT, o, {:name => name} )
65
- elsif name == "server_facts" && Puppet[:trusted_server_facts]
66
- fail(Issues::ILLEGAL_RESERVED_ASSIGNMENT, o, {:name => name} )
67
75
  else
68
76
  fail(Issues::ILLEGAL_REASSIGNMENT, o, {:name => name} )
69
77
  end
@@ -240,7 +248,7 @@ module Runtime3Support
240
248
  # @param name [String] the name of the function (without the 'function_' prefix used by scope)
241
249
  # @param args [Array] arguments, may be empty
242
250
  # @param scope [Object] the (runtime specific) scope where evaluation takes place
243
- # @raise ArgumentError 'unknown function' if the function does not exist
251
+ # @raise [ArgumentError] 'unknown function' if the function does not exist
244
252
  #
245
253
  def external_call_function(name, args, scope, &block)
246
254
  # Call via 4x API if the function exists there
@@ -261,7 +269,7 @@ module Runtime3Support
261
269
 
262
270
  # Arguments must be mapped since functions are unaware of the new and magical creatures in 4x.
263
271
  # NOTE: Passing an empty string last converts nil/:undef to empty string
264
- mapped_args = Runtime3Converter.map_args(args, scope, '')
272
+ mapped_args = Runtime3FunctionArgumentConverter.map_args(args, scope, '')
265
273
  result = scope.send("function_#{name}", mapped_args, &block)
266
274
  # Prevent non r-value functions from leaking their result (they are not written to care about this)
267
275
  Puppet::Parser::Functions.rvalue?(name) ? result : nil
@@ -281,7 +289,7 @@ module Runtime3Support
281
289
 
282
290
  # Arguments must be mapped since functions are unaware of the new and magical creatures in 4x.
283
291
  # NOTE: Passing an empty string last converts nil/:undef to empty string
284
- mapped_args = Runtime3Converter.map_args(args, scope, '')
292
+ mapped_args = Runtime3FunctionArgumentConverter.map_args(args, scope, '')
285
293
  result = Puppet::Pops::PuppetStack.stack(file, line, scope, "function_#{name}", [mapped_args], &block)
286
294
  # Prevent non r-value functions from leaking their result (they are not written to care about this)
287
295
  Puppet::Parser::Functions.rvalue?(name) ? result : nil
@@ -299,7 +307,8 @@ module Runtime3Support
299
307
  end
300
308
 
301
309
  def convert(value, scope, undef_value)
302
- Runtime3Converter.convert(value, scope, undef_value)
310
+ converter = scope.environment.rich_data? ? Runtime3Converter.instance : Runtime3FunctionArgumentConverter.instance
311
+ converter.convert(value, scope, undef_value)
303
312
  end
304
313
 
305
314
  def create_resources(o, scope, virtual, exported, type_name, resource_titles, evaluated_parameters)
@@ -1,3 +1,5 @@
1
+ module Puppet::Pops
2
+ module Functions
1
3
  # Defines a connection between a implementation method and the signature that
2
4
  # the method will handle.
3
5
  #
@@ -5,7 +7,7 @@
5
7
  # constructed using the DSL defined in {Puppet::Functions}.
6
8
  #
7
9
  # @api private
8
- class Puppet::Pops::Functions::Dispatch < Puppet::Pops::Evaluator::CallableSignature
10
+ class Dispatch < Evaluator::CallableSignature
9
11
  # @api public
10
12
  attr_reader :type
11
13
  # TODO: refactor to parameter_names since that makes it API
@@ -42,7 +44,10 @@ class Puppet::Pops::Functions::Dispatch < Puppet::Pops::Evaluator::CallableSigna
42
44
 
43
45
  # @api private
44
46
  def invoke(instance, calling_scope, args, &block)
45
- instance.send(@method_name, *weave(calling_scope, args), &block)
47
+ result = instance.send(@method_name, *weave(calling_scope, args), &block)
48
+ return_type = @type.return_type
49
+ Types::TypeAsserter.assert_instance_of(nil, return_type, result) { "value returned from function '#{@method_name}'" } unless return_type.nil?
50
+ result
46
51
  end
47
52
 
48
53
  # @api private
@@ -83,3 +88,5 @@ class Puppet::Pops::Functions::Dispatch < Puppet::Pops::Evaluator::CallableSigna
83
88
  end
84
89
  end
85
90
  end
91
+ end
92
+ end
@@ -32,7 +32,9 @@ class Puppet::Pops::Functions::Dispatcher
32
32
  actual = tc.infer_set(block_given? ? args + [block] : args)
33
33
  found = @dispatchers.find { |d| tc.callable?(d.type, actual) }
34
34
  if found
35
- found.invoke(instance, calling_scope, args, &block)
35
+ catch(:next) do
36
+ found.invoke(instance, calling_scope, args, &block)
37
+ end
36
38
  else
37
39
  raise ArgumentError, Puppet::Pops::Types::TypeMismatchDescriber.describe_signatures(instance.class.name, @dispatchers, actual)
38
40
  end
@@ -41,7 +41,24 @@ class Puppet::Pops::Functions::Function
41
41
  #
42
42
  # @api public
43
43
  def call(scope, *args, &block)
44
- self.class.dispatcher.dispatch(self, scope, args, &block)
44
+ begin
45
+ result = catch(:return) do
46
+ return self.class.dispatcher.dispatch(self, scope, args, &block)
47
+ end
48
+ return result.value
49
+ rescue Puppet::Pops::Evaluator::Next => jumper
50
+ begin
51
+ throw :next, jumper.value
52
+ rescue Puppet::Parser::Scope::UNCAUGHT_THROW_EXCEPTION => uncaught
53
+ raise Puppet::ParseError.new("next() from context where this is illegal", jumper.file, jumper.line)
54
+ end
55
+ rescue Puppet::Pops::Evaluator::Return => jumper
56
+ begin
57
+ throw :return, jumper
58
+ rescue Puppet::Parser::Scope::UNCAUGHT_THROW_EXCEPTION => uncaught
59
+ raise Puppet::ParseError.new("return() from context where this is illegal", jumper.file, jumper.line)
60
+ end
61
+ end
45
62
  end
46
63
 
47
64
  # Allows the implementation of a function to call other functions by name. The callable functions
@@ -109,7 +126,7 @@ class Puppet::Pops::Functions::Function
109
126
  # Call via 3x API
110
127
  # Arguments must be mapped since functions are unaware of the new and magical creatures in 4x.
111
128
  # NOTE: Passing an empty string last converts nil/:undef to empty string
112
- result = scope.send(func_3x, Puppet::Pops::Evaluator::Runtime3Converter.map_args(args, loader_scope, ''), &block)
129
+ result = scope.send(func_3x, Puppet::Pops::Evaluator::Runtime3FunctionArgumentConverter.map_args(args, loader_scope, ''), &block)
113
130
 
114
131
  # Prevent non r-value functions from leaking their result (they are not written to care about this)
115
132
  Puppet::Parser::Functions.rvalue?(function_name) ? result : nil
@@ -255,6 +255,10 @@ module Issues
255
255
  "Operator '#{operator}' is not applicable to #{label.a_an(left_value)}."
256
256
  end
257
257
 
258
+ OPERATOR_NOT_APPLICABLE_WHEN = hard_issue :OPERATOR_NOT_APPLICABLE_WHEN, :operator, :left_value, :right_value do
259
+ "Operator '#{operator}' is not applicable to #{label.a_an(left_value)} when right side is #{label.a_an(right_value)}."
260
+ end
261
+
258
262
  COMPARISON_NOT_POSSIBLE = hard_issue :COMPARISON_NOT_POSSIBLE, :operator, :left_value, :right_value, :detail do
259
263
  "Comparison of: #{label(left_value)} #{operator} #{label(right_value)}, is not possible. Caused by '#{detail}'."
260
264
  end
@@ -430,6 +434,11 @@ module Issues
430
434
  "#{label.a_an_uc(left_value)}[] cannot use #{actual} where #{expected_text} expected"
431
435
  end
432
436
 
437
+ BAD_STRING_SLICE_KEY_TYPE = issue :BAD_STRING_SLICE_KEY_TYPE, :left_value, :actual_type do
438
+ actual_type_text = "#{label.article(actual_type)} #{actual_type}"
439
+ "A substring operation does not accept #{actual_type_text} as a character index. Expected an Integer"
440
+ end
441
+
433
442
  BAD_NOT_UNDEF_SLICE_TYPE = issue :BAD_NOT_UNDEF_SLICE_TYPE, :base_type, :actual do
434
443
  "#{base_type}[] argument must be a Type or a String. Got #{actual}"
435
444
  end