TerraformDevKit 0.2.7 → 0.3.1.pre.rc1
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 +4 -4
- data/TerraformDevKit.gemspec +1 -0
- data/lib/TerraformDevKit/aws/aws.rb +65 -0
- data/lib/TerraformDevKit/aws/cloudfront.rb +20 -0
- data/lib/TerraformDevKit/aws/dynamodb.rb +46 -0
- data/lib/TerraformDevKit/aws/s3.rb +44 -0
- data/lib/TerraformDevKit/aws/terraform_remote_state.rb +67 -0
- data/lib/TerraformDevKit/version.rb +1 -1
- data/lib/TerraformDevKit.rb +5 -4
- data/tasks/devkit.rake +4 -4
- metadata +23 -8
- data/lib/TerraformDevKit/aws.rb +0 -63
- data/lib/TerraformDevKit/dynamodb.rb +0 -45
- data/lib/TerraformDevKit/s3.rb +0 -43
- data/lib/TerraformDevKit/terraform_remote_state.rb +0 -66
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61324a6263f32fec652b3c6daea0cd8ee4122fdd
|
4
|
+
data.tar.gz: 110251680246f79e70f9852c6daf7ac544f0a459
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2479eee7bea5199c2a23f6ce00b34e635ccee5d1ae93c1701af70322158883088def53933d4ab5f41c61502499969d48e48359b150f592649d23c68365300b64
|
7
|
+
data.tar.gz: ce79833600dc8e75b7f67d4e2bf283669287c5db096ba9ce123f37d0444ad3c02e861796095b00d6cb058c9c7e6468e7cc7b4b7f9c9498c5499ab92df2f48f4d
|
data/TerraformDevKit.gemspec
CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
|
29
29
|
spec.add_runtime_dependency 'aws-sdk-core', '~> 3'
|
30
30
|
spec.add_runtime_dependency 'aws-sdk-dynamodb', '~> 1'
|
31
|
+
spec.add_runtime_dependency 'aws-sdk-cloudfront', '~> 1'
|
31
32
|
spec.add_runtime_dependency 'aws-sdk-s3', '~> 1'
|
32
33
|
spec.add_runtime_dependency 'mustache', '~> 1.0'
|
33
34
|
spec.add_runtime_dependency 'rainbow', '~> 3.0'
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'aws-sdk-core'
|
2
|
+
|
3
|
+
Aws.use_bundled_cert!
|
4
|
+
|
5
|
+
module TerraformDevKit
|
6
|
+
module Aws
|
7
|
+
class AwsConfig
|
8
|
+
def initialize(config)
|
9
|
+
unless config.nil?
|
10
|
+
@profile = config.fetch('profile', nil)
|
11
|
+
@region = config.fetch('region', nil)
|
12
|
+
@access_key_id = config.fetch('access_key_id', nil)
|
13
|
+
@secret_access_key = config.fetch('secret_access_key', nil)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def credentials
|
18
|
+
unless profile.nil?
|
19
|
+
credentials = ::Aws::SharedCredentials.new(profile_name: profile)
|
20
|
+
return credentials if credentials.set?
|
21
|
+
end
|
22
|
+
|
23
|
+
return ::Aws::Credentials.new(*access_keys) if access_keys_available?
|
24
|
+
|
25
|
+
raise 'Cannot find AWS credentials'
|
26
|
+
end
|
27
|
+
|
28
|
+
def region
|
29
|
+
@region || ENV['AWS_REGION']
|
30
|
+
end
|
31
|
+
|
32
|
+
def profile
|
33
|
+
@profile || ENV['AWS_PROFILE']
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def access_keys
|
39
|
+
return config_access_keys if config_has_access_keys?
|
40
|
+
return environment_access_keys if environment_has_access_keys?
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
|
44
|
+
def access_keys_available?
|
45
|
+
config_has_access_keys? || environment_has_access_keys?
|
46
|
+
end
|
47
|
+
|
48
|
+
def config_has_access_keys?
|
49
|
+
!@access_key_id.nil? && !@secret_access_key.nil?
|
50
|
+
end
|
51
|
+
|
52
|
+
def config_access_keys
|
53
|
+
return @access_key_id, @secret_access_key
|
54
|
+
end
|
55
|
+
|
56
|
+
def environment_has_access_keys?
|
57
|
+
ENV.key?('AWS_ACCESS_KEY_ID') && ENV.key?('AWS_SECRET_ACCESS_KEY')
|
58
|
+
end
|
59
|
+
|
60
|
+
def environment_access_keys
|
61
|
+
return ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY']
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'aws-sdk-cloudfront'
|
2
|
+
|
3
|
+
module TerraformDevKit
|
4
|
+
module Aws
|
5
|
+
class CloudFront
|
6
|
+
def initialize(credentials, region)
|
7
|
+
@cloudfront = ::Aws::CloudFront::Client.new(
|
8
|
+
region: region,
|
9
|
+
credentials:credentials
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
def distribution_is_deployed?(distribution_id)
|
14
|
+
@cloudfront.get_distribution({
|
15
|
+
id: distribution_id,
|
16
|
+
}).distribution.status == 'Deployed'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'aws-sdk-dynamodb'
|
2
|
+
|
3
|
+
Aws.use_bundled_cert!
|
4
|
+
|
5
|
+
module TerraformDevKit
|
6
|
+
module Aws
|
7
|
+
# Wrapper class around aws dynamodb
|
8
|
+
class DynamoDB
|
9
|
+
def initialize(credentials, region)
|
10
|
+
@db_client = ::Aws::DynamoDB::Client.new(
|
11
|
+
credentials: credentials,
|
12
|
+
region: region
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def put_item(table_name, item)
|
17
|
+
@db_client.put_item({item: item, table_name: table_name})
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_table(table_name, attributes, keys, read_capacity, write_capacity)
|
21
|
+
@db_client.create_table(
|
22
|
+
attribute_definitions: attributes,
|
23
|
+
key_schema: keys,
|
24
|
+
provisioned_throughput: {
|
25
|
+
read_capacity_units: read_capacity,
|
26
|
+
write_capacity_units: write_capacity
|
27
|
+
},
|
28
|
+
table_name: table_name
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_table_status(table_name)
|
33
|
+
resp = @db_client.describe_table({
|
34
|
+
table_name: table_name,
|
35
|
+
})
|
36
|
+
resp.table.table_status
|
37
|
+
end
|
38
|
+
|
39
|
+
def delete_table(table_name)
|
40
|
+
@db_client.delete_table({
|
41
|
+
table_name: table_name,
|
42
|
+
})
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'aws-sdk-s3'
|
2
|
+
|
3
|
+
Aws.use_bundled_cert!
|
4
|
+
|
5
|
+
module TerraformDevKit
|
6
|
+
module Aws
|
7
|
+
class S3
|
8
|
+
def initialize(credentials, region)
|
9
|
+
@s3_client = ::Aws::S3::Client.new(
|
10
|
+
credentials: credentials,
|
11
|
+
region: region
|
12
|
+
)
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_bucket(bucket_name)
|
16
|
+
@s3_client.create_bucket(
|
17
|
+
bucket: bucket_name
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_bucket(bucket_name)
|
22
|
+
empty_bucket(bucket_name)
|
23
|
+
|
24
|
+
@s3_client.delete_bucket(
|
25
|
+
bucket: bucket_name
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def empty_bucket(bucket_name)
|
30
|
+
keys_to_delete = @s3_client
|
31
|
+
.list_objects_v2(bucket: bucket_name)
|
32
|
+
.contents
|
33
|
+
.map { |x| { key: x.key } }
|
34
|
+
|
35
|
+
@s3_client.delete_objects(
|
36
|
+
bucket: bucket_name,
|
37
|
+
delete: {
|
38
|
+
objects: keys_to_delete
|
39
|
+
}
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'aws-sdk-dynamodb'
|
2
|
+
require 'aws-sdk-s3'
|
3
|
+
|
4
|
+
module TerraformDevKit
|
5
|
+
module Aws
|
6
|
+
class TerraformRemoteState
|
7
|
+
ATTRIBUTES = [
|
8
|
+
{
|
9
|
+
attribute_name: 'LockID',
|
10
|
+
attribute_type: 'S'
|
11
|
+
}
|
12
|
+
]
|
13
|
+
KEYS = [
|
14
|
+
{
|
15
|
+
attribute_name: 'LockID',
|
16
|
+
key_type: 'HASH'
|
17
|
+
}
|
18
|
+
]
|
19
|
+
|
20
|
+
def initialize(dynamodb, s3)
|
21
|
+
@dynamodb = dynamodb
|
22
|
+
@s3 = s3
|
23
|
+
end
|
24
|
+
|
25
|
+
def init(environment, project)
|
26
|
+
table_name = table_name(environment, project)
|
27
|
+
return if lock_table_exists_and_is_active(table_name)
|
28
|
+
|
29
|
+
@dynamodb.create_table(table_name, ATTRIBUTES, KEYS, 1, 1)
|
30
|
+
|
31
|
+
begin
|
32
|
+
@s3.create_bucket(state_bucket_name(environment, project))
|
33
|
+
rescue Aws::S3::Errors::BucketAlreadyOwnedByYou
|
34
|
+
return
|
35
|
+
end
|
36
|
+
|
37
|
+
sleep(0.2) until lock_table_exists_and_is_active(table_name)
|
38
|
+
end
|
39
|
+
|
40
|
+
def destroy(environment, project)
|
41
|
+
table_name = table_name(environment, project)
|
42
|
+
|
43
|
+
@dynamodb.delete_table(table_name)
|
44
|
+
@s3.delete_bucket(state_bucket_name(environment, project))
|
45
|
+
end
|
46
|
+
|
47
|
+
private_class_method
|
48
|
+
def lock_table_exists_and_is_active(table_name)
|
49
|
+
begin
|
50
|
+
return @dynamodb.get_table_status(table_name) == 'ACTIVE'
|
51
|
+
rescue Aws::DynamoDB::Errors::ResourceNotFoundException
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private_class_method
|
57
|
+
def table_name(environment, project)
|
58
|
+
"#{project.acronym}-#{environment.name}-lock-table"
|
59
|
+
end
|
60
|
+
|
61
|
+
private_class_method
|
62
|
+
def state_bucket_name(environment, project)
|
63
|
+
"#{project.name}-#{environment.name}-state"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/TerraformDevKit.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
|
-
require 'TerraformDevKit/aws'
|
1
|
+
require 'TerraformDevKit/aws/aws'
|
2
|
+
require 'TerraformDevKit/aws/cloudfront'
|
3
|
+
require 'TerraformDevKit/aws/dynamodb'
|
4
|
+
require 'TerraformDevKit/aws/terraform_remote_state'
|
5
|
+
require 'TerraformDevKit/aws/s3'
|
2
6
|
require 'TerraformDevKit/backup_state'
|
3
7
|
require 'TerraformDevKit/command'
|
4
8
|
require 'TerraformDevKit/config'
|
5
|
-
require 'TerraformDevKit/dynamodb'
|
6
9
|
require 'TerraformDevKit/environment'
|
7
10
|
require 'TerraformDevKit/extended_file_utils'
|
8
11
|
require 'TerraformDevKit/os'
|
9
12
|
require 'TerraformDevKit/request'
|
10
13
|
require 'TerraformDevKit/retry'
|
11
|
-
require 'TerraformDevKit/s3'
|
12
14
|
require 'TerraformDevKit/terraform_config_manager'
|
13
15
|
require 'TerraformDevKit/terraform_env_manager'
|
14
16
|
require 'TerraformDevKit/terraform_installer'
|
15
|
-
require 'TerraformDevKit/terraform_remote_state'
|
16
17
|
require 'TerraformDevKit/terraform_log_filter'
|
17
18
|
require 'TerraformDevKit/terraform_project_config'
|
18
19
|
require 'TerraformDevKit/terraform_template_config_file'
|
data/tasks/devkit.rake
CHANGED
@@ -40,16 +40,16 @@ def task_in_current_namespace(task_name, current_task)
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def remote_state
|
43
|
-
aws_config = TDK::AwsConfig.new(TDK::Configuration.get('aws'))
|
44
|
-
dynamo_db = TDK::DynamoDB.new(
|
43
|
+
aws_config = TDK::Aws::AwsConfig.new(TDK::Configuration.get('aws'))
|
44
|
+
dynamo_db = TDK::Aws::DynamoDB.new(
|
45
45
|
aws_config.credentials,
|
46
46
|
aws_config.region
|
47
47
|
)
|
48
|
-
s3 = TDK::S3.new(
|
48
|
+
s3 = TDK::Aws::S3.new(
|
49
49
|
aws_config.credentials,
|
50
50
|
aws_config.region
|
51
51
|
)
|
52
|
-
TDK::TerraformRemoteState.new(dynamo_db, s3)
|
52
|
+
TDK::Aws::TerraformRemoteState.new(dynamo_db, s3)
|
53
53
|
end
|
54
54
|
|
55
55
|
desc 'Prepares the environment to create the infrastructure'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: TerraformDevKit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1.pre.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Jimenez
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '1'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: aws-sdk-cloudfront
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: aws-sdk-s3
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -171,24 +185,25 @@ files:
|
|
171
185
|
- bin/setup
|
172
186
|
- exe/wait_for_url
|
173
187
|
- lib/TerraformDevKit.rb
|
174
|
-
- lib/TerraformDevKit/aws.rb
|
188
|
+
- lib/TerraformDevKit/aws/aws.rb
|
189
|
+
- lib/TerraformDevKit/aws/cloudfront.rb
|
190
|
+
- lib/TerraformDevKit/aws/dynamodb.rb
|
191
|
+
- lib/TerraformDevKit/aws/s3.rb
|
192
|
+
- lib/TerraformDevKit/aws/terraform_remote_state.rb
|
175
193
|
- lib/TerraformDevKit/backup_state.rb
|
176
194
|
- lib/TerraformDevKit/command.rb
|
177
195
|
- lib/TerraformDevKit/config.rb
|
178
196
|
- lib/TerraformDevKit/download.rb
|
179
|
-
- lib/TerraformDevKit/dynamodb.rb
|
180
197
|
- lib/TerraformDevKit/environment.rb
|
181
198
|
- lib/TerraformDevKit/extended_file_utils.rb
|
182
199
|
- lib/TerraformDevKit/os.rb
|
183
200
|
- lib/TerraformDevKit/request.rb
|
184
201
|
- lib/TerraformDevKit/retry.rb
|
185
|
-
- lib/TerraformDevKit/s3.rb
|
186
202
|
- lib/TerraformDevKit/terraform_config_manager.rb
|
187
203
|
- lib/TerraformDevKit/terraform_env_manager.rb
|
188
204
|
- lib/TerraformDevKit/terraform_installer.rb
|
189
205
|
- lib/TerraformDevKit/terraform_log_filter.rb
|
190
206
|
- lib/TerraformDevKit/terraform_project_config.rb
|
191
|
-
- lib/TerraformDevKit/terraform_remote_state.rb
|
192
207
|
- lib/TerraformDevKit/terraform_template_config_file.rb
|
193
208
|
- lib/TerraformDevKit/url.rb
|
194
209
|
- lib/TerraformDevKit/version.rb
|
@@ -209,9 +224,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
209
224
|
version: '0'
|
210
225
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
211
226
|
requirements:
|
212
|
-
- - "
|
227
|
+
- - ">"
|
213
228
|
- !ruby/object:Gem::Version
|
214
|
-
version:
|
229
|
+
version: 1.3.1
|
215
230
|
requirements: []
|
216
231
|
rubyforge_project:
|
217
232
|
rubygems_version: 2.6.13
|
data/lib/TerraformDevKit/aws.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'aws-sdk-core'
|
2
|
-
|
3
|
-
Aws.use_bundled_cert!
|
4
|
-
|
5
|
-
module TerraformDevKit
|
6
|
-
class AwsConfig
|
7
|
-
def initialize(config)
|
8
|
-
unless config.nil?
|
9
|
-
@profile = config.fetch('profile', nil)
|
10
|
-
@region = config.fetch('region', nil)
|
11
|
-
@access_key_id = config.fetch('access_key_id', nil)
|
12
|
-
@secret_access_key = config.fetch('secret_access_key', nil)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def credentials
|
17
|
-
unless profile.nil?
|
18
|
-
credentials = Aws::SharedCredentials.new(profile_name: profile)
|
19
|
-
return credentials if credentials.set?
|
20
|
-
end
|
21
|
-
|
22
|
-
return Aws::Credentials.new(*access_keys) if access_keys_available?
|
23
|
-
|
24
|
-
raise 'Cannot find AWS credentials'
|
25
|
-
end
|
26
|
-
|
27
|
-
def region
|
28
|
-
@region || ENV['AWS_REGION']
|
29
|
-
end
|
30
|
-
|
31
|
-
def profile
|
32
|
-
@profile || ENV['AWS_PROFILE']
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def access_keys
|
38
|
-
return config_access_keys if config_has_access_keys?
|
39
|
-
return environment_access_keys if environment_has_access_keys?
|
40
|
-
nil
|
41
|
-
end
|
42
|
-
|
43
|
-
def access_keys_available?
|
44
|
-
config_has_access_keys? || environment_has_access_keys?
|
45
|
-
end
|
46
|
-
|
47
|
-
def config_has_access_keys?
|
48
|
-
!@access_key_id.nil? && !@secret_access_key.nil?
|
49
|
-
end
|
50
|
-
|
51
|
-
def config_access_keys
|
52
|
-
return @access_key_id, @secret_access_key
|
53
|
-
end
|
54
|
-
|
55
|
-
def environment_has_access_keys?
|
56
|
-
ENV.key?('AWS_ACCESS_KEY_ID') && ENV.key?('AWS_SECRET_ACCESS_KEY')
|
57
|
-
end
|
58
|
-
|
59
|
-
def environment_access_keys
|
60
|
-
return ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY']
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require 'aws-sdk-dynamodb'
|
2
|
-
|
3
|
-
Aws.use_bundled_cert!
|
4
|
-
|
5
|
-
module TerraformDevKit
|
6
|
-
# Wrapper class around aws dynamodb
|
7
|
-
class DynamoDB
|
8
|
-
def initialize(credentials, region)
|
9
|
-
@db_client = Aws::DynamoDB::Client.new(
|
10
|
-
credentials: credentials,
|
11
|
-
region: region
|
12
|
-
)
|
13
|
-
end
|
14
|
-
|
15
|
-
def put_item(table_name, item)
|
16
|
-
@db_client.put_item({item: item, table_name: table_name})
|
17
|
-
end
|
18
|
-
|
19
|
-
def create_table(table_name, attributes, keys, read_capacity, write_capacity)
|
20
|
-
@db_client.create_table(
|
21
|
-
attribute_definitions: attributes,
|
22
|
-
key_schema: keys,
|
23
|
-
provisioned_throughput: {
|
24
|
-
read_capacity_units: read_capacity,
|
25
|
-
write_capacity_units: write_capacity
|
26
|
-
},
|
27
|
-
table_name: table_name
|
28
|
-
)
|
29
|
-
end
|
30
|
-
|
31
|
-
def get_table_status(table_name)
|
32
|
-
resp = @db_client.describe_table({
|
33
|
-
table_name: table_name,
|
34
|
-
})
|
35
|
-
resp.table.table_status
|
36
|
-
end
|
37
|
-
|
38
|
-
def delete_table(table_name)
|
39
|
-
@db_client.delete_table({
|
40
|
-
table_name: table_name,
|
41
|
-
})
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
end
|
data/lib/TerraformDevKit/s3.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'aws-sdk-s3'
|
2
|
-
|
3
|
-
Aws.use_bundled_cert!
|
4
|
-
|
5
|
-
module TerraformDevKit
|
6
|
-
# Wrapper class around aws s3
|
7
|
-
class S3
|
8
|
-
def initialize(credentials, region)
|
9
|
-
@s3_client = Aws::S3::Client.new(
|
10
|
-
credentials: credentials,
|
11
|
-
region: region
|
12
|
-
)
|
13
|
-
end
|
14
|
-
|
15
|
-
def create_bucket(bucket_name)
|
16
|
-
@s3_client.create_bucket(
|
17
|
-
bucket: bucket_name
|
18
|
-
)
|
19
|
-
end
|
20
|
-
|
21
|
-
def delete_bucket(bucket_name)
|
22
|
-
empty_bucket(bucket_name)
|
23
|
-
|
24
|
-
@s3_client.delete_bucket(
|
25
|
-
bucket: bucket_name
|
26
|
-
)
|
27
|
-
end
|
28
|
-
|
29
|
-
def empty_bucket(bucket_name)
|
30
|
-
keys_to_delete = @s3_client
|
31
|
-
.list_objects_v2(bucket: bucket_name)
|
32
|
-
.contents
|
33
|
-
.map { |x| { key: x.key } }
|
34
|
-
|
35
|
-
@s3_client.delete_objects(
|
36
|
-
bucket: bucket_name,
|
37
|
-
delete: {
|
38
|
-
objects: keys_to_delete
|
39
|
-
}
|
40
|
-
)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
require 'aws-sdk-dynamodb'
|
2
|
-
require 'aws-sdk-s3'
|
3
|
-
|
4
|
-
module TerraformDevKit
|
5
|
-
# Represents a terraform lock table.
|
6
|
-
class TerraformRemoteState
|
7
|
-
ATTRIBUTES = [
|
8
|
-
{
|
9
|
-
attribute_name: 'LockID',
|
10
|
-
attribute_type: 'S'
|
11
|
-
}
|
12
|
-
]
|
13
|
-
KEYS = [
|
14
|
-
{
|
15
|
-
attribute_name: 'LockID',
|
16
|
-
key_type: 'HASH'
|
17
|
-
}
|
18
|
-
]
|
19
|
-
|
20
|
-
def initialize(dynamodb, s3)
|
21
|
-
@dynamodb = dynamodb
|
22
|
-
@s3 = s3
|
23
|
-
end
|
24
|
-
|
25
|
-
def init(environment, project)
|
26
|
-
table_name = table_name(environment, project)
|
27
|
-
return if lock_table_exists_and_is_active(table_name)
|
28
|
-
|
29
|
-
@dynamodb.create_table(table_name, ATTRIBUTES, KEYS, 1, 1)
|
30
|
-
|
31
|
-
begin
|
32
|
-
@s3.create_bucket(state_bucket_name(environment, project))
|
33
|
-
rescue Aws::S3::Errors::BucketAlreadyOwnedByYou
|
34
|
-
return
|
35
|
-
end
|
36
|
-
|
37
|
-
sleep(0.2) until lock_table_exists_and_is_active(table_name)
|
38
|
-
end
|
39
|
-
|
40
|
-
def destroy(environment, project)
|
41
|
-
table_name = table_name(environment, project)
|
42
|
-
|
43
|
-
@dynamodb.delete_table(table_name)
|
44
|
-
@s3.delete_bucket(state_bucket_name(environment, project))
|
45
|
-
end
|
46
|
-
|
47
|
-
private_class_method
|
48
|
-
def lock_table_exists_and_is_active(table_name)
|
49
|
-
begin
|
50
|
-
return @dynamodb.get_table_status(table_name) == 'ACTIVE'
|
51
|
-
rescue Aws::DynamoDB::Errors::ResourceNotFoundException
|
52
|
-
return false
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
private_class_method
|
57
|
-
def table_name(environment, project)
|
58
|
-
"#{project.acronym}-#{environment.name}-lock-table"
|
59
|
-
end
|
60
|
-
|
61
|
-
private_class_method
|
62
|
-
def state_bucket_name(environment, project)
|
63
|
-
"#{project.name}-#{environment.name}-state"
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|