Sha256: 9f1b3dfe0e5fb69030bc5c99d43a6fc4c50923451f9a9a3e4fae7ab693b675f7

Contents?: true

Size: 2 KB

Versions: 30

Compression:

Stored size: 2 KB

Contents

class Terraspace::Terraform::Runner
  class Retryer
    include Terraspace::Util::Logging
    include Terraspace::Util::Pretty

    def initialize(mod, options, command_name, exception)
      @mod, @options, @command_name, @exception = mod, options, command_name, exception
      @retries = 1
    end

    def retry?
      if @retries <= 3 && !@stop_retrying
        true # will retry
      else
        logger.info "ERROR: #{@exception.message}"
        false # will not retry
      end
    end

    def run
      backoff = 2 ** @retries # 2, 4, 8
      logger.debug "Waiting #{backoff}s before retrying"
      sleep(backoff)
      @retries += 1

      case @exception
      when Terraspace::SharedCacheError
        shared_cache_error
      when Terraspace::InitRequiredError
        init_required_error
      end
    end

    def shared_cache_error
      logger.info "Terraform Shared Cache error detected. Will purge caches and run `terraform init` to try again."
      logger.debug "Retry attempt: #{@retries}"
      logger.debug "#{@exception.class}"
      logger.debug "#{@exception.message}"
      if Terraspace.config.terraform.plugin_cache.purge_on_error # Purging the cache "fixes" this terraform bug
        purge_caches
        reinit
      else
        @stop_retrying = true
      end
    end

    def init_required_error
      logger.info "Terraform reinitialization required detected. Will run `terraform init` and try again."
      logger.debug "Retry attempt: #{@retries}"
      logger.debug "#{@exception.class}"
      reinit
    end

    def reinit
      Terraspace::Terraform::Runner.new("init", @options).run unless @command_name == "init"
    end

    def purge_caches
      dir = "#{@mod.cache_dir}/.terraform"
      logger.info "Purging #{pretty_path(dir)}"
      FileUtils.rm_rf(dir)

      dir = "#{Terraspace.config.terraform.plugin_cache.dir}"
      logger.info "Purging #{pretty_path(dir)}"
      FileUtils.rm_rf(dir)
      FileUtils.mkdir_p(dir) # need /tmp/terraspace/plugin_cache dir to exist
    end
  end
end

Version data entries

30 entries across 30 versions & 1 rubygems

Version Path
terraspace-0.6.17 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.16 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.15 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.13 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.12 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.11 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.10 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.9 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.8 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.7 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.6 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.5 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.4 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.3 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.2 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.1 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.6.0 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.5.12 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.5.11 lib/terraspace/terraform/runner/retryer.rb
terraspace-0.5.10 lib/terraspace/terraform/runner/retryer.rb