Skip to content
This repository was archived by the owner on May 9, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ defaults:
enabled: true
loopbackVideo:
enabled: true
hostSharedMemory:
enabled: true
phone:
enabled: false
sims: '1'
Expand Down
5 changes: 5 additions & 0 deletions schemas/v1/payload.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,11 @@
"title": "Loopback Audio device",
"description": "Audio loopback device created using snd-aloop",
"type": "boolean"
},
"hostSharedMemory": {
"title": "Host shared memory device (Experimental)",
"description": "Mount /dev/shm from the host in the container.",
"type": "boolean"
}
}
}
Expand Down
5 changes: 5 additions & 0 deletions src/lib/devices/device_manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ const Debug = require('debug');
const VideoDeviceManager = require('./video_device_manager');
const AudioDeviceManager = require('./audio_device_manager');
const CpuDeviceManager = require('./cpu_device_manager');
const SharedMemoryDeviceManager = require('./shared_memory_device_manager');

let debug = Debug('taskcluster-docker-worker:deviceManager');

const DEVICE_MANAGERS = {
'loopbackVideo': VideoDeviceManager,
'loopbackAudio': AudioDeviceManager,
'cpu': CpuDeviceManager,
'hostSharedMemory': SharedMemoryDeviceManager
};


Expand Down Expand Up @@ -42,6 +44,9 @@ class DeviceManager {

async getAvailableCapacity() {
let devices = await Promise.all(Object.keys(this.managers).map(async (manager) => {
if (this.managers[manager].unlimitedDevices) {
return Infinity;
}
let availableDevices = await this.managers[manager].getAvailableDevices();
return availableDevices.length;
}));
Expand Down
41 changes: 41 additions & 0 deletions src/lib/devices/shared_memory_device_manager.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
const Debug = require('debug');

let debug = Debug('taskcluster-docker-worker:devices:sharedMemoryManager');

class SharedMemoryDeviceManager {
constructor() {
this.devices = [new SharedMemoryDevice()];
this.unlimitedDevices = true;
}

getAvailableDevice() {
let devices = this.getAvailableDevices();
let device = devices[0];
device.acquire();

debug(`Device: ${device.path} acquired`);

return device;
}

getAvailableDevices() {
return this.devices;
}
}

class SharedMemoryDevice {
constructor() {
this.mountPoints = [
'/dev/shm'
];
}

acquire() {}

release() {
debug('Device: /dev/shm released');
}

}

module.exports = SharedMemoryDeviceManager;
30 changes: 30 additions & 0 deletions test/integration/device_link_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,4 +174,34 @@ suite('device linking within containers', () => {
`Worker should just capacity based on the number of devices that could be found:\n${message}`
);
});

test.skip('/dev/shm is shared with the host', async () => {
worker = new TestWorker(DockerWorker);
await worker.launch();
let task = {
scopes: ['docker-worker:capability:device:hostSharedMemory'],
payload: {
capabilities: {
devices: {
hostSharedMemory: true
}
},
image: 'ubuntu:14.10',
command: cmd(
'mount | grep dev/shm',
'mount | grep dev/shm | grep -vq size= || { echo \'/dev/shm should not contain size\'; exit 1; }'
),
maxRunTime: 5 * 60
}
};

let result = await worker.postToQueue(task);

assert.equal(result.status.state, 'completed', 'Task state is not marked as completed');
assert.equal(
result.run.reasonResolved,
'completed',
'Task not resolved as complete'
);
});
});