domed-city 0.1.0 → 1.0.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
  SHA1:
3
- metadata.gz: 7216036ceb6858cda42ec4ca107ef3ac98cab6be
4
- data.tar.gz: c7ba0c37d0871bad6e1822133488a6186fe45abd
3
+ metadata.gz: 9b7beb507c76c82d0ff5159d7f40f25724c1a7e0
4
+ data.tar.gz: 03fd70a24686a3db7c51357fa9b4cf69d3349d77
5
5
  SHA512:
6
- metadata.gz: 9c5b0bd930972a77768a9605a3d5f4875bd6c98689d876f8e58fad3b424663e9af76b87aef7fbd32f79e79f1cd6bd2e937b22c4ad35ee73d61d525cbb12944df
7
- data.tar.gz: a9cc15593eca39c0b7fa8b3acefca0361d1539ad07c68934d9d04df30df9e170bb3cb389a4de39308c300912c112507310a50aa211c0882c9ccf4b357da5f5ff
6
+ metadata.gz: 25aede6e6d7021984c375c43de5703535565c26b05c869264bb98ce033ca1c7a51b0361b738853f1916189ecfce955ab1a08638ecadcc705edee8a171cd294dc
7
+ data.tar.gz: 8220849b29ffa820316ad69bc3b46df3fd578e6c6cf20f6660282d5ff549f8664f8d4a151709e122cf64a3e3a70b06a25f2398bc18ba42c8bb1d9d75653ba71d
data/bin/dome CHANGED
@@ -1,28 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require 'trollop'
5
- require "dome"
3
+ require 'bundler/setup'
4
+ require 'dome'
6
5
 
7
- # desc "creates the S3 bucket relevant for the environment; if the S3 state exists it pulls the remote S3 state locally"
8
- # task :bootstrap_s3_state do
9
- #
10
- # desc "creates the TF plan in a local file"
11
- # task :plan do
12
- #
13
- # desc "creates the TF plan, to destroy resources, in a local file"
14
- # task :plandestroy do
15
- #
16
- # desc "applies a TF plan"
17
- # task :apply do
18
- #
19
- # desc "applies a destructive TF immediately"
20
- # task :destroy do
21
- #
22
- # desc "updates the TF binary dependencies"
23
- # task :update do
24
-
25
- opts = Trollop::options do
6
+ opts = Trollop.options do
26
7
  version Dome::VERSION
27
8
  banner <<-EOS
28
9
  Dome wraps the Terraform API and performs useful stuff.
@@ -32,18 +13,28 @@ Usage:
32
13
  where [commands] are:
33
14
  EOS
34
15
 
35
- opt :plan, "Creates the Terraform plan in a local file"
36
- opt :apply, "Applies the Terraform plan"
37
- opt :destroy, "Applies a destructive Terraform plan"
38
- opt :plan_destroy, "TODO"
39
- opt :update, "TODO (maybe?)"
16
+ opt :plan, 'Creates a Terraform plan'
17
+ opt :apply, 'Applies a Terraform plan'
18
+ opt :plan_destroy, 'Creates a destructive Terraform plan'
19
+ opt :state, 'Synchronises the Terraform state'
40
20
  end
41
21
 
42
22
  if opts[:plan]
43
- Dome::Environment.validate_environment
44
- puts 'plan called'
23
+ @dome = Dome::Environment.new
24
+ @dome.validate_environment
25
+ @dome.plan
45
26
  elsif opts[:apply]
46
- puts 'apply called'
27
+ @dome = Dome::Environment.new
28
+ @dome.validate_environment
29
+ @dome.apply
30
+ elsif opts[:plan_destroy]
31
+ @dome = Dome::Environment.new
32
+ @dome.validate_environment
33
+ @dome.plan_destroy
34
+ elsif opts[:state]
35
+ @dome = Dome::Environment.new
36
+ @dome.validate_environment
37
+ @dome.bootstrap_s3_state
47
38
  else
48
- Trollop::educate
39
+ Trollop.educate
49
40
  end
@@ -4,25 +4,27 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'dome/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "domed-city"
7
+ spec.name = 'domed-city'
8
8
  spec.version = Dome::VERSION
9
- spec.authors = ["Ben Snape"]
10
- spec.email = ["ben.snape@itv.com"]
9
+ spec.authors = ['Ben Snape']
10
+ spec.email = ['ben.snape@itv.com']
11
11
 
