Sha256: 9efd2ffc2ae3cc373789058cd09c747db524e3e61987f5626a7774031c26a6eb

Contents?: true

Size: 1.74 KB

Versions: 2

Compression:

Stored size: 1.74 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

2 entries across 2 versions & 1 rubygems

Version Path
TerraformDevKit-0.3.8 lib/TerraformDevKit/aws/terraform_remote_state.rb
TerraformDevKit-0.3.3 lib/TerraformDevKit/aws/terraform_remote_state.rb