From b63e038f10c598e263d3e3bd7dc1524392467fb6 Mon Sep 17 00:00:00 2001 From: John Haverlack Date: Sun, 8 Feb 2026 11:18:26 -0900 Subject: [PATCH 1/5] Start v0.3.9 --- README.md | 2 +- docs/DESIGN.md | 2 +- metadata.json | 2 +- sdl-mgr/app/package.json | 2 +- sdl-wkr/app/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2385611..63e6b2a 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ | **Author** | John Haverlack | | **Copyright** | 2026 John Haverlack | | **License** | MIT | -| **Version** | 0.3.8 | +| **Version** | 0.3.9 | | **Date** | 2026-02-08 | ## Overview diff --git a/docs/DESIGN.md b/docs/DESIGN.md index df5a246..f3080dc 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -5,7 +5,7 @@ | **Author** | John Haverlack | | **Copyright** | 2026 John Haverlack | | **License** | MIT | -| **Version** | 0.3.8 | +| **Version** | 0.3.9 | | **Date** | 2026-02-08 | ## Overview diff --git a/metadata.json b/metadata.json index e60810b..6ed1abc 100644 --- a/metadata.json +++ b/metadata.json @@ -3,7 +3,7 @@ "name": "sdl", "description": "Software Defined Laboratory", "abbr": "SDL", - "version": "0.3.8", + "version": "0.3.9", "version_date": "2026-02-08", "maturity": "ALPHA", "author": "John Haverlack", diff --git a/sdl-mgr/app/package.json b/sdl-mgr/app/package.json index 94c0a84..127d102 100644 --- a/sdl-mgr/app/package.json +++ b/sdl-mgr/app/package.json @@ -1,6 +1,6 @@ { "name": "sdl-mgr", - "version": "0.3.8", + "version": "0.3.9", "version_date": "2026-02-08", "description": "Software Defined Laboratory: Manager (sdl-mgr)", "main": "index.js", diff --git a/sdl-wkr/app/package.json b/sdl-wkr/app/package.json index 25821ae..fd93636 100644 --- a/sdl-wkr/app/package.json +++ b/sdl-wkr/app/package.json @@ -1,7 +1,7 @@ { "name": "sdl-wkr", "description": "Software Defined Laboratory: Worker (sdl-wkr)", - "version": "0.3.8", + "version": "0.3.9", "version_date": "2026-02-08", "main": "index.js", "type": "module", From b69513019bcbb1ade5144e09e4aceaa985b126d0 Mon Sep 17 00:00:00 2001 From: John Haverlack Date: Sun, 8 Feb 2026 15:38:01 -0900 Subject: [PATCH 2/5] System Columnn Display --- README.md | 9 +++- changelog.json | 7 +++ docs/CHANGELOG.md | 28 +++++++++- sdl-mgr/app/modules/sdl-mgr/index.js | 26 +--------- sdl-mgr/html/js/dash.js | 77 ++++++++++++++++------------ sdl-mgr/html/md/changelog.md | 28 +++++++++- sdl-wkr/app/modules/sdl-wkr/index.js | 9 +++- 7 files changed, 118 insertions(+), 66 deletions(-) diff --git a/README.md b/README.md index 63e6b2a..73bd9d7 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,14 @@ Or to get the install command from the beacon message: nc -u -l -k 10101 | jq -r '.msg.sdl_wkr_install_cmd[]' ``` -> NOTE: CTRL-C to exit `nc`. You cannot run `nc` on port 10101 in parallel with the sdl-wkr. So run it once to get the install command. Tnen install sdl-wkr. +**NOTE**: If you use UFW or a local firewall, you must allow SDL Worker to listen on UDP port 10101. + +``` +sudo ufw allow in proto udp from to any port 10101 +``` + +> **NOTE**: CTRL-C to exit `nc`. You cannot run `nc` on port 10101 in parallel with the sdl-wkr. So run it once to get the install command. Tnen install sdl-wkr. + Run the **curl** or **wget** command provided by SDL Manager UDP beacon to install SDL Worker locally. diff --git a/changelog.json b/changelog.json index caf96f4..d939605 100644 --- a/changelog.json +++ b/changelog.json @@ -1,5 +1,12 @@ { "releases": [ + { + "version": "0.3.9", + "date": "2026-02-08", + "maturity": "ALPHA", + "summary": "", + "notes": "" + }, { "version": "0.3.8", "date": "2026-02-01", diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index e950d88..62516b1 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -5,11 +5,35 @@ | **Author** | John Haverlack | | **Copyright** | 2026 John Haverlack | | **License** | MIT | -| **Version** | 0.3.8 | -| **Date** | 2026-02-01 | +| **Version** | 0.3.9 | +| **Date** | 2026-02-08 | + +## v0.3.9 - 2026-02-08 (ALPHA) + +- Start v0.3.9 ## v0.3.8 - 2026-02-01 (ALPHA) +- v0.3.8 +- Refactoing Worker Dashboard +- Refactoing Worker Dashboard +- Refactored Cluster Status +- Refactor of telemetry format + hw detection +- Switched Panel Icon to Bootstrap Icon +- Updating Worker Telemetry +- CP +- Fixing Wget/Curl Command Installer Port +- Fixing Wget/Curl Command Installer Port +- Fixing Wkr Start / Stop +- Update stop-sdl-wkr.sh +- WIP Install / Start / Stop +- WIP Install / Start /Stop +- Systemd Detectiion in Start/Stop/Status +- WIP: Start / Stop Scripts +- Non Systemd start stop scripts +- WIP: start stop scripts +- Updating Task List +- Adding Screeshot to README - Start v0.3.8 ## v0.3.7 - 2026-02-01 (ALPHA) diff --git a/sdl-mgr/app/modules/sdl-mgr/index.js b/sdl-mgr/app/modules/sdl-mgr/index.js index e152706..fbb31eb 100644 --- a/sdl-mgr/app/modules/sdl-mgr/index.js +++ b/sdl-mgr/app/modules/sdl-mgr/index.js @@ -557,31 +557,7 @@ function startTelemetryListener() { const now = new Date(); // ✅ Build/update worker state from telemetry - workersState[sdl_id] = { - sdl_id: sdl_id, - hostname: hostname, - role: telemetry.role, - last_seen: now.toISOString(), // ✅ ISO string - last_seen_utime: Math.floor(now.getTime() / 1000), // ✅ Unix timestamp (seconds) - - // System info - platform: telemetry.msg?.system?.platform, - arch: telemetry.msg?.system?.arch, - distro: telemetry.msg?.system?.distro, - hardware: telemetry.msg?.system?.hardware, - - // Uptime - uptime: telemetry.msg?.uptime, - - // Resources - resources: telemetry.msg?.resources, - - // Usage - usage: telemetry.msg?.usage, - - // Load - load: telemetry.msg?.load - }; + workersState[sdl_id] = telemetry } catch (err) { log(`${module}: failed to process telemetry: ${err}`); diff --git a/sdl-mgr/html/js/dash.js b/sdl-mgr/html/js/dash.js index 7689997..1a8edb5 100644 --- a/sdl-mgr/html/js/dash.js +++ b/sdl-mgr/html/js/dash.js @@ -513,57 +513,65 @@ function renderWorkersTable(msg) { const staleThresholdSec = 60; for (const [sdl_id, worker] of Object.entries(workers)) { - const ageSec = nowSec - worker.last_seen_utime; + const ageSec = nowSec - worker.ts_utime; // ✅ Use ts_utime from telemetry const isActive = ageSec <= staleThresholdSec; // Status badge const statusBadge = isActive ? 'Active' - : 'Inactive'; // ✅ Red instead of grey + : 'Inactive'; - // Hardware info - const hwType = worker.hardware?.type || 'unknown'; - const hwIcon = hwType === 'hw' ? '🖥️' : hwType === 'vm' ? '💠' : '❓'; - const hwManuf = worker.hardware?.manufacturer || 'Unknown'; - const hwModel = worker.hardware?.model || 'Unknown'; + // ✅ Hardware info from nested msg.system.hardware + const hwType = worker.msg?.system?.hardware?.type || 'unknown'; + // const hwIcon = hwType === 'hw' ? '🖥️' : hwType === 'vm' ? '💠' : '❓'; + const hwIcon = hwType === 'hw' ? '' : + hwType === 'vm' ? '' : + ''; + const hwManuf = worker.msg?.system?.hardware?.manufacturer || 'Unknown'; + const hwModel = worker.msg?.system?.hardware?.model || 'Unknown'; + const hwCPU = worker.msg?.system?.hardware?.cpu || 'Unknown'; - // ✅ Full hardware display with model const hardwareDisplay = hwType === 'vm' ? `${hwIcon} ${hwModel}` : `${hwIcon} ${hwManuf} ${hwModel}`; - // ✅ OS info - const osDistro = worker.distro || 'Unknown'; - const osArch = worker.arch || 'unknown'; - const osPlatform = worker.platform || 'unknown'; + // ✅ OS info from nested msg.system + const osDistro = worker.msg?.system?.distro.replace(/\(\S+\)/, '') || 'Unknown'; + const osArch = worker.msg?.system?.arch || 'unknown'; + const osPlatform = worker.msg?.system?.platform || 'unknown'; + const platformIcon = osPlatform === 'linux' ? '' : + osPlatform === 'win32' ? '' : + osPlatform === 'darwin' ? '' : + ''; - // CPU - const cpuAvail = worker.resources?.cpus?.available || 0; - const cpuTotal = worker.resources?.cpus?.allocated || 0; - const cpuUsed = worker.usage?.cpu?.total || 0; + const osDisplay = `${platformIcon} ${osDistro} (${osArch})`; - // Memory - const memAvail = worker.resources?.memory?.available || 0; - const memTotal = worker.resources?.memory?.allocated || 0; - const memUsed = worker.usage?.memory?.used || 0; + // ✅ CPU from nested msg.resources and msg.usage + const cpuAvail = worker.msg?.resources?.cpus?.available || 0; + const cpuTotal = worker.msg?.resources?.cpus?.allocated || 0; + const cpuUsed = worker.msg?.usage?.cpu?.total || 0; + + // ✅ Memory from nested msg + const memAvail = worker.msg?.resources?.memory?.available || 0; + const memTotal = worker.msg?.resources?.memory?.allocated || 0; const memAvailGB = Math.round(memAvail / (1024 * 1024 * 1024)); const memTotalGB = Math.round(memTotal / (1024 * 1024 * 1024)); - const memPercent = worker.usage?.memory?.percent_used || 0; + const memPercent = worker.msg?.usage?.memory?.percent_used || 0; - // GPU - const gpuAvail = worker.resources?.gpus?.available || 0; - const gpuTotal = worker.resources?.gpus?.allocated || 0; - const gpuData = worker.usage?.gpu; + // ✅ GPU from nested msg + const gpuAvail = worker.msg?.resources?.gpus?.available || 0; + const gpuTotal = worker.msg?.resources?.gpus?.allocated || 0; + const gpuData = worker.msg?.usage?.gpu; const gpuUsed = gpuData?.total_utilization || 0; const gpuMemMB = gpuData?.total_memory_total_mb || 0; const gpuMemGB = Math.round(gpuMemMB / 1024); - // Uptime - const procUptime = worker.uptime?.proc_dhms || 'N/A'; - const sysUptime = worker.uptime?.sys_dhms || 'N/A'; + // ✅ Uptime from nested msg.uptime + const procUptime = worker.msg?.uptime?.proc_dhms || 'N/A'; + const sysUptime = worker.msg?.uptime?.sys_dhms || 'N/A'; - // ✅ Last seen age + // Last seen age const days = Math.floor(ageSec / 86400); const hours = Math.floor((ageSec % 86400) / 3600); const minutes = Math.floor((ageSec % 3600) / 60); @@ -577,15 +585,16 @@ function renderWorkersTable(msg) { html += ''; - // ✅ Hostname column with hardware underneath + // System column html += ` - ${worker.hostname}
- ${worker.sdl_id}
+ ${worker.host}
+ ${worker.sdl_id.substring(0, 8)}...
${hardwareDisplay}
- ${osDistro} ${osArch} ${osPlatform} + ${memTotalGB} GB | ${cpuTotal}x ${hwCPU}}
+ ${osDisplay} `; - // ✅ Status column with uptime and last seen + // Status column html += ` ${statusBadge}
SDL: ${procUptime}
diff --git a/sdl-mgr/html/md/changelog.md b/sdl-mgr/html/md/changelog.md index e950d88..62516b1 100644 --- a/sdl-mgr/html/md/changelog.md +++ b/sdl-mgr/html/md/changelog.md @@ -5,11 +5,35 @@ | **Author** | John Haverlack | | **Copyright** | 2026 John Haverlack | | **License** | MIT | -| **Version** | 0.3.8 | -| **Date** | 2026-02-01 | +| **Version** | 0.3.9 | +| **Date** | 2026-02-08 | + +## v0.3.9 - 2026-02-08 (ALPHA) + +- Start v0.3.9 ## v0.3.8 - 2026-02-01 (ALPHA) +- v0.3.8 +- Refactoing Worker Dashboard +- Refactoing Worker Dashboard +- Refactored Cluster Status +- Refactor of telemetry format + hw detection +- Switched Panel Icon to Bootstrap Icon +- Updating Worker Telemetry +- CP +- Fixing Wget/Curl Command Installer Port +- Fixing Wget/Curl Command Installer Port +- Fixing Wkr Start / Stop +- Update stop-sdl-wkr.sh +- WIP Install / Start / Stop +- WIP Install / Start /Stop +- Systemd Detectiion in Start/Stop/Status +- WIP: Start / Stop Scripts +- Non Systemd start stop scripts +- WIP: start stop scripts +- Updating Task List +- Adding Screeshot to README - Start v0.3.8 ## v0.3.7 - 2026-02-01 (ALPHA) diff --git a/sdl-wkr/app/modules/sdl-wkr/index.js b/sdl-wkr/app/modules/sdl-wkr/index.js index 79d684c..13c06c5 100644 --- a/sdl-wkr/app/modules/sdl-wkr/index.js +++ b/sdl-wkr/app/modules/sdl-wkr/index.js @@ -391,9 +391,13 @@ function publishTelemetry(topic) { ? Math.round(perCpuUsage.reduce((sum, usage) => sum + usage, 0) / perCpuUsage.length) : 0; + const now = new Date(); + const telemetry = { - ts: new Date().toISOString(), + ts: now.toISOString(), + ts_utime: Math.floor(now.getTime() / 1000), sdl_id: config.identity.sdl_id, + sdl_ver: config.sdl.version, role: 'sdl-wkr', host: config.identity.hostname, type: 'worker-telemetry', @@ -511,7 +515,8 @@ function getSystemHardware() { const hardware = { type: 'unknown', manufacturer: 'Unknown', - model: 'Unknown' + model: 'Unknown', + cpu: config.host.cpu.model }; // Only run Linux-specific detection on Linux From 6fa62c6d47238d2f52315528aa496eb212326d70 Mon Sep 17 00:00:00 2001 From: John Haverlack Date: Sun, 8 Feb 2026 16:59:36 -0900 Subject: [PATCH 3/5] Refactor Cluster Status Dash --- sdl-mgr/html/js/dash.js | 323 +++++++++++++++++++++++++++------------- sdl-mgr/html/md/dash.md | 9 +- 2 files changed, 224 insertions(+), 108 deletions(-) diff --git a/sdl-mgr/html/js/dash.js b/sdl-mgr/html/js/dash.js index 1a8edb5..eb21fcd 100644 --- a/sdl-mgr/html/js/dash.js +++ b/sdl-mgr/html/js/dash.js @@ -54,14 +54,14 @@ if (Array.isArray(config.host.gpu) && config.host.gpu.length > 0) { // Hostinfo: hostname, cpu, cores, ram, os const hostinfo = { - "hostname": '' + config.host.hostname + '', "sdl_id": '' + config.identity.sdl_id + '', - "cpu cores": '' + config.host.cpu.cores_logical + ' ' + config.host.cpu.model + '', - // "cores": config.host.cpu.cores_logical, - "ram": '' + config.host.memory.total_gb + ' GB ', - "gpu": gpuSummary, - "net": "", - "os": config.host.os.pretty_name + "hostname": '' + config.host.hostname + '', + // "cpu cores": '' + config.host.cpu.cores_logical + ' ' + config.host.cpu.model + '', + // // "cores": config.host.cpu.cores_logical, + // "ram": '' + config.host.memory.total_gb + ' GB ', + // "gpu": gpuSummary, + // "net": "", + // "os": config.host.os.pretty_name } @@ -70,7 +70,7 @@ for (let intf in config.host.network) { if (intf != 'lo') { for (let addr in config.host.network[intf]) { if (config.host.network[intf][addr].family == 'IPv4') { - hostinfo["net"] += '' + config.host.network[intf][addr].cidr + '
'; + hostinfo["net"] += '' + config.host.network[intf][addr].cidr + ' '; } } } @@ -79,12 +79,7 @@ for (let intf in config.host.network) { let host_html = '
Manager
\n'; host_html += '\n'; -// host_html += '\n'; -// host_html += '\n'; -// host_html += '\n'; -// host_html += '\n'; -// host_html += '\n'; -// host_html += '\n'; + host_html += '\n'; for (let key in hostinfo) { @@ -97,7 +92,7 @@ for (let key in hostinfo) { host_html += '\n'; host_html += '
KeyValue
\n'; -document.getElementById('dash-sdl-mgr-info').innerHTML = host_html; +// document.getElementById('dash-sdl-mgr-info').innerHTML = host_html; initMqtt(); @@ -245,9 +240,11 @@ async function initMqtt() { lastSdlStatus = msg; lastSdlTimestamp = Date.parse(msg.ts); renderModulesTable(msg); + // renderClusterSummary(msg); } else if (msg.type === 'cluster-workers') { lastWorkers = msg; renderWorkersTable(msg); + renderClusterSummary(msg); } } catch (e) { @@ -302,109 +299,78 @@ function renderModulesTable(msg) { // // `; - sdl_html += ` - - Name - ${msg.msg.cluster.name} - - `; - - sdl_html += ` - - Description - ${msg.msg.cluster.desc} - - `; - - // Workers stats - const workers = msg.msg.workers || { allocated: 0, available: 0, used: 0 }; - sdl_html += ` - - SDL Workers - - ${workers.available} - - - `; // sdl_html += ` // - // SDL Workers (active/total) + // Name + // ${msg.msg.cluster.name} + // + // `; + + // sdl_html += ` + // + // Description + // ${msg.msg.cluster.desc} + // + // `; + + // Workers stats + // const workers = msg.msg.workers || { allocated: 0, available: 0, used: 0 }; + // sdl_html += ` + // + // SDL Workers // - // ${workers.available} / ${workers.allocated} + // ${workers.available} // // // `; + // CPU resources - const cpus = msg.msg.resources?.cpus || { allocated: 0, available: 0, used: 0 }; - sdl_html += ` - - CPU Cores - - ${cpus.available} - - - `; + // const cpus = msg.msg.resources?.cpus || { allocated: 0, available: 0, used: 0 }; // sdl_html += ` // // CPU Cores // - // ${cpus.available} / ${cpus.allocated} - // ${cpus.used > 0 ? `(${cpus.used} in use)` : ''} + // ${cpus.available} // // // `; - // Memory resources - const memory = msg.msg.resources?.memory || { allocated: 0, available: 0, used: 0 }; - const memAllocGB = Math.round(memory.allocated / (1024 * 1024 * 1024)); - const memAvailGB = Math.round(memory.available / (1024 * 1024 * 1024)); - const memUsedGB = memory.used > 0 ? Math.round(memory.used / 1024) : 0; - sdl_html += ` - - RAM - - ${memAvailGB} GB - - - `; + // Memory resources + // const memory = msg.msg.resources?.memory || { allocated: 0, available: 0, used: 0 }; + // const memAllocGB = Math.round(memory.allocated / (1024 * 1024 * 1024)); + // const memAvailGB = Math.round(memory.available / (1024 * 1024 * 1024)); + // const memUsedGB = memory.used > 0 ? Math.round(memory.used / 1024) : 0; + // sdl_html += ` - // - // RAM (GB) - // - // ${memAvailGB} / ${memAllocGB} GB - // ${memUsedGB > 0 ? `(${memUsedGB} GB in use)` : ''} - // - // - // `; + // + // RAM + // + // ${memAvailGB} GB + // + // + // `; + // GPU resources - const gpus = msg.msg.resources?.gpus || { allocated: 0, available: 0, used: 0 }; - sdl_html += ` - - GPU (VRAM) - - ${gpus.available} - - - `; + // const gpus = msg.msg.resources?.gpus || { allocated: 0, available: 0, used: 0 }; // sdl_html += ` // - // GPU + // GPU (VRAM) // - // ${gpus.available} / ${gpus.allocated} - // ${gpus.used > 0 ? `(${gpus.used} in use)` : ''} + // ${gpus.available} // // // `; - + + sdl_html += ` `; - document.getElementById('dash-sdl-info').innerHTML = sdl_html; + sessionStorage.setItem('dash-sdl-uptime', msg.msg.sdl.uptime); const modules = msg.msg.modules; @@ -431,7 +397,7 @@ function renderModulesTable(msg) { `; - document.getElementById('dash-modules-list').innerHTML = html; + // document.getElementById('dash-modules-list').innerHTML = html; } @@ -450,23 +416,33 @@ function startStatusAgeMonitor() { const ageMs = Date.now() - lastSdlTimestamp; - const ageEl = document.getElementById('dash-modules-age'); + // const ageEl = document.getElementById('dash-modules-age'); + + // if (ageMs > maxAgeMs) { + // ageEl.innerHTML = + // ` + // + // SDL status stale (${Math.round(ageMs / 1000)}s) + // `; + + // markAllModulesDown(); + // } else { + // ageEl.innerHTML = + // ` + // + // SDL online (${Math.round(ageMs / 1000)}s ago) + // `; + // } + + // Save dash-sdl-status to Session Storage if (ageMs > maxAgeMs) { - ageEl.innerHTML = - ` - - SDL status stale (${Math.round(ageMs / 1000)}s) - `; - - markAllModulesDown(); + sessionStorage.setItem('dash-sdl-status', ' ' + Math.round(ageMs / 1000) + 's ago' + ''); } else { - ageEl.innerHTML = - ` - - SDL online (${Math.round(ageMs / 1000)}s ago) - `; + sessionStorage.setItem('dash-sdl-status', ' ' + Math.round(ageMs / 1000) + 's ago'); } + + // sessionStorage.setItem('dash-sdl-status', Math.round(ageMs / 1000) + 's ago'); }, 1000); } @@ -628,4 +604,149 @@ function renderWorkersTable(msg) { html += ''; document.getElementById('dash-sdl-wkrs').innerHTML = html; +} + + +function renderClusterSummary(msg) { + const workers = msg.msg?.workers || {}; + const workerCount = Object.keys(workers).length; + + // Aggregate resources from all workers + let totalCpus = 0; + let totalMemory = 0; + let totalGpus = 0; + let activeCpus = 0; + let activeMemory = 0; + let activeGpus = 0; + let activeWorkers = 0; + + const nowSec = Math.floor(Date.now() / 1000); + const staleThresholdSec = 60; + + for (const worker of Object.values(workers)) { + const ageSec = nowSec - worker.ts_utime; + const isActive = ageSec <= staleThresholdSec; + + // Totals (all workers) + totalCpus += worker.msg?.resources?.cpus?.allocated || 0; + totalMemory += worker.msg?.resources?.memory?.allocated || 0; + totalGpus += worker.msg?.resources?.gpus?.allocated || 0; + + // Active workers only + if (isActive) { + activeWorkers++; + activeCpus += worker.msg?.resources?.cpus?.available || 0; + activeMemory += worker.msg?.resources?.memory?.allocated || 0; + activeGpus += worker.msg?.resources?.gpus?.available || 0; + } + } + + // Convert memory to GB + const totalMemoryGB = Math.round(totalMemory / (1024 * 1024 * 1024)); + const activeMemoryGB = Math.round(activeMemory / (1024 * 1024 * 1024)); + + // Get cluster info from last status message + const clusterName = lastSdlStatus?.msg?.cluster?.name || 'Unknown'; + const clusterDesc = lastSdlStatus?.msg?.cluster?.desc || ''; + + let html = ` +
+
Cluster: ${clusterName}
+ ${clusterDesc} +
+ `; + + html += '
'; + + // SDL card + html += ` +
+
+
+
+ SDL +
+ Version: v${config?.sdl?.version}
+ Uptime:
+ Status: +
+
+
+ `; + + // Workers card + html += ` +
+
+
+
+ Workers +
+