12
- spec.summary = %q{A simple Terraform API wrapper and helpers for ITV.}
13
- spec.homepage = "https://github.com/ITV/dome"
12
+ spec.summary = 'A simple Terraform API wrapper and helpers for ITV.'
13
+ spec.homepage = 'https://github.com/ITV/dome'
14
14
 
15
15
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
- spec.bindir = "exe"
17
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
- spec.require_paths = ["lib"]
16
+ spec.bindir = 'bin'
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.require_paths = ['lib']
19
19
 
20
- spec.add_development_dependency "bundler", "~> 1.9"
21
- spec.add_development_dependency "rake", "~> 10.0"
22
- spec.add_development_dependency "rspec", "~> 3.0"
20
+ spec.add_development_dependency 'bundler', '~> 1.9'
21
+ spec.add_development_dependency 'rake', '~> 10.0'
22
+ spec.add_development_dependency 'rspec', '~> 3.0'
23
+ spec.add_development_dependency 'rubocop', '~> 0.34.2'
23
24
 
24
- spec.add_dependency 'trollop'
25
- spec.add_dependency 'aws-profile_parser'
26
- spec.add_dependency 'aws-sdk'
27
- spec.add_dependency 'colorize'
25
+ spec.add_dependency 'trollop', '~> 2.1'
26
+ spec.add_dependency 'aws-profile_parser', '~> 0.0.4'
27
+ spec.add_dependency 'aws-sdk', '~> 2.1.33'
28
+ spec.add_dependency 'colorize', '~> 0.7.7'
29
+ spec.add_dependency 'jmespath', '~> 1.1.3'
28
30
  end
@@ -1,8 +1,8 @@
1
- require 'dome/version'
2
- require 'dome/environment'
3
- require 'dome/terraform'
4
-
1
+ require 'trollop'
5
2
  require 'aws-sdk'
6
3
  require 'colorize'
7
4
  require 'aws/profile_parser'
8
5
  require 'fileutils'
6
+
7
+ require 'dome/version'
8
+ require 'dome/environment'
@@ -1,132 +1,225 @@
1
1
  module Dome
2
2
  class Environment
3
+ def initialize
4
+ @environment = Dir.pwd.split('/')[-1]
5
+ @account = Dir.pwd.split('/')[-2]
6
+ @team = 'deirdre'
7
+ @tfstate_bucket = "#{@team}-tfstate-#{@environment}"
8
+ @tfstate_s3_obj = "#{@environment}-terraform.tfstate"
9
+ @varfile = 'params/env.tfvars'
10
+ @plan = "plans/#{@account}-#{@environment}-plan.tf"
11
+ @state_file = "state-files/#{@environment}-terraform.tfstate"
12
+ end
3
13
 
4
- def self.validate_environment
5
- current_dir = File.absolute_path(ENV['PWD'])
6
- environment = current_dir.to_s.split('/')[-1]
7
- account = current_dir.to_s.split('/')[-2]
8
-
9
- valid_accounts = ['deirdre-dev', 'deirdre-prd']
10
- valid_env_nonprod = ['infradev', 'sit', 'qa', 'stg']
11
- valid_env_prod = ['infraprd', 'prd']
12
-
13
- if account
14
- if is_valid_account?(account)
15
- puts "found valid account #{account}, moving on ...".colorize(:green)
16
- else
17
- invalid_account_notification
18
- end
19
- else
20
- fail "\n#{account} is no a valid account\n\n".colorize(:red)
21
- end
22
-
23
- if environment
24
- if is_valid_env?(environment)
25
- puts "found valid environment #{environment}, moving on ...".colorize(:green)
26
- else
27
- invalid_environment_notification
28
- end
29
- else
30
- fail "\n #{environment} is not a valid environment for the account: #{account}\n\n".colorize(:red)
31
- end
14
+ # --------------------------------------------------------------
15
+ # Environment stuff
16
+ # --------------------------------------------------------------
32
17
 
33
- current_env_dir = "#{account}/#{environment}"
34
- @varfile = "-var-file=params/env.tfvars"
18
+ def valid_accounts
19
+ %w(deirdre-dev deirdre-prd)
35
20
  end
36
21
 
37
- def self.cd_to_tf_dir
38
- Dir.chdir(current_env_dir) if Dir.pwd != current_env_dir
22
+ def valid_env_nonprod
23
+ %w(infradev sit qa stg)
39
24
  end
40
25
 
