func (task *Task) addSharedVolumes(SharedVolumeMatchFullConfig bool, ctx context.Context, dockerClient dockerapi.DockerClient,
	vol *TaskVolume) error {

	volumeConfig := vol.Volume.(*taskresourcevolume.DockerVolumeConfig)
	volumeConfig.DockerVolumeName = vol.Name
	// if autoprovision == true, we will auto-provision the volume if it does not exist already
	// else the named volume must exist
	if !volumeConfig.Autoprovision {
		volumeMetadata := dockerClient.InspectVolume(ctx, vol.Name, dockerclient.InspectVolumeTimeout)
		if volumeMetadata.Error != nil {
			return errors.Wrapf(volumeMetadata.Error, "initialize volume: volume detection failed, volume '%s' does not exist and autoprovision is set to false", vol.Name)
		}
		return nil
	}

	// at this point we know autoprovision = true
	// check if the volume configuration matches the one exists on the instance
	volumeMetadata := dockerClient.InspectVolume(ctx, volumeConfig.DockerVolumeName, dockerclient.InspectVolumeTimeout)
	if volumeMetadata.Error != nil {
		// Inspect the volume timed out, fail the task
		if _, ok := volumeMetadata.Error.(*dockerapi.DockerTimeoutError); ok {
			return volumeMetadata.Error
		}

		seelog.Infof("initialize volume: Task [%s]: non-autoprovisioned volume not found, adding to task resource %q", task.Arn, vol.Name)
		// this resource should be created by agent
		volumeResource, err := taskresourcevolume.NewVolumeResource(
			ctx,
			vol.Name,
			vol.Name,
			volumeConfig.Scope, volumeConfig.Autoprovision,
			volumeConfig.Driver, volumeConfig.DriverOpts,
			volumeConfig.Labels, dockerClient)
		if err != nil {
			return err
		}

		task.AddResource(resourcetype.DockerVolumeKey, volumeResource)
		task.updateContainerVolumeDependency(vol.Name)
		return nil
	}

	seelog.Infof("initialize volume: Task [%s]: volume [%s] already exists", task.Arn, volumeConfig.DockerVolumeName)
	if !SharedVolumeMatchFullConfig {
		seelog.Infof("initialize volume: Task [%s]: ECS_SHARED_VOLUME_MATCH_FULL_CONFIG is set to false and volume with name [%s] is found", task.Arn, volumeConfig.DockerVolumeName)
		return nil
	}

	// validate all the volume metadata fields match to the configuration
	if len(volumeMetadata.DockerVolume.Labels) == 0 && len(volumeMetadata.DockerVolume.Labels) == len(volumeConfig.Labels) {
		seelog.Infof("labels are both empty or null: Task [%s]: volume [%s]", task.Arn, volumeConfig.DockerVolumeName)
	} else if !reflect.DeepEqual(volumeMetadata.DockerVolume.Labels, volumeConfig.Labels) {
		return errors.Errorf("intialize volume: non-autoprovisioned volume does not match existing volume labels: existing: %v, expected: %v",
			volumeMetadata.DockerVolume.Labels, volumeConfig.Labels)
	}

	if len(volumeMetadata.DockerVolume.Options) == 0 && len(volumeMetadata.DockerVolume.Options) == len(volumeConfig.DriverOpts) {
		seelog.Infof("driver options are both empty or null: Task [%s]: volume [%s]", task.Arn, volumeConfig.DockerVolumeName)
	} else if !reflect.DeepEqual(volumeMetadata.DockerVolume.Options, volumeConfig.DriverOpts) {
		return errors.Errorf("initialize volume: non-autoprovisioned volume does not match existing volume options: existing: %v, expected: %v",
			volumeMetadata.DockerVolume.Options, volumeConfig.DriverOpts)
	}
	// Right now we are not adding shared, autoprovision = true volume to task as resource if it already exists (i.e. when this task didn't create the volume).
	// if we need to change that, make a call to task.AddResource here.
	return nil
}
func (task *Task) addSharedVolumes(SharedVolumeMatchFullConfig bool, ctx context.Context, dockerClient dockerapi.DockerClient,
	vol *TaskVolume) error {

	volumeConfig := vol.Volume.(*taskresourcevolume.DockerVolumeConfig)
	volumeConfig.DockerVolumeName = vol.Name
	
	
	if !volumeConfig.Autoprovision {
		volumeMetadata := dockerClient.InspectVolume(ctx, vol.Name, dockerclient.InspectVolumeTimeout)
		if volumeMetadata.Error != nil {
			return errors.Wrapf(volumeMetadata.Error, "initialize volume: volume detection failed, volume '%s' does not exist and autoprovision is set to false", vol.Name)
		}
		return nil
	}

	
	
	volumeMetadata := dockerClient.InspectVolume(ctx, volumeConfig.DockerVolumeName, dockerclient.InspectVolumeTimeout)
	if volumeMetadata.Error != nil {
		
		if _, ok := volumeMetadata.Error.(*dockerapi.DockerTimeoutError); ok {
			return volumeMetadata.Error
		}

		seelog.Infof("initialize volume: Task [%s]: non-autoprovisioned volume not found, adding to task resource %q", task.Arn, vol.Name)
		
		volumeResource, err := taskresourcevolume.NewVolumeResource(
			ctx,
			vol.Name,
			vol.Name,
			volumeConfig.Scope, volumeConfig.Autoprovision,
			volumeConfig.Driver, volumeConfig.DriverOpts,
			volumeConfig.Labels, dockerClient)
		if err != nil {
			return err
		}

		task.AddResource(resourcetype.DockerVolumeKey, volumeResource)
		task.updateContainerVolumeDependency(vol.Name)
		return nil
	}

	seelog.Infof("initialize volume: Task [%s]: volume [%s] already exists", task.Arn, volumeConfig.DockerVolumeName)
	if !SharedVolumeMatchFullConfig {
		seelog.Infof("initialize volume: Task [%s]: ECS_SHARED_VOLUME_MATCH_FULL_CONFIG is set to false and volume with name [%s] is found", task.Arn, volumeConfig.DockerVolumeName)
		return nil
	}

	
	if len(volumeMetadata.DockerVolume.Labels) == 0 && len(volumeMetadata.DockerVolume.Labels) == len(volumeConfig.Labels) {
		seelog.Infof("labels are both empty or null: Task [%s]: volume [%s]", task.Arn, volumeConfig.DockerVolumeName)
	} else if !reflect.DeepEqual(volumeMetadata.DockerVolume.Labels, volumeConfig.Labels) {
		return errors.Errorf("intialize volume: non-autoprovisioned volume does not match existing volume labels: existing: %v, expected: %v",
			volumeMetadata.DockerVolume.Labels, volumeConfig.Labels)
	}

	if len(volumeMetadata.DockerVolume.Options) == 0 && len(volumeMetadata.DockerVolume.Options) == len(volumeConfig.DriverOpts) {
		seelog.Infof("driver options are both empty or null: Task [%s]: volume [%s]", task.Arn, volumeConfig.DockerVolumeName)
	} else if !reflect.DeepEqual(volumeMetadata.DockerVolume.Options, volumeConfig.DriverOpts) {
		return errors.Errorf("initialize volume: non-autoprovisioned volume does not match existing volume options: existing: %v, expected: %v",
			volumeMetadata.DockerVolume.Options, volumeConfig.DriverOpts)
	}
	
	
	return nil
}
func ( task * Task ) addSharedVolumes ( SharedVolumeMatchFullConfig bool , ctx context . Context , dockerClient dockerapi . DockerClient , vol * TaskVolume ) error { volumeConfig := vol . Volume . ( * taskresourcevolume . DockerVolumeConfig ) volumeConfig . DockerVolumeName = vol . Name // if autoprovision == true, we will auto-provision the volume if it does not exist already // else the named volume must exist if ! volumeConfig . Autoprovision { volumeMetadata := dockerClient . InspectVolume ( ctx , vol . Name , dockerclient . InspectVolumeTimeout ) if volumeMetadata . Error != nil { return errors . Wrapf ( volumeMetadata . Error , " " , vol . Name ) } return nil } // at this point we know autoprovision = true // check if the volume configuration matches the one exists on the instance volumeMetadata := dockerClient . InspectVolume ( ctx , volumeConfig . DockerVolumeName , dockerclient . InspectVolumeTimeout ) if volumeMetadata . Error != nil { // Inspect the volume timed out, fail the task if _ , ok := volumeMetadata . Error . ( * dockerapi . DockerTimeoutError ) ; ok { return volumeMetadata . Error } seelog . Infof ( " " , task . Arn , vol . Name ) // this resource should be created by agent volumeResource , err := taskresourcevolume . NewVolumeResource ( ctx , vol . Name , vol . Name , volumeConfig . Scope , volumeConfig . Autoprovision , volumeConfig . Driver , volumeConfig . DriverOpts , volumeConfig . Labels , dockerClient ) if err != nil { return err } task . AddResource ( resourcetype . DockerVolumeKey , volumeResource ) task . updateContainerVolumeDependency ( vol . Name ) return nil } seelog . Infof ( " " , task . Arn , volumeConfig . DockerVolumeName ) if ! SharedVolumeMatchFullConfig { seelog . Infof ( " " , task . Arn , volumeConfig . DockerVolumeName ) return nil } // validate all the volume metadata fields match to the configuration if len ( volumeMetadata . DockerVolume . Labels ) == 0 && len ( volumeMetadata . DockerVolume . Labels ) == len ( volumeConfig . Labels ) { seelog . Infof ( " " , task . Arn , volumeConfig . DockerVolumeName ) } else if ! reflect . DeepEqual ( volumeMetadata . DockerVolume . Labels , volumeConfig . Labels ) { return errors . Errorf ( " " , volumeMetadata . DockerVolume . Labels , volumeConfig . Labels ) } if len ( volumeMetadata . DockerVolume . Options ) == 0 && len ( volumeMetadata . DockerVolume . Options ) == len ( volumeConfig . DriverOpts ) { seelog . Infof ( " " , task . Arn , volumeConfig . DockerVolumeName ) } else if ! reflect . DeepEqual ( volumeMetadata . DockerVolume . Options , volumeConfig . DriverOpts ) { return errors . Errorf ( " " , volumeMetadata . DockerVolume . Options , volumeConfig . DriverOpts ) } // Right now we are not adding shared, autoprovision = true volume to task as resource if it already exists (i.e. when this task didn't create the volume). // if we need to change that, make a call to task.AddResource here. return nil }
// addSharedVolumes adds shared volume into task resources and updates container dependency
addSharedVolumes adds shared volume into task resources and updates container dependency