Class: SimplyGenius::Atmos::Commands::Terraform

Inherits:
BaseCommand
  • Object
show all
Includes:
FileUtils
Defined in:
lib/simplygenius/atmos/commands/terraform.rb

Direct Known Subclasses

Apply, Destroy, Init, Plan

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from UI

#agree, #ask, #choose, color_enabled, color_enabled=, #display, #error, #notify, #say, #warn

Instance Attribute Details

#auto_initObject

Returns the value of attribute auto_init.



11
12
13
# File 'lib/simplygenius/atmos/commands/terraform.rb', line 11

def auto_init
  @auto_init
end

Class Method Details

.descriptionObject



13
14
15
# File 'lib/simplygenius/atmos/commands/terraform.rb', line 13

def self.description
  "Runs terraform"
end

Instance Method Details

#executeObject



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/simplygenius/atmos/commands/terraform.rb', line 48

def execute

  unless Atmos.config.is_atmos_repo?
    signal_usage_error <<~EOF
      Atmos can only run terraform from a location configured for atmos. 
      Have you run atmos init?"
    EOF
  end

  Atmos.config.provider.auth_manager.authenticate(ENV) do |auth_env|
    begin
      get_modules = @terraform_arguments.delete("--get-modules")

      init_automatically(auth_env, get_modules)

      exe = TerraformExecutor.new(process_env: auth_env)
      exe.run(*@terraform_arguments, get_modules: get_modules.present?)
    rescue TerraformExecutor::ProcessFailed => e
      logger.error(e.message)
    end
  end
end

#init_automatically(auth_env, get_modules) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
# File 'lib/simplygenius/atmos/commands/terraform.rb', line 23

def init_automatically(auth_env, get_modules)
  tf_init_dir = File.join(Atmos.config.tf_working_dir, '.terraform')
  backend_initialized = File.exist?(File.join(tf_init_dir, 'terraform.tfstate'))
  auto_init_enabled = Atmos.config["atmos.terraform.auto_init"].to_s == "true"

  if auto_init && auto_init_enabled && ! backend_initialized
    exe = TerraformExecutor.new(process_env: auth_env)
    exe.run("init", get_modules: get_modules.present?)
    init_shared_plugins
  end
end

#init_shared_pluginsObject



35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/simplygenius/atmos/commands/terraform.rb', line 35

def init_shared_plugins
  if ! Atmos.config["atmos.terraform.disable_shared_plugins"]
    home_dir = OS.windows? ? File.join("~", "Application Data") : "~"
    shared_plugins_dir = File.expand_path(File.join(home_dir,".terraform.d", "plugins"))
    logger.debug("Updating shared terraform plugins dir: #{shared_plugins_dir}")
    mkdir_p(shared_plugins_dir)
    terraform_plugins_dir = File.join(Atmos.config.tf_working_dir,'recipes', '.terraform', 'plugins')
    if File.exist?(terraform_plugins_dir)
      cp_r("#{terraform_plugins_dir}/.", shared_plugins_dir)
    end
  end
end

#parse(arguments) ⇒ Object

override so we can pass all options/flags/parameters directly to terraform instead of having clamp parse them



19
20
21
# File 'lib/simplygenius/atmos/commands/terraform.rb', line 19

def parse(arguments)
  @terraform_arguments = arguments
end