41
- def self.purge_terraform
42
- FileUtils.rm_rf ".terraform/"
26
+ def valid_env_prod
27
+ %w(infraprd prd)
43
28
  end
44
29
 
45
- def self.set_env
46
- fail "Unable to set an account!" if account.nil?
47
- set_creds
30
+ def validate_environment
31
+ puts "Environment: #{@environment}"
32
+ puts "Account: #{@account}"
33
+
34
+ invalid_account_message(account) unless valid_account? @account
35
+ invalid_environment_message(account, environment) unless valid_environment?(@account, @environment)
36
+
37
+ set_aws_credentials(@account)
48
38
  end
49
39
 
50
- def self.set_creds
51
- accounts = AWS::ProfileParser.new
40
+ def set_aws_credentials(account)
52
41
  begin
53
- @aws_creds = accounts.get(account)
54
- rescue StandardError
55
- raise "No credentials found for #{account}"
42
+ @aws_creds = AWS::ProfileParser.new.get(account)
43
+ rescue RuntimeError
44
+ raise "No credentials found for account: '#{account}'."
56
45
  end
57
46
  ENV['AWS_ACCESS_KEY_ID'] = @aws_creds[:access_key_id]
58
47
  ENV['AWS_SECRET_ACCESS_KEY'] = @aws_creds[:secret_access_key]
59
48
  ENV['AWS_DEFAULT_REGION'] = @aws_creds[:region]
60
49
  end
61
50
 
62
- def self.is_valid_account?(account)
63
- valid_accounts.include?(account)
51
+ def valid_account?(account)
52
+ valid_accounts.include? account
64
53
  end
65
54
 
66
- def self.is_valid_env?(environment)
55
+ def valid_environment?(account, environment)
67
56
  if valid_accounts[valid_accounts.index(account)] == 'deirdre-dev'
68
- valid_env_nonprod.include?(environment)
57
+ valid_env_nonprod.include? environment
69
58
  elsif valid_accounts[valid_accounts.index(account)] == 'deirdre-prd'
70
- valid_env_prod.include?(environment)
59
+ valid_env_prod.include? environment
71
60
  end
72
61
  end
73
62
 
74
- def self.invalid_account_notification
75
- puts "\n#{account} is not a valid account\n\n".colorize(:red)
76
- puts "valid accounts are: "
77
- p valid_accounts
78
- puts "please set your .aws/config to one of the valid accounts described above!"
79
- puts "if you've correctly set your .aws/config then make sure you've cd into the correct directory matching the env name from .aws/config"
63
+ def invalid_account_message(account)
64
+ puts "\n'#{account}' is not a valid account.\n".colorize(:red)
65
+ puts "Valid accounts are: #{valid_accounts}."
66
+ puts "\nEither:"
67
+ puts '1. Set your .aws/config to one of the valid accounts above.'
68
+ puts '2. Ensure you are running this from the correct directory.'
80
69
  exit 1
81
70
  end
82
71
 
83
- def self.invalid_environment_notification
84
- puts "\n#{environment} is not a valid environment\n\n".colorize(:red)
85
- puts "valid environments are:"
86
- if account == 'deirdre-dev'
87
- p valid_env_nonprod
88
- elsif account == 'deirdre-prd'
89
- p valid_env_prod
90
- end
72
+ def invalid_environment_message(account, environment)
73
+ puts "\n'#{environment}' is not a valid environment for the account: '#{account}'.\n".colorize(:red)
74
+ (account == 'deirdre-dev') ? env = valid_env_nonprod : env = valid_env_prod
75
+ puts "Valid environments are: #{env}"
91
76
  exit 1
92
77
  end
93
78
 
