hashicorptools 0.2.3 → 0.3.0

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: d40948d480fbe605a1cdd463dd25f016b9a8caab0bd7b1ee3c85a1f72065b97f
4
- data.tar.gz: 2aff29bee1f1f7bd76b7e0685295b3d5acb173f4a01f362bc843825ac08a6230
3
+ metadata.gz: 75178f2878dffffbcca566e4ed6fa81c9cc612f55b601adf82a5a31da8492e74
4
+ data.tar.gz: 47fef27c27f49f242188b474872ef4b57128e8998e9a277de2c19f6752a74759
5
5
  SHA512:
6
- metadata.gz: 9db81bb211352e0a183432e031b2b7e596e5ba1005d9e662ab18c46476ce96430b258af6950a2dc8b92d03b87f83d3bf18a550b3ba8c4e908669a1fa98ef20da
7
- data.tar.gz: f7442712eced0611f8695b9acc7186abf4950485f3f48c430d779fa6a1f9980cb9dc552029e74c583726783b8b848df72c020205c94b80c76a03ae0cefeef567
6
+ metadata.gz: 75d5ca009f079b41864ec1e5d66b1d6a2e88dcbab943ee2aff7f7cb869a41e667ef32483c0de2c865fe885f5c9d726c6c32122d79a3f7077fa7eec418de111de
7
+ data.tar.gz: d346e24bc5ae25eb45e9406894701d96095d75eec0b40838cd85e647943b6c21a019913a21bb4ba51f9426d9bfa56fbee0cd0b80e90bf0b2bf73b75d62f24996
@@ -1 +1 @@
1
- ruby-2.5.3
1
+ ruby-2.6.6
@@ -1,3 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - "2.2.5"
3
+ - "2.6.6"
4
+ # TravisCI uses Bundler 1 by default, but we want Bundler 2
5
+ # https://docs.travis-ci.com/user/languages/ruby/#bundler-20
6
+ before_install:
7
+ - gem install bundler
data/Gemfile CHANGED
@@ -15,7 +15,7 @@ gem 'git', '~> 1.3'
15
15
  group :development do
16
16
  gem 'rspec', '~> 3.7'
17
17
  gem 'rdoc', '~> 3.12'
18
- gem 'bundler', '~> 1.0'
18
+ gem 'bundler', '~> 2.0'
19
19
  gem 'juwelier', '~> 2.4', '>= 2.4.7'
20
20
  gem 'simplecov', '>= 0'
21
21
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.3
1
+ 0.3.0
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: hashicorptools 0.2.3 ruby lib
5
+ # stub: hashicorptools 0.3.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "hashicorptools".freeze
9
- s.version = "0.2.3"
9
+ s.version = "0.3.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Nathan Woodhull".freeze]
14
- s.date = "2018-12-03"
14
+ s.date = "2020-06-18"
15
15
  s.description = "Wrappers for terraform and packer".freeze
16
16
  s.email = "systems@controlshiftlabs.com".freeze
17
17
  s.executables = ["ec2_host".freeze]
@@ -37,7 +37,6 @@ Gem::Specification.new do |s|
37
37
  "lib/hashicorptools/ec2_utilities.rb",
38
38
  "lib/hashicorptools/host.rb",
39
39
  "lib/hashicorptools/packer.rb",
40
- "lib/hashicorptools/terraform.rb",
41
40
  "lib/hashicorptools/update_launch_configuration.rb",
42
41
  "lib/hashicorptools/variables.rb",
43
42
  "spec/hashicorptools_spec.rb",
@@ -45,7 +44,7 @@ Gem::Specification.new do |s|
45
44
  ]
46
45
  s.homepage = "http://github.com/woodhull/hashicorptools".freeze
47
46
  s.licenses = ["MIT".freeze]
48
- s.rubygems_version = "2.7.6".freeze
47
+ s.rubygems_version = "3.0.3".freeze
49
48
  s.summary = "Wrappers for terraform and packer".freeze
50
49
 
51
50
  if s.respond_to? :specification_version then