${activeWorkers}

+ of ${workerCount} total +
+
+
+ `; + + // CPU card + html += ` +
+
+
+
+ CPU Cores +
+

${activeCpus}

+ of ${totalCpus} total +
+
+
+ `; + + // Memory card + html += ` +
+
+
+
+ RAM +
+

${activeMemoryGB} GB

+ of ${totalMemoryGB} GB total +
+
+
+ `; + + // GPU card + html += ` +
+
+
+
+ GPUs +
+

${activeGpus}

+ of ${totalGpus} total +
+
+
+ `; + + html += '
'; // end row + + document.getElementById('dash-sdl-clstr').innerHTML = html; + + // Read dash-sdl-uptime from Session Storage + const dashSdlUptime = sessionStorage.getItem('dash-sdl-uptime'); + if (dashSdlUptime) { + document.getElementById('dash-sdl-uptime').innerHTML = dashSdlUptime; + } + + // Read dash-sdl-status from Session Storage + const dashSdlStatus = sessionStorage.getItem('dash-sdl-status'); + if (dashSdlStatus) { + document.getElementById('dash-sdl-status').innerHTML = dashSdlStatus; + } } \ No newline at end of file diff --git a/sdl-mgr/html/md/dash.md b/sdl-mgr/html/md/dash.md index 2a61aed..e20014b 100644 --- a/sdl-mgr/html/md/dash.md +++ b/sdl-mgr/html/md/dash.md @@ -1,11 +1,6 @@
-
-
-
-
-
-
-
+
+
Cluster
Workers
From 822e7c46e3693274f24ddf5c0aa5ced342ede45e Mon Sep 17 00:00:00 2001 From: John Haverlack Date: Sun, 8 Feb 2026 17:02:49 -0900 Subject: [PATCH 4/5] Refactor Cluster Status Dash --- sdl-mgr/conf/modules/sdl-mgr.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdl-mgr/conf/modules/sdl-mgr.json b/sdl-mgr/conf/modules/sdl-mgr.json index f8b93bf..026a73c 100644 --- a/sdl-mgr/conf/modules/sdl-mgr.json +++ b/sdl-mgr/conf/modules/sdl-mgr.json @@ -4,9 +4,9 @@ "worker_stale_threshold": 15000, "update_interval": { "udp_beacon": 2000, - "cluster_status": 10000, - "cluster_workers": 2000, - "cluster_telemetry": 1000 + "cluster_status": 2000, + "cluster_workers": 1000, + "cluster_telemetry": 500 }, "expiration_timeout": { "cluster_status": 60000, From 266adae45ae60428b1cd034784fc9411e3c06a22 Mon Sep 17 00:00:00 2001 From: John Haverlack Date: Sun, 8 Feb 2026 17:04:21 -0900 Subject: [PATCH 5/5] v0.3.9 --- docs/CHANGELOG.md | 3 +++ sdl-mgr/html/md/changelog.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 62516b1..2717d01 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -10,6 +10,9 @@ ## v0.3.9 - 2026-02-08 (ALPHA) +- Refactor Cluster Status Dash +- Refactor Cluster Status Dash +- System Columnn Display - Start v0.3.9 ## v0.3.8 - 2026-02-01 (ALPHA) diff --git a/sdl-mgr/html/md/changelog.md b/sdl-mgr/html/md/changelog.md index 62516b1..2717d01 100644 --- a/sdl-mgr/html/md/changelog.md +++ b/sdl-mgr/html/md/changelog.md @@ -10,6 +10,9 @@ ## v0.3.9 - 2026-02-08 (ALPHA) +- Refactor Cluster Status Dash +- Refactor Cluster Status Dash +- System Columnn Display - Start v0.3.9 ## v0.3.8 - 2026-02-01 (ALPHA)