94
- def self.s3_bucket_exists?(tfstate_bucket)
95
- s3_client = Aws::S3::Client.new(@aws_creds)
96
- resp = s3_client.list_buckets
79
+ # --------------------------------------------------------------
80
+ # Terraform commands
81
+ # --------------------------------------------------------------
82
+
83
+ def plan
84
+ puts "current dir: #{Dir.pwd}"
85
+ delete_terraform_directory
86
+ delete_plan_file
87
+ install_terraform_modules
88
+ fetch_s3_state
89
+ create_plan
90
+ end
91
+
92
+ def apply
93
+ command = "terraform apply #{@plan}"
94
+ failure_message = 'something went wrong when applying the TF plan'
95
+ execute_command(command, failure_message)
96
+ end
97
+
98
+ def create_plan
99
+ command = "terraform plan -module-depth=1 -refresh=true -out=#{@plan} -var-file=#{@varfile}"
100
+ failure_message = 'something went wrong when creating the TF plan'
101
+ execute_command(command, failure_message)
102
+ end
103
+
104
+ def delete_terraform_directory
105
+ puts 'Deleting older terraform module cache dir ...'.colorize(:green)
106
+ terraform_directory = '.terraform'
107
+ puts "About to delete directory: #{terraform_directory}"
108
+ FileUtils.rm_rf '.terraform/'
109
+ end
110
+
111
+ def delete_plan_file
112
+ puts 'Deleting older terraform plan ...'.colorize(:green)
113
+ puts "About to delete: #{@plan}"
114
+ FileUtils.rm_f @plan
115
+ end
116
+
117
+ def plan_destroy
118
+ delete_terraform_directory
119
+ delete_plan_file
120
+ install_terraform_modules
121
+ create_destroy_plan
122
+ end
123
+
124
+ def create_destroy_plan
125
+ command = "terraform plan -destroy -module-depth=1 -out=#{@plan} -var-file=#{@varfile}"
126
+ failure_message = 'something went wrong when creating the TF plan'
127
+ execute_command(command, failure_message)
128
+ end
129
+
130
+ def install_terraform_modules
131
+ command = 'terraform get -update=true'
132
+ failure_message = 'something went wrong when pulling remote TF modules'
133
+ execute_command(command, failure_message)
134
+ end
135
+
136
+ # S3 stuff
137
+
138
+ def s3_client
139
+ @s3_client ||= Aws::S3::Client.new(@aws_creds)
140
+ end
141
+
142
+ def s3_bucket_exists?(tfstate_bucket)
143
+ resp = s3_client.list_buckets
97
144
  resp.buckets.each { |bucket| return true if bucket.name == tfstate_bucket }
98
145
  false
99
146
  end
100
147
 
101
- def self.s3_tf_create_remote_state_bucket(tfstate_bucket, tfstate_s3_obj)
102
- puts "initial boostrap of the S3 bucket".colorize(:green)
103
- s3_client = Aws::S3::Client.new(@aws_creds)
148
+ def create_bucket(name)
104
149
  begin
105
- s3_client.create_bucket({
106
- bucket: tfstate_bucket,
107
- acl: "private"
108
- })
109
- rescue Aws::S3::Errors::BucketAlreadyExists => e
110
- puts "type of exception #{e.class}".colorize(:red)
111
- puts "backtrace for this exception:".colorize(:red)
112
- puts e.backtrace
113
- puts "\nmake sure the bucket name is unique per whole AWS S3 service, see here for docs on uniqueness https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html\n\n".colorize(:red)
114
- exit 1
150
+ s3_client.create_bucket(bucket: name, acl: 'private')
151
+ rescue Aws::S3::Errors::BucketAlreadyExists
152
+ raise 'The S3 bucket must be globally unique. See https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html'.colorize(:red)
115
153
  end