@@ -55,44 +54,44 @@ Gem::Specification.new do |s|
55
54
  s.add_runtime_dependency(%q<aws-sdk>.freeze, ["~> 2"])
56
55
  s.add_runtime_dependency(%q<dynect_rest>.freeze, ["= 0.4.6"])
57
56
  s.add_runtime_dependency(%q<aws-sdk-v1>.freeze, ["~> 1.67"])
58
- s.add_runtime_dependency(%q<dotenv>.freeze, [">= 2.2.1", "~> 2.2"])
57
+ s.add_runtime_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
59
58
  s.add_runtime_dependency(%q<thor>.freeze, ["= 0.20.0"])
60
- s.add_runtime_dependency(%q<activesupport>.freeze, [">= 5.1.4", "~> 5.1"])
61
- s.add_runtime_dependency(%q<byebug>.freeze, [">= 10.0.2", "~> 10.0"])
59
+ s.add_runtime_dependency(%q<activesupport>.freeze, ["~> 5.1", ">= 5.1.4"])
60
+ s.add_runtime_dependency(%q<byebug>.freeze, ["~> 10.0", ">= 10.0.2"])
62
61
  s.add_runtime_dependency(%q<git>.freeze, ["~> 1.3"])
63
62
  s.add_development_dependency(%q<rspec>.freeze, ["~> 3.7"])
64
63
  s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
65
- s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
66
- s.add_development_dependency(%q<juwelier>.freeze, [">= 2.4.7", "~> 2.4"])
64
+ s.add_development_dependency(%q<bundler>.freeze, ["~> 2.0"])
65
+ s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.7"])
67
66
  s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
68
67
  else
69
68
  s.add_dependency(%q<aws-sdk>.freeze, ["~> 2"])
70
69
  s.add_dependency(%q<dynect_rest>.freeze, ["= 0.4.6"])
71
70
  s.add_dependency(%q<aws-sdk-v1>.freeze, ["~> 1.67"])
72
- s.add_dependency(%q<dotenv>.freeze, [">= 2.2.1", "~> 2.2"])
71
+ s.add_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
73
72
  s.add_dependency(%q<thor>.freeze, ["= 0.20.0"])
74
- s.add_dependency(%q<activesupport>.freeze, [">= 5.1.4", "~> 5.1"])
75
- s.add_dependency(%q<byebug>.freeze, [">= 10.0.2", "~> 10.0"])
73
+ s.add_dependency(%q<activesupport>.freeze, ["~> 5.1", ">= 5.1.4"])
74
+ s.add_dependency(%q<byebug>.freeze, ["~> 10.0", ">= 10.0.2"])
76
75
  s.add_dependency(%q<git>.freeze, ["~> 1.3"])
77
76
  s.add_dependency(%q<rspec>.freeze, ["~> 3.7"])
78
77
  s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
79
- s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
80
- s.add_dependency(%q<juwelier>.freeze, [">= 2.4.7", "~> 2.4"])
78
+ s.add_dependency(%q<bundler>.freeze, ["~> 2.0"])
79
+ s.add_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.7"])
81
80
  s.add_dependency(%q<simplecov>.freeze, [">= 0"])
82
81
  end
83
82
  else
84
83
  s.add_dependency(%q<aws-sdk>.freeze, ["~> 2"])
85
84
  s.add_dependency(%q<dynect_rest>.freeze, ["= 0.4.6"])
86
85
  s.add_dependency(%q<aws-sdk-v1>.freeze, ["~> 1.67"])
87
- s.add_dependency(%q<dotenv>.freeze, [">= 2.2.1", "~> 2.2"])
86
+ s.add_dependency(%q<dotenv>.freeze, ["~> 2.2", ">= 2.2.1"])
88
87
  s.add_dependency(%q<thor>.freeze, ["= 0.20.0"])
89
- s.add_dependency(%q<activesupport>.freeze, [">= 5.1.4", "~> 5.1"])
90
- s.add_dependency(%q<byebug>.freeze, [">= 10.0.2", "~> 10.0"])
88
+ s.add_dependency(%q<activesupport>.freeze, ["~> 5.1", ">= 5.1.4"])
89
+ s.add_dependency(%q<byebug>.freeze, ["~> 10.0", ">= 10.0.2"])
91
90
  s.add_dependency(%q<git>.freeze, ["~> 1.3"])
