You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
2.4 KiB

4 years ago
require "bento/common"
class NormalizeRunner
include Common
include PackerExec
attr_reader :templates, :build_timestamp, :debug, :override_version
def initialize(opts)
@templates = opts.template_files
@debug = opts.debug
@modified = []
@build_timestamp = Time.now.gmtime.strftime("%Y%m%d%H%M%S")
end
def start
banner("Normalizing for templates:")
templates.each { |t| puts "- #{t}" }
time = Benchmark.measure do
templates.each do |file|
bento_dir = Dir.pwd
dir = File.dirname(file)
template = File.basename(file)
Dir.chdir dir
validate(template)
Dir.chdir(bento_dir)
end
end
unless @modified.empty?
info("")
info("The following templates were modified:")
@modified.sort.each { |template| info(" * #{template}") }
end
banner("Normalizing finished in #{duration(time.real)}.")
end
private
def checksum(file)
Digest::MD5.file(file).hexdigest
end
def fix(template)
file = "#{template}.json"
banner("[#{template}] Fixing")
original_checksum = checksum(file)
output = `packer fix #{file}`
raise "[#{template}] Error fixing, exited #{$CHILD_STATUS}" if $CHILD_STATUS.exitstatus != 0
# preserve ampersands in shell commands,
# see: https://github.com/hashicorp/packer/issues/784
output.gsub!("\\u0026", "&")
File.open(file, "wb") { |dest| dest.write(output) }
fixed_checksum = checksum(file)
if original_checksum == fixed_checksum
puts("No changes made.")
else
warn("Template #{template} has been modified.")
@modified << template
end
end
def packer_validate_cmd(template, var_file)
vars = "#{template}.variables.json"
cmd = %W{packer validate -var-file=#{var_file} #{template}.json}
cmd.insert(2, "-var-file=#{vars}") if File.exist?(vars)
cmd
end
def validate(template)
for_packer_run_with(template) do |md_file, var_file|
cmd = packer_validate_cmd(template, var_file.path)
banner("[#{template}] Validating: '#{cmd.join(" ")}'")
if debug
banner("[#{template}] DEBUG: var_file(#{var_file.path}) is:")
puts IO.read(var_file.path)
banner("[#{template}] DEBUG: md_file(#{md_file.path}) is:")
puts IO.read(md_file.path)
end
system(*cmd) || raise("[#{template}] Error validating, exited #{$CHILD_STATUS}")
end
end
end