tfrb 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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