92
91
  s.add_dependency(%q<rspec>.freeze, ["~> 3.7"])
93
92
  s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
94
- s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
95
- s.add_dependency(%q<juwelier>.freeze, [">= 2.4.7", "~> 2.4"])
93
+ s.add_dependency(%q<bundler>.freeze, ["~> 2.0"])
94
+ s.add_dependency(%q<juwelier>.freeze, ["~> 2.4", ">= 2.4.7"])
96
95
  s.add_dependency(%q<simplecov>.freeze, [">= 0"])
97
96
  end
98
97
  end
@@ -13,7 +13,6 @@ require_relative 'hashicorptools/variables'
13
13
  require_relative 'hashicorptools/ec2_utilities'
14
14
  require_relative 'hashicorptools/auto_scaling_group'
15
15
  require_relative 'hashicorptools/packer'
16
- require_relative 'hashicorptools/terraform'
17
16
  require_relative 'hashicorptools/host'
18
17
  require_relative 'hashicorptools/update_launch_configuration'
19
18
  require_relative 'hashicorptools/code_deploy'
@@ -15,6 +15,7 @@
15
15
  }
16
16
  ],
17
17
  "region": "us-east-1",
18
+ "ami_regions": ["us-east-1", "eu-central-1"],
18
19
  "run_tags": {
19
20
  "kind": "packer",
20
21
  "role": "AMI builder"
@@ -2,7 +2,7 @@ require "timeout"
2
2
 
3
3
  module Hashicorptools
4
4
  class AutoScalingGroup
5
- attr_accessor :name
5
+ attr_accessor :name, :region
6
6
 
7
7
  def initialize(attrs = {})
8
8
  attrs.each do |key,value|
@@ -115,15 +115,15 @@ module Hashicorptools
115
115
  end
116
116
 
117
117
  def autoscaling
118
- @autoscaling ||= Aws::AutoScaling::Client.new(region: 'us-east-1')
118
+ @autoscaling ||= Aws::AutoScaling::Client.new(region: region)
119
119
  end
120
120
 
121
121
  def ec2
122
- @ec2 ||= Aws::EC2::Client.new(region: 'us-east-1')
122
+ @ec2 ||= Aws::EC2::Client.new(region: region)
123
123
  end
124
124
 
125
125
  def elb
126
- @elb ||= Aws::ElasticLoadBalancing::Client.new(region: 'us-east-1')
126
+ @elb ||= Aws::ElasticLoadBalancing::Client.new(region: region)
127
127
  end
128
128
 
129
129
  def groups
@@ -11,11 +11,21 @@ module Hashicorptools
11
11
 
12
12
  desc 'deploy', 'deploy latest code to environment'
13
13
  option :environment, :required => true
14
- option :branch, default: 'master'
14
+ option :branch
15
+ option :aws_region, default: 'us-east-1'
15
16
  option :commit
16
17
  def deploy
17
18
  g = Git.open('..')
18
19
 
20
+ # TODO restore defaulting branch to the default branch (and remove below check)
21
+ # once all the repos have the same default branch name of `main`
22
+ # Currently, `agra` is using `master` while other apps are using `main`.
23
+ # and we are unable to detect what the default branch is
24
+ # via the git client here.
25
+ if options[:commit].nil? && options[:branch].nil?
26
+ raise 'You must supply either commit or branch to deploy'
27
+ end
28
+
19
29
  commit = if options[:commit].present?
20
30
  g.gcommit(options[:commit])
21
31
  else
@@ -34,7 +44,7 @@ module Hashicorptools
34
44
  def create_deployment(commit_id, commit_message = nil)
35
45
  Dotenv.load
36
46
 
37
- client = Aws::CodeDeploy::Client.new
47
+ client = Aws::CodeDeploy::Client.new(region: options[:aws_region])
38
48
  response = client.create_deployment({
39
49
  application_name: application_name,
40
50
  deployment_group_name: "#{application_name}-#{options[:environment]}",
@@ -48,7 +58,7 @@ module Hashicorptools
48
58
  description: (commit_message || "commit #{commit_id}").slice(0,99)
49
59
  })
50
60
  puts "created deployment #{response.deployment_id}"
51
- puts "https://console.aws.amazon.com/codedeploy/home?region=#{ENV['AWS_REGION']}#/deployments/#{response.deployment_id}"
61
+ puts "https://console.aws.amazon.com/codedeploy/home?region=#{options[:aws_region]}#/deployments/#{response.deployment_id}"
52
62
  end
53
63
 
54
64
  def application_name
@@ -69,8 +69,10 @@ module Hashicorptools
69
69
  max_count: 1,
70
70
  instance_type: "t2.micro")
