diff --git a/OpenApi.yml b/OpenApi.yml index 2a30332..98c9536 100644 --- a/OpenApi.yml +++ b/OpenApi.yml @@ -354,6 +354,11 @@ components: items: type: string example: all + devices: + type: array + items: + type: string + example: /dev/dri/renderD128 RoomSettings: type: object diff --git a/client/src/api/api.ts b/client/src/api/api.ts index 56b01ad..c1640d0 100644 --- a/client/src/api/api.ts +++ b/client/src/api/api.ts @@ -375,6 +375,12 @@ export interface RoomResources { * @memberof RoomResources */ 'gpus'?: Array; + /** + * + * @type {Array} + * @memberof RoomResources + */ + 'devices'?: Array; } /** * diff --git a/client/src/components/RoomInfo.vue b/client/src/components/RoomInfo.vue index 35909c1..d5e659f 100644 --- a/client/src/components/RoomInfo.vue +++ b/client/src/components/RoomInfo.vue @@ -174,6 +174,7 @@ CPU Shares {{ settings.resources.cpu_shares }}--undefined-- Shared memory {{ settings.resources.shm_size | memory }} GPUs {{ settings.resources.gpus.join(",") }}--not used-- + Devices {{ settings.resources.devices.join(",") }}--none-- diff --git a/client/src/components/RoomsCreate.vue b/client/src/components/RoomsCreate.vue index 06c2804..41cea66 100644 --- a/client/src/components/RoomsCreate.vue +++ b/client/src/components/RoomsCreate.vue @@ -351,6 +351,7 @@ :max="20*1e9" :step="0.2*1e9" color="blue" + hide-details > diff --git a/client/src/store/state.ts b/client/src/store/state.ts index 1ba4398..8bc22ad 100644 --- a/client/src/store/state.ts +++ b/client/src/store/state.ts @@ -75,6 +75,7 @@ export const state = { memory: 0, // eslint-disable-next-line shm_size: 2000000000, + devices: [], }, } as RoomSettings, videoCodecs: [ diff --git a/internal/room/manager.go b/internal/room/manager.go index 930fde1..193a31c 100644 --- a/internal/room/manager.go +++ b/internal/room/manager.go @@ -401,6 +401,19 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro deviceRequests = append(deviceRequests, gpuOpts.Value()...) } + // + // Set container devices + // + + var devices []container.DeviceMapping + for _, device := range settings.Resources.Devices { + devices = append(devices, container.DeviceMapping{ + PathOnHost: device, + PathInContainer: device, + CgroupPermissions: "rwm", + }) + } + // // Set container configs // @@ -447,6 +460,7 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro NanoCPUs: settings.Resources.NanoCPUs, Memory: settings.Resources.Memory, DeviceRequests: deviceRequests, + Devices: devices, }, // Privileged Privileged: isPrivilegedImage, @@ -610,12 +624,23 @@ func (manager *RoomManagerCtx) GetSettings(id string) (*types.RoomSettings, erro } } + devices := []string{} + for _, dev := range container.HostConfig.Devices { + // TODO: dev.CgroupPermissions + if dev.PathOnHost == dev.PathInContainer { + devices = append(devices, dev.PathOnHost) + } else { + devices = append(devices, fmt.Sprintf("%s:%s", dev.PathOnHost, dev.PathInContainer)) + } + } + roomResources = types.RoomResources{ CPUShares: container.HostConfig.CPUShares, NanoCPUs: container.HostConfig.NanoCPUs, ShmSize: container.HostConfig.ShmSize, Memory: container.HostConfig.Memory, Gpus: gpus, + Devices: devices, } } diff --git a/internal/types/room.go b/internal/types/room.go index b17b8ff..e5038af 100644 --- a/internal/types/room.go +++ b/internal/types/room.go @@ -67,6 +67,7 @@ type RoomResources struct { ShmSize int64 `json:"shm_size"` // in bytes Memory int64 `json:"memory"` // in bytes Gpus []string `json:"gpus"` // gpu opts + Devices []string `json:"devices"` } type RoomSettings struct {