Class: Packer::Config

Inherits:
DataObject show all
Defined in:
lib/packer-config.rb

Defined Under Namespace

Classes: DumpError, PackerBuildError, UndefinedVariableError

Instance Attribute Summary collapse

Attributes inherited from DataObject

#data, #required

Instance Method Summary collapse

Methods inherited from DataObject

#__add_array_of_array_of_strings, #__add_array_of_hashes, #__add_array_of_strings, #__add_boolean, #__add_hash, #__add_integer, #__add_string, #__exclusive_key_error, #add_required, #deep_copy

Constructor Details

#initialize(file) ⇒ Config

Returns a new instance of Config.



23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/packer-config.rb', line 23

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
end

Instance Attribute Details

#buildersObject

Returns the value of attribute builders.



14
15
16
# File 'lib/packer-config.rb', line 14

def builders
  @builders
end

#envvarObject

Returns the value of attribute envvar.



20
21
22
# File 'lib/packer-config.rb', line 20

def envvar
  @envvar
end

#macroObject

Returns the value of attribute macro.



19
20
21
# File 'lib/packer-config.rb', line 19

def macro
  @macro
end

#output_fileObject

Returns the value of attribute output_file.



21
22
23
# File 'lib/packer-config.rb', line 21

def output_file
  @output_file
end

#packerObject

Returns the value of attribute packer.



17
18
19
# File 'lib/packer-config.rb', line 17

def packer
  @packer
end

#packer_optionsObject

Returns the value of attribute packer_options.



18
19
20
# File 'lib/packer-config.rb', line 18

def packer_options
  @packer_options
end

#postprocessorsObject

Returns the value of attribute postprocessors.



15
16
17
# File 'lib/packer-config.rb', line 15

def postprocessors
  @postprocessors
end

#provisionersObject

Returns the value of attribute provisioners.



16
17
18
# File 'lib/packer-config.rb', line 16

def provisioners
  @provisioners
end

Instance Method Details

#add_builder(type) ⇒ Object



128
129
130
131
132
# File 'lib/packer-config.rb', line 128

def add_builder(type)
  builder = Packer::Builder.get_builder(type)
  self.builders.push(builder)
  builder
end

#add_postprocessor(type) ⇒ Object



140
141
142
143
144
# File 'lib/packer-config.rb', line 140

def add_postprocessor(type)
  postprocessor = Packer::PostProcessor.get_postprocessor(type)
  self.postprocessors.push(postprocessor)
  postprocessor
end

#add_provisioner(type) ⇒ Object



134
135
136
137
138
# File 'lib/packer-config.rb', line 134

def add_provisioner(type)
  provisioner = Packer::Provisioner.get_provisioner(type)
  self.provisioners.push(provisioner)
  provisioner
end

#add_variable(name, value) ⇒ Object



146
147
148
149
150
# File 'lib/packer-config.rb', line 146

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) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/packer-config.rb', line 101

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

#deleteObject



94
95
96
# File 'lib/packer-config.rb', line 94

def delete
  File.delete(self.output_file)
end

#description(description) ⇒ Object



116
117
118
# File 'lib/packer-config.rb', line 116

def description(description)
  self.__add_string('description', description)
end

#dump(format = 'json', pretty = false) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/packer-config.rb', line 60

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
  if self.provisioners.length > 0
    data_copy['provisioners'] = []
    self.provisioners.each do |thing|
      data_copy['provisioners'].push(thing.deep_copy)
    end
  end
  if self.postprocessors.length > 0
    data_copy['post-processors'] = []
    self.postprocessors.each do |thing|
      data_copy['post-processors'].push(thing.deep_copy)
    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) ⇒ Object



120
121
122
# File 'lib/packer-config.rb', line 120

def min_packer_version(version)
  self.__add_string('min_packer_version', version)
end

#validateObject



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/packer-config.rb', line 36

def validate
  super
  if self.builders.length == 0
    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: true
    rescue Packer::Runner::CommandExecutionError => e
      raise PackerBuildError.new(e.to_s)
    end
  end
  self.delete
  stdout
end

#variable(name) ⇒ Object



155
156
157
158
159
160
# File 'lib/packer-config.rb', line 155

def variable(name)
  unless self.variables.has_key? name
    raise UndefinedVariableError.new("No variable named #{name} has been defined -- did you forget to call add_variable?")
  end
  "{{user `#{name}`}}"
end

#variablesObject



124
125
126
# File 'lib/packer-config.rb', line 124

def variables
  self.data['variables']
end

#write(format = 'json') ⇒ Object



90
91
92
# File 'lib/packer-config.rb', line 90

def write(format='json')
  File.write(self.output_file, self.dump(format))
end