71
71
 
72
- ec2.create_tags( resources: run_instances_resp.instances.collect{|i| i.instance_id },
73
- tags: [ {key: 'Name', value: "packer test boot #{tag_name}"}, {key: 'environment', value: 'packer-development'}, {key: 'temporary', value: 'kill me'}])
72
+ ec2.create_tags( resources: run_instances_resp.instances.collect(&:instance_id),
73
+ tags: [ {key: 'Name', value: "packer test boot #{tag_name}"},
74
+ {key: 'environment', value: 'packer-development'},
75
+ {key: 'temporary', value: 'kill me'}])
74
76
 
75
77
  require 'byebug'
76
78
  byebug
@@ -1,8 +1,9 @@
1
1
  module Hashicorptools
2
2
  class UpdateLaunchConfiguration < Thor
3
3
  desc 'deploy ASG_NAME', 'recycle instances in the ASG with no downtime'
4
+ option :aws_region, default: 'us-east-1'
4
5
  def deploy(asg_name)
5
- asg = AutoScalingGroup.new(name: asg_name)
6
+ asg = AutoScalingGroup.new(name: asg_name, region: options[:aws_region])
6
7
  if asg.group.nil?
7
8
  raise "could not find asg #{asg_name}"
8
9
  end
@@ -1,12 +1,8 @@
1
1
  module Hashicorptools
2
2
  module Variables
3
- def aws_credentials_settings(settings_overrides = {})
4
- {aws_access_key: ENV['AWS_ACCESS_KEY_ID'],
5
- aws_secret_key: ENV['AWS_SECRET_ACCESS_KEY']}.merge(settings_overrides)
6
- end
7
3
 
8
4
  def variables(settings_overrides = {})
9
- aws_credentials_settings(settings_overrides).collect{|key,value| format_variable(key, value)}.join(' ')
5
+ settings_overrides.collect{|key,value| format_variable(key, value)}.join(' ')
10
6
  end
11
7
 
12
8
  protected
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashicorptools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Woodhull
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-03 00:00:00.000000000 Z
11
+ date: 2020-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
@@ -56,22 +56,22 @@ dependencies:
56
56
  name: dotenv
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: 2.2.1
62
59
  - - "~>"
63
60
  - !ruby/object:Gem::Version
64
61
  version: '2.2'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 2.2.1
65
65
  type: :runtime
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
68
68
  requirements:
69
- - - ">="
70
- - !ruby/object:Gem::Version
71
- version: 2.2.1
72
69
  - - "~>"
73
70
  - !ruby/object:Gem::Version
74
71
  version: '2.2'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 2.2.1
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: thor
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -90,42 +90,42 @@ dependencies:
90
90
  name: activesupport
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - ">="
94
- - !ruby/object:Gem::Version
95
- version: 5.1.4
96
93
  - - "~>"
97
94
  - !ruby/object:Gem::Version
98
95
  version: '5.1'
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: 5.1.4
99
99
  type: :runtime
100
100
  prerelease: false
101
101
  version_requirements: !ruby/object:Gem::Requirement
102
102
  requirements:
103
- - - ">="
104
- - !ruby/object:Gem::Version
105
- version: 5.1.4
106
103
  - - "~>"
107
104
  - !ruby/object:Gem::Version
