class Packer::Config

Constants

PACKER_VERSION

Attributes

builders[RW]
chained_postprocessors[RW]
envvar[RW]
macro[RW]
output_file[RW]
packer[RW]
packer_options[RW]
postprocessors[RW]
provisioners[RW]

Public Class Methods

new(file) click to toggle source
Calls superclass method Packer::DataObject::new
# File lib/packer-config.rb, line 27
def initialize(file)
  super()
  self.data['variables'] = {}
  self.output_file = file
  self.builders = []
  self.provisioners = []
  self.postprocessors = []
  self.packer = 'packer'
  self.packer_options = []
  self.macro = Macro.new
  self.envvar = EnvVar.new
  self.chained_postprocessors = true
end

Public Instance Methods

add_builder(type) click to toggle source
# File lib/packer-config.rb, line 138
def add_builder(type)
  builder = Packer::Builder.get_builder(type)
  self.builders.push(builder)
  builder
end
add_postprocessor(type) click to toggle source
# File lib/packer-config.rb, line 150
def add_postprocessor(type)
  postprocessor = Packer::PostProcessor.get_postprocessor(type)
  self.postprocessors.push(postprocessor)
  postprocessor
end
add_provisioner(type) click to toggle source
# File lib/packer-config.rb, line 144
def add_provisioner(type)
  provisioner = Packer::Provisioner.get_provisioner(type)
  self.provisioners.push(provisioner)
  provisioner
end
add_variable(name, value) click to toggle source
# File lib/packer-config.rb, line 156
def add_variable(name, value)
  variables_copy = Marshal.load(Marshal.dump(self.variables))
  variables_copy[name.to_s] = value.to_s
  self.__add_hash('variables', variables_copy)
end
build(quiet: false) click to toggle source
# File lib/packer-config.rb, line 115
def build(quiet: false)
  self.validate
  self.write
  stdout = nil
  Dir.chdir(File.dirname(self.output_file)) do
    begin
      stdout = Packer::Runner.run! self.packer, 'build', self.packer_options, File.basename(self.output_file), quiet: quiet
    rescue Packer::Runner::CommandExecutionError => e
      raise PackerBuildError.new(e.to_s)
    end
  end
  self.delete
  stdout
end
chained_postprocessors?() click to toggle source
# File lib/packer-config.rb, line 41
def chained_postprocessors?
  self.chained_postprocessors ? true : false
end
delete() click to toggle source
# File lib/packer-config.rb, line 108
def delete
  File.delete(self.output_file)
end
description(description) click to toggle source
# File lib/packer-config.rb, line 130
def description(description)
  self.__add_string('description', description)
end
dump(format='json', pretty=false) click to toggle source
# File lib/packer-config.rb, line 71
def dump(format='json', pretty=false)
  data_copy = self.deep_copy
  data_copy['builders'] = []
  self.builders.each do |thing|
    data_copy['builders'].push(thing.deep_copy)
  end
  unless self.provisioners.empty?
    data_copy['provisioners'] = []
    self.provisioners.each do |thing|
      data_copy['provisioners'].push(thing.deep_copy)
    end
  end
  unless self.postprocessors.empty?
    data_copy['post-processors'] = []
    self.postprocessors.each do |thing|
      data_copy['post-processors'].push(thing.deep_copy)
    end
    unless self.chained_postprocessors?
      data_copy['post-processors'] = [data_copy['post-processors']]
    end
  end
  case format
  when 'json'
    if pretty
      JSON.pretty_generate(data_copy)
    else
      data_copy.to_json
    end
  else
    raise DumpError.new("Unrecognized format #{format} use one of ['json']")
  end
end
min_packer_version(version) click to toggle source
# File lib/packer-config.rb, line 181
def min_packer_version(version)
  self.__add_string('min_packer_version', version)
end
validate(verbose: false) click to toggle source
Calls superclass method Packer::DataObject#validate
# File lib/packer-config.rb, line 45
def validate(verbose: false)
  super()
  verify_packer_version
  if self.builders.empty?
    raise DataValidationError.new("At least one builder is required")
  end

  self.builders.each(&:validate)
  self.provisioners.each(&:validate)
  self.postprocessors.each(&:validate)
  self.write
  stdout = nil
  Dir.chdir(File.dirname(self.output_file)) do
    begin
      stdout = Packer::Runner.run! self.packer, 'validate', File.basename(self.output_file), quiet: !verbose
    rescue Packer::Runner::CommandExecutionError => e
      raise PackerBuildError.new(e.to_s)
    end
  end
  self.delete
  stdout
end
variable(name) click to toggle source
# File lib/packer-config.rb, line 165
def variable(name)
  unless self.variables.key? name
    raise UndefinedVariableError.new("No variable named #{name} has been defined -- did you forget to call add_variable?")
  end

  "{{user `#{name}`}}"
end
variables() click to toggle source
# File lib/packer-config.rb, line 134
def variables
  self.data['variables']
end
verify_packer_version() click to toggle source
# File lib/packer-config.rb, line 173
def verify_packer_version
  min_packer_version PACKER_VERSION
  version = /Packer v(\d+\.\d+\.\d+)/.match(
    Packer::Runner.run!(packer, 'version', quiet: true)
  )[1]
  Gem::Dependency.new('', ">= #{PACKER_VERSION}").match?('', version) || raise("Packer version #{version} is not new enough (requires >= #{PACKER_VERSION})")
end
write(format='json') click to toggle source
# File lib/packer-config.rb, line 104
def write(format='json')
  File.write(self.output_file, self.dump(format))
end