Class: Packer::Config

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

Defined Under Namespace

Classes: DumpError, PackerBuildError, UndefinedVariableError

Constant Summary collapse

PACKER_VERSION =
'1.0.0'

Instance Attribute Summary collapse

Attributes inherited from DataObject

#data, #key_dependencies, #required

Instance Method Summary collapse

Methods inherited from DataObject

#__add_array_of_array_of_strings, #__add_array_of_hashes, #__add_array_of_ints, #__add_array_of_strings, #__add_boolean, #__add_hash, #__add_integer, #__add_json, #__add_string, #__exclusive_key_error, #add_key_dependencies, #add_required, #deep_copy, #validate_key_dependencies, #validate_required

Constructor Details

#initialize(file) ⇒ Config

Returns a new instance of Config.



27
28
29
30
31
32
33
34
35
36
37
38
39
# 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

Instance Attribute Details

#buildersObject

Returns the value of attribute builders.



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

def builders
  @builders
end

#chained_postprocessorsObject

Returns the value of attribute chained_postprocessors.



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

def chained_postprocessors
  @chained_postprocessors
end

#envvarObject

Returns the value of attribute envvar.



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

def envvar
  @envvar
end

#macroObject

Returns the value of attribute macro.



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

def macro
  @macro
end

#output_fileObject

Returns the value of attribute output_file.



23
24
25
# File 'lib/packer-config.rb', line 23

def output_file
  @output_file
end

#packerObject

Returns the value of attribute packer.



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

def packer
  @packer
end

#packer_optionsObject

Returns the value of attribute packer_options.



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

def packer_options
  @packer_options
end

#postprocessorsObject

Returns the value of attribute postprocessors.



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

def postprocessors
  @postprocessors
end

#provisionersObject

Returns the value of attribute provisioners.



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

def provisioners
  @provisioners
end

Instance Method Details

#add_builder(type) ⇒ Object



138
139
140
141
142
# 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) ⇒ Object



150
151
152
153
154
# 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) ⇒ Object



144
145
146
147
148
# 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) ⇒ Object



156
157
158
159
160
# 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) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
128
# 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?Boolean

Returns:

  • (Boolean)


41
42
43
# File 'lib/packer-config.rb', line 41

def chained_postprocessors?
  self.chained_postprocessors ? true : false
end

#deleteObject



108
109
110
# File 'lib/packer-config.rb', line 108

def delete
  File.delete(self.output_file)
end

#description(description) ⇒ Object



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

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

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



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# 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) ⇒ Object



181
182
183
# File 'lib/packer-config.rb', line 181

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

#validate(verbose: false) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 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) ⇒ Object



165
166
167
168
169
170
171
# 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

#variablesObject



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

def variables
  self.data['variables']
end

#verify_packer_versionObject



173
174
175
176
177
178
179
# 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') ⇒ Object



104
105
106
# File 'lib/packer-config.rb', line 104

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