#
# Cookbook:: irrigate-ecs
# Recipe:: default
#
# Copyright:: 2023, All Rights Reserved.

if platform_family?('amazon')

  execute 'enable_docker_topic' do
    command 'amazon-linux-extras enable docker && touch /var/cache/.docker_topic_enabled'
    creates '/var/cache/.docker_topic_enabled'
  end

  # There is a difference between the ecs-init (available in the AL2 core repos) and
  # amazon-ecs-init packages that is not reflected in the Github repo, but only amazon-ecs-init
  # correctly configures bind mounts for the ecs agent container to obtain credentials

  if node['platform_version'].start_with?('2')

    prerequisite_packages = %w(
      pygpgme
      yum-utils
    )

    # Install packages
    prerequisite_packages.each do |name|
      package name
    end

    yum_repository 'packagecloud_ecs' do
      description 'Packagecloud ECS Repository'
      baseurl 'https://packagecloud.io/orchardit/ecs/amazon/2/$basearch'
      gpgcheck false
      gpgkey 'https://packagecloud.io/orchardit/ecs/gpgkey'
      repo_gpgcheck true
      sslverify true
      action :create
    end
  end

  package 'docker'

  package 'amazon-ecs-init' do
    version node['ecs']['init']['version']
  end

end

sysctl 'net.ipv4.ip_forward' do
  value 1
  comment 'Allow ipv4 forwarding for Docker.'
end

ecs_tags = { 'cluster_name': node['ecs']['cluster_name'] }

unless node['ecs']['map_tag'].empty?
  ecs_tags['map-migrated'] = node['ecs']['map_tag']
end

# Create ecs agent config files
template '/etc/ecs/ecs.config' do
  source 'etc_ecs_ecs.config.erb'
  owner 'root'
  group 'root'
  mode '0644'
  action :create
  notifies :restart, 'service[ecs]', :delayed
  variables(tags: ecs_tags.to_json)
end

template '/var/lib/ecs/ecs.config' do
  source 'var_lib_ecs_ecs.config.erb'
  owner 'root'
  group 'root'
  mode '0644'
  action :create
  notifies :restart, 'service[ecs]', :delayed
end

service 'ecs' do
  action [:enable, :start]
end

ecs_response = ''
ecs_uri = URI.parse('http://localhost:51678/v1/metadata')

ruby_block 'verify_instance_metadata' do
  block do
    require 'json'
    require 'net/http'
    require 'time'

    start_time = Time.now
    while (Time.now - start_time) < node['ecs']['init_timeout']
      begin
        ecs_response = Net::HTTP.get(ecs_uri)
        if !ecs_response.nil?
          metadata = JSON.parse(ecs_response)
          if metadata['Cluster'] == node['ecs']['cluster_name']
            Chef::Log.info "Instance is a member of #{node['ecs']['cluster_name']}"
            break
          else
            raise 'Instance is not a member of the correct cluster'
          end
        else
          raise 'Instance metadata is empty'
        end
      rescue StandardError
        Chef::Log.error('Error getting ECS container instance metadata')
      ensure
        sleep 10
      end
    end

    raise 'Instance metadata is empty or endpoint is not available' if ecs_response.empty?
  end

  not_if { ::File.directory?("/var/lib/ecs/data/metadata/#{node['ecs']['cluster_name']}") }
end
