pdk-akerl 1.8.0.1
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 +7 -0
- data/CHANGELOG.md +826 -0
- data/LICENSE +201 -0
- data/README.md +133 -0
- data/exe/pdk +10 -0
- data/lib/pdk.rb +10 -0
- data/lib/pdk/answer_file.rb +121 -0
- data/lib/pdk/cli.rb +113 -0
- data/lib/pdk/cli/build.rb +76 -0
- data/lib/pdk/cli/bundle.rb +42 -0
- data/lib/pdk/cli/convert.rb +41 -0
- data/lib/pdk/cli/errors.rb +23 -0
- data/lib/pdk/cli/exec.rb +246 -0
- data/lib/pdk/cli/exec_group.rb +67 -0
- data/lib/pdk/cli/module.rb +14 -0
- data/lib/pdk/cli/module/build.rb +14 -0
- data/lib/pdk/cli/module/generate.rb +45 -0
- data/lib/pdk/cli/new.rb +17 -0
- data/lib/pdk/cli/new/class.rb +32 -0
- data/lib/pdk/cli/new/defined_type.rb +30 -0
- data/lib/pdk/cli/new/module.rb +41 -0
- data/lib/pdk/cli/new/provider.rb +27 -0
- data/lib/pdk/cli/new/task.rb +31 -0
- data/lib/pdk/cli/test.rb +12 -0
- data/lib/pdk/cli/test/unit.rb +88 -0
- data/lib/pdk/cli/update.rb +32 -0
- data/lib/pdk/cli/util.rb +193 -0
- data/lib/pdk/cli/util/command_redirector.rb +26 -0
- data/lib/pdk/cli/util/interview.rb +63 -0
- data/lib/pdk/cli/util/option_normalizer.rb +53 -0
- data/lib/pdk/cli/util/option_validator.rb +56 -0
- data/lib/pdk/cli/validate.rb +124 -0
- data/lib/pdk/generate.rb +11 -0
- data/lib/pdk/generate/defined_type.rb +49 -0
- data/lib/pdk/generate/module.rb +318 -0
- data/lib/pdk/generate/provider.rb +82 -0
- data/lib/pdk/generate/puppet_class.rb +48 -0
- data/lib/pdk/generate/puppet_object.rb +288 -0
- data/lib/pdk/generate/task.rb +86 -0
- data/lib/pdk/i18n.rb +4 -0
- data/lib/pdk/logger.rb +28 -0
- data/lib/pdk/module.rb +21 -0
- data/lib/pdk/module/build.rb +214 -0
- data/lib/pdk/module/convert.rb +209 -0
- data/lib/pdk/module/metadata.rb +193 -0
- data/lib/pdk/module/templatedir.rb +313 -0
- data/lib/pdk/module/update.rb +111 -0
- data/lib/pdk/module/update_manager.rb +210 -0
- data/lib/pdk/report.rb +112 -0
- data/lib/pdk/report/event.rb +357 -0
- data/lib/pdk/template_file.rb +89 -0
- data/lib/pdk/tests/unit.rb +213 -0
- data/lib/pdk/util.rb +271 -0
- data/lib/pdk/util/bundler.rb +253 -0
- data/lib/pdk/util/filesystem.rb +12 -0
- data/lib/pdk/util/git.rb +74 -0
- data/lib/pdk/util/puppet_version.rb +242 -0
- data/lib/pdk/util/ruby_version.rb +147 -0
- data/lib/pdk/util/vendored_file.rb +88 -0
- data/lib/pdk/util/version.rb +42 -0
- data/lib/pdk/util/windows.rb +13 -0
- data/lib/pdk/util/windows/api_types.rb +57 -0
- data/lib/pdk/util/windows/file.rb +36 -0
- data/lib/pdk/util/windows/string.rb +16 -0
- data/lib/pdk/validate.rb +14 -0
- data/lib/pdk/validate/base_validator.rb +209 -0
- data/lib/pdk/validate/metadata/metadata_json_lint.rb +86 -0
- data/lib/pdk/validate/metadata/metadata_syntax.rb +109 -0
- data/lib/pdk/validate/metadata_validator.rb +30 -0
- data/lib/pdk/validate/puppet/puppet_lint.rb +67 -0
- data/lib/pdk/validate/puppet/puppet_syntax.rb +112 -0
- data/lib/pdk/validate/puppet_validator.rb +30 -0
- data/lib/pdk/validate/ruby/rubocop.rb +77 -0
- data/lib/pdk/validate/ruby_validator.rb +29 -0
- data/lib/pdk/validate/tasks/metadata_lint.rb +126 -0
- data/lib/pdk/validate/tasks/name.rb +88 -0
- data/lib/pdk/validate/tasks_validator.rb +33 -0
- data/lib/pdk/version.rb +4 -0
- data/locales/config.yaml +21 -0
- data/locales/pdk.pot +1283 -0
- metadata +304 -0
@@ -0,0 +1,253 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
require 'digest'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'pdk/util'
|
5
|
+
require 'pdk/cli/exec'
|
6
|
+
|
7
|
+
module PDK
|
8
|
+
module Util
|
9
|
+
module Bundler
|
10
|
+
class BundleHelper; end
|
11
|
+
|
12
|
+
def self.ensure_bundle!(gem_overrides = nil)
|
13
|
+
bundle = BundleHelper.new
|
14
|
+
|
15
|
+
# This will default ensure_bundle! to re-resolving everything to latest
|
16
|
+
gem_overrides ||= { puppet: nil, hiera: nil, facter: nil }
|
17
|
+
|
18
|
+
if already_bundled?(bundle.gemfile, gem_overrides)
|
19
|
+
PDK.logger.debug(_('Bundler managed gems already up to date.'))
|
20
|
+
return
|
21
|
+
end
|
22
|
+
|
23
|
+
unless bundle.gemfile?
|
24
|
+
PDK.logger.debug(_("No Gemfile found in '%{cwd}'. Skipping bundler management.") % { cwd: Dir.pwd })
|
25
|
+
return
|
26
|
+
end
|
27
|
+
|
28
|
+
unless bundle.locked?
|
29
|
+
# Generate initial default Gemfile.lock, either from package cache or
|
30
|
+
# by invoking `bundle lock`
|
31
|
+
bundle.lock!
|
32
|
+
end
|
33
|
+
|
34
|
+
# Check if all dependencies will be available once we update the lockfile.
|
35
|
+
begin
|
36
|
+
original_lockfile = bundle.gemfile_lock
|
37
|
+
temp_lockfile = "#{original_lockfile}.tmp"
|
38
|
+
|
39
|
+
FileUtils.mv(original_lockfile, temp_lockfile)
|
40
|
+
|
41
|
+
all_deps_available = bundle.installed?(gem_overrides)
|
42
|
+
ensure
|
43
|
+
FileUtils.mv(temp_lockfile, original_lockfile, force: true)
|
44
|
+
end
|
45
|
+
|
46
|
+
bundle.update_lock!(with: gem_overrides, local: all_deps_available)
|
47
|
+
|
48
|
+
# If there are missing dependencies after updating the lockfile, let `bundle install`
|
49
|
+
# go out and get them. If the specified puppet gem version points to a remote location
|
50
|
+
# or local filepath, then run bundle install as well.
|
51
|
+
if !bundle.installed? || (gem_overrides[:puppet] && gem_overrides[:puppet].start_with?('file://', 'git://', 'https://'))
|
52
|
+
bundle.install!(gem_overrides)
|
53
|
+
end
|
54
|
+
|
55
|
+
mark_as_bundled!(bundle.gemfile, gem_overrides)
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.ensure_binstubs!(*gems)
|
59
|
+
bundle = BundleHelper.new
|
60
|
+
|
61
|
+
bundle.binstubs!(gems)
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.already_bundled?(gemfile, gem_overrides)
|
65
|
+
!(@bundled ||= {})[bundle_cache_key(gemfile, gem_overrides)].nil?
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.mark_as_bundled!(gemfile, gem_overrides)
|
69
|
+
(@bundled ||= {})[bundle_cache_key(gemfile, gem_overrides)] = true
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.bundle_cache_key(gemfile, gem_overrides)
|
73
|
+
override_sig = (gem_overrides || {}).sort_by { |gem, _| gem.to_s }.to_s
|
74
|
+
Digest::MD5.hexdigest(gemfile.to_s + override_sig)
|
75
|
+
end
|
76
|
+
private_class_method :bundle_cache_key
|
77
|
+
|
78
|
+
class BundleHelper
|
79
|
+
def gemfile
|
80
|
+
@gemfile ||= PDK::Util.find_upwards('Gemfile')
|
81
|
+
end
|
82
|
+
|
83
|
+
def gemfile_lock
|
84
|
+
return nil if gemfile.nil?
|
85
|
+
@gemfile_lock ||= File.join(File.dirname(gemfile), 'Gemfile.lock')
|
86
|
+
end
|
87
|
+
|
88
|
+
def gemfile?
|
89
|
+
!gemfile.nil?
|
90
|
+
end
|
91
|
+
|
92
|
+
def locked?
|
93
|
+
!gemfile_lock.nil? && File.file?(gemfile_lock)
|
94
|
+
end
|
95
|
+
|
96
|
+
def installed?(gem_overrides = {})
|
97
|
+
PDK.logger.debug(_('Checking for missing Gemfile dependencies.'))
|
98
|
+
|
99
|
+
argv = ['check', "--gemfile=#{gemfile}", '--dry-run']
|
100
|
+
|
101
|
+
cmd = bundle_command(*argv).tap do |c|
|
102
|
+
c.update_environment(gemfile_env(gem_overrides)) unless gem_overrides.empty?
|
103
|
+
end
|
104
|
+
|
105
|
+
result = cmd.execute!
|
106
|
+
|
107
|
+
unless result[:exit_code].zero?
|
108
|
+
PDK.logger.debug(result.values_at(:stdout, :stderr).join("\n"))
|
109
|
+
end
|
110
|
+
|
111
|
+
result[:exit_code].zero?
|
112
|
+
end
|
113
|
+
|
114
|
+
def lock!
|
115
|
+
if PDK::Util.package_install?
|
116
|
+
# In packaged installs, use vendored Gemfile.lock as a starting point.
|
117
|
+
# Subsequent 'bundle install' will still pick up any new dependencies.
|
118
|
+
vendored_lockfiles = [
|
119
|
+
File.join(PDK::Util.package_cachedir, "Gemfile-#{PDK::Util::RubyVersion.active_ruby_version}.lock"),
|
120
|
+
File.join(PDK::Util.package_cachedir, 'Gemfile.lock'),
|
121
|
+
]
|
122
|
+
|
123
|
+
vendored_gemfile_lock = vendored_lockfiles.find { |lockfile| File.exist?(lockfile) }
|
124
|
+
|
125
|
+
unless vendored_gemfile_lock
|
126
|
+
raise PDK::CLI::FatalError, _('Vendored Gemfile.lock (%{source}) not found.') % {
|
127
|
+
source: vendored_gemfile_lock,
|
128
|
+
}
|
129
|
+
end
|
130
|
+
|
131
|
+
PDK.logger.debug(_('Using vendored Gemfile.lock from %{source}.') % { source: vendored_gemfile_lock })
|
132
|
+
FileUtils.cp(vendored_gemfile_lock, File.join(PDK::Util.module_root, 'Gemfile.lock'))
|
133
|
+
else
|
134
|
+
argv = ['lock']
|
135
|
+
|
136
|
+
cmd = bundle_command(*argv).tap do |c|
|
137
|
+
c.add_spinner(_('Resolving default Gemfile dependencies.'))
|
138
|
+
end
|
139
|
+
|
140
|
+
result = cmd.execute!
|
141
|
+
|
142
|
+
unless result[:exit_code].zero?
|
143
|
+
PDK.logger.fatal(result.values_at(:stdout, :stderr).join("\n"))
|
144
|
+
raise PDK::CLI::FatalError, _('Unable to resolve default Gemfile dependencies.')
|
145
|
+
end
|
146
|
+
|
147
|
+
# After initial lockfile generation, re-resolve json gem to built-in
|
148
|
+
# version to avoid unncessary native compilation attempts. For packaged
|
149
|
+
# installs this is done during the generation of the vendored Gemfile.lock
|
150
|
+
update_lock!(only: { json: nil }, local: true)
|
151
|
+
end
|
152
|
+
|
153
|
+
true
|
154
|
+
end
|
155
|
+
|
156
|
+
def update_lock!(options = {})
|
157
|
+
PDK.logger.debug(_('Updating Gemfile dependencies.'))
|
158
|
+
|
159
|
+
argv = ['lock', "--lockfile=#{gemfile_lock}", '--update']
|
160
|
+
|
161
|
+
overrides = nil
|
162
|
+
|
163
|
+
if options && options[:only]
|
164
|
+
update_gems = options[:only].keys.map(&:to_s)
|
165
|
+
argv << update_gems
|
166
|
+
argv.flatten!
|
167
|
+
|
168
|
+
overrides = options[:only]
|
169
|
+
elsif options && options[:with]
|
170
|
+
overrides = options[:with]
|
171
|
+
end
|
172
|
+
|
173
|
+
argv << '--local' if options && options[:local]
|
174
|
+
argv << '--conservative' if options && options[:conservative]
|
175
|
+
|
176
|
+
cmd = bundle_command(*argv).tap do |c|
|
177
|
+
c.update_environment('BUNDLE_GEMFILE' => gemfile)
|
178
|
+
c.update_environment(gemfile_env(overrides)) if overrides
|
179
|
+
end
|
180
|
+
|
181
|
+
result = cmd.execute!
|
182
|
+
|
183
|
+
unless result[:exit_code].zero?
|
184
|
+
PDK.logger.fatal(result.values_at(:stdout, :stderr).join("\n"))
|
185
|
+
raise PDK::CLI::FatalError, _('Unable to resolve Gemfile dependencies.')
|
186
|
+
end
|
187
|
+
|
188
|
+
true
|
189
|
+
end
|
190
|
+
|
191
|
+
def install!(gem_overrides = {})
|
192
|
+
argv = ['install', "--gemfile=#{gemfile}"]
|
193
|
+
argv << '-j4' unless Gem.win_platform? && Gem::Version.new(PDK::Util::RubyVersion.active_ruby_version) < Gem::Version.new('2.3.5')
|
194
|
+
|
195
|
+
cmd = bundle_command(*argv).tap do |c|
|
196
|
+
c.add_spinner(_('Installing missing Gemfile dependencies.'))
|
197
|
+
c.update_environment(gemfile_env(gem_overrides)) unless gem_overrides.empty?
|
198
|
+
end
|
199
|
+
|
200
|
+
result = cmd.execute!
|
201
|
+
|
202
|
+
unless result[:exit_code].zero?
|
203
|
+
PDK.logger.fatal(result.values_at(:stdout, :stderr).join("\n"))
|
204
|
+
raise PDK::CLI::FatalError, _('Unable to install missing Gemfile dependencies.')
|
205
|
+
end
|
206
|
+
|
207
|
+
true
|
208
|
+
end
|
209
|
+
|
210
|
+
def binstubs!(gems)
|
211
|
+
binstub_dir = File.join(File.dirname(gemfile), 'bin')
|
212
|
+
return true if gems.all? { |gem| File.file?(File.join(binstub_dir, gem)) }
|
213
|
+
|
214
|
+
cmd = bundle_command('binstubs', *gems, '--force')
|
215
|
+
result = cmd.execute!
|
216
|
+
|
217
|
+
unless result[:exit_code].zero?
|
218
|
+
PDK.logger.fatal(_("Failed to generate binstubs for '%{gems}':\n%{output}") % { gems: gems.join(' '), output: result.values_at(:stdout, :stderr).join("\n") })
|
219
|
+
raise PDK::CLI::FatalError, _('Unable to install requested binstubs.')
|
220
|
+
end
|
221
|
+
|
222
|
+
true
|
223
|
+
end
|
224
|
+
|
225
|
+
def self.gemfile_env(gem_overrides)
|
226
|
+
gemfile_env = {}
|
227
|
+
|
228
|
+
return gemfile_env unless gem_overrides.respond_to?(:each)
|
229
|
+
|
230
|
+
gem_overrides.each do |gem, version|
|
231
|
+
gemfile_env['PUPPET_GEM_VERSION'] = version if gem.respond_to?(:to_s) && gem.to_s == 'puppet' && !version.nil?
|
232
|
+
gemfile_env['FACTER_GEM_VERSION'] = version if gem.respond_to?(:to_s) && gem.to_s == 'facter' && !version.nil?
|
233
|
+
gemfile_env['HIERA_GEM_VERSION'] = version if gem.respond_to?(:to_s) && gem.to_s == 'hiera' && !version.nil?
|
234
|
+
end
|
235
|
+
|
236
|
+
gemfile_env
|
237
|
+
end
|
238
|
+
|
239
|
+
private
|
240
|
+
|
241
|
+
def gemfile_env(gem_overrides)
|
242
|
+
self.class.gemfile_env(gem_overrides)
|
243
|
+
end
|
244
|
+
|
245
|
+
def bundle_command(*args)
|
246
|
+
PDK::CLI::Exec::Command.new(PDK::CLI::Exec.bundle_bin, *args).tap do |c|
|
247
|
+
c.context = :module
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module PDK
|
2
|
+
module Util
|
3
|
+
module Filesystem
|
4
|
+
def write_file(path, content)
|
5
|
+
raise ArgumentError unless path.is_a?(String) || path.respond_to?(:to_path)
|
6
|
+
|
7
|
+
File.open(path, 'wb') { |f| f.write(content.encode(universal_newline: true)) }
|
8
|
+
end
|
9
|
+
module_function :write_file
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/pdk/util/git.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
module PDK
|
2
|
+
module Util
|
3
|
+
module Git
|
4
|
+
def self.git_bindir
|
5
|
+
@git_dir ||= File.join('private', 'git', Gem.win_platform? ? 'cmd' : 'bin')
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.git_paths
|
9
|
+
@paths ||= begin
|
10
|
+
paths = [File.join(PDK::Util.pdk_package_basedir, git_bindir)]
|
11
|
+
|
12
|
+
if Gem.win_platform?
|
13
|
+
paths << File.join(PDK::Util.pdk_package_basedir, 'private', 'git', 'mingw64', 'bin')
|
14
|
+
paths << File.join(PDK::Util.pdk_package_basedir, 'private', 'git', 'mingw64', 'libexec', 'git-core')
|
15
|
+
paths << File.join(PDK::Util.pdk_package_basedir, 'private', 'git', 'usr', 'bin')
|
16
|
+
end
|
17
|
+
|
18
|
+
paths
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.git_bin
|
23
|
+
git_bin = Gem.win_platform? ? 'git.exe' : 'git'
|
24
|
+
vendored_bin_path = File.join(git_bindir, git_bin)
|
25
|
+
|
26
|
+
PDK::CLI::Exec.try_vendored_bin(vendored_bin_path, git_bin)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.git(*args)
|
30
|
+
PDK::CLI::Exec.ensure_bin_present!(git_bin, 'git')
|
31
|
+
|
32
|
+
PDK::CLI::Exec.execute(git_bin, *args)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.git_with_env(env, *args)
|
36
|
+
PDK::CLI::Exec.ensure_bin_present!(git_bin, 'git')
|
37
|
+
|
38
|
+
PDK::CLI::Exec.execute_with_env(env, git_bin, *args)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.repo?(maybe_repo)
|
42
|
+
return bare_repo?(maybe_repo) if File.directory?(maybe_repo)
|
43
|
+
|
44
|
+
remote_repo?(maybe_repo)
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.bare_repo?(maybe_repo)
|
48
|
+
env = { 'GIT_DIR' => maybe_repo }
|
49
|
+
rev_parse = git_with_env(env, 'rev-parse', '--is-bare-repository')
|
50
|
+
|
51
|
+
rev_parse[:exit_code].zero? && rev_parse[:stdout].strip == 'true'
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.remote_repo?(maybe_repo)
|
55
|
+
git('ls-remote', '--exit-code', maybe_repo)[:exit_code].zero?
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.ls_remote(repo, ref)
|
59
|
+
output = git('ls-remote', '--refs', repo, ref)
|
60
|
+
|
61
|
+
unless output[:exit_code].zero?
|
62
|
+
PDK.logger.error output[:stdout]
|
63
|
+
PDK.logger.error output[:stderr]
|
64
|
+
raise PDK::CLI::ExitWithError, _('Unable to access the template repository "%{repository}"') % {
|
65
|
+
repository: repo,
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
matching_refs = output[:stdout].split("\n").map { |r| r.split("\t") }
|
70
|
+
matching_refs.find { |_sha, remote_ref| remote_ref == ref }.first
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,242 @@
|
|
1
|
+
require 'pdk/util'
|
2
|
+
require 'pdk/util/git'
|
3
|
+
|
4
|
+
module PDK
|
5
|
+
module Util
|
6
|
+
class PuppetVersion
|
7
|
+
class << self
|
8
|
+
extend Forwardable
|
9
|
+
|
10
|
+
def_delegators :instance, :puppet_dev_env, :puppet_dev_path, :fetch_puppet_dev, :find_gem_for, :from_pe_version, :from_module_metadata, :latest_available
|
11
|
+
|
12
|
+
attr_writer :instance
|
13
|
+
|
14
|
+
def instance
|
15
|
+
@instance ||= new
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
PE_VERSIONS_URL = 'https://forgeapi.puppet.com/private/versions/pe'.freeze
|
20
|
+
DEFAULT_PUPPET_DEV_URL = 'https://github.com/puppetlabs/puppet'.freeze
|
21
|
+
DEFAULT_PUPPET_DEV_BRANCH = 'master'.freeze
|
22
|
+
|
23
|
+
def puppet_dev_env
|
24
|
+
{
|
25
|
+
gem_version: 'file://%{path}' % { path: puppet_dev_path },
|
26
|
+
ruby_version: PDK::Util::RubyVersion.latest_ruby_version,
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def puppet_dev_path
|
31
|
+
File.join(PDK::Util.cachedir, 'src', 'puppet')
|
32
|
+
end
|
33
|
+
|
34
|
+
def latest_available
|
35
|
+
latest = find_gem(Gem::Requirement.create('>= 0'))
|
36
|
+
|
37
|
+
if latest.nil?
|
38
|
+
raise ArgumentError, _('Unable to find a Puppet gem in current Ruby environment or from Rubygems.org.')
|
39
|
+
end
|
40
|
+
|
41
|
+
latest
|
42
|
+
end
|
43
|
+
|
44
|
+
def fetch_puppet_dev
|
45
|
+
# Check if the source is cloned and is a readable git repo
|
46
|
+
unless PDK::Util::Git.remote_repo? puppet_dev_path
|
47
|
+
# Check if the path has something in it already. Delete it and prepare for clone if so.
|
48
|
+
if File.exist? puppet_dev_path
|
49
|
+
File.delete(puppet_dev_path) if File.file? puppet_dev_path
|
50
|
+
FileUtils.rm_rf(puppet_dev_path) if File.directory? puppet_dev_path
|
51
|
+
end
|
52
|
+
|
53
|
+
FileUtils.mkdir_p puppet_dev_path
|
54
|
+
clone_result = PDK::Util::Git.git('clone', DEFAULT_PUPPET_DEV_URL, puppet_dev_path)
|
55
|
+
return if clone_result[:exit_code].zero?
|
56
|
+
|
57
|
+
PDK.logger.error clone_result[:stdout]
|
58
|
+
PDK.logger.error clone_result[:stderr]
|
59
|
+
raise PDK::CLI::FatalError, _("Unable to clone git repository at '%{repo}'.") % { repo: DEFAULT_PUPPET_DEV_URL }
|
60
|
+
end
|
61
|
+
|
62
|
+
# Fetch Updates from remote repository
|
63
|
+
fetch_result = PDK::Util::Git.git('-C', puppet_dev_path, 'fetch', 'origin')
|
64
|
+
|
65
|
+
unless fetch_result[:exit_code].zero?
|
66
|
+
PDK.logger.error fetch_result[:stdout]
|
67
|
+
PDK.logger.error fetch_result[:stderr]
|
68
|
+
raise PDK::CLI::FatalError, _("Unable to fetch from git remote at '%{repo}'.") % { repo: DEFAULT_PUPPET_DEV_URL }
|
69
|
+
end
|
70
|
+
|
71
|
+
# Reset local repo to latest
|
72
|
+
reset_result = PDK::Util::Git.git('-C', puppet_dev_path, 'reset', '--hard', 'origin/master')
|
73
|
+
return if reset_result[:exit_code].zero?
|
74
|
+
|
75
|
+
PDK.logger.error reset_result[:stdout]
|
76
|
+
PDK.logger.error reset_result[:stderr]
|
77
|
+
raise PDK::CLI::FatalError, _("Unable to update git repository at '%{cachedir}'.") % { repo: puppet_dev_path }
|
78
|
+
end
|
79
|
+
|
80
|
+
def find_gem_for(version_str)
|
81
|
+
version = parse_specified_version(version_str)
|
82
|
+
|
83
|
+
# Look for a gem matching exactly the version passed in.
|
84
|
+
if version.segments.length == 3
|
85
|
+
exact_match_gem = find_gem(Gem::Requirement.create(version))
|
86
|
+
return exact_match_gem unless exact_match_gem.nil?
|
87
|
+
end
|
88
|
+
|
89
|
+
# Construct a pessimistic version constraint to find the latest
|
90
|
+
# available gem matching the level of specificity of version_str.
|
91
|
+
requirement_string = version.approximate_recommendation
|
92
|
+
requirement_string += '.0' unless version.segments.length == 1
|
93
|
+
latest_requirement = Gem::Requirement.create(requirement_string)
|
94
|
+
|
95
|
+
latest_available_gem = find_gem(latest_requirement)
|
96
|
+
|
97
|
+
if latest_available_gem.nil?
|
98
|
+
raise ArgumentError, _('Unable to find a Puppet gem matching %{requirement}.') % {
|
99
|
+
requirement: latest_requirement,
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
# Only issue this warning if they requested an exact version that isn't available.
|
104
|
+
if version.segments.length == 3
|
105
|
+
PDK.logger.warn(_('Puppet %{requested_version} is not available, activating %{found_version} instead.') % {
|
106
|
+
requested_version: version_str,
|
107
|
+
found_version: latest_available_gem[:gem_version].version,
|
108
|
+
})
|
109
|
+
end
|
110
|
+
|
111
|
+
latest_available_gem
|
112
|
+
end
|
113
|
+
|
114
|
+
def from_pe_version(version_str)
|
115
|
+
version = parse_specified_version(version_str)
|
116
|
+
|
117
|
+
gem_version = pe_version_map.find do |version_map|
|
118
|
+
version_map[:requirement].satisfied_by?(version)
|
119
|
+
end
|
120
|
+
|
121
|
+
if gem_version.nil?
|
122
|
+
raise ArgumentError, _('Unable to map Puppet Enterprise version %{pe_version} to a Puppet version.') % {
|
123
|
+
pe_version: version_str,
|
124
|
+
}
|
125
|
+
end
|
126
|
+
|
127
|
+
PDK.logger.info _('Puppet Enterprise %{pe_version} maps to Puppet %{puppet_version}.') % {
|
128
|
+
pe_version: version_str,
|
129
|
+
puppet_version: gem_version[:gem_version],
|
130
|
+
}
|
131
|
+
|
132
|
+
find_gem_for(gem_version[:gem_version])
|
133
|
+
end
|
134
|
+
|
135
|
+
def from_module_metadata(metadata = nil)
|
136
|
+
if metadata.nil?
|
137
|
+
metadata_file = PDK::Util.find_upwards('metadata.json')
|
138
|
+
|
139
|
+
unless metadata_file
|
140
|
+
PDK.logger.warn _('Unable to determine Puppet version for module: no metadata.json present in module.')
|
141
|
+
return nil
|
142
|
+
end
|
143
|
+
|
144
|
+
metadata = PDK::Module::Metadata.from_file(metadata_file)
|
145
|
+
end
|
146
|
+
|
147
|
+
metadata.validate_puppet_version_requirement!
|
148
|
+
metadata_requirement = metadata.puppet_requirement
|
149
|
+
|
150
|
+
# Split combined requirements like ">= 4.7.0 < 6.0.0" into their
|
151
|
+
# component requirements [">= 4.7.0", "< 6.0.0"]
|
152
|
+
pattern = %r{#{Gem::Requirement::PATTERN_RAW}}
|
153
|
+
requirement_strings = metadata_requirement['version_requirement'].scan(pattern).map do |req|
|
154
|
+
req.compact.join(' ')
|
155
|
+
end
|
156
|
+
|
157
|
+
gem_requirement = Gem::Requirement.create(requirement_strings)
|
158
|
+
find_gem(gem_requirement)
|
159
|
+
end
|
160
|
+
|
161
|
+
private
|
162
|
+
|
163
|
+
def parse_specified_version(version_str)
|
164
|
+
Gem::Version.new(version_str)
|
165
|
+
rescue ArgumentError
|
166
|
+
raise ArgumentError, _('%{version} is not a valid version number.') % {
|
167
|
+
version: version_str,
|
168
|
+
}
|
169
|
+
end
|
170
|
+
|
171
|
+
def pe_version_map
|
172
|
+
@pe_version_map ||= fetch_pe_version_map.map { |version_map|
|
173
|
+
maps = version_map['versions'].map do |pe_release|
|
174
|
+
requirements = ["= #{pe_release['version']}"]
|
175
|
+
|
176
|
+
# Some PE release have a .0 Z release, which causes problems when
|
177
|
+
# the user specifies "X.Y" expecting to get the latest Z and
|
178
|
+
# instead getting the oldest.
|
179
|
+
requirements << "!= #{pe_release['version'].gsub(%r{\.\d+\Z}, '')}" if pe_release['version'].end_with?('.0')
|
180
|
+
{
|
181
|
+
requirement: Gem::Requirement.create(requirements),
|
182
|
+
gem_version: pe_release['puppet'],
|
183
|
+
}
|
184
|
+
end
|
185
|
+
|
186
|
+
maps << {
|
187
|
+
requirement: requirement_from_forge_range(version_map['release']),
|
188
|
+
gem_version: version_map['versions'].find { |r| r['version'] == version_map['latest'] }['puppet'],
|
189
|
+
}
|
190
|
+
}.flatten
|
191
|
+
end
|
192
|
+
|
193
|
+
def fetch_pe_version_map
|
194
|
+
map = PDK::Util::VendoredFile.new('pe_versions.json', PE_VERSIONS_URL).read
|
195
|
+
|
196
|
+
JSON.parse(map)
|
197
|
+
rescue PDK::Util::VendoredFile::DownloadError => e
|
198
|
+
raise PDK::CLI::FatalError, e.message
|
199
|
+
rescue JSON::ParserError
|
200
|
+
raise PDK::CLI::FatalError, _('Failed to parse Puppet Enterprise version map file.')
|
201
|
+
end
|
202
|
+
|
203
|
+
def requirement_from_forge_range(range_str)
|
204
|
+
Gem::Requirement.create("~> #{range_str.gsub(%r{\.x\Z}, '.0')}")
|
205
|
+
end
|
206
|
+
|
207
|
+
def rubygems_puppet_versions
|
208
|
+
return @rubygems_puppet_versions unless @rubygems_puppet_versions.nil?
|
209
|
+
|
210
|
+
fetcher = Gem::SpecFetcher.fetcher
|
211
|
+
puppet_tuples = fetcher.detect(:released) do |spec_tuple|
|
212
|
+
spec_tuple.name == 'puppet' && Gem::Platform.match(spec_tuple.platform)
|
213
|
+
end
|
214
|
+
puppet_versions = puppet_tuples.map { |name, _| name.version }.uniq
|
215
|
+
@rubygems_puppet_versions = puppet_versions.sort { |a, b| b <=> a }
|
216
|
+
end
|
217
|
+
|
218
|
+
def find_gem(requirement)
|
219
|
+
if PDK::Util.package_install?
|
220
|
+
find_in_package_cache(requirement)
|
221
|
+
else
|
222
|
+
find_in_rubygems(requirement)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def find_in_rubygems(requirement)
|
227
|
+
version = rubygems_puppet_versions.find { |r| requirement.satisfied_by?(r) }
|
228
|
+
version.nil? ? nil : { gem_version: version, ruby_version: PDK::Util::RubyVersion.default_ruby_version }
|
229
|
+
end
|
230
|
+
|
231
|
+
def find_in_package_cache(requirement)
|
232
|
+
PDK::Util::RubyVersion.versions.each do |ruby_version, _|
|
233
|
+
PDK::Util::RubyVersion.use(ruby_version)
|
234
|
+
version = PDK::Util::RubyVersion.available_puppet_versions.find { |r| requirement.satisfied_by?(r) }
|
235
|
+
return { gem_version: version, ruby_version: ruby_version } unless version.nil?
|
236
|
+
end
|
237
|
+
|
238
|
+
nil
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|