116
- puts "enabling versioning on the S3 bucket - http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html".colorize(:green)
117
- s3_client.put_bucket_versioning({
118
- bucket: tfstate_bucket,
119
- versioning_configuration: {
120
- mfa_delete: "Disabled",
121
- status: "Enabled"
122
- },
154
+ end
155
+
156
+ def enable_bucket_versioning(bucket_name)
157
+ puts 'Enabling versioning on the S3 bucket - http://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html'.colorize(:green)
158
+ s3_client.put_bucket_versioning(bucket: bucket_name,
159
+ versioning_configuration: {
160
+ mfa_delete: 'Disabled',
161
+ status: 'Enabled'
123
162
  })
124
- puts "creating an empty S3 object".colorize(:green)
125
- s3_client.put_object({
126
- bucket: tfstate_bucket,
127
- key: tfstate_s3_obj,
128
- body: ""
129
- })
163
+ end
164
+
165
+ def put_empty_object_in_bucket(bucket_name, key_name)
166
+ puts "Putting an empty object with key: #{key_name} into bucket: #{bucket_name}".colorize(:green)
167
+ s3_client.put_object(
168
+ bucket: bucket_name,
169
+ key: key_name,
170
+ body: ''
171
+ )
172
+ end
173
+
174
+ def create_remote_state_bucket(tfstate_bucket, tfstate_s3_obj)
175
+ create_bucket tfstate_bucket
176
+ enable_bucket_versioning tfstate_bucket
177
+ put_empty_object_in_bucket(tfstate_bucket, tfstate_s3_obj)
178
+ end
179
+
180
+ def bootstrap_s3_state
181
+ if s3_bucket_exists?(@tfstate_bucket)
182
+ synchronise_s3_state
183
+ else
184
+ create_remote_state_bucket(@tfstate_bucket, @tfstate_s3_obj)
185
+ end
186
+ end
187
+
188
+ def synchronise_s3_state
189
+ puts 'Synchronising the remote S3 state...'
190
+ # not clear for me if the -state in the below command matters
191
+ command = 'terraform remote config'\
192
+ ' -backend=S3'\
193
+ " -backend-config='bucket=#{@tfstate_bucket}' -backend-config='key=#{@tfstate_s3_obj}'"\
194
+ " -state=#{@state_file}"
195
+ failure_message = 'something went wrong when creating the S3 state'
196
+ execute_command(command, failure_message)
197
+ end
198
+
199
+ def synchronise_s3_state_setup
200
+ puts "Setting up the initial terraform S3 state in the S3 bucket: #{@tfstate_bucket.colorize(:green)} for account: #{@account.colorize(:green)} and environment: #{@environment.colorize(:green)} ..."
201
+ command = 'terraform remote config'\
202
+ ' -backend=S3'\
203
+ " -backend-config='bucket=#{@tfstate_bucket}' -backend-config='key=#{@tfstate_s3_obj}'"
204
+ failure_message = 'something went wrong when creating the S3 state'
205
+ execute_command(command, failure_message)
206
+ end
207
+
208
+ def fetch_s3_state
209
+ command = 'terraform remote config -backend=S3'\
210
+ " -backend-config='bucket=#{@tfstate_bucket}' -backend-config='key=#{@tfstate_s3_obj}'"
211
+ failure_message = 'something went wrong when fetching the S3 state'
212
+ execute_command(command, failure_message)
213
+ end
214
+
215
+ # --------------------------------------------------------------
216
+ # Misc.
217
+ # --------------------------------------------------------------
218
+
219
+ def execute_command(command, failure_message)
220
+ puts "About to execute command: #{command}"
221
+ success = system command
222
+ puts failure_message unless success
130
223
  end
131
224
  end
132
225
  end
@@ -1,3 +1,3 @@
1
1
  module Dome
2
- VERSION = "0.1.0"
2
+ VERSION = '1.0.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: domed-city
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Snape
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-30 00:00:00.000000000 Z
11
+ date: 2015-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,66 +52,95 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.34.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.34.2
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: trollop
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - ">="
73
+ - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '0'
75
+ version: '2.1'
62
76
  type: :runtime
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - ">="
80
+ - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '0'
82
+ version: '2.1'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: aws-profile_parser
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - ">="
87
+ - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '0'
89
+ version: 0.0.4
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - ">="
94
+ - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '0'
96
+ version: 0.0.4
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: aws-sdk
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ">="
101
+ - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '0'
103
+ version: 2.1.33
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - ">="
108
+ - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '0'
110
+ version: 2.1.33
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: colorize
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - ">="
115
+ - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: '0'
117
+ version: 0.7.7
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - ">="
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.7.7
125
+ - !ruby/object:Gem::Dependency
126
+ name: jmespath
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 1.1.3
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
109
137
  - !ruby/object:Gem::Version
110
- version: '0'
138
+ version: 1.1.3
111
139
  description:
112
140
  email:
113
141
  - ben.snape@itv.com
114
- executables: []
142
+ executables:
143
+ - dome
115
144
  extensions: []
116
145
  extra_rdoc_files: []
117
146
  files:
@@ -126,7 +155,6 @@ files:
126
155
  - dome.gemspec
127
156
  - lib/dome.rb
128
157
  - lib/dome/environment.rb
129
- - lib/dome/terraform.rb
130
158
  - lib/dome/version.rb
131
159
  homepage: https://github.com/ITV/dome
132
160
  licenses: []
@@ -1,96 +0,0 @@
1
- module Dome
2
- class Terraform
3
- def self.plan
4
- puts "--- running task :plan".colorize(:light_cyan)
5
- set_env
6
- Dir.chdir(CURRENT_ENV_DIR)
7
- puts "purging older terraform module cache dir ...".colorize(:green)
8
- purge_terraform
9
- puts "purging older terraform plan ...".colorize(:green)
10
- FileUtils.rm_f(PLAN)
11
- puts "updating terraform external modules ...".colorize(:green)
12
- Rake::Task['tf:update'].invoke
13
-
14
- cmd = "terraform remote config"\
15
- " -backend=S3"\
16
- " -backend-config='bucket=#{tfstate_bucket}' -backend-config='key=#{tfstate_s3_obj}'"
17
- puts "Command to execute: #{cmd}"
18
- bool = system(cmd)
19
- fail "something went wrong when fetching the S3 state" unless bool
20
- cmd = "terraform plan -module-depth=1 -refresh=true -out=#{PLAN} #{@varfile}"
21
- puts "\nCommand to execute: \n #{cmd}\n\n"
22
- bool = system(cmd)
23
- fail "something went wrong when creating the TF plan" unless bool
24
- end
25
-
26
- def self.apply
27
- puts "--- running task :apply".colorize(:light_cyan)
28
- set_env
29
- cd_to_tf_dir
30
- set_env
31
- cmd = "terraform apply #{PLAN}"
32
- puts "\n Command to execute: #{cmd}\n\n"
33
- bool = system(cmd)
34
- fail "something went wrong when applying the TF plan" unless bool
35
- end
36
-
37
- def self.plan_destroy
38
- puts "--- running task :plandestroy".colorize(:light_cyan)
39
- set_env
40
- Dir.chdir(CURRENT_ENV_DIR)
41
- puts "purging older terraform module cache dir ...".colorize(:green)
42
- purge_terraform
43
- puts "purging older terraform plan ...".colorize(:green)
44
- FileUtils.rm_f(PLAN)
45
- puts "updating terraform external modules ...".colorize(:green)
46
- Rake::Task['tf:update'].invoke
47
- p PLAN
48
- cmd = "terraform plan -destroy -module-depth=1 -out=#{PLAN} #{@varfile}"
49
- puts "\nCommand to execute: \n #{cmd}\n\n"
50
- bool = system(cmd)
51
- fail "something went wrong when creating the TF plan" unless bool
52
- end
53
-
54
- def self.destroy
55
- puts "--- running task :destroy".colorize(:light_cyan)
56
- puts "here is the destroy plan that terraform will carry out"
57
- plan_destroy
58
- apply
59
- end
60
-
61
- def self.update
62
- puts "--- running task :update".colorize(:light_cyan)
63
- cmd = "terraform get -update=true"
64
- puts "\nCommand to execute: \n #{cmd}\n\n"
65
- bool = system(cmd)
66
- fail "something went wrong when pulling remote TF modules" unless bool
67
- end
68
-
69
- def self.bootstrap_s3_state
70
- set_env
71
- if s3_bucket_exists?(tfstate_bucket)
72
- puts "Bootstrap attempted, but config for account: #{ACCOUNT.colorize(:green)} and environment: #{ENVIRONMENT.colorize(:green)} already exists in S3 bucket: #{tfstate_bucket.colorize(:green)}"
73
- puts "synchronising the remote S3 state ..."
74
- cd_to_tf_dir
75
- cmd = "terraform remote config"\
76
- " -backend=S3"\
77
- " -backend-config='bucket=#{tfstate_bucket}' -backend-config='key=#{tfstate_s3_obj}'"\
78
- " -state=#{STATE_FILE_DIR}/#{REMOTE_STATE_FILE}"
79
- # still not clear for me if the -state in the above cmd matters
80
- puts "Command to execute: #{cmd}"
81
- bool = system(cmd)
82
- fail "something went wrong when creating the S3 state" unless bool
83
- else
84
- s3_tf_create_remote_state_bucket(tfstate_bucket, tfstate_s3_obj)
85
- puts "\nsetting up the initial terraform S3 state in the S3 bucket: #{tfstate_bucket.colorize(:green)} for account:#{ACCOUNT.colorize(:green)} and environment:#{ENVIRONMENT.colorize(:green)} ..."
86
- cd_to_tf_dir
87
- cmd = "terraform remote config"\
88
- " -backend=S3"\
89
- " -backend-config='bucket=#{tfstate_bucket}' -backend-config='key=#{tfstate_s3_obj}'"
90
- puts "Command to execute: #{cmd}"
91
- bool = system(cmd)
92
- fail "something went wrong when creating the S3 state" unless bool
93
- end
94
- end
95
- end
96
- end