tfrb 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d33067657cf2a91d52a49276d63625eb981fd5080732aca333c6069317d62a99
4
- data.tar.gz: db42d995878e60d287639a03e0175693809b4611e2c42fda9d1983eb805e6ef1
3
+ metadata.gz: dcf070c3b3ae2566c53df75d4a38a6fdcae411cd0eadaa620062ea0d8c690a91
4
+ data.tar.gz: 468e9dbf7423807d1fbe9ccca5ea835394013176848f671451eec28a5d439548
5
5
  SHA512:
6
- metadata.gz: 28e1660e89cd237521c47892460ebbcc023877826734b9bcbfc6714525922bba9c794fa27dcaf7ecef5d10acf4b3f4d0b9791ebf9beff9948a5b30df75f1e8bc
7
- data.tar.gz: e1a2ea2bf9719bdc2d260833d945fa081148468a405e2c5e59691211cc3a9afc1c80c41ae845d935ea31b71e794820e572e493ab749dd90b09826f556ce0d0c7
6
+ metadata.gz: f93320b30f22b5b6101083e3e4d544de336f56abb85d74dbfe1db12e1340b2eb3b48f947b4130fb2156038d57655399895afb73d8dd98c71616b1ef1d7ec85a8
7
+ data.tar.gz: 30e8349752c48e7a16cdc11070a752f0f79560aa1d3a8417f5946b2335d4a42db1968f44c49f212ab12cd25202129c99032e6d553a3d54cfbf17d48f68aaeae8
@@ -8,16 +8,20 @@ class Tfrb::Base
8
8
  attr_accessor :block
9
9
  attr_accessor :path
10
10
  attr_accessor :temp_path
11
+ attr_accessor :local_state_path
11
12
  attr_accessor :environments
12
13
  attr_accessor :state
13
14
  attr_accessor :skip_import
15
+ attr_accessor :dry_run
14
16
 
15
17
  def initialize(block, environments)
16
18
  @skip_import = false
19
+ @dry_run = false
17
20
  @block = block
18
21
  @path = Tfrb::Config[:path]
19
22
  @temp_path = File.join(Tfrb::Config[:temp_path], block)
20
23
  Dir.mkdir(@temp_path) unless Dir.exist?(@temp_path)
24
+ @local_state_path = File.join(@temp_path, '.terraform', 'local.tfstate')
21
25
  @environments = environments.each_with_object({}) do |environment, hash|
22
26
  hash[environment] = Tfrb::Block.load(environment)
23
27
  end
@@ -44,6 +48,7 @@ class Tfrb::Base
44
48
  tf_pullstate = Mixlib::ShellOut.new('terraform', 'state', 'pull', { cwd: temp_path })
45
49
  tf_pullstate.run_command
46
50
  tf_pullstate.error!
51
+ File.write(local_state_path, tf_pullstate.stdout) if dry_run
47
52
  pulled_state = JSON.parse(tf_pullstate.stdout)
48
53
  if pulled_state['modules']
49
54
  pulled_state['modules'].each do |state_module|
@@ -76,12 +81,18 @@ class Tfrb::Base
76
81
  end
77
82
  write!
78
83
  end
84
+ tf_import_args = ['terraform', 'import']
85
+ if dry_run
86
+ tf_import_args << "-lock=false"
87
+ tf_import_args << "-state=#{local_state_path}"
88
+ end
79
89
  providers = @environments.find { |_, e| e['resource'] && e['resource'][resource] && e['resource'][resource][name] && e['resource'][resource][name]['provider'] }
80
90
  if providers && provider = providers[1]['resource'][resource][name]['provider']
81
- tf_import = Mixlib::ShellOut.new('terraform', 'import', "-provider=#{provider}", "#{resource}.#{name}", id, cwd: temp_path)
82
- else
83
- tf_import = Mixlib::ShellOut.new('terraform', 'import', "#{resource}.#{name}", id, cwd: temp_path)
91
+ tf_import_args << "-provider=#{provider}"
84
92
  end
93
+ tf_import_args << "#{resource}.#{name}"
94
+ tf_import_args << id
95
+ tf_import = Mixlib::ShellOut.new(*tf_import_args, cwd: temp_path)
85
96
  tf_import.run_command
86
97
  tf_import.error!
87
98
  state[resource] ||= {}
@@ -116,7 +127,14 @@ class Tfrb::Base
116
127
 
117
128
  def plan!
118
129
  printf "\033[1;32mCalculating plan...\033[0m\n"
