Sha256: 817460832c2d4acaad6f8adec941409a85251b2840c6d12b8e9a23324205b41a

Contents?: true

Size: 1.67 KB

Versions: 6

Compression:

Stored size: 1.67 KB

Contents

require 'aws-sdk-dynamodb'
require 'aws-sdk-s3'

module TerraformDevKit
  module Aws
    class TerraformRemoteState
      ATTRIBUTES = [
          {
            attribute_name: 'LockID',
            attribute_type: 'S'
          }
        ]
      KEYS = [
          {
            attribute_name: 'LockID',
            key_type: 'HASH'
          }
        ]

      def initialize(dynamodb, s3)
        @dynamodb = dynamodb
        @s3 = s3
      end

      def init(environment, project)
        table_name = table_name(environment, project)
        return if lock_table_exists_and_is_active(table_name)

        @dynamodb.create_table(table_name, ATTRIBUTES, KEYS, 1, 1)

        begin
          @s3.create_bucket(state_bucket_name(environment, project))
        rescue ::Aws::S3::Errors::BucketAlreadyOwnedByYou
          return
        end

        sleep(0.2) until lock_table_exists_and_is_active(table_name)
      end

      def destroy(environment, project)
        table_name = table_name(environment, project)

        @dynamodb.delete_table(table_name)
        @s3.delete_bucket(state_bucket_name(environment, project))
      end

      private_class_method
      def lock_table_exists_and_is_active(table_name)
        begin
          return @dynamodb.get_table_status(table_name) == 'ACTIVE'
        rescue ::Aws::DynamoDB::Errors::ResourceNotFoundException
          return false
        end
      end

      private_class_method
      def table_name(environment, project)
        "#{project.acronym}-#{environment.name}-lock-table"
      end

      private_class_method
      def state_bucket_name(environment, project)
        "#{project.name}-#{environment.name}-state"
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
TerraformDevKit-0.4.0 lib/TerraformDevKit/aws/terraform_remote_state.rb
TerraformDevKit-0.3.7 lib/TerraformDevKit/aws/terraform_remote_state.rb
TerraformDevKit-0.3.6 lib/TerraformDevKit/aws/terraform_remote_state.rb
TerraformDevKit-0.3.5 lib/TerraformDevKit/aws/terraform_remote_state.rb
TerraformDevKit-0.3.4 lib/TerraformDevKit/aws/terraform_remote_state.rb
TerraformDevKit-0.3.2 lib/TerraformDevKit/aws/terraform_remote_state.rb