func()

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
}