in agent/api/task/task.go [325:404]
func (task *Task) PostUnmarshalTask(cfg *config.Config,
credentialsManager credentials.Manager, resourceFields *taskresource.ResourceFields,
dockerClient dockerapi.DockerClient, ctx context.Context, options ...Option) error {
// TODO, add rudimentary plugin support and call any plugins that want to
// hook into this
task.adjustForPlatform(cfg)
if task.MemoryCPULimitsEnabled {
if err := task.initializeCgroupResourceSpec(cfg.CgroupPath, cfg.CgroupCPUPeriod, resourceFields); err != nil {
seelog.Errorf("Task [%s]: could not intialize resource: %v", task.Arn, err)
return apierrors.NewResourceInitError(task.Arn, err)
}
}
if err := task.initializeContainerOrderingForVolumes(); err != nil {
seelog.Errorf("Task [%s]: could not initialize volumes dependency for container: %v", task.Arn, err)
return apierrors.NewResourceInitError(task.Arn, err)
}
if err := task.initializeContainerOrderingForLinks(); err != nil {
seelog.Errorf("Task [%s]: could not initialize links dependency for container: %v", task.Arn, err)
return apierrors.NewResourceInitError(task.Arn, err)
}
task.initSecretResources(credentialsManager, resourceFields)
task.initializeCredentialsEndpoint(credentialsManager)
// NOTE: initializeVolumes needs to be after initializeCredentialsEndpoint, because EFS volume might
// need the credentials endpoint constructed by it.
if err := task.initializeVolumes(cfg, dockerClient, ctx); err != nil {
return err
}
if err := task.addGPUResource(cfg); err != nil {
seelog.Errorf("Task [%s]: could not initialize GPU associations: %v", task.Arn, err)
return apierrors.NewResourceInitError(task.Arn, err)
}
task.initializeContainersV3MetadataEndpoint(utils.NewDynamicUUIDProvider())
task.initializeContainersV4MetadataEndpoint(utils.NewDynamicUUIDProvider())
if err := task.addNetworkResourceProvisioningDependency(cfg); err != nil {
seelog.Errorf("Task [%s]: could not provision network resource: %v", task.Arn, err)
return apierrors.NewResourceInitError(task.Arn, err)
}
// Adds necessary Pause containers for sharing PID or IPC namespaces
task.addNamespaceSharingProvisioningDependency(cfg)
if err := task.applyFirelensSetup(cfg, resourceFields, credentialsManager); err != nil {
return err
}
if task.requiresCredentialSpecResource() {
if err := task.initializeCredentialSpecResource(cfg, credentialsManager, resourceFields); err != nil {
seelog.Errorf("Task [%s]: could not initialize credentialspec resource: %v", task.Arn, err)
return apierrors.NewResourceInitError(task.Arn, err)
}
}
if err := task.initializeEnvfilesResource(cfg, credentialsManager); err != nil {
seelog.Errorf("Task [%s]: could not initialize environment files resource: %v", task.Arn, err)
return apierrors.NewResourceInitError(task.Arn, err)
}
task.populateTaskARN()
// fsxWindowsFileserver is the product type -- it is technically "agnostic" ie it should apply to both Windows and Linux tasks
if task.requiresFSxWindowsFileServerResource() {
if err := task.initializeFSxWindowsFileServerResource(cfg, credentialsManager, resourceFields); err != nil {
seelog.Errorf("Task [%s]: could not initialize FSx for Windows File Server resource: %v", task.Arn, err)
return apierrors.NewResourceInitError(task.Arn, err)
}
}
for _, opt := range options {
if err := opt(task); err != nil {
seelog.Errorf("Task [%s]: could not apply task option: %v", task.Arn, err)
return err
}
}
return nil
}