in ecs-cli/modules/utils/compose/convert_task_definition.go [51:154]
func ConvertToTaskDefinition(params ConvertTaskDefParams) (*ecs.TaskDefinition, error) {
if len(params.ContainerConfigs) == 0 {
return nil, errors.New("cannot create a task definition with no containers; invalid service config")
}
// Instantiates zero values for fields on task def specified by ecs-params
taskDefParams, err := convertTaskDefParams(params.ECSParams)
if err != nil {
return nil, err
}
// The task-role-arn flag takes precedence over a taskRoleArn value specified in ecs-params file.
if params.TaskRoleArn == "" {
params.TaskRoleArn = taskDefParams.taskRoleArn
}
// Create containerDefinitions
containerDefinitions := []*ecs.ContainerDefinition{}
for _, containerConfig := range params.ContainerConfigs {
name := containerConfig.Name
// Check if there are ecs-params specified for the container
ecsContainerDef := &ContainerDef{Essential: true}
if cd, ok := taskDefParams.containerDefs[name]; ok {
ecsContainerDef = &cd
}
// Validate essential containers
count := len(params.ContainerConfigs)
if !hasEssential(taskDefParams.containerDefs, count) {
return nil, errors.New("Task definition does not have any essential containers")
}
taskVals := taskLevelValues{
MemLimit: taskDefParams.memory,
}
containerDef, err := reconcileContainerDef(&containerConfig, ecsContainerDef, taskVals)
if err != nil {
return nil, err
}
containerDefinitions = append(containerDefinitions, containerDef)
}
ecsVolumes, err := convertToECSVolumes(params.Volumes, params.ECSParams)
if err != nil {
return nil, err
}
executionRoleArn := taskDefParams.executionRoleArn
placementConstraints := convertToTaskDefinitionConstraints(params.ECSParams)
// Check for and apply provided ecs-registry-creds values
if params.ECSRegistryCreds != nil {
err := addRegistryCredsToContainerDefs(containerDefinitions, params.ECSRegistryCreds.CredentialResources.ContainerCredentials)
if err != nil {
return nil, err
}
// if provided, add or replace existing executionRoleArn with value from cred file
if params.ECSRegistryCreds.CredentialResources.TaskExecutionRole != "" {
newExecutionRole := params.ECSRegistryCreds.CredentialResources.TaskExecutionRole
if executionRoleArn != "" {
// TODO: refactor 'showResourceOverrideMsg()' to take in override src and use here
log.WithFields(log.Fields{
"option name": "task_execution_role",
}).Infof("Using "+regcredio.ECSCredFileBaseName+" value as override (was %s but is now %s)", executionRoleArn, newExecutionRole)
} else {
log.WithFields(log.Fields{
"option name": "task_execution_role",
}).Infof("Using "+regcredio.ECSCredFileBaseName+" value %s", newExecutionRole)
}
executionRoleArn = newExecutionRole
}
}
// Note: this is later converted into an ecs.RegisterTaskDefinitionInput in entity_helper.go
taskDefinition := &ecs.TaskDefinition{
Family: aws.String(params.TaskDefName),
ContainerDefinitions: containerDefinitions,
Volumes: ecsVolumes,
TaskRoleArn: aws.String(params.TaskRoleArn),
NetworkMode: aws.String(taskDefParams.networkMode),
Cpu: aws.String(taskDefParams.cpu),
Memory: aws.String(taskDefParams.memory),
ExecutionRoleArn: aws.String(executionRoleArn),
PlacementConstraints: placementConstraints,
}
// Set launch type
if params.RequiredCompatibilites != "" {
taskDefinition.RequiresCompatibilities = []*string{aws.String(params.RequiredCompatibilites)}
}
if taskDefParams.pidMode != "" {
taskDefinition.SetPidMode(taskDefParams.pidMode)
}
if taskDefParams.ipcMode != "" {
taskDefinition.SetIpcMode(taskDefParams.ipcMode)
}
return taskDefinition, nil
}