func (factory *gardenContainerSpecFactory) BuildTaskContainerSpec( spec TaskContainerSpec, gardenSpec garden.ContainerSpec, cancel <-chan os.Signal, delegate ImageFetchingDelegate, id Identifier, metadata Metadata, workerClient Client, ) (garden.ContainerSpec, error) { if spec.ImageResourcePointer == nil { gardenSpec.RootFSPath = spec.Image } gardenSpec.Privileged = spec.Privileged var err error gardenSpec, err = factory.createVolumes(gardenSpec, spec.Inputs) if err != nil { return gardenSpec, err } for _, mount := range spec.Outputs { volume := mount.Volume gardenSpec.BindMounts = append(gardenSpec.BindMounts, garden.BindMount{ SrcPath: volume.Path(), DstPath: mount.MountPath, Mode: garden.BindMountModeRW, }) factory.volumeHandles = append(factory.volumeHandles, volume.Handle()) factory.volumeMounts[volume.Handle()] = mount.MountPath } return gardenSpec, nil }
func (factory *gardenContainerSpecFactory) createVolumes(containerSpec garden.ContainerSpec, mounts []VolumeMount) (garden.ContainerSpec, error) { for _, mount := range mounts { cowVolume, err := factory.baggageclaimClient.CreateVolume(factory.logger, baggageclaim.VolumeSpec{ Strategy: baggageclaim.COWStrategy{ Parent: mount.Volume, }, Privileged: containerSpec.Privileged, TTL: VolumeTTL, }) if err != nil { return containerSpec, err } factory.releaseAfterCreate = append(factory.releaseAfterCreate, cowVolume) containerSpec.BindMounts = append(containerSpec.BindMounts, garden.BindMount{ SrcPath: cowVolume.Path(), DstPath: mount.MountPath, Mode: garden.BindMountModeRW, }) factory.volumeHandles = append(factory.volumeHandles, cowVolume.Handle()) factory.volumeMounts[cowVolume.Handle()] = mount.MountPath } return containerSpec, nil }
func (factory *gardenContainerSpecFactory) BuildResourceContainerSpec( spec ResourceTypeContainerSpec, gardenSpec garden.ContainerSpec, resourceTypes []atc.WorkerResourceType, ) (garden.ContainerSpec, error) { if len(spec.Mounts) > 0 && spec.Cache.Volume != nil { return gardenSpec, errors.New("a container may not have mounts and a cache") } gardenSpec.Privileged = true gardenSpec.Env = append(gardenSpec.Env, spec.Env...) if spec.Ephemeral { gardenSpec.Properties[ephemeralPropertyName] = "true" } if spec.Cache.Volume != nil && spec.Cache.MountPath != "" { gardenSpec.BindMounts = []garden.BindMount{ { SrcPath: spec.Cache.Volume.Path(), DstPath: spec.Cache.MountPath, Mode: garden.BindMountModeRW, }, } factory.volumeHandles = append(factory.volumeHandles, spec.Cache.Volume.Handle()) factory.volumeMounts[spec.Cache.Volume.Handle()] = spec.Cache.MountPath } var err error gardenSpec, err = factory.createVolumes(gardenSpec, spec.Mounts) if err != nil { return gardenSpec, err } if spec.ImageResourcePointer == nil { for _, t := range resourceTypes { if t.Type == spec.Type { gardenSpec.RootFSPath = t.Image return gardenSpec, nil } } return gardenSpec, ErrUnsupportedResourceType } return gardenSpec, nil }