108
105
  version: '5.1'
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: 5.1.4
109
109
  - !ruby/object:Gem::Dependency
110
110
  name: byebug
111
111
  requirement: !ruby/object:Gem::Requirement
112
112
  requirements:
113
- - - ">="
114
- - !ruby/object:Gem::Version
115
- version: 10.0.2
116
113
  - - "~>"
117
114
  - !ruby/object:Gem::Version
118
115
  version: '10.0'
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: 10.0.2
119
119
  type: :runtime
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- version: 10.0.2
126
123
  - - "~>"
127
124
  - !ruby/object:Gem::Version
128
125
  version: '10.0'
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: 10.0.2
129
129
  - !ruby/object:Gem::Dependency
130
130
  name: git
131
131
  requirement: !ruby/object:Gem::Requirement
@@ -174,34 +174,34 @@ dependencies:
174
174
  requirements:
175
175
  - - "~>"
176
176
  - !ruby/object:Gem::Version
177
- version: '1.0'
177
+ version: '2.0'
178
178
  type: :development
179
179
  prerelease: false
180
180
  version_requirements: !ruby/object:Gem::Requirement
181
181
  requirements:
182
182
  - - "~>"
183
183
  - !ruby/object:Gem::Version
184
- version: '1.0'
184
+ version: '2.0'
185
185
  - !ruby/object:Gem::Dependency
186
186
  name: juwelier
187
187
  requirement: !ruby/object:Gem::Requirement
188
188
  requirements:
189
- - - ">="
190
- - !ruby/object:Gem::Version
191
- version: 2.4.7
192
189
  - - "~>"
193
190
  - !ruby/object:Gem::Version
194
191
  version: '2.4'
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: 2.4.7
195
195
  type: :development
196
196
  prerelease: false
197
197
  version_requirements: !ruby/object:Gem::Requirement
198
198
  requirements:
199
- - - ">="
200
- - !ruby/object:Gem::Version
201
- version: 2.4.7
202
199
  - - "~>"
203
200
  - !ruby/object:Gem::Version
204
201
  version: '2.4'
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: 2.4.7
205
205
  - !ruby/object:Gem::Dependency
206
206
  name: simplecov
207
207
  requirement: !ruby/object:Gem::Requirement
@@ -242,7 +242,6 @@ files:
242
242
  - lib/hashicorptools/ec2_utilities.rb
243
243
  - lib/hashicorptools/host.rb
244
244
  - lib/hashicorptools/packer.rb
245
- - lib/hashicorptools/terraform.rb
246
245
  - lib/hashicorptools/update_launch_configuration.rb
247
246
  - lib/hashicorptools/variables.rb
248
247
  - spec/hashicorptools_spec.rb
@@ -266,8 +265,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
266
265
  - !ruby/object:Gem::Version
267
266
  version: '0'
268
267
  requirements: []
269
- rubyforge_project:
270
- rubygems_version: 2.7.6
268
+ rubygems_version: 3.0.3
271
269
  signing_key:
272
270
  specification_version: 4
273
271
  summary: Wrappers for terraform and packer
@@ -1,299 +0,0 @@
1
- module Hashicorptools
2
- class Terraform < Thor
3
- TERRAFORM_VERSION = '0.11.0'
4
-
5
- include Ec2Utilities
6
- include Variables
7
-
8
- desc 'bootstrap', 'terraform a new infrastructure from scratch'
9
- option :environment, :required => true
10
- def bootstrap
11
- apply
12
- end
13
-
14
- desc 'init', 'install providers into local terraform'
15
- option :environment, :required => true
16
- def init
17
-
18
- end
19
-
20
- [:apply, :plan, :destroy, :pull, :refresh].each do |cmd|
21
- desc cmd, "terraform #{cmd}"
22
- option :environment, :required => true
23
- option :debug, :required => false
24
-
25
- define_method cmd do
26
- send("_#{cmd}")
27
- end
28
-
29
- no_commands do
30
- define_method "_#{cmd}" do |settings_overrides = {}|
31
- enforce_version!
32
- raise 'invalid environment' unless ['staging', 'production'].include?(options[:environment])
33
-
34
- execute(state_path, var_file_path) do
35
-
36
- settings_overrides
37
- .merge!({ app_environment: options[:environment] }
38
- .merge(env_variable_keys)
39
- .merge(settings)
40
- .merge(shared_plan_variables))
41
-
42
- send("before_#{cmd}")
43
-
44
- terraform_command = "terraform #{cmd} #{variables(settings_overrides)} -state #{state_path} #{var_file_param} #{config_directory}"
45
-
46
- if (options[:debug])
47
- puts "[DEBUG] running command: '#{terraform_command}"
48
- end
49
-
50
- result = system terraform_command
51
-
52
- if result
53
- send("after_#{cmd}")
54
- end
55
- end
56
- end
57
-
58
- define_method "before_#{cmd}" do
59
- # no-op
60
- end
61
- end
62
-
63
- no_commands do
64
- define_method "before_shared_#{cmd}" do
65
- # no-op
66
- end
67
-
68
- define_method "after_#{cmd}" do
69
- # no-op
70
- end
71
-
72
- define_method "after_shared_#{cmd}" do
73
- # no-op
74
- end
75
- end
76
-
77
- desc cmd, "terraform #{cmd} for shared plan"
78
- option :debug, :required => false
79
- define_method "shared_#{cmd}" do
80
- enforce_version!
81
-
82
- execute(shared_state_path) do
83
- send("before_shared_#{cmd}")
84
-
85
- terraform_command = "terraform #{cmd} #{variables(env_variable_keys.merge(settings))} -state #{shared_state_path} #{shared_config_directory}"
86
- if (options[:debug])
87
- puts "[DEBUG] running command: '#{terraform_command}"
88
- end
89
- result = system terraform_command
90
-
91
- if result
92
- send("after_shared_#{cmd}")
93
- end
94
- end
95
- end
96
- end
97
-
98
- desc 'output', 'terraform output'
99
- option :environment, :required => true
100
- option :name, :required => true
101
- def output
102
- execute(state_path) do
103
- system output_cmd(state_path, options[:name])
104
- end
105
- end
106
-
107
- desc 'shared_output', 'terraform output for shared plan'
108
- option :name, :required => true
109
- def shared_output
110
- execute(shared_state_path) do
111
- system output_cmd(shared_state_path, options[:name])
112
- end
113
- end
114
-
115
- desc 'taint', 'terraform taint'
116
- option :environment, :required => true
117
- option :name, :required => true
118
- option :module, :required => false
119
- def taint
120
- execute(state_path) do
121
- if options[:module].present?
122
- system "terraform taint -module #{options[:module]} -state #{state_path} #{options[:name]}"
123
- else
124
- system "terraform taint -state #{state_path} #{options[:name]}"
125
- end
126
- end
127
- end
128
-
129
- desc 'shared_taint', 'terraform taint for shared plan'
130
- option :name, :required => true
131
- option :module, :required => false
132
- def shared_taint
133
- execute(shared_state_path) do
134
- if options[:module].present?
135
- system "terraform taint -module #{options[:module]} -state #{shared_state_path} #{options[:name]}"
136
- else
137
- system "terraform taint -state #{shared_state_path} #{options[:name]}"
138
- end
139
- end
140
- end
141
-
142
- desc 'show', 'terraform show'
143
- option :environment, :required => true
144
- def show
145
- execute(state_path) do
146
- system "terraform show #{state_path}"
147
- end
148
- end
149
-
150
- desc 'shared_show', 'terraform show for shared plan'
151
- def shared_show
152
- execute(shared_state_path) do
153
- system "terraform show #{shared_state_path}"
154
- end
155
- end
156
-
157
- desc "console", "interactive session"
158
- def console
159
- require 'pry-byebug'
160
- binding.pry
161
- end
162
-
163
- protected
164
-
165
- def var_file_param
166
- File.exist?(var_file_path) ?
167
- "-var-file #{var_file_path}" :
168
- ""
169
- end
170
-
171
- def execute(state_file_path, var_file_path=nil)
172
- begin
173
- yield
174
- rescue StandardError => e
175
- puts e.message
176
- puts e.backtrace
177
- end
178
- end
179
-
180
- def state_path
181
- "#{config_environment_path}/#{options[:environment]}.tfstate"
182
- end
183
-
184
- def shared_state_path
185
- "#{shared_config_directory}/shared.tfstate"
186
- end
187
-
188
- def var_file_path
189
- "#{config_environment_path}/variables.tfvars"
190
- end
191
-
192
- def config_directory
193
- "config/infrastructure/#{infrastructure}"
194
- end
195
-
196
- def shared_config_directory
197
- "config/infrastructure/#{infrastructure}/shared"
198
- end
199
-
200
- def config_environment_path
201
- "#{config_directory}/environments/#{options[:environment]}"
202
- end
203
-
204
- def infrastructure
205
- raise 'implement me'
206
- end
207
-
208
- def output_cmd(state_file_path, name=nil)
209
- "terraform output -state=#{state_file_path} #{name}"
210
- end
211
-
212
- def output_variable(state_file_path, name)
213
- `#{output_cmd(state_file_path, name)}`.chomp
214
- end
215
-
216
- def output_variables(state_file_path)
217
- raw_plan_output = `#{output_cmd(state_file_path)}`
218
- parse_key_value_variables(raw_plan_output)
219
- end
220
-
221
- def var_file_variables
222
- raise "Vars file #{var_file_path} does not exist" unless File.exist?(var_file_path)
223
-
224
- raw_var_file_variables = File.read(var_file_path)
225
- parse_key_value_variables(raw_var_file_variables)
226
- end
227
-
228
- def terraform_version
229
- version_string = `terraform version`.chomp
230
- version = /(\d+.\d+.\d+)/.match(version_string)
231
- version[0]
232
- end
233
-
234
- def enforce_version!
235
- if Gem::Version.new(terraform_version) < Gem::Version.new(TERRAFORM_VERSION)
236
- raise "Terraform #{terraform_version} is out of date, please upgrade"
237
- end
238
- end
239
-
240
- def settings
241
- {} # override me to pass more variables into the terraform plan.
242
- end
243
-
244
- def asg_launch_config_name(asg_name)
245
- asg_client = Aws::AutoScaling::Client.new(region: 'us-east-1')
246
- group = asg_client.describe_auto_scaling_groups(auto_scaling_group_names: [asg_name]).auto_scaling_groups.first
247
- group.try(:launch_configuration_name)
248
- end
249
-
250
- def env_variable_keys
251
- {} # override me to pass environmental variables into the terraform plan
252
- end
253
-
254
- def shared_plan_variables
255
- if File.exist?(shared_state_path)
256
- output_variables(shared_state_path)
257
- else
258
- {}
259
- end
260
- end
261
-
262
- def fetch_terraform_modules
263
- system "terraform get -update=true #{config_directory}"
264
- end
265
-
266
- def current_tfstate
267
- return @current_tfstate if defined?(@current_tfstate)
268
- raw_conf = File.read(state_path)
269
- @current_tfstate = JSON.parse(raw_conf)
270
- end
271
-
272
- def read_config_file(path)
273
- File.new('config/' + path).read
274
- template = ERB.new File.new("config/#{path}").read, nil, "%"
275
- template.result(OpenStruct.new(options).instance_eval { binding })
276
- end
277
-
278
- def dynect
279
- @dynect ||= DynectRest.new("controlshiftlabs", ENV['DYNECT_USERNAME'], ENV['DYNECT_PASSWORD'], "controlshiftlabs.com")
280
- end
281
-
282
- def dns_record_exists?(parent_node_fqdn, record)
283
- dynect.node_list(nil, parent_node_fqdn).include?(record.fqdn)
284
- end
285
-
286
- private
287
-
288
- def parse_key_value_variables(vars_string)
289
- vars = {}
290
- vars_string.split("\n").each do |string_var|
291
- next if string_var.blank?
292
- key, value = string_var.split("=")
293
- vars[key.strip] = value.strip.gsub('"', '')
294
- end
295
-
296
- vars
297
- end
298
- end
299
- end