in ecs-cli/modules/cli/compose/entity/task/task.go [428:492]
func (t *Task) up(forceUpdate bool) error {
ecsTasks, err := entity.CollectTasksWithStatus(t, ecs.DesiredStatusRunning, true)
if err != nil {
return err
}
_, err = entity.GetOrCreateTaskDefinition(t)
if err != nil {
return err
}
err = entity.OptionallyCreateLogs(t)
if err != nil {
return err
}
countTasks := len(ecsTasks)
if countTasks == 0 {
return t.createOne()
}
log.WithFields(log.Fields{
"ProjectName": entity.GetProjectName(t),
"CountOfTasks": countTasks,
}).Info("Found existing ECS tasks for project")
// Note: Picking the first task definition as a standard and comparing against that
oldTaskDef := aws.StringValue(ecsTasks[0].TaskDefinitionArn)
newTaskDef := aws.StringValue(t.TaskDefinition().TaskDefinitionArn)
ecsTaskArns := make(map[string]bool)
if oldTaskDef != newTaskDef || forceUpdate {
log.WithFields(log.Fields{"taskDefinition": newTaskDef}).Info("Updating to new task definition")
chunkSize := 10
for i := 0; i < len(ecsTasks); i += chunkSize {
var chunk []*ecs.Task
if i+chunkSize > len(ecsTasks) {
chunk = ecsTasks[i:len(ecsTasks)]
} else {
chunk = ecsTasks[i : i+chunkSize]
}
// stop 10 and then run 10
for _, task := range chunk {
arn := aws.StringValue(task.TaskArn)
ecsTaskArns[arn] = true
err := t.Context().ECSClient.StopTask(arn)
if err != nil {
return err
}
}
newTasks, err := t.runTasks(newTaskDef, len(chunk))
if err != nil {
return err
}
for _, task := range newTasks {
ecsTaskArns[aws.StringValue(task.TaskArn)] = true
}
}
return waitForTasks(t, ecsTaskArns)
}
return nil
}