hashicorptools 0.2.3 → 0.3.0

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: 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