119
- tf_plan = Mixlib::ShellOut.new('terraform', 'plan', '-out=plan.cache', shell_opts)
130
+ tf_plan_args = ['terraform', 'plan']
131
+ if dry_run
132
+ tf_plan_args << "-lock=false"
133
+ tf_plan_args << "-state=#{local_state_path}"
134
+ else
135
+ tf_plan_args << '-out=plan.cache'
136
+ end
137
+ tf_plan = Mixlib::ShellOut.new(*tf_plan_args, shell_opts)
120
138
  tf_plan.run_command
121
139
  tf_plan.error!
122
140
  end
@@ -152,7 +170,7 @@ class Tfrb::Base
152
170
  end
153
171
 
154
172
  class << self
155
- def load(block, environments, skip_import = false)
173
+ def load(block, environments, skip_import = false, dry_run = false)
156
174
  Tfrb::Resource.load_helpers!
157
175
 
158
176
  printf "\033[1;32mLoading %s...\033[0m\n", block
@@ -161,6 +179,9 @@ class Tfrb::Base
161
179
  # Set skip_import
162
180
  tfrb.skip_import = skip_import
163
181
 
182
+ # Set dry_run
183
+ tfrb.dry_run = dry_run
184
+
164
185
  # Clean temporary files before starting
165
186
  tfrb.clean!
166
187
 
@@ -12,14 +12,26 @@ class Tfrb::CLI < Thor
12
12
  puts Tfrb::VERSION
13
13
  end
14
14
 
15
- [:init, :plan, :apply].each do |cmd|
16
- desc "#{cmd}", "Runs a terraform #{cmd}"
17
- method_option :skip_import, aliases: '-s', type: :boolean, desc: 'Skip automatic terraform import', default: false
18
- define_method(cmd) do
19
- tfrb = load_tfrb(options[:skip_import] || [:init].include?(cmd))
20
- tfrb.send("#{cmd}!".to_sym)
21
- tfrb.clean! unless cmd == :init
22
- end
15
+ desc 'init', 'Runs a terraform init'
16
+ def init
17
+ load_tfrb.init!
18
+ end
19
+
20
+ desc 'plan', 'Runs a terraform plan'
21
+ method_option :dry_run, aliases: '-n', type: :boolean, desc: 'Dry run using local copy of statefile', default: false
22
+ method_option :skip_import, aliases: '-s', type: :boolean, desc: 'Skip automatic terraform import', default: false
23
+ def plan
24
+ tfrb = load_tfrb(options[:skip_import], options[:dry_run])
25
+ tfrb.plan!
26
+ tfrb.clean!
27
+ end
28
+
29
+ desc 'apply', 'Runs a terraform apply'
30
+ method_option :skip_import, aliases: '-s', type: :boolean, desc: 'Skip automatic terraform import', default: false
31
+ def apply
32
+ tfrb = load_tfrb(options[:skip_import])
33
+ tfrb.apply!
34
+ tfrb.clean!
23
35
  end
24
36
 
25
37
  desc 'import TYPE NAME ID', 'Runs a terraform import'
@@ -48,7 +60,7 @@ class Tfrb::CLI < Thor
48
60
 
49
61
  private
50
62
 
51
- def load_tfrb(skip_import = true)
63
+ def load_tfrb(skip_import = true, dry_run = false)
52
64
  unless File.exist?('tfrb.rb')
53
65
  puts 'Missing tfrb.rb file'
54
66
  exit(false)
@@ -63,6 +75,6 @@ class Tfrb::CLI < Thor
63
75
 
64
76
  require 'tfrb/base'
65
77
 
66
- Tfrb::Base.load(Tfrb::Config[:environment_name], Tfrb::Config[:files], skip_import)
78
+ Tfrb::Base.load(Tfrb::Config[:environment_name], Tfrb::Config[:files], skip_import, dry_run)
67
79
  end
68
80
  end
@@ -67,7 +67,9 @@ module Tfrb::Resource
67
67
  end
68
68
 
69
69
  def get_state(base, resource, name)
70
- tf_state = Mixlib::ShellOut.new('terraform', 'state', 'show', "#{resource}.#{name}", cwd: base.temp_path)
70
+ tf_state_args = ['terraform', 'state', 'show', "#{resource}.#{name}"]
71
+ tf_state_args << "-state=#{base.local_state_path}" if base.dry_run
72
+ tf_state = Mixlib::ShellOut.new(*tf_state_args, cwd: base.temp_path)
71
73
  tf_state.run_command
72
74
  tf_state.error!
73
75
  tf_state.stdout.split("\n").each_with_object({}) { |line, hash| key, value = line.split(' = '); hash[key.strip] = value }
@@ -1,3 +1,3 @@
1
1
  module Tfrb
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tfrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - 'Matt Kasa
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2019-05-01 00:00:00.000000000 Z
13
+ date: 2019-05-02 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler