Merge pull request #4 from kasmtech/feature/KASM-4200-113-updates

KASM-4200 Updates for 1.13 release
This commit is contained in:
j-travis 2023-03-28 08:27:34 -04:00 committed by GitHub
commit e599398710
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 88 deletions

View file

@ -60,7 +60,7 @@ async function installerBlobs() {
installerBlobs();
// GPU image yaml merging
async function setGpu(imagesD) {
async function setGpu(imagesI) {
if (upgradeSettings['forceGpu'] !== undefined) {
installSettings = upgradeSettings;
}
@ -73,24 +73,17 @@ async function setGpu(imagesD) {
if (gpuName.indexOf('NVIDIA') !== -1) {
baseRun = JSON.parse('{"environment":{"KASM_EGL_CARD":"/dev/dri/card' + card + '","KASM_RENDERD":"/dev/dri/renderD' + render + '"},"devices":["/dev/dri/card' + card + ':/dev/dri/card' + card + ':rwm","/dev/dri/renderD' + render + ':/dev/dri/renderD' + render + ':rwm"],"device_requests":[{"driver": "","count": -1,"device_ids": null,"capabilities":[["gpu"]],"options":{}}]}');
} else {
baseRun = JSON.parse('{"environment":{"KASM_EGL_CARD":"/dev/dri/card' + card + '","KASM_RENDERD":"/dev/dri/renderD' + render + '"},"devices":["/dev/dri/card' + card + ':/dev/dri/card' + card + ':rwm","/dev/dri/renderD' + render + ':/dev/dri/renderD' + render + ':rwm"]}');
baseRun = JSON.parse('{"environment":{"DRINODE":"/dev/dri/renderD' + render + '", "HW3D": true},"devices":["/dev/dri/card' + card + ':/dev/dri/card' + card + ':rwm","/dev/dri/renderD' + render + ':/dev/dri/renderD' + render + ':rwm"]}');
}
let baseExec = JSON.parse('{"first_launch":{"user":"root","cmd": "bash -c \'chown -R kasm-user:kasm-user /dev/dri/*\'"}}');
for await (let image of Object.keys(images.images)) {
if (imagesD.images[image]['run_config']) {
finalRun = _.merge(JSON.parse(imagesD.images[image]['run_config']), baseRun)
} else {
finalRun = baseRun;
}
if (imagesD.images[image]['exec_config']) {
finalExec = _.merge(JSON.parse(imagesD.images[image]['exec_config']), baseExec)
} else {
finalExec = baseExec;
}
imagesD.images[image]['run_config'] = JSON.stringify(finalRun);
imagesD.images[image]['exec_config'] = JSON.stringify(finalExec);
for (var i=0; i<imagesI.images.length; i++) {
console.log(imagesI.images[i]['run_config']);
finalRun = _.merge(imagesI.images[i]['run_config'], baseRun)
finalExec = _.merge(imagesI.images[i]['exec_config'], baseExec)
imagesI.images[i]['run_config'] = finalRun;
imagesI.images[i]['exec_config'] = finalExec;
}
return imagesD;
return imagesI;
}
//// Http server ////
@ -111,37 +104,19 @@ io.on('connection', async function (socket) {
async function install(data) {
// Determine install settings
installSettings = data[0];
let imagesI = data[1];
let imagesD = images;
installFlags = ['/kasm_release/install.sh', '-A', '-B' ,'-H', '-e', '-L', port, '-P', installSettings.adminPass, '-U', installSettings.userPass];
if (installSettings.useRolling == true) {
installFlags.push('-O');
}
if ((installSettings.noDownload == true) || (imagesI == false)) {
installFlags.push('-u');
}
if ((imagesI.hasOwnProperty('images')) && (Object.keys(imagesI.images).length < 10)) {
var imagesI = data[1];
installFlags = ['/kasm_release/install.sh', '-W', '-A', '-B' ,'-H', '-e', '-L', port, '-P', installSettings.adminPass, '-U', installSettings.userPass];
if ((imagesI.hasOwnProperty('images')) && (imagesI.images.length < 10)) {
installFlags.push('-b');
}
// Flag the images properly based on selection
for await (let image of Object.keys(images.images)) {
if ((imagesI.hasOwnProperty('images')) && (imagesI.images.hasOwnProperty(image))) {
imagesD.images[image].enabled = true;
imagesD.images[image].hidden = false;
} else {
imagesD.images[image].enabled = false;
imagesD.images[image].hidden = true;
}
}
// GPU yaml merge
if (installSettings.forceGpu !== 'disabled') {
imagesD = await setGpu(imagesD);
imagesI = await setGpu(imagesI);
}
// Write finalized image data
let yamlStr = yaml.dump(imagesD);
let yamlStr = yaml.dump(imagesI);
await fsw.writeFile('/kasm_release/conf/database/seed_data/default_images_' + arch + '.yaml', yamlStr);
// Copy over version
@ -163,8 +138,7 @@ io.on('connection', async function (socket) {
async function upgrade(data) {
// Determine upgrade settings
upgradeSettings = data[0];
let imagesI = data[1];
let imagesD = images;
var imagesI = data[1];
upgradeFlags = ['/kasm_release/upgrade.sh', '-A', '-L', port];
if (upgradeSettings.keepOldImages == true) {
upgradeFlags.push('-K');
@ -172,24 +146,13 @@ io.on('connection', async function (socket) {
upgradeFlags.push('-U');
}
// Flag the images properly based on selection
for await (let image of Object.keys(images.images)) {
if ((imagesI.hasOwnProperty('images')) && (imagesI.images.hasOwnProperty(image))) {
imagesD.images[image].enabled = true;
imagesD.images[image].hidden = false;
} else {
imagesD.images[image].enabled = false;
imagesD.images[image].hidden = true;
}
}
// GPU yaml merge
if (upgradeSettings.forceGpu !== 'disabled') {
imagesD = await setGpu(imagesD);
imagesI = await setGpu(imagesI);
}
// Write finalized image data
let yamlStr = yaml.dump(imagesD);
let yamlStr = yaml.dump(imagesI);
await fsw.writeFile('/kasm_release/conf/database/seed_data/default_images_' + arch + '.yaml', yamlStr);
// Copy over version

View file

@ -27,15 +27,15 @@ async function install() {
showTerminal()
titleChange('Installing');
// Create new object based on image selection
let selectedImages = {images: {}};
let selectedImages = {alembic_version: images.alembic_version, images: [], group_images: []};
if (installImages.length == 0) {
socket.emit('install', [installSettings, false]);
} else {
for await (let image of installImages) {
if (images.images[image].hasOwnProperty('enabled')) {
images.images[image].enabled = true;
}
Object.assign(selectedImages.images, {[image]: images.images[image]});
let srcImage = images.images.find(x => x.friendly_name === image);
srcImage['enabled'] = true;
selectedImages.images.push(srcImage);
selectedImages.group_images.push({image_id: srcImage.image_id, group_id: "68d557ac-4cac-42cc-a9f3-1c7c853de0f3"});
}
socket.emit('install', [installSettings, selectedImages]);
}
@ -46,15 +46,15 @@ async function upgrade() {
showTerminal()
titleChange('Upgrading');
// Create new object based on image selection
let selectedImages = {images: {}};
let selectedImages = {alembic_version: images.alembic_version, images: [], group_images: []};
if (installImages.length == 0) {
socket.emit('upgrade', [upgradeSettings, false]);
} else {
for await (let image of installImages) {
if (images.images[image].hasOwnProperty('enabled')) {
images.images[image].enabled = true;
}
Object.assign(selectedImages.images, {[image]: images.images[image]});
let srcImage = images.images.find(x => x.friendly_name === image);
srcImage['enabled'] = true;
selectedImages.images.push(srcImage);
selectedImages.group_images.push({image_id: srcImage.image_id, group_id: "68d557ac-4cac-42cc-a9f3-1c7c853de0f3"});
}
socket.emit('upgrade', [upgradeSettings, selectedImages]);
}
@ -228,14 +228,6 @@ async function pickSettings() {
$('<label>', {for: 'userPass'}).text('user@kasm.local Password: '),
$('<input>', {name: 'userPass', id: 'userPass', type: 'password', placeholder: 'required'}).prop('required',true)
]);
let useRolling = $('<div>', {class: 'form-group'}).append([
$('<label>', {for: 'useRolling'}).text('Use Rolling Images: '),
$('<input>', {name: 'useRolling', id: 'useRolling', type: 'checkbox'})
]);
let noDownload = $('<div>', {class: 'form-group'}).append([
$('<label>', {for: 'noDownload'}).text('Skip Image Download: '),
$('<input>', {name: 'noDownload', id: 'noDownload', type: 'checkbox'})
]);
let gpuOptions = [$('<option>', {value: 'disabled'}).text('Disabled')];
for await (let card of Object.keys(gpus)) {
gpuOptions.push($('<option>', {value: card + '|' + gpus[card]}).text(card + ' - ' + gpus[card]));
@ -250,8 +242,6 @@ async function pickSettings() {
fieldset.append([
adminPass,
userPass,
useRolling,
noDownload,
forceGpu,
submit
]);
@ -262,8 +252,6 @@ async function pickSettings() {
e.preventDefault();
installSettings.adminPass = $('#adminPass').val();
installSettings.userPass = $('#userPass').val();
installSettings.useRolling = $('#useRolling').is(":checked");
installSettings.noDownload = $('#noDownload').is(":checked");
installSettings.forceGpu = $('#forceGpu').val();
pickImages(false);
});
@ -323,15 +311,15 @@ async function pickImages(upgrade) {
titleChange('Image Selection');
let imagesDiv = $('<div>', {class: 'cardcontainer', id: 'images'});
$('#container').append(imagesDiv);
for await (let image of Object.keys(images.images).sort(Intl.Collator().compare)) {
let imageName = $('<p>').text(image);
for await (let image of images.images) {
let imageName = $('<p>').text(image.friendly_name);
let imageDiv = $('<div>', {
class: 'card',
id: image.replace(new RegExp(' ', 'g'), '_'),
title: images.images[image].description,
onclick: 'selectImage(\'' + image.replace(new RegExp(' ', 'g'), '_') + '\')'
id: image.friendly_name.replace(new RegExp(' ', 'g'), '_').replace('.', '-'),
title: image.description,
onclick: 'selectImage(\'' + image.friendly_name.replace(new RegExp(' ', 'g'), '_').replace('.', '-') + '\')'
}).append(imageName).css('filter', 'grayscale(100%)')
let thumb = $('<img>', {class: 'thumb', src: 'public/' + images.images[image].image_src});
let thumb = $('<img>', {class: 'thumb', src: 'public/' + image.image_src});
imageDiv.append(thumb);
$('#images').append(imageDiv);
}
@ -345,7 +333,7 @@ async function pickImages(upgrade) {
// Select an individual image
function selectImage(image) {
let imageKey = image.replace(new RegExp('_', 'g'), ' ');
let imageKey = image.replace(new RegExp('_', 'g'), ' ').replace('-', '.');
if (installImages.includes(imageKey)) {
installImages = installImages.filter(e => e !== imageKey)
$('#' + image).css({
@ -366,8 +354,8 @@ function selectAll() {
installImages = [];
if (selected) {
selected = false;
for (let image of Object.keys(images.images)) {
let imageElem = image.replace(new RegExp(' ', 'g'), '_');
for (let image of images.images) {
let imageElem = image.friendly_name.replace(new RegExp(' ', 'g'), '_').replace('.', '-');
$('#' + imageElem).css({
filter: 'grayscale(100%)',
background: ''
@ -375,9 +363,9 @@ function selectAll() {
}
} else {
selected = true;
for (let image of Object.keys(images.images)) {
let imageElem = image.replace(new RegExp(' ', 'g'), '_');
installImages.push(image);
for (let image of images.images) {
let imageElem = image.friendly_name.replace(new RegExp(' ', 'g'), '_').replace('.', '-');
installImages.push(image.friendly_name);
$('#' + imageElem).css({
filter: '',
background: '#89cff0'