Class: Full360::Sequencer::RunECSTask

Inherits:
RunTaskBase show all
Defined in:
lib/full360_sequencer/run_ecs_task.rb

Instance Attribute Summary collapse

Attributes inherited from RunTaskBase

#exit_code, #success

Instance Method Summary collapse

Methods inherited from RunTaskBase

#kill_task

Constructor Details

#initialize(task_name, params, ecs_client = nil, logger = nil) ⇒ RunECSTask

Returns a new instance of RunECSTask.



16
17
18
19
20
21
22
# File 'lib/full360_sequencer/run_ecs_task.rb', line 16

def initialize(task_name, params, ecs_client = nil, logger = nil)
  @logger     = logger ||= Logger.new(STDOUT)
  @ecs_client = ecs_client ||= Aws::ECS::Client.new
  @task_name  = task_name
  @params     = params[:parameters]
  @cluster    = self.params[:cluster]
end

Instance Attribute Details

#clusterObject (readonly)

Returns the value of attribute cluster.



12
13
14
# File 'lib/full360_sequencer/run_ecs_task.rb', line 12

def cluster
  @cluster
end

#ecs_clientObject

Returns the value of attribute ecs_client.



9
10
11
# File 'lib/full360_sequencer/run_ecs_task.rb', line 9

def ecs_client
  @ecs_client
end

#loggerObject

Returns the value of attribute logger.



10
11
12
# File 'lib/full360_sequencer/run_ecs_task.rb', line 10

def logger
  @logger
end

#paramsObject

Returns the value of attribute params.



8
9
10
# File 'lib/full360_sequencer/run_ecs_task.rb', line 8

def params
  @params
end

#start_timeObject (readonly)

Returns the value of attribute start_time.



14
15
16
# File 'lib/full360_sequencer/run_ecs_task.rb', line 14

def start_time
  @start_time
end

#task_arnObject (readonly)

Returns the value of attribute task_arn.



13
14
15
# File 'lib/full360_sequencer/run_ecs_task.rb', line 13

def task_arn
  @task_arn
end

#task_nameObject

Returns the value of attribute task_name.



7
8
9
# File 'lib/full360_sequencer/run_ecs_task.rb', line 7

def task_name
  @task_name
end

Instance Method Details

#completed?Boolean

Returns:



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/full360_sequencer/run_ecs_task.rb', line 53

def completed?
  retries ||= 0

  resp = ecs_describe_tasks
  status = last_task_status(resp)

  logger.info("#{task_name}: #{task_arn} current status: #{status}")

  completed = false

  if status == "STOPPED"
    logger.info("#{task_name} completed in #{Time.new.utc - start_time} seconds")
    # parse exit_code(s) and return completion
    @success = determine_success(resp)
    completed = true
  end

  completed
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: #{e.message}")
  e.backtrace.each { |r| logger.error(r) }
end

#determine_success(resp) ⇒ Object

success is determined by all containers having zero exit code



89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/full360_sequencer/run_ecs_task.rb', line 89

def determine_success(resp)
  success = true

  resp.tasks.first.containers.each do |c|
    logger.info("#{task_name}: container #{c.name} #{c.container_arn} completed with exit_code #{c.exit_code}")

    # we had a problem!
    success = false if c.exit_code != 0
  end

  success
end

#ecs_describe_tasksObject



44
45
46
47
48
49
50
51
# File 'lib/full360_sequencer/run_ecs_task.rb', line 44

def ecs_describe_tasks
  ecs_client.describe_tasks(
    {
      cluster: cluster,
      tasks: [task_arn],
    }
  )
end

#ecs_run_taskObject



33
34
35
36
37
38
39
40
41
42
# File 'lib/full360_sequencer/run_ecs_task.rb', line 33

def ecs_run_task
  logger.debug("running ECS task #{task_name}...")
  @start_time = Time.new.utc

  resp = ecs_client.run_task(params)
  resp
rescue => e
  logger.error("SEQUENCER_ERROR: response from ECS #{resp}")
  raise e
end

#last_task_status(resp) ⇒ Object

parses last status from aws API response



84
85
86
# File 'lib/full360_sequencer/run_ecs_task.rb', line 84

def last_task_status(resp)
  resp.tasks.first.last_status
end

#run_taskObject



24
25
26
27
28
29
30
31
# File 'lib/full360_sequencer/run_ecs_task.rb', line 24

def run_task
  logger.info("starting ECS task #{task_name}")

  resp = ecs_run_task
  @task_arn = resp.tasks.first.task_arn

  logger.info("#{task_name} task created #{task_arn} on cluster #{cluster}")
end