Skip to content

Adds ability to resolve dependencies from a source file #1232 #1314

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.mkd
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ CHANGELOG
Unreleased
----------
- Add TOC to configuration docs [#1298](https://github.com/puppetlabs/r10k/issues/1298)
- Add ability to resolve dependencies of a source file into a Puppetfile [#1232](https://github.com/puppetlabs/r10k/pull/1232)

3.15.0
------
Expand Down
1 change: 1 addition & 0 deletions lib/r10k/action/puppetfile.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ module Puppetfile
require 'r10k/action/puppetfile/install'
require 'r10k/action/puppetfile/check'
require 'r10k/action/puppetfile/purge'
require 'r10k/action/puppetfile/resolve'
end
end
end
70 changes: 70 additions & 0 deletions lib/r10k/action/puppetfile/resolve.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
require 'r10k/action/base'
require 'r10k/content_synchronizer'
require 'r10k/errors/formatting'
require 'r10k/module_loader/puppetfile'
require 'r10k/util/cleaner'
require 'puppetfile-resolver'
require 'puppetfile-resolver/puppetfile/parser/r10k_eval'

module R10K
module Action
module Puppetfile
class Resolve < R10K::Action::Base

def call
begin
@output ||= 'Puppetfile'
@source ||= "#{@output}.src"

unless @force
if File.exist? @output
logger.error "Pass --force to overwrite existing file: #{@output}"
return false
end
end

content = File.read(@source)
puppetfile = PuppetfileResolver::Puppetfile::Parser::R10KEval.parse(content)

# Make sure the Puppetfile is valid
unless puppetfile.valid?
logger.error 'Puppetfile source is not valid'
puppetfile.validation_errors.each { |err| logger.error err }
return false
end

resolver = PuppetfileResolver::Resolver.new(puppetfile, nil)
result = resolver.resolve(strict_mode: true)

# Output resolution validation errors
result.validation_errors.each { |err| logger.warn err}

File.open(@output, "w+") do |file|
# copy over the existing Puppetfile, then add resolved dependencies below
file.write puppetfile.content
file.write "\n####### resolved dependencies #######\n"

result.dependency_graph.each do |dep|
# ignore the original modules, they're already in the lockfile
next if puppetfile.modules.find {|mod| mod.name == dep.name}

mod = dep.payload
next unless mod.is_a? PuppetfileResolver::Models::ModuleSpecification

file.write "mod '#{dep.payload.owner}-#{dep.payload.name}', '#{dep.payload.version}'\n"
end
end
end

logger.warn "Please inspect #{@output} and the modules it declares to ensure you know what you are deploying in your infrastructure."
end

private

def allowed_initialize_opts
super.merge(root: :self, output: :self, source: :self, force: :self )
end
end
end
end
end
17 changes: 17 additions & 0 deletions lib/r10k/cli/puppetfile.rb
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,22 @@ def self.command
end
end
end

module Resolve
def self.command
@cmd ||= Cri::Command.define do
name 'resolve'
usage 'resolve'
summary 'Resolve all the dependencies of a minimal source Puppetfile into Puppetfile ready for code deployment'

option nil, :output, 'Path to write the output Puppetfile', argument: :required
flag nil, :force, 'Overwrite existing Puppetfile'
option nil, :source, 'Path to source Puppetfile', argument: :required
runner R10K::Action::Puppetfile::CriRunner.wrap(R10K::Action::Puppetfile::Resolve)
end
end
end

end
end

Expand All @@ -71,3 +87,4 @@ def self.command
R10K::CLI::Puppetfile.command.add_command(R10K::CLI::Puppetfile::Install.command)
R10K::CLI::Puppetfile.command.add_command(R10K::CLI::Puppetfile::Check.command)
R10K::CLI::Puppetfile.command.add_command(R10K::CLI::Puppetfile::Purge.command)
R10K::CLI::Puppetfile.command.add_command(R10K::CLI::Puppetfile::Resolve.command)
2 changes: 2 additions & 0 deletions r10k.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ Gem::Specification.new do |s|
s.add_dependency 'jwt', '~> 2.2.3'
s.add_dependency 'minitar', '~> 0.9'

s.add_dependency 'puppetfile-resolver', '~> 0.5.0'

s.add_development_dependency 'rspec', '~> 3.1'

s.add_development_dependency 'rake'
Expand Down