pdk 1.17.0 → 1.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +71 -2
  3. data/lib/pdk/cli/convert.rb +7 -9
  4. data/lib/pdk/cli/new/class.rb +2 -1
  5. data/lib/pdk/cli/new/defined_type.rb +2 -1
  6. data/lib/pdk/cli/new/provider.rb +2 -1
  7. data/lib/pdk/cli/new/task.rb +2 -1
  8. data/lib/pdk/cli/new/test.rb +2 -1
  9. data/lib/pdk/cli/new/transport.rb +2 -1
  10. data/lib/pdk/cli/remove/config.rb +80 -0
  11. data/lib/pdk/cli/remove.rb +20 -0
  12. data/lib/pdk/cli/set/config.rb +119 -0
  13. data/lib/pdk/cli/set.rb +20 -0
  14. data/lib/pdk/cli/update.rb +6 -8
  15. data/lib/pdk/cli/util/update_manager_printer.rb +82 -0
  16. data/lib/pdk/cli/util.rb +1 -0
  17. data/lib/pdk/cli.rb +2 -0
  18. data/lib/pdk/config.rb +96 -13
  19. data/lib/pdk/context.rb +8 -5
  20. data/lib/pdk/generate/defined_type.rb +25 -32
  21. data/lib/pdk/generate/module.rb +11 -10
  22. data/lib/pdk/generate/provider.rb +16 -65
  23. data/lib/pdk/generate/puppet_class.rb +25 -31
  24. data/lib/pdk/generate/puppet_object.rb +83 -187
  25. data/lib/pdk/generate/resource_api_object.rb +55 -0
  26. data/lib/pdk/generate/task.rb +28 -46
  27. data/lib/pdk/generate/transport.rb +21 -75
  28. data/lib/pdk/generate.rb +1 -0
  29. data/lib/pdk/module/convert.rb +41 -23
  30. data/lib/pdk/module/release.rb +1 -1
  31. data/lib/pdk/module/update.rb +6 -10
  32. data/lib/pdk/module/update_manager.rb +7 -0
  33. data/lib/pdk/module.rb +0 -1
  34. data/lib/pdk/template/fetcher/git.rb +85 -0
  35. data/lib/pdk/template/fetcher/local.rb +28 -0
  36. data/lib/pdk/template/fetcher.rb +98 -0
  37. data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +116 -0
  38. data/lib/pdk/template/renderer/v1/renderer.rb +132 -0
  39. data/lib/pdk/template/renderer/v1/template_file.rb +102 -0
  40. data/lib/pdk/template/renderer/v1.rb +25 -0
  41. data/lib/pdk/template/renderer.rb +96 -0
  42. data/lib/pdk/template/template_dir.rb +67 -0
  43. data/lib/pdk/template.rb +59 -0
  44. data/lib/pdk/tests/unit.rb +5 -0
  45. data/lib/pdk/util/json_finder.rb +84 -0
  46. data/lib/pdk/util/puppet_strings.rb +3 -3
  47. data/lib/pdk/util/template_uri.rb +4 -6
  48. data/lib/pdk/util.rb +4 -35
  49. data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +23 -0
  50. data/lib/pdk/validate/control_repo/environment_conf_validator.rb +98 -0
  51. data/lib/pdk/validate/invokable_validator.rb +2 -3
  52. data/lib/pdk/validate/validator.rb +7 -0
  53. data/lib/pdk/validate/validator_group.rb +1 -0
  54. data/lib/pdk/validate.rb +17 -10
  55. data/lib/pdk/version.rb +1 -1
  56. data/lib/pdk.rb +1 -1
  57. data/locales/pdk.pot +356 -228
  58. metadata +33 -12
  59. data/lib/pdk/module/template_dir/base.rb +0 -268
  60. data/lib/pdk/module/template_dir/git.rb +0 -91
  61. data/lib/pdk/module/template_dir/local.rb +0 -21
  62. data/lib/pdk/module/template_dir.rb +0 -115
  63. data/lib/pdk/template_file.rb +0 -96
