pdk 1.9.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +744 -711
- data/README.md +23 -21
- data/lib/pdk/answer_file.rb +3 -112
- data/lib/pdk/bolt.rb +20 -0
- data/lib/pdk/cli/build.rb +51 -54
- data/lib/pdk/cli/bundle.rb +33 -29
- data/lib/pdk/cli/console.rb +148 -0
- data/lib/pdk/cli/convert.rb +46 -37
- data/lib/pdk/cli/env.rb +51 -0
- data/lib/pdk/cli/errors.rb +4 -3
- data/lib/pdk/cli/exec/command.rb +285 -0
- data/lib/pdk/cli/exec/interactive_command.rb +109 -0
- data/lib/pdk/cli/exec.rb +32 -201
- data/lib/pdk/cli/exec_group.rb +79 -43
- data/lib/pdk/cli/get/config.rb +26 -0
- data/lib/pdk/cli/get.rb +22 -0
- data/lib/pdk/cli/new/class.rb +20 -22
- data/lib/pdk/cli/new/defined_type.rb +21 -21
- data/lib/pdk/cli/new/fact.rb +27 -0
- data/lib/pdk/cli/new/function.rb +27 -0
- data/lib/pdk/cli/new/module.rb +40 -29
- data/lib/pdk/cli/new/provider.rb +18 -18
- data/lib/pdk/cli/new/task.rb +23 -22
- data/lib/pdk/cli/new/test.rb +52 -0
- data/lib/pdk/cli/new/transport.rb +27 -0
- data/lib/pdk/cli/new.rb +15 -9
- data/lib/pdk/cli/release/prep.rb +39 -0
- data/lib/pdk/cli/release/publish.rb +46 -0
- data/lib/pdk/cli/release.rb +185 -0
- data/lib/pdk/cli/remove/config.rb +83 -0
- data/lib/pdk/cli/remove.rb +22 -0
- data/lib/pdk/cli/set/config.rb +121 -0
- data/lib/pdk/cli/set.rb +22 -0
- data/lib/pdk/cli/test/unit.rb +71 -69
- data/lib/pdk/cli/test.rb +9 -8
- data/lib/pdk/cli/update.rb +38 -21
- data/lib/pdk/cli/util/command_redirector.rb +13 -3
- data/lib/pdk/cli/util/interview.rb +25 -9
- data/lib/pdk/cli/util/option_normalizer.rb +6 -6
- data/lib/pdk/cli/util/option_validator.rb +19 -9
- data/lib/pdk/cli/util/spinner.rb +13 -0
- data/lib/pdk/cli/util/update_manager_printer.rb +82 -0
- data/lib/pdk/cli/util.rb +105 -48
- data/lib/pdk/cli/validate.rb +96 -111
- data/lib/pdk/cli.rb +134 -87
- data/lib/pdk/config/errors.rb +5 -0
- data/lib/pdk/config/ini_file.rb +184 -0
- data/lib/pdk/config/ini_file_setting.rb +35 -0
- data/lib/pdk/config/json.rb +35 -0
- data/lib/pdk/config/json_schema_namespace.rb +137 -0
- data/lib/pdk/config/json_schema_setting.rb +51 -0
- data/lib/pdk/config/json_with_schema.rb +47 -0
- data/lib/pdk/config/namespace.rb +362 -0
- data/lib/pdk/config/setting.rb +134 -0
- data/lib/pdk/config/task_schema.json +116 -0
- data/lib/pdk/config/validator.rb +31 -0
- data/lib/pdk/config/yaml.rb +41 -0
- data/lib/pdk/config/yaml_with_schema.rb +51 -0
- data/lib/pdk/config.rb +304 -0
- data/lib/pdk/context/control_repo.rb +61 -0
- data/lib/pdk/context/module.rb +28 -0
- data/lib/pdk/context/none.rb +22 -0
- data/lib/pdk/context.rb +98 -0
- data/lib/pdk/control_repo.rb +89 -0
- data/lib/pdk/generate/defined_type.rb +27 -33
- data/lib/pdk/generate/fact.rb +26 -0
- data/lib/pdk/generate/function.rb +49 -0
- data/lib/pdk/generate/module.rb +160 -153
- data/lib/pdk/generate/provider.rb +16 -69
- data/lib/pdk/generate/puppet_class.rb +27 -32
- data/lib/pdk/generate/puppet_object.rb +100 -159
- data/lib/pdk/generate/task.rb +34 -51
- data/lib/pdk/generate/transport.rb +34 -0
- data/lib/pdk/generate.rb +21 -8
- data/lib/pdk/logger.rb +24 -6
- data/lib/pdk/module/build.rb +125 -37
- data/lib/pdk/module/convert.rb +146 -65
- data/lib/pdk/module/metadata.rb +72 -71
- data/lib/pdk/module/release.rb +255 -0
- data/lib/pdk/module/update.rb +48 -37
- data/lib/pdk/module/update_manager.rb +75 -39
- data/lib/pdk/module.rb +10 -2
- data/lib/pdk/monkey_patches.rb +268 -0
- data/lib/pdk/report/event.rb +36 -48
- data/lib/pdk/report.rb +35 -22
- data/lib/pdk/template/fetcher/git.rb +84 -0
- data/lib/pdk/template/fetcher/local.rb +29 -0
- data/lib/pdk/template/fetcher.rb +100 -0
- data/lib/pdk/template/renderer/v1/legacy_template_dir.rb +108 -0
- data/lib/pdk/template/renderer/v1/renderer.rb +131 -0
- data/lib/pdk/template/renderer/v1/template_file.rb +100 -0
- data/lib/pdk/template/renderer/v1.rb +25 -0
- data/lib/pdk/template/renderer.rb +97 -0
- data/lib/pdk/template/template_dir.rb +67 -0
- data/lib/pdk/template.rb +52 -0
- data/lib/pdk/tests/unit.rb +101 -51
- data/lib/pdk/util/bundler.rb +44 -42
- data/lib/pdk/util/changelog_generator.rb +138 -0
- data/lib/pdk/util/env.rb +48 -0
- data/lib/pdk/util/filesystem.rb +139 -2
- data/lib/pdk/util/git.rb +108 -8
- data/lib/pdk/util/json_finder.rb +86 -0
- data/lib/pdk/util/puppet_strings.rb +125 -0
- data/lib/pdk/util/puppet_version.rb +71 -87
- data/lib/pdk/util/ruby_version.rb +49 -25
- data/lib/pdk/util/template_uri.rb +283 -0
- data/lib/pdk/util/vendored_file.rb +34 -42
- data/lib/pdk/util/version.rb +11 -10
- data/lib/pdk/util/windows/api_types.rb +74 -44
- data/lib/pdk/util/windows/file.rb +31 -27
- data/lib/pdk/util/windows/process.rb +74 -0
- data/lib/pdk/util/windows/string.rb +19 -12
- data/lib/pdk/util/windows.rb +2 -0
- data/lib/pdk/util.rb +111 -124
- data/lib/pdk/validate/control_repo/control_repo_validator_group.rb +23 -0
- data/lib/pdk/validate/control_repo/environment_conf_validator.rb +98 -0
- data/lib/pdk/validate/external_command_validator.rb +213 -0
- data/lib/pdk/validate/internal_ruby_validator.rb +101 -0
- data/lib/pdk/validate/invokable_validator.rb +238 -0
- data/lib/pdk/validate/metadata/metadata_json_lint_validator.rb +84 -0
- data/lib/pdk/validate/metadata/metadata_syntax_validator.rb +76 -0
- data/lib/pdk/validate/metadata/metadata_validator_group.rb +20 -0
- data/lib/pdk/validate/puppet/puppet_epp_validator.rb +131 -0
- data/lib/pdk/validate/puppet/puppet_lint_validator.rb +66 -0
- data/lib/pdk/validate/puppet/puppet_plan_syntax_validator.rb +38 -0
- data/lib/pdk/validate/puppet/puppet_syntax_validator.rb +135 -0
- data/lib/pdk/validate/puppet/puppet_validator_group.rb +22 -0
- data/lib/pdk/validate/ruby/ruby_rubocop_validator.rb +79 -0
- data/lib/pdk/validate/ruby/ruby_validator_group.rb +19 -0
- data/lib/pdk/validate/tasks/tasks_metadata_lint_validator.rb +83 -0
- data/lib/pdk/validate/tasks/tasks_name_validator.rb +45 -0
- data/lib/pdk/validate/tasks/tasks_validator_group.rb +20 -0
- data/lib/pdk/validate/validator.rb +120 -0
- data/lib/pdk/validate/validator_group.rb +107 -0
- data/lib/pdk/validate/yaml/yaml_syntax_validator.rb +86 -0
- data/lib/pdk/validate/yaml/yaml_validator_group.rb +19 -0
- data/lib/pdk/validate.rb +86 -12
- data/lib/pdk/version.rb +2 -2
- data/lib/pdk.rb +60 -10
- metadata +138 -100
- data/lib/pdk/cli/module/build.rb +0 -14
- data/lib/pdk/cli/module/generate.rb +0 -45
- data/lib/pdk/cli/module.rb +0 -14
- data/lib/pdk/i18n.rb +0 -4
- data/lib/pdk/module/templatedir.rb +0 -321
- data/lib/pdk/template_file.rb +0 -95
- data/lib/pdk/validate/base_validator.rb +0 -215
- data/lib/pdk/validate/metadata/metadata_json_lint.rb +0 -86
- data/lib/pdk/validate/metadata/metadata_syntax.rb +0 -109
- data/lib/pdk/validate/metadata_validator.rb +0 -30
- data/lib/pdk/validate/puppet/puppet_lint.rb +0 -67
- data/lib/pdk/validate/puppet/puppet_syntax.rb +0 -112
- data/lib/pdk/validate/puppet_validator.rb +0 -30
- data/lib/pdk/validate/ruby/rubocop.rb +0 -77
- data/lib/pdk/validate/ruby_validator.rb +0 -29
- data/lib/pdk/validate/tasks/metadata_lint.rb +0 -126
- data/lib/pdk/validate/tasks/name.rb +0 -88
- data/lib/pdk/validate/tasks_validator.rb +0 -33
- data/lib/pdk/validate/yaml/syntax.rb +0 -109
- data/lib/pdk/validate/yaml_validator.rb +0 -31
- data/locales/config.yaml +0 -21
- data/locales/pdk.pot +0 -1291
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require 'pdk'
|
|
2
|
+
|
|
3
|
+
module PDK
|
|
4
|
+
module CLI
|
|
5
|
+
module Util
|
|
6
|
+
module UpdateManagerPrinter
|
|
7
|
+
# Prints the summary for a PDK::Module::UpdateManager Object
|
|
8
|
+
# @param update_manager [PDK::Module::UpdateManager] The object to print a summary of
|
|
9
|
+
# @param options [Hash{Object => Object}] A list of options when printing
|
|
10
|
+
# @option options [Boolean] :tense Whether to use future (:future) or past (:past) tense when printing the summary ("Files to be added" versus "Files added"). Default is :future
|
|
11
|
+
#
|
|
12
|
+
# @return [void]
|
|
13
|
+
def self.print_summary(update_manager, options = {})
|
|
14
|
+
require 'pdk/report'
|
|
15
|
+
|
|
16
|
+
options = {
|
|
17
|
+
tense: :future
|
|
18
|
+
}.merge(options)
|
|
19
|
+
|
|
20
|
+
footer = false
|
|
21
|
+
|
|
22
|
+
summary(update_manager).each do |category, files|
|
|
23
|
+
next if files.empty?
|
|
24
|
+
|
|
25
|
+
PDK::Report.default_target.puts('')
|
|
26
|
+
PDK::Report.default_target.puts(generate_banner("Files #{options[:tense] == :future ? 'to be ' : ''}#{category}", 40))
|
|
27
|
+
PDK::Report.default_target.puts(files.map(&:to_s).join("\n"))
|
|
28
|
+
footer = true
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
if footer # rubocop:disable Style/GuardClause No.
|
|
32
|
+
PDK::Report.default_target.puts('')
|
|
33
|
+
PDK::Report.default_target.puts(generate_banner('', 40))
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# :nocov: Tested as part of the public methods
|
|
38
|
+
# Returns a hash, summarizing the contents of the Update Manager object
|
|
39
|
+
# @param update_manager [PDK::Module::UpdateManager] The object to create a summary of
|
|
40
|
+
#
|
|
41
|
+
# @return [Hash{Symbol => Array[String]}] A hash of each category and the file paths in each category
|
|
42
|
+
def self.summary(update_manager)
|
|
43
|
+
summary = {}
|
|
44
|
+
update_manager.changes.each do |category, update_category|
|
|
45
|
+
if update_category.respond_to?(:keys)
|
|
46
|
+
updated_files = update_category.keys
|
|
47
|
+
else
|
|
48
|
+
begin
|
|
49
|
+
updated_files = update_category.map { |file| file[:path] }
|
|
50
|
+
rescue TypeError
|
|
51
|
+
updated_files = update_category.to_a
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
summary[category] = updated_files
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
summary
|
|
59
|
+
end
|
|
60
|
+
private_class_method :summary
|
|
61
|
+
|
|
62
|
+
# Creates a line of text, with `text` centered in the middle
|
|
63
|
+
# @param text [String] The text to put in the middle of the banner
|
|
64
|
+
# @param width [Integer] The width of the banner in characters. Default is 80
|
|
65
|
+
# @return [String] The generated banner
|
|
66
|
+
def self.generate_banner(text, width = 80)
|
|
67
|
+
padding = width - text.length
|
|
68
|
+
banner = ''
|
|
69
|
+
padding_char = '-'
|
|
70
|
+
|
|
71
|
+
(padding / 2.0).ceil.times { banner << padding_char }
|
|
72
|
+
banner << text
|
|
73
|
+
(padding / 2.0).floor.times { banner << padding_char }
|
|
74
|
+
|
|
75
|
+
banner
|
|
76
|
+
end
|
|
77
|
+
private_class_method :generate_banner
|
|
78
|
+
# :nocov:
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
data/lib/pdk/cli/util.rb
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
|
+
require 'pdk'
|
|
2
|
+
|
|
1
3
|
module PDK
|
|
2
4
|
module CLI
|
|
3
5
|
module Util
|
|
6
|
+
autoload :CommandRedirector, 'pdk/cli/util/command_redirector'
|
|
7
|
+
autoload :OptionNormalizer, 'pdk/cli/util/option_normalizer'
|
|
8
|
+
autoload :OptionValidator, 'pdk/cli/util/option_validator'
|
|
9
|
+
autoload :Interview, 'pdk/cli/util/interview'
|
|
10
|
+
autoload :Spinner, 'pdk/cli/util/spinner'
|
|
11
|
+
autoload :UpdateManagerPrinter, 'pdk/cli/util/update_manager_printer'
|
|
12
|
+
|
|
4
13
|
# Ensures the calling code is being run from inside a module directory.
|
|
5
14
|
#
|
|
6
15
|
# @param opts [Hash] options to change the behavior of the check logic.
|
|
@@ -14,7 +23,7 @@ module PDK
|
|
|
14
23
|
return unless PDK::Util.module_root.nil?
|
|
15
24
|
return if opts[:check_module_layout] && PDK::Util.in_module_root?
|
|
16
25
|
|
|
17
|
-
message = opts.fetch(:message,
|
|
26
|
+
message = opts.fetch(:message, 'This command must be run from inside a valid module (no metadata.json found).')
|
|
18
27
|
raise PDK::CLI::ExitWithError.new(message, opts)
|
|
19
28
|
end
|
|
20
29
|
module_function :ensure_in_module!
|
|
@@ -22,25 +31,28 @@ module PDK
|
|
|
22
31
|
def spinner_opts_for_platform
|
|
23
32
|
windows_opts = {
|
|
24
33
|
success_mark: '*',
|
|
25
|
-
error_mark: 'X'
|
|
34
|
+
error_mark: 'X'
|
|
26
35
|
}
|
|
27
36
|
|
|
28
37
|
return windows_opts if Gem.win_platform?
|
|
38
|
+
|
|
29
39
|
{}
|
|
30
40
|
end
|
|
31
41
|
module_function :spinner_opts_for_platform
|
|
32
42
|
|
|
33
43
|
def prompt_for_yes(question_text, opts = {})
|
|
44
|
+
require 'tty/prompt'
|
|
45
|
+
|
|
34
46
|
prompt = opts[:prompt] || TTY::Prompt.new(help_color: :cyan)
|
|
35
|
-
validator = proc { |value| [true, false].include?(value) || value =~
|
|
47
|
+
validator = proc { |value| [true, false].include?(value) || value =~ /\A(?:yes|y|no|n)\Z/i }
|
|
36
48
|
response = nil
|
|
37
49
|
|
|
38
50
|
begin
|
|
39
51
|
response = prompt.yes?(question_text) do |q|
|
|
40
52
|
q.default opts[:default] unless opts[:default].nil?
|
|
41
|
-
q.validate(validator,
|
|
53
|
+
q.validate(validator, 'Answer "Y" to continue or "n" to cancel.')
|
|
42
54
|
end
|
|
43
|
-
rescue
|
|
55
|
+
rescue PDK::CLI::Util::Interview::READER::InputInterrupt
|
|
44
56
|
PDK.logger.info opts[:cancel_message] if opts[:cancel_message]
|
|
45
57
|
end
|
|
46
58
|
|
|
@@ -48,9 +60,32 @@ module PDK
|
|
|
48
60
|
end
|
|
49
61
|
module_function :prompt_for_yes
|
|
50
62
|
|
|
63
|
+
# Uses environment variables to detect if the current process is running in common
|
|
64
|
+
# Continuous Integration (CI) environments
|
|
65
|
+
# @return [Boolean] Whether the PDK is in a CI based environment
|
|
66
|
+
def ci_environment?
|
|
67
|
+
[
|
|
68
|
+
'CI', # Generic
|
|
69
|
+
'CONTINUOUS_INTEGRATION', # Generic
|
|
70
|
+
'APPVEYOR_BUILD_FOLDER', # AppVeyor CI
|
|
71
|
+
'GITLAB_CI', # GitLab CI
|
|
72
|
+
'JENKINS_URL', # Jenkins
|
|
73
|
+
'BUILD_DEFINITIONNAME', # Azure Pipelines
|
|
74
|
+
'TEAMCITY_VERSION', # Team City
|
|
75
|
+
'BAMBOO_BUILDKEY', # Bamboo
|
|
76
|
+
'GOCD_SERVER_URL', # Go CD
|
|
77
|
+
'TRAVIS', # Travis CI
|
|
78
|
+
'GITHUB_WORKFLOW' # GitHub Actions
|
|
79
|
+
].any? { |name| PDK::Util::Env.key?(name) }
|
|
80
|
+
end
|
|
81
|
+
module_function :ci_environment?
|
|
82
|
+
|
|
51
83
|
def interactive?
|
|
84
|
+
require 'pdk/logger'
|
|
85
|
+
|
|
52
86
|
return false if PDK.logger.debug?
|
|
53
|
-
return !
|
|
87
|
+
return !PDK::Util::Env['PDK_FRONTEND'].casecmp('noninteractive').zero? if PDK::Util::Env['PDK_FRONTEND']
|
|
88
|
+
return false if ci_environment?
|
|
54
89
|
return false unless $stderr.isatty
|
|
55
90
|
|
|
56
91
|
true
|
|
@@ -62,66 +97,89 @@ module PDK
|
|
|
62
97
|
|
|
63
98
|
# This means the module does not have a pdk-version tag in the metadata.json
|
|
64
99
|
# and will require a pdk convert.
|
|
65
|
-
raise PDK::CLI::ExitWithError,
|
|
100
|
+
raise PDK::CLI::ExitWithError, 'This module is not PDK compatible. Run `pdk convert` to make it compatible with your version of PDK.' if module_pdk_ver.nil?
|
|
66
101
|
|
|
67
102
|
# This checks that the version of pdk in the module's metadata is older
|
|
68
103
|
# than 1.3.1, which means the module will need to run pdk convert to the
|
|
69
104
|
# new templates.
|
|
70
105
|
if Gem::Version.new(module_pdk_ver) < Gem::Version.new('1.3.1')
|
|
71
|
-
PDK.logger.warn
|
|
106
|
+
PDK.logger.warn 'This module template is out of date. Run `pdk convert` to make it compatible with your version of PDK.'
|
|
72
107
|
# This checks if the version of the installed PDK is older than the
|
|
73
108
|
# version in the module's metadata, and advises the user to upgrade to
|
|
74
109
|
# their install of PDK.
|
|
75
110
|
elsif Gem::Version.new(PDK::VERSION) < Gem::Version.new(module_pdk_ver)
|
|
76
|
-
PDK.logger.warn
|
|
111
|
+
PDK.logger.warn 'This module is compatible with a newer version of PDK. Upgrade your version of PDK to ensure compatibility.'
|
|
77
112
|
# This checks if the version listed in the module's metadata is older
|
|
78
113
|
# than the installed PDK, and advises the user to run pdk update.
|
|
79
114
|
elsif Gem::Version.new(PDK::VERSION) > Gem::Version.new(module_pdk_ver)
|
|
80
|
-
|
|
115
|
+
message = 'This module is compatible with an older version of PDK.'
|
|
116
|
+
message = 'Module templates older than 3.0.0 may experience issues.' if Gem::Version.new(module_pdk_ver) < Gem::Version.new('3.0.0')
|
|
117
|
+
|
|
118
|
+
PDK.logger.warn "#{message} Run `pdk update` to update it to the latest version."
|
|
81
119
|
end
|
|
82
120
|
end
|
|
83
121
|
module_function :module_version_check
|
|
84
122
|
|
|
85
|
-
def
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
123
|
+
def check_for_deprecated_puppet(version)
|
|
124
|
+
return unless version.is_a?(Gem::Version)
|
|
125
|
+
|
|
126
|
+
deprecated_below = Gem::Version.new('7.0.0')
|
|
127
|
+
return unless version < deprecated_below
|
|
128
|
+
|
|
129
|
+
raise PDK::CLI::ExitWithError, "Support for Puppet versions older than #{deprecated_below} has been removed from PDK."
|
|
130
|
+
end
|
|
131
|
+
module_function :check_for_deprecated_puppet
|
|
132
|
+
|
|
133
|
+
# @param opts [Hash] - the pdk options to use, defaults to empty hash
|
|
134
|
+
# @option opts [String] :'puppet-dev' Use the puppet development version, default to PDK_PUPPET_DEV env
|
|
135
|
+
# @option opts [String] :'puppet-version' Puppet version to use, default to PDK_PUPPET_VERSION env
|
|
136
|
+
# @option opts [String] :'pe-version' PE Puppet version to use, default to PDK_PE_VERSION env
|
|
137
|
+
# @param logging_disabled [Boolean] - disable logging of PDK info
|
|
138
|
+
# @param context [PDK::Context::AbstractContext] - The context the PDK is running in
|
|
139
|
+
# @return [Hash] - return hash of { gemset: <>, ruby_version: 2.x.x }
|
|
140
|
+
def puppet_from_opts_or_env(opts, logging_disabled = false, context = PDK.context)
|
|
141
|
+
opts ||= {}
|
|
142
|
+
use_puppet_dev = opts.fetch(:'puppet-dev', PDK::Util::Env['PDK_PUPPET_DEV'])
|
|
143
|
+
desired_puppet_version = opts.fetch(:'puppet-version', PDK::Util::Env['PDK_PUPPET_VERSION'])
|
|
144
|
+
desired_pe_version = opts.fetch(:'pe-version', PDK::Util::Env['PDK_PE_VERSION'])
|
|
89
145
|
|
|
90
146
|
begin
|
|
91
147
|
puppet_env =
|
|
92
148
|
if use_puppet_dev
|
|
149
|
+
PDK::Util::PuppetVersion.fetch_puppet_dev(run: :once)
|
|
93
150
|
PDK::Util::PuppetVersion.puppet_dev_env
|
|
94
151
|
elsif desired_puppet_version
|
|
95
152
|
PDK::Util::PuppetVersion.find_gem_for(desired_puppet_version)
|
|
96
153
|
elsif desired_pe_version
|
|
97
154
|
PDK::Util::PuppetVersion.from_pe_version(desired_pe_version)
|
|
98
|
-
|
|
155
|
+
elsif context.is_a?(PDK::Context::Module)
|
|
99
156
|
PDK::Util::PuppetVersion.from_module_metadata || PDK::Util::PuppetVersion.latest_available
|
|
157
|
+
else
|
|
158
|
+
PDK::Util::PuppetVersion.latest_available
|
|
100
159
|
end
|
|
101
160
|
rescue ArgumentError => e
|
|
102
161
|
raise PDK::CLI::ExitWithError, e.message
|
|
103
162
|
end
|
|
104
163
|
|
|
105
164
|
# Notify user of what Ruby version will be used.
|
|
106
|
-
PDK.logger.info(
|
|
107
|
-
|
|
108
|
-
|
|
165
|
+
PDK.logger.info(format('Using Ruby %{version}', version: puppet_env[:ruby_version])) unless logging_disabled
|
|
166
|
+
|
|
167
|
+
check_for_deprecated_puppet(puppet_env[:gem_version])
|
|
109
168
|
|
|
110
169
|
gemset = { puppet: puppet_env[:gem_version].to_s }
|
|
111
170
|
|
|
112
171
|
# Notify user of what gems are being activated.
|
|
113
|
-
|
|
114
|
-
|
|
172
|
+
unless logging_disabled
|
|
173
|
+
gemset.each do |gem, version|
|
|
174
|
+
next if version.nil?
|
|
115
175
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
version: version,
|
|
119
|
-
})
|
|
176
|
+
PDK.logger.info(format('Using %{gem} %{version}', gem: gem.to_s.capitalize, version: version))
|
|
177
|
+
end
|
|
120
178
|
end
|
|
121
179
|
|
|
122
180
|
{
|
|
123
181
|
gemset: gemset,
|
|
124
|
-
ruby_version: puppet_env[:ruby_version]
|
|
182
|
+
ruby_version: puppet_env[:ruby_version]
|
|
125
183
|
}
|
|
126
184
|
end
|
|
127
185
|
module_function :puppet_from_opts_or_env
|
|
@@ -129,24 +187,21 @@ module PDK
|
|
|
129
187
|
def validate_puppet_version_opts(opts)
|
|
130
188
|
puppet_ver_specs = []
|
|
131
189
|
puppet_ver_specs << '--puppet-version option' if opts[:'puppet-version']
|
|
132
|
-
puppet_ver_specs << 'PDK_PUPPET_VERSION environment variable' if
|
|
190
|
+
puppet_ver_specs << 'PDK_PUPPET_VERSION environment variable' if PDK::Util::Env['PDK_PUPPET_VERSION'] && !PDK::Util::Env['PDK_PUPPET_VERSION'].empty?
|
|
133
191
|
|
|
134
192
|
pe_ver_specs = []
|
|
135
193
|
pe_ver_specs << '--pe-version option' if opts[:'pe-version']
|
|
136
|
-
pe_ver_specs << 'PDK_PE_VERSION environment variable' if
|
|
194
|
+
pe_ver_specs << 'PDK_PE_VERSION environment variable' if PDK::Util::Env['PDK_PE_VERSION'] && !PDK::Util::Env['PDK_PE_VERSION'].empty?
|
|
137
195
|
|
|
138
196
|
puppet_dev_specs = []
|
|
139
197
|
puppet_dev_specs << '--puppet-dev flag' if opts[:'puppet-dev']
|
|
140
|
-
puppet_dev_specs << 'PDK_PUPPET_DEV environment variable' if
|
|
198
|
+
puppet_dev_specs << 'PDK_PUPPET_DEV environment variable' if PDK::Util::Env['PDK_PUPPET_DEV'] && !PDK::Util::Env['PDK_PUPPET_DEV'].empty?
|
|
141
199
|
|
|
142
200
|
puppet_dev_specs.each do |pup_dev_spec|
|
|
143
201
|
[puppet_ver_specs, pe_ver_specs].each do |offending|
|
|
144
202
|
next if offending.empty?
|
|
145
203
|
|
|
146
|
-
raise PDK::CLI::ExitWithError,
|
|
147
|
-
first: pup_dev_spec,
|
|
148
|
-
second: offending.first,
|
|
149
|
-
}
|
|
204
|
+
raise PDK::CLI::ExitWithError, format('You cannot specify a %{first} and %{second} at the same time.', first: pup_dev_spec, second: offending.first)
|
|
150
205
|
end
|
|
151
206
|
end
|
|
152
207
|
|
|
@@ -155,39 +210,41 @@ module PDK
|
|
|
155
210
|
|
|
156
211
|
offending = [pup_ver_spec, pe_ver_specs[0]].sort
|
|
157
212
|
|
|
158
|
-
raise PDK::CLI::ExitWithError,
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
213
|
+
raise PDK::CLI::ExitWithError, format('You cannot specify a %{first} and %{second} at the same time.', first: offending[0], second: offending[1])
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# We want to mark setting the PE as deprecated.
|
|
217
|
+
if opts[:'pe-version'] || PDK::Util::Env['PDK_PE_VERSION']
|
|
218
|
+
PDK.logger.warn('Specifying a Puppet Enterprise version is now deprecated and will be removed in a future version. Please use --puppet-version or PDK_PUPPET_VERSION instead.')
|
|
162
219
|
end
|
|
163
220
|
|
|
164
221
|
if puppet_dev_specs.size == 2
|
|
165
222
|
warning_str = 'Puppet dev flag from command line: "--puppet-dev" '
|
|
166
223
|
warning_str += 'overrides value from environment: "PDK_PUPPET_DEV=true". You should not specify both.'
|
|
167
224
|
|
|
168
|
-
PDK.logger.warn(
|
|
169
|
-
pup_ver_opt: opts[:'puppet-dev'],
|
|
170
|
-
pup_ver_env: ENV['PDK_PUPPET_DEV'],
|
|
171
|
-
})
|
|
225
|
+
PDK.logger.warn(format(warning_str, pup_ver_opt: opts[:'puppet-dev'], pup_ver_env: PDK::Util::Env['PDK_PUPPET_DEV']))
|
|
172
226
|
elsif puppet_ver_specs.size == 2
|
|
173
227
|
warning_str = 'Puppet version option from command line: "--puppet-version=%{pup_ver_opt}" '
|
|
174
228
|
warning_str += 'overrides value from environment: "PDK_PUPPET_VERSION=%{pup_ver_env}". You should not specify both.'
|
|
175
229
|
|
|
176
|
-
PDK.logger.warn(
|
|
177
|
-
pup_ver_opt: opts[:'puppet-version'],
|
|
178
|
-
pup_ver_env: ENV['PDK_PUPPET_VERSION'],
|
|
179
|
-
})
|
|
230
|
+
PDK.logger.warn(format(warning_str, pup_ver_opt: opts[:'puppet-version'], pup_ver_env: PDK::Util::Env['PDK_PUPPET_VERSION']))
|
|
180
231
|
elsif pe_ver_specs.size == 2
|
|
181
232
|
warning_str = 'Puppet Enterprise version option from command line: "--pe-version=%{pe_ver_opt}" '
|
|
182
233
|
warning_str += 'overrides value from environment: "PDK_PE_VERSION=%{pe_ver_env}". You should not specify both.'
|
|
183
234
|
|
|
184
|
-
PDK.logger.warn(
|
|
185
|
-
pup_ver_opt: opts[:'pe-version'],
|
|
186
|
-
pup_ver_env: ENV['PDK_PE_VERSION'],
|
|
187
|
-
})
|
|
235
|
+
PDK.logger.warn(format(warning_str, pe_ver_opt: opts[:'pe-version'], pe_ver_env: PDK::Util::Env['PDK_PE_VERSION']))
|
|
188
236
|
end
|
|
189
237
|
end
|
|
190
238
|
module_function :validate_puppet_version_opts
|
|
239
|
+
|
|
240
|
+
def validate_template_opts(opts)
|
|
241
|
+
raise PDK::CLI::ExitWithError, '--template-ref requires --template-url to also be specified.' if opts[:'template-ref'] && opts[:'template-url'].nil?
|
|
242
|
+
|
|
243
|
+
return unless opts[:'template-url']&.include?('#')
|
|
244
|
+
|
|
245
|
+
raise PDK::CLI::ExitWithError, '--template-url may not be used to specify paths containing #\'s.'
|
|
246
|
+
end
|
|
247
|
+
module_function :validate_template_opts
|
|
191
248
|
end
|
|
192
249
|
end
|
|
193
250
|
end
|
data/lib/pdk/cli/validate.rb
CHANGED
|
@@ -1,124 +1,109 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
validator_names = PDK::Validate.validators.map { |v| v.name }
|
|
30
|
-
validators = PDK::Validate.validators
|
|
31
|
-
targets = []
|
|
32
|
-
|
|
33
|
-
if opts[:list]
|
|
34
|
-
PDK.logger.info(_('Available validators: %{validator_names}') % { validator_names: validator_names.join(', ') })
|
|
35
|
-
exit 0
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
PDK::CLI::Util.validate_puppet_version_opts(opts)
|
|
39
|
-
|
|
40
|
-
PDK::CLI::Util.ensure_in_module!(
|
|
41
|
-
message: _('Code validation can only be run from inside a valid module directory'),
|
|
42
|
-
log_level: :info,
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
PDK::CLI::Util.module_version_check
|
|
46
|
-
|
|
47
|
-
if args[0]
|
|
48
|
-
# This may be a single validator, a list of validators, or a target.
|
|
49
|
-
if Util::OptionValidator.comma_separated_list?(args[0])
|
|
50
|
-
# This is a comma separated list. Treat each item as a validator.
|
|
51
|
-
|
|
52
|
-
vals = Util::OptionNormalizer.comma_separated_list_to_array(args[0])
|
|
53
|
-
validators = PDK::Validate.validators.select { |v| vals.include?(v.name) }
|
|
54
|
-
|
|
55
|
-
invalid = vals.reject { |v| validator_names.include?(v) }
|
|
56
|
-
invalid.each do |v|
|
|
57
|
-
PDK.logger.warn(_("Unknown validator '%{v}'. Available validators: %{validators}.") % { v: v, validators: validator_names.join(', ') })
|
|
58
|
-
end
|
|
59
|
-
else
|
|
60
|
-
# This is a single item. Check if it's a known validator, or otherwise treat it as a target.
|
|
61
|
-
val = PDK::Validate.validators.find { |v| args[0] == v.name }
|
|
62
|
-
if val
|
|
63
|
-
validators = [val]
|
|
64
|
-
else
|
|
65
|
-
targets = [args[0]]
|
|
66
|
-
# We now know that no validators were passed, so let the user know we're using all of them by default.
|
|
67
|
-
PDK.logger.info(_('Running all available validators...'))
|
|
68
|
-
end
|
|
1
|
+
module PDK
|
|
2
|
+
module CLI
|
|
3
|
+
@validate_cmd = @base_cmd.define_command do
|
|
4
|
+
name 'validate'
|
|
5
|
+
usage 'validate [validators] [options] [targets]'
|
|
6
|
+
summary 'Run static analysis tests.'
|
|
7
|
+
description "Run metadata, YAML, Puppet, Ruby, or Tasks validation.\n\n" \
|
|
8
|
+
'[validators] is an optional comma-separated list of validators to use. ' \
|
|
9
|
+
'If not specified, all validators are used. ' \
|
|
10
|
+
"Note that when using PowerShell, the list of validators must be enclosed in single quotes.\n\n" \
|
|
11
|
+
'[targets] is an optional space-separated list of files or directories to be validated. ' \
|
|
12
|
+
'If not specified, validators are run against all applicable files in the module.'
|
|
13
|
+
|
|
14
|
+
PDK::CLI.puppet_version_options(self)
|
|
15
|
+
PDK::CLI.puppet_dev_option(self)
|
|
16
|
+
flag nil, :list, 'List all available validators.'
|
|
17
|
+
flag :a, 'auto-correct', 'Automatically correct problems where possible.'
|
|
18
|
+
flag nil, :parallel, 'Run validations in parallel.'
|
|
19
|
+
|
|
20
|
+
run do |opts, args, _cmd|
|
|
21
|
+
# Write the context information to the debug log
|
|
22
|
+
PDK.context.to_debug_log
|
|
23
|
+
|
|
24
|
+
if args == ['help']
|
|
25
|
+
PDK::CLI.run(['validate', '--help'])
|
|
26
|
+
exit 0
|
|
69
27
|
end
|
|
70
|
-
else
|
|
71
|
-
PDK.logger.info(_('Running all available validators...'))
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Subsequent arguments are targets.
|
|
75
|
-
targets.concat(args[1..-1]) if args.length > 1
|
|
76
|
-
|
|
77
|
-
report = PDK::Report.new
|
|
78
|
-
report_formats = if opts[:format]
|
|
79
|
-
PDK::CLI::Util::OptionNormalizer.report_formats(opts[:format])
|
|
80
|
-
else
|
|
81
|
-
[{
|
|
82
|
-
method: PDK::Report.default_format,
|
|
83
|
-
target: PDK::Report.default_target,
|
|
84
|
-
}]
|
|
85
|
-
end
|
|
86
28
|
|
|
87
|
-
|
|
88
|
-
options[:auto_correct] = true if opts.key?(:'auto-correct')
|
|
29
|
+
require 'pdk/validate'
|
|
89
30
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
options.merge!(puppet_env[:gemset])
|
|
96
|
-
|
|
97
|
-
PDK::Util::Bundler.ensure_bundle!(puppet_env[:gemset])
|
|
31
|
+
if opts[:list]
|
|
32
|
+
PDK.logger.info(format('Available validators: %{validator_names}', validator_names: PDK::Validate.validator_names.join(', ')))
|
|
33
|
+
exit 0
|
|
34
|
+
end
|
|
98
35
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
36
|
+
PDK::CLI::Util.validate_puppet_version_opts(opts)
|
|
37
|
+
unless PDK.feature_flag?('controlrepo') || PDK.context.is_a?(PDK::Context::Module)
|
|
38
|
+
raise PDK::CLI::ExitWithError.new('Code validation can only be run from inside a valid module directory', log_level: :error)
|
|
39
|
+
end
|
|
102
40
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
41
|
+
PDK::CLI::Util.module_version_check if PDK.context.is_a?(PDK::Context::Module)
|
|
42
|
+
|
|
43
|
+
# Set the ruby version we're going to use early. Must be set before the validators are created.
|
|
44
|
+
# Note that this is a bit of code-smell and should be fixed
|
|
45
|
+
puppet_env = PDK::CLI::Util.puppet_from_opts_or_env(opts)
|
|
46
|
+
PDK::Util::RubyVersion.use(puppet_env[:ruby_version])
|
|
47
|
+
|
|
48
|
+
targets = []
|
|
49
|
+
validators_to_run = nil
|
|
50
|
+
if args[0]
|
|
51
|
+
# This may be a single validator, a list of validators, or a target.
|
|
52
|
+
if Util::OptionValidator.comma_separated_list?(args[0])
|
|
53
|
+
# This is a comma separated list. Treat each item as a validator.
|
|
54
|
+
vals = Util::OptionNormalizer.comma_separated_list_to_array(args[0])
|
|
55
|
+
validators_to_run = PDK::Validate.validator_names.select { |name| vals.include?(name) }
|
|
56
|
+
|
|
57
|
+
vals.reject { |v| PDK::Validate.validator_names.include?(v) }
|
|
58
|
+
.each do |v|
|
|
59
|
+
PDK.logger.warn(format("Unknown validator '%{v}'. Available validators: %{validators}.", v: v, validators: PDK::Validate.validator_names.join(', ')))
|
|
60
|
+
end
|
|
61
|
+
else
|
|
62
|
+
# This is a single item. Check if it's a known validator, or otherwise treat it as a target.
|
|
63
|
+
val = PDK::Validate.validator_names.find { |name| args[0] == name }
|
|
64
|
+
if val
|
|
65
|
+
validators_to_run = [val]
|
|
66
|
+
else
|
|
67
|
+
targets = [args[0]]
|
|
68
|
+
# We now know that no validators were passed, so let the user know we're using all of them by default.
|
|
69
|
+
PDK.logger.info('Running all available validators...')
|
|
70
|
+
end
|
|
106
71
|
end
|
|
72
|
+
else
|
|
73
|
+
PDK.logger.info('Running all available validators...')
|
|
107
74
|
end
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
75
|
+
validators_to_run = PDK::Validate.validator_names if validators_to_run.nil?
|
|
76
|
+
|
|
77
|
+
# Subsequent arguments are targets.
|
|
78
|
+
targets.concat(args.to_a[1..]) if args.length > 1
|
|
79
|
+
|
|
80
|
+
report = PDK::Report.new
|
|
81
|
+
report_formats = if opts[:format]
|
|
82
|
+
PDK::CLI::Util::OptionNormalizer.report_formats(opts[:format])
|
|
83
|
+
else
|
|
84
|
+
[{
|
|
85
|
+
method: PDK::Report.default_format,
|
|
86
|
+
target: PDK::Report.default_target
|
|
87
|
+
}]
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
options = targets.empty? ? {} : { targets: targets }
|
|
91
|
+
options[:auto_correct] = true if opts[:'auto-correct']
|
|
92
|
+
options.merge!(puppet_env[:gemset])
|
|
93
|
+
|
|
94
|
+
# Ensure that the bundled gems are up to date and correct Ruby is activated before running any validations.
|
|
95
|
+
# Note that if no Gemfile exists, then ensure_bundle! will log a debug message and exit gracefully
|
|
96
|
+
require 'pdk/util/bundler'
|
|
97
|
+
PDK::Util::Bundler.ensure_bundle!(puppet_env[:gemset])
|
|
98
|
+
|
|
99
|
+
exit_code, report = PDK::Validate.invoke_validators_by_name(PDK.context, validators_to_run, opts.fetch(:parallel, false), options)
|
|
100
|
+
|
|
101
|
+
report_formats.each do |format|
|
|
102
|
+
report.send(format[:method], format[:target])
|
|
114
103
|
end
|
|
115
|
-
end
|
|
116
104
|
|
|
117
|
-
|
|
118
|
-
report.send(format[:method], format[:target])
|
|
105
|
+
exit exit_code
|
|
119
106
|
end
|
|
120
|
-
|
|
121
|
-
exit exit_code
|
|
122
107
|
end
|
|
123
108
|
end
|
|
124
109
|
end
|