mirror of
https://github.com/containers/podman.git
synced 2025-08-02 09:12:36 +08:00
Pod Device Support
added support for pod devices. The device gets added to the infra container and recreated in all containers that join the pod. This required a new container config item to keep track of the original device passed in by the user before the path was parsed into the container device. Signed-off-by: cdoern <cdoern@redhat.com>
This commit is contained in:
@ -30,24 +30,27 @@ func MakeContainer(ctx context.Context, rt *libpod.Runtime, s *specgen.SpecGener
|
||||
|
||||
// If joining a pod, retrieve the pod for use, and its infra container
|
||||
var pod *libpod.Pod
|
||||
var cont *libpod.Container
|
||||
var config *libpod.ContainerConfig
|
||||
var infraConfig *libpod.ContainerConfig
|
||||
if s.Pod != "" {
|
||||
pod, err = rt.LookupPod(s.Pod)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrapf(err, "error retrieving pod %s", s.Pod)
|
||||
}
|
||||
if pod.HasInfraContainer() {
|
||||
cont, err = pod.InfraContainer()
|
||||
infra, err := pod.InfraContainer()
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
config = cont.Config()
|
||||
infraConfig = infra.Config()
|
||||
}
|
||||
}
|
||||
|
||||
if config != nil && (len(config.NamedVolumes) > 0 || len(config.UserVolumes) > 0 || len(config.ImageVolumes) > 0 || len(config.OverlayVolumes) > 0) {
|
||||
s.VolumesFrom = append(s.VolumesFrom, config.ID)
|
||||
if infraConfig != nil && (len(infraConfig.NamedVolumes) > 0 || len(infraConfig.UserVolumes) > 0 || len(infraConfig.ImageVolumes) > 0 || len(infraConfig.OverlayVolumes) > 0) {
|
||||
s.VolumesFrom = append(s.VolumesFrom, infraConfig.ID)
|
||||
}
|
||||
|
||||
if infraConfig != nil && len(infraConfig.Spec.Linux.Devices) > 0 {
|
||||
s.DevicesFrom = append(s.DevicesFrom, infraConfig.ID)
|
||||
}
|
||||
// Set defaults for unset namespaces
|
||||
if s.PidNS.IsDefault() {
|
||||
@ -166,6 +169,16 @@ func MakeContainer(ctx context.Context, rt *libpod.Runtime, s *specgen.SpecGener
|
||||
logrus.Debugf("setting container name %s", s.Name)
|
||||
options = append(options, libpod.WithName(s.Name))
|
||||
}
|
||||
if len(s.DevicesFrom) > 0 {
|
||||
for _, dev := range s.DevicesFrom {
|
||||
ctr, err := rt.GetContainer(dev)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
devices := ctr.DeviceHostSrc()
|
||||
s.Devices = append(s.Devices, devices...)
|
||||
}
|
||||
}
|
||||
if len(s.Devices) > 0 {
|
||||
opts = extractCDIDevices(s)
|
||||
options = append(options, opts...)
|
||||
@ -174,6 +187,9 @@ func MakeContainer(ctx context.Context, rt *libpod.Runtime, s *specgen.SpecGener
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
if len(s.HostDeviceList) > 0 {
|
||||
options = append(options, libpod.WithHostDevice(s.HostDeviceList))
|
||||
}
|
||||
return runtimeSpec, s, options, err
|
||||
}
|
||||
func ExecuteCreate(ctx context.Context, rt *libpod.Runtime, runtimeSpec *spec.Spec, s *specgen.SpecGenerator, infra bool, options ...libpod.CtrCreateOption) (*libpod.Container, error) {
|
||||
|
Reference in New Issue
Block a user