require "json"
require "net/http"

module OpsWorks
  class ECSAgent
    def available?
      Net::HTTP.get(uri)

      true
    rescue StandardError
      false
    end

    def cluster
      metadata.fetch("Cluster")
    rescue KeyError
      Chef::Log.warn("Cluster not found in ECS metadata.")
    end

    def wait_for_availability(attempts = 300)
      attempts.times do
        return true if available?

        sleep 1
      end

      false
    end

    private

    def metadata
      result = Net::HTTP.get(uri)
      JSON.parse(result)
    rescue Errno::ECONNREFUSED
      Chef::Log.warn("Cannot connect to ECS metadata service.")
    rescue JSON::ParserError
      Chef::Log.warn("Cannot parse ECS metadata.")
    rescue StandardError
      Chef::Log.warn("Unknown error occured during ECS metadata lookup.")
    end

    def uri
      URI("http://localhost:51678/v1/metadata")
    end
  end
end