func getContainersForTasksWithTaskNetworking()

in ecs-cli/modules/cli/compose/entity/entity_helper.go [326:375]


func getContainersForTasksWithTaskNetworking(entity ProjectEntity, ecsTasks []*ecs.Task) ([]composecontainer.Container, []*ecs.Task, error) {
	var tasksWithInstanceIPs []*ecs.Task
	info := []composecontainer.Container{}
	tdStore := NewTaskDefinitionStore()

	if len(ecsTasks) == 0 {
		return info, ecsTasks, nil
	}

	// For Fargate tasks
	taskENIPublicIPs, err := getPublicIPsFromENIs(entity, ecsTasks)
	if err != nil {
		return nil, nil, err
	}

	for _, ecsTask := range ecsTasks {
		taskDef, err := tdStore.getTaskDefintion(entity, aws.StringValue(ecsTask.TaskDefinitionArn))
		if err != nil {
			return nil, nil, err
		}
		if aws.StringValue(taskDef.NetworkMode) == ecs.NetworkModeAwsvpc {
			for _, container := range ecsTask.Containers {
				containerDef, err := getContainerDef(taskDef, aws.StringValue(container.Name))
				if err != nil {
					return nil, nil, err
				}
				bindings := convertToNetworkBindings(containerDef)
				ipAddress := ""
				status := aws.StringValue(ecsTask.LastStatus)
				if status == "PENDING" || status == "PROVISIONING" {
					ipAddress = "(PENDING)"
				}

				// Get IPs from ENIs if they have been provisioned and the task is still running
				if len(container.NetworkInterfaces) > 0 && status != "STOPPED" {
					ipAddress = aws.StringValue(container.NetworkInterfaces[0].PrivateIpv4Address)
					if aws.StringValue(ecsTask.LaunchType) == config.LaunchTypeFargate {
						if ip := taskENIPublicIPs[aws.StringValue(ecsTask.TaskArn)]; ip != "" {
							ipAddress = ip
						}
					}
				}
				info = append(info, composecontainer.NewContainer(ecsTask, ipAddress, container, bindings))
			}
		} else {
			tasksWithInstanceIPs = append(tasksWithInstanceIPs, ecsTask)
		}
	}
	return info, tasksWithInstanceIPs, nil
}