Skip to content

Commit

Permalink
pkg/api: honor cdi devices from the hostconfig
Browse files Browse the repository at this point in the history
pass down the devices specifies in the resources block so that CDI
devices in the compose file are honored.

Tested manually with the following compose file:

services:
  testgpupodman_count:
    image: ubuntu:latest
    command: ["nvidia-smi"]
    profiles: [gpu]
    deploy:
      resources:
        reservations:
          devices:
          - driver: nvidia
            count: 1
            capabilities: [gpu]
  testgpupodman_deviceid:
      image: docker.io/ubuntu:latest
      command: ["nvidia-smi"]
      deploy:
        resources:
          reservations:
            devices:
            - driver: cdi
              device_ids: ['nvidia.com/gpu=all']
              capabilities: [gpu]

Closes: containers#19338

Signed-off-by: Giuseppe Scrivano <[email protected]>
  • Loading branch information
giuseppe committed Jan 31, 2025
1 parent 48f8742 commit f4bf555
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 0 deletions.
5 changes: 5 additions & 0 deletions pkg/api/handlers/compat/containers_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,11 @@ func cliOpts(cc handlers.CreateContainerConfig, rtc *config.Config) (*entities.C
for _, dev := range cc.HostConfig.Devices {
devices = append(devices, fmt.Sprintf("%s:%s:%s", dev.PathOnHost, dev.PathInContainer, dev.CgroupPermissions))
}
for _, r := range cc.HostConfig.Resources.DeviceRequests {
if r.Driver == "cdi" {
devices = append(devices, r.DeviceIDs...)
}
}

// iterate blkreaddevicebps
readBps := make([]string, 0, len(cc.HostConfig.BlkioDeviceReadBps))
Expand Down
9 changes: 9 additions & 0 deletions test/compose/cdi_device/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
cdi devices
===========

This test copies a CDI device file on a tmpfs mounted on /etc/cdi, then checks that the CDI device in the compose file is present in a container. When running as rootless, the mount is created inside the rootless mount namespasce.

Validation
------------

* The CDI device is present in the container.
14 changes: 14 additions & 0 deletions test/compose/cdi_device/device.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"cdiVersion": "0.3.0",
"kind": "vendor.com/device",
"devices": [
{
"name": "myKmsg",
"containerEdits": {
"mounts": [
{"hostPath": "/dev/kmsg", "containerPath": "/dev/kmsg1", "options": ["rw", "rprivate", "rbind"]}
]
}
}
]
}
11 changes: 11 additions & 0 deletions test/compose/cdi_device/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
services:
test:
image: alpine
command: ["top"]
deploy:
resources:
reservations:
devices:
- driver: cdi
device_ids: ['vendor.com/device=myKmsg']
capabilities: []
9 changes: 9 additions & 0 deletions test/compose/cdi_device/setup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
if is_rootless; then
reason=" - can't write to /etc/cdi"
_show_ok skip "$testname # skip$reason"
exit 0
fi

mkdir -p /etc/cdi
mount -t tmpfs tmpfs /etc/cdi
cp device.json /etc/cdi
4 changes: 4 additions & 0 deletions test/compose/cdi_device/teardown.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
if ! is_rootless; then
umount /etc/cdi
rmdir /etc/cdi || true # do not return an error if the directory is non-empty
fi
5 changes: 5 additions & 0 deletions test/compose/cdi_device/tests.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# -*- bash -*-

ctr_name="cdi_device-test-1"

podman exec "$ctr_name" sh -c 'test /dev/ksmg1'

0 comments on commit f4bf555

Please sign in to comment.