class Full360::Sequencer::RunECSTask

Public Class Methods

new(task_name, params, logger = nil) click to toggle source
# File lib/full360-sequencer.rb, line 75
def initialize(task_name, params, logger = nil)
  @logger = logger ? logger : Logger.new(STDOUT)
  @task_name = task_name
  @params = params['parameters']
  @params = keys_to_symbol(@params)
  @cluster = @params[:cluster]
end

Public Instance Methods

completed?() click to toggle source
# File lib/full360-sequencer.rb, line 123
def completed?
  retries ||= 0
  resp = ecs_describe_tasks
  status = last_task_status(resp)
  @logger.info("#{@task_name} : #{@task_arn} current status: #{status}")
  if status == 'STOPPED'
    @logger.info("#{@task_name} completed in #{Time.new - @start_time} seconds")
    # parse exit_code(s) and return completion
    @success = determine_success(resp)
    return true
  end
  false
rescue => e
  @logger.warn(e.message)
  @logger.warn("task completion check failed, trying again ##{ retries }")
  sleep 10*retries
  retry if (retries += 1) < 3

  @logger.error('SEQUENCER_ERROR')
  @logger.error(e.message)
  e.backtrace.each { |r| @logger.error(r) }
end
determine_success(resp) click to toggle source

success is determined by all containers having zero exit code

# File lib/full360-sequencer.rb, line 152
def determine_success(resp)
  success = true
  resp.tasks[0].containers.each do |c|
    @logger.info("#{@task_name} : container #{c.name} #{c.container_arn} completed with exit_code #{c.exit_code}")
    if c.exit_code != 0
      # we had a problem!
      success = false
    end
  end
  success
end
ecs_describe_tasks() click to toggle source
# File lib/full360-sequencer.rb, line 114
def ecs_describe_tasks
  @ecs_client.describe_tasks(
    {
      cluster: @cluster,
      tasks: [@task_arn] # required
    }
  )
end
ecs_run_task() click to toggle source
# File lib/full360-sequencer.rb, line 100
def ecs_run_task
  @logger.debug("creating AWS client for ECS task #{@task_name}...")
  @ecs_client = ::Aws::ECS::Client.new
  @logger.debug("running ECS task #{@task_name}...")
  @start_time = Time.new
  resp = @ecs_client.run_task(@params)
  return resp
rescue => e
  @logger.error('SEQUENCER_ERROR')
  @logger.error("error creating ECS task...")
  @logger.error("response from ECS: #{resp}")
  raise e
end
keys_to_symbol(params) click to toggle source
# File lib/full360-sequencer.rb, line 83
def keys_to_symbol(params)
  # replaces string keys with symbol keys
  # required by AWS SDK
  if params.is_a?(Hash)
    params.inject({}){ |memo,(k,v)| memo[k.to_sym] = v; memo }
  else
    nil
  end
end
last_task_status(resp) click to toggle source

parses last status from aws API response

# File lib/full360-sequencer.rb, line 147
def last_task_status(resp)
  resp.tasks[0].last_status
end
run_task() click to toggle source
# File lib/full360-sequencer.rb, line 93
def run_task
  @logger.info("starting ECS task #{@task_name}")
  resp = ecs_run_task
  @task_arn = resp.tasks[0].task_arn
  @logger.info("#{@task_name} task created #{@task_arn} on cluster #{@cluster}")
end