@@ -0,0 +1,84 @@
1
+ module PDK
2
+ module Util
3
+ # Processes a given string, looking for JSON objects and parsing them.
4
+ #
5
+ # @example A string with a JSON object and some junk characters
6
+ # PDK::Util::JSONFinder.new('foo{"bar":1}').objects
7
+ # => [{ 'bar' => 1 }]
8
+ #
9
+ # @example A string with mulitple JSON objects
10
+ # PDK::Util::JSONFinder.new('foo{"bar":1}baz{"gronk":2}').objects
11
+ # => [{ 'bar' => 1 }, { 'gronk' => 2 }]
12
+ class JSONFinder
13
+ # Creates a new instance of PDK::Util::JSONFinder.
14
+ #
15
+ # @param string [String] the string to find JSON objects inside of.
16
+ #
17
+ # @return [PDK::Util::JSONFinder] a new PDK::Util::JSONFinder object.
18
+ def initialize(string)
19
+ require 'strscan'
20
+
21
+ @scanner = StringScanner.new(string)
22
+ end
23
+
24
+ # Returns the parsed JSON objects from the string.
25
+ #
26
+ # @return [Array[Hash]] the parsed JSON objects present in the string.
27
+ def objects
28
+ return @objects unless @objects.nil?
29
+
30
+ require 'json'
31
+
32
+ until @scanner.eos?
33
+ @scanner.getch until @scanner.peek(1) == '{' || @scanner.eos?
34
+
35
+ (@objects ||= []) << begin
36
+ JSON.parse(read_object(true) || '')
37
+ rescue JSON::ParserError
38
+ nil
39
+ end
40
+ end
41
+
42
+ @objects = @objects.compact
43
+ end
44
+
45
+ private
46
+
47
+ # Recursively process the string to extract a complete JSON object.
48
+ #
49
+ # @param new_object [Boolean] Set to true if processing a new object to
50
+ # capture the opening brace. Set to false if being called recursively
51
+ # where the opening brace has already been captured.
52
+ #
53
+ # @return [String] The matched substring containing a JSON object.
54
+ def read_object(new_object = false)
55
+ matched_text = new_object ? @scanner.getch : ''
56
+
57
+ until @scanner.eos?
58
+ text = @scanner.scan_until(%r{(?:(?<!\\)"|\{|\})})
59
+ unless text
60
+ @scanner.terminate
61
+ return nil
62
+ end
63
+ matched_text += text
64
+
65
+ case @scanner.matched
66
+ when '}'
67
+ break
68
+ when '"'
69
+ text = @scanner.scan_until(%r{(?<!\\)"})
70
+ unless text
71
+ @scanner.terminate
72
+ return nil
73
+ end
74
+ matched_text += text
75
+ else
76
+ matched_text += read_object
77
+ end
78
+ end
79
+
80
+ matched_text
81
+ end
82
+ end
83
+ end
84
+ end
@@ -92,12 +92,12 @@ module PDK
92
92
  require 'pdk/generate'
93
93
 
94
94
  generators = PDK::Generate.generators.select do |gen|
95
- gen.respond_to?(:puppet_strings_type) && !gen.puppet_strings_type.nil?
95
+ gen.const_defined?(:PUPPET_STRINGS_TYPE) && !gen::PUPPET_STRINGS_TYPE.nil?
96
96
  end
97
97
 
98
98
  known_objects = generate_hash
99
99
 
100
- generators.map { |gen| [gen, known_objects[gen.puppet_strings_type]] }.reject do |_, obj|
100
+ generators.map { |gen| [gen, known_objects[gen::PUPPET_STRINGS_TYPE]] }.reject do |_, obj|
101
101
  obj.nil? || obj.empty?
102
102
  end
103
103
  end
@@ -117,7 +117,7 @@ module PDK
117
117
  require 'pdk/generate'
118
118
 
119
119
  PDK::Generate.generators.find do |gen|
120
- gen.respond_to?(:puppet_strings_type) && gen.puppet_strings_type == type
120
+ gen.const_defined?(:PUPPET_STRINGS_TYPE) && gen::PUPPET_STRINGS_TYPE == type
121
121
  end
122
122
  end
123
123
  end
@@ -192,7 +192,6 @@ module PDK
192
192
  # directory, and :allow_fallback contains a Boolean that specifies if
193
193
  # the lookup process should proceed to the next template directory if
194
194
  # the template file is not in this template directory.
195
- #
196
195
  def self.templates(opts)
197
196
  require 'pdk/answer_file'
198
197
  require 'pdk/util'
@@ -261,21 +260,20 @@ module PDK
261
260
  found_template[:uri]
262
261
  end
263
262
 
264
- def self.valid_template?(template)
263
+ def self.valid_template?(template, context = PDK.context)
265
264
  require 'addressable'
266
265
 
267
266
  return false if template.nil? || !template.is_a?(Hash)
268
267
  return false if template[:uri].nil? || !template[:uri].is_a?(Addressable::URI)
269
268
 
270
269
  return true if PDK::Util::Git.repo?(bare_uri(template[:uri]))
271
-
272
270
  path = human_readable(template[:uri].path)
273
271
  if PDK::Util::Filesystem.directory?(path)
274
272
  # We know that it's not a git repository, but it's a valid path on disk
275
273
  begin
276
- PDK::Module::TemplateDir.validate_module_template!(path)
277
- return true
278
- rescue ArgumentError
274
+ renderer = PDK::Template::Renderer.instance(path, template[:uri], context)
275
+ return !renderer.nil?
276
+ rescue StandardError
279
277
  nil
280
278
  end
281
279
  end
data/lib/pdk/util.rb CHANGED
@@ -14,6 +14,7 @@ module PDK
14
14
  autoload :Env, 'pdk/util/env'
15
15
  autoload :Filesystem, 'pdk/util/filesystem'
16
16
  autoload :Git, 'pdk/util/git'
17
+ autoload :JSONFinder, 'pdk/util/json_finder'
17
18
  autoload :PuppetStrings, 'pdk/util/puppet_strings'
18
19
  autoload :PuppetVersion, 'pdk/util/puppet_version'
19
20
  autoload :RubyVersion, 'pdk/util/ruby_version'
@@ -148,7 +149,7 @@ module PDK
148
149
 
149
150
  def system_configdir
150
151
  return @system_configdir unless @system_configdir.nil?
151
- return @system_configdir = File.join('opt', 'puppetlabs', 'pdk', 'config') unless Gem.win_platform?
152
+ return @system_configdir = File.join(File::SEPARATOR, 'opt', 'puppetlabs', 'pdk', 'config') unless Gem.win_platform?
152
153
 
153
154
  return @system_configdir = File.join(PDK::Util::Env['ProgramData'], 'PuppetLabs', 'PDK') unless PDK::Util::Env['ProgramData'].nil?
154
155
  @system_configdir = File.join(PDK::Util::Env['AllUsersProfile'], 'PuppetLabs', 'PDK')
@@ -196,7 +197,7 @@ module PDK
196
197
  # @return [Hash, nil] subset of text as Hash of first valid JSON found, or nil if no valid
197
198
  # JSON found in the text
198
199
  def find_first_json_in(text)
199
- find_valid_json_in(text)
200
+ find_all_json_in(text).first
200
201
  end
201
202
  module_function :find_first_json_in
202
203
 
@@ -206,42 +207,10 @@ module PDK
206
207
  # @return [Array<Hash>] subset of text as Array of all JSON object found, empty Array if none are found
207
208
  # JSON found in the text
208
209
  def find_all_json_in(text)
209
- find_valid_json_in(text, break_on_first: false)
210
+ PDK::Util::JSONFinder.new(text).objects
210
211
  end
211
212
  module_function :find_all_json_in
212
213
 
213
- # Iterate through possible JSON documents until we find one that is valid.
214
- #
215
- # @param [String] text the text in which to find a JSON document
216
- # @param [Hash] opts options
217
- # @option opts [Boolean] :break_on_first Whether or not to break after valid JSON is found, defaults to true
218
- #
219
- # @return [Hash, Array<Hash>, nil] subset of text as Hash of first valid JSON found, array of all valid JSON found, or nil if no valid
220
- # JSON found in the text
221
- #
222
- # @private
223
- def find_valid_json_in(text, opts = {})
224
- break_on_first = opts.key?(:break_on_first) ? opts[:break_on_first] : true
225
-
226
- json_result = break_on_first ? nil : []
227
-
228
- text.scan(%r{\{(?:[^{}]|(?:\g<0>))*\}}x) do |str|
229
- begin
230
- if break_on_first
231
- json_result = JSON.parse(str)
232
- break
233
- else
234
- json_result.push(JSON.parse(str))
235
- end
236
- rescue JSON::ParserError
237
- next
238
- end
239
- end
240
-
241
- json_result
242
- end
243
- module_function :find_valid_json_in
244
-
245
214
  # Returns the targets' paths relative to the working directory
246
215
  #
247
216
  # @return [Array<String>] The absolute or path to the target
@@ -0,0 +1,23 @@
1
+ require 'pdk'
2
+
3
+ module PDK
4
+ module Validate
5
+ module ControlRepo
6
+ class ControlRepoValidatorGroup < ValidatorGroup
7
+ def name
8
+ 'control-repo'
9
+ end
10
+
11
+ def valid_in_context?
12
+ context.is_a?(PDK::Context::ControlRepo)
13
+ end
14
+
15
+ def validators
16
+ [
17
+ EnvironmentConfValidator,
18
+ ].freeze
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,98 @@
1
+ require 'pdk'
2
+
3
+ module PDK
4
+ module Validate
5
+ module ControlRepo
6
+ class EnvironmentConfValidator < InternalRubyValidator
7
+ ALLOWED_SETTINGS = %w[modulepath manifest config_version environment_timeout].freeze
8
+
9
+ def name
10
+ 'environment-conf'
11
+ end
12
+
13
+ def valid_in_context?
14
+ context.is_a?(PDK::Context::ControlRepo)
15
+ end
16
+
17
+ def pattern
18
+ ['environment.conf']
19
+ end
20
+
21
+ def spinner_text
22
+ _('Checking Puppet Environment settings (%{patterns}).') % {
23
+ patterns: pattern.join(' '),
24
+ }
25
+ end
26
+
27
+ def validate_target(report, target)
28
+ unless PDK::Util::Filesystem.readable?(target)
29
+ report.add_event(
30
+ file: target,
31
+ source: name,
32
+ state: :failure,
33
+ severity: 'error',
34
+ message: _('Could not be read.'),
35
+ )
36
+ return 1
37
+ end
38
+
39
+ is_valid = true
40
+ begin
41
+ env_conf = PDK::ControlRepo.environment_conf_as_config(target)
42
+
43
+ env_conf.resolve.each do |setting_name, setting_value|
44
+ # Remove the 'environment.' setting_name prefix
45
+ setting_name = setting_name.slice(12..-1)
46
+ next if ALLOWED_SETTINGS.include?(setting_name)
47
+ # A hash indicates that the ini file has a section in it.
48
+ message = if setting_value.is_a?(Hash)
49
+ _("Invalid section '%{name}'") % { name: setting_name }
50
+ else
51
+ _("Invalid setting '%{name}'") % { name: setting_name }
52
+ end
53
+
54
+ report.add_event(
55
+ file: target,
56
+ source: name,
57
+ state: :failure,
58
+ severity: 'error',
59
+ message: message,
60
+ )
61
+ is_valid = false
62
+ end
63
+
64
+ timeout = env_conf.fetch('environment_timeout', nil)
65
+ unless timeout.nil? || timeout == '0' || timeout == 'unlimited'
66
+ report.add_event(
67
+ file: target,
68
+ source: name,
69
+ state: :failure,
70
+ severity: 'error',
71
+ message: _("environment_timeout is set to '%{timeout}' but should be 0, 'unlimited' or not set.") % { timeout: timeout },
72
+ )
73
+ is_valid = false
74
+ end
75
+
76
+ return 1 unless is_valid
77
+ report.add_event(
78
+ file: target,
79
+ source: name,
80
+ state: :passed,
81
+ severity: 'ok',
82
+ )
83
+ return 0
84
+ rescue StandardError => e
85
+ report.add_event(
86
+ file: target,
87
+ source: name,
88
+ state: :failure,
89
+ severity: 'error',
90
+ message: e.message,
91
+ )
92
+ return 1
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -19,9 +19,8 @@ module PDK
19
19
  :once
20
20
  end
21
21
 
22
- # Whether this Validator can be invoked in this context. By default any Validator can work in any Context, except ::None
23
- # @return [Boolean]
24
- # @abstract
22
+ # Whether this Validator can be invoked in this context. By default any InvokableValidator can work in any Context, except ::None
23
+ # @see PDK::Validate::Validator
25
24
  def valid_in_context?
26
25
  !context.is_a?(PDK::Context::None)
27
26
  end
@@ -40,6 +40,13 @@ module PDK
40
40
  @prepared = false
41
41
  end
42
42
 
43
+ # Whether this Validator can be invoked in this context. By default any Validator can work in any Context
44
+ # @return [Boolean]
45
+ # @abstract
46
+ def valid_in_context?
47
+ true
48
+ end
49
+
43
50
  # Returns the text used for the spinner to display to the user while invoking
44
51
  #
45
52
  # @return [String]
@@ -97,6 +97,7 @@ module PDK
97
97
  # @api private
98
98
  def validator_instances
99
99
  @validator_instances ||= validators.map { |klass| klass.new(context, options.merge(parent_validator: self)) }
100
+ .select { |instance| instance.valid_in_context? }
100
101
  end
101
102
  end
102
103
  end
data/lib/pdk/validate.rb CHANGED
@@ -8,15 +8,22 @@ module PDK
8
8
  autoload :Validator, 'pdk/validate/validator'
9
9
  autoload :ValidatorGroup, 'pdk/validate/validator_group'
10
10
 
11
+ module ControlRepo
12
+ autoload :ControlRepoValidatorGroup, 'pdk/validate/control_repo/control_repo_validator_group'
13
+ autoload :EnvironmentConfValidator, 'pdk/validate/control_repo/environment_conf_validator'
14
+ end
15
+
11
16
  module Metadata
12
17
  autoload :MetadataJSONLintValidator, 'pdk/validate/metadata/metadata_json_lint_validator'
13
18
  autoload :MetadataSyntaxValidator, 'pdk/validate/metadata/metadata_syntax_validator'
14
19
  autoload :MetadataValidatorGroup, 'pdk/validate/metadata/metadata_validator_group'
15
20
  end
16
21
 
17
- module YAML
18
- autoload :YAMLSyntaxValidator, 'pdk/validate/yaml/yaml_syntax_validator'
19
- autoload :YAMLValidatorGroup, 'pdk/validate/yaml/yaml_validator_group'
22
+ module Puppet
23
+ autoload :PuppetEPPValidator, 'pdk/validate/puppet/puppet_epp_validator'
24
+ autoload :PuppetLintValidator, 'pdk/validate/puppet/puppet_lint_validator'
25
+ autoload :PuppetSyntaxValidator, 'pdk/validate/puppet/puppet_syntax_validator'
26
+ autoload :PuppetValidatorGroup, 'pdk/validate/puppet/puppet_validator_group'
20
27
  end
21
28
 
22
29
  module Ruby
@@ -25,16 +32,14 @@ module PDK
25
32
  end
26
33
 
27
34
  module Tasks
28
- autoload :TasksNameValidator, 'pdk/validate/tasks/tasks_name_validator'
29
35
  autoload :TasksMetadataLintValidator, 'pdk/validate/tasks/tasks_metadata_lint_validator'
36
+ autoload :TasksNameValidator, 'pdk/validate/tasks/tasks_name_validator'
30
37
  autoload :TasksValidatorGroup, 'pdk/validate/tasks/tasks_validator_group'
31
38
  end
32
39
 
33
- module Puppet
34
- autoload :PuppetEPPValidator, 'pdk/validate/puppet/puppet_epp_validator'
35
- autoload :PuppetLintValidator, 'pdk/validate/puppet/puppet_lint_validator'
36
- autoload :PuppetSyntaxValidator, 'pdk/validate/puppet/puppet_syntax_validator'
37
- autoload :PuppetValidatorGroup, 'pdk/validate/puppet/puppet_validator_group'
40
+ module YAML
41
+ autoload :YAMLSyntaxValidator, 'pdk/validate/yaml/yaml_syntax_validator'
42
+ autoload :YAMLValidatorGroup, 'pdk/validate/yaml/yaml_validator_group'
38
43
  end
39
44
 
40
45
  def self.validators
@@ -47,8 +52,9 @@ module PDK
47
52
 
48
53
  # @api private
49
54
  def self.validator_hash
50
- # TODO: This isn't the most performant... But with only 5 items, it's fine
55
+ # TODO: This isn't the most performant... But with only 6 items, it's fine
51
56
  @validator_hash ||= [
57
+ ControlRepo::ControlRepoValidatorGroup,
52
58
  Metadata::MetadataValidatorGroup,
53
59
  Puppet::PuppetValidatorGroup,
54
60
  Ruby::RubyValidatorGroup,
@@ -60,6 +66,7 @@ module PDK
60
66
  def self.invoke_validators_by_name(context, names, parallel = false, options = {})
61
67
  instances = names.select { |name| validator_names.include?(name) }
62
68
  .map { |name| validator_hash[name].new(context, options) }
69
+ .select { |instance| instance.valid_in_context? }
63
70
  .each { |instance| instance.prepare_invoke! }
64
71
  report = PDK::Report.new
65
72
 
data/lib/pdk/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module PDK
2
- VERSION = '1.17.0'.freeze
2
+ VERSION = '1.18.0'.freeze
3
3
  TEMPLATE_REF = VERSION
4
4
  end
data/lib/pdk.rb CHANGED
@@ -11,7 +11,7 @@ module PDK
11
11
  autoload :Logger, 'pdk/logger'
12
12
  autoload :Module, 'pdk/module'
13
13
  autoload :Report, 'pdk/report'
14
- autoload :TemplateFile, 'pdk/template_file'
14
+ autoload :Template, 'pdk/template'
15
15
  autoload :TEMPLATE_REF, 'pdk/version'
16
16
  autoload :Util, 'pdk/util'
17
17
  autoload :Validate, 'pdk/validate'