Class: Terrafying::Context

Inherits:
Object
  • Object
show all
Defined in:
lib/terrafying/generator.rb

Direct Known Subclasses

RootContext

Constant Summary collapse

REGION =
ENV.fetch('AWS_REGION', 'eu-west-1')
PROVIDER_DEFAULTS =
{
  aws: { region: REGION }
}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeContext

Returns a new instance of Context.



177
178
179
180
181
182
# File 'lib/terrafying/generator.rb', line 177

def initialize
  @output = {
    'resource' => {}
  }
  @children = []
end

Instance Attribute Details

#outputObject (readonly)

Returns the value of attribute output.



175
176
177
# File 'lib/terrafying/generator.rb', line 175

def output
  @output
end

Class Method Details

.bundle(&block) ⇒ Object



169
170
171
172
173
# File 'lib/terrafying/generator.rb', line 169

def self.bundle(&block)
  ctx = Context.new
  ctx.instance_eval(&block)
  ctx
end

Instance Method Details

#add!(*c) ⇒ Object



314
315
316
317
# File 'lib/terrafying/generator.rb', line 314

def add!(*c)
  @children.push(*c)
  c[0]
end

#awsObject



184
185
186
# File 'lib/terrafying/generator.rb', line 184

def aws
  @@aws ||= Terrafying::Aws::Ops.new REGION
end

#data(type, name, spec) ⇒ Object



239
240
241
242
243
244
245
246
247
# File 'lib/terrafying/generator.rb', line 239

def data(type, name, spec)
  @output['data'] ||= {}
  @output['data'][type.to_s] ||= {}

  raise "Data already exists #{type}.#{name}" if @output['data'][type.to_s].key? name.to_s

  @output['data'][type.to_s][name.to_s] = spec
  RootRef.new(kind: :data, type: type, name: name)
end

#id_of(type, name) ⇒ Object



280
281
282
# File 'lib/terrafying/generator.rb', line 280

def id_of(type, name)
  output_of(type, name, 'id')
end

#key_exists_spec_differs(key, name, spec) ⇒ Object



217
218
219
# File 'lib/terrafying/generator.rb', line 217

def key_exists_spec_differs(key, name, spec)
  @providers.key?(key) && spec != @providers[key][name.to_s]
end

#local(name, value) ⇒ Object



221
222
223
224
225
226
227
228
# File 'lib/terrafying/generator.rb', line 221

def local(name, value)
  @output['locals'] ||= {}

  raise "Local already exists #{name}" if @output['locals'].key? name.to_s

  @output['locals'][name.to_s] = value
  RootRef.new(kind: :local, name: name)
end

#output_of(type, name, key) ⇒ Object



284
285
286
# File 'lib/terrafying/generator.rb', line 284

def output_of(type, name, key)
  RootRef.new(kind: :resource, type: type, name: name)[key]
end

#output_with_childrenObject



276
277
278
# File 'lib/terrafying/generator.rb', line 276

def output_with_children
  @children.inject(@output) { |out, c| out.deep_merge(c.output_with_children) }
end

#pretty_generateObject



288
289
290
# File 'lib/terrafying/generator.rb', line 288

def pretty_generate
  JSON.pretty_generate(output_with_children)
end

#provider(name, spec) ⇒ Object



188
189
190
191
192
193
194
195
196
# File 'lib/terrafying/generator.rb', line 188

def provider(name, spec)
  key = provider_key(name, spec)
  @providers ||= {}
  raise "Duplicate provider configuration detected for #{key}" if key_exists_spec_differs(key, name, spec)

  @providers[key] = { name.to_s => spec }
  @output['provider'] = @providers.values
  key
end

#provider_key(name, spec) ⇒ Object



198
199
200
# File 'lib/terrafying/generator.rb', line 198

def provider_key(name, spec)
  [name, spec[:alias]].compact.join('.')
end

#required_provider(name, spec) ⇒ Object



202
203
204
205
206
207
208
# File 'lib/terrafying/generator.rb', line 202

def required_provider(name, spec)
  @output['terraform'] ||= {}
  @output['terraform']['required_providers'] ||= {}
  raise "Duplicate required_provider configuration detected for #{name}" if @output['terraform']['required_providers'].key? name.to_s

  @output['terraform']['required_providers'][name.to_s] = spec
end

#required_version(version) ⇒ Object



210
211
212
213
214
215
# File 'lib/terrafying/generator.rb', line 210

def required_version(version)
  @output['terraform'] ||= {}
  raise "required_version already configure" if @output['terraform']['required_version']

  @output['terraform']['required_version'] = "#{version}"
end

#resource(type, name, attributes) ⇒ Object



249
250
251
252
253
254
255
256
# File 'lib/terrafying/generator.rb', line 249

def resource(type, name, attributes)
  @output['resource'][type.to_s] ||= {}

  raise "Resource already exists #{type}.#{name}" if @output['resource'][type.to_s].key? name.to_s

  @output['resource'][type.to_s][name.to_s] = attributes
  RootRef.new(kind: :resource, type: type, name: name)
end

#resource_namesObject



292
293
294
295
296
297
298
299
300
301
# File 'lib/terrafying/generator.rb', line 292

def resource_names
  out = output_with_children
  ret = []
  out['resource'].keys.each do |type|
    out['resource'][type].keys.each do |id|
      ret << "#{type}.#{id}"
    end
  end
  ret
end

#resourcesObject



303
304
305
306
307
308
309
310
311
312
# File 'lib/terrafying/generator.rb', line 303

def resources
  out = output_with_children
  ret = []
  out['resource'].keys.each do |type|
    out['resource'][type].keys.each do |id|
      ret << "${#{type}.#{id}.id}"
    end
  end
  ret
end

#template(relative_path, params = {}) ⇒ Object



268
269
270
271
272
273
274
# File 'lib/terrafying/generator.rb', line 268

def template(relative_path, params = {})
  dir = caller_locations[0].path
  filename = File.join(File.dirname(dir), relative_path)
  erb = ERB.new(IO.read(filename))
  erb.filename = filename
  erb.result(OpenStruct.new(params).instance_eval { binding })
end

#tf_module(name, spec) ⇒ Object



258
259
260
261
262
263
264
265
266
# File 'lib/terrafying/generator.rb', line 258

def tf_module(name, spec)
  @output['module'] ||= {}

  raise "Module already exists #{name}" if @output['module'].key? name.to_s

  @output['module'][name.to_s] = spec

  RootRef.new(kind: :module, name: name)
end

#tf_safe(str) ⇒ Object



319
320
321
# File 'lib/terrafying/generator.rb', line 319

def tf_safe(str)
  str.gsub(%r{[\.\s/\?]}, '-').gsub(%r{\*}, "star")
end

#var(name, spec) ⇒ Object



230
231
232
233
234
235
236
237
# File 'lib/terrafying/generator.rb', line 230

def var(name, spec)
  @output['variable'] ||= {}

  raise "Var already exists #{name}" if @output['variable'].key? name.to_s

  @output['variable'][name.to_s] = spec
  RootRef.new(kind: :var, name: name)
end