From 7aceaf3a53f153d9f7c5229ec8cc962cb8decc5a Mon Sep 17 00:00:00 2001 From: Ted Ross Date: Fri, 1 May 2026 14:20:37 -0400 Subject: [PATCH 1/4] Cleaned up references to 'var' in the modules. Removed the outdated passing of modules through the kube.Start function. --- .../management-controller/src/mc-main.js | 8 +- components/site-controller/src/sc-main.js | 8 +- modules/src/amqp.js | 53 ++++++----- modules/src/kube.js | 90 +++++++++---------- modules/src/log.js | 2 +- modules/src/router.js | 22 ++--- modules/src/state-sync.js | 40 ++++----- modules/src/util.js | 8 +- 8 files changed, 109 insertions(+), 122 deletions(-) diff --git a/components/management-controller/src/mc-main.js b/components/management-controller/src/mc-main.js index f10b0993..f646823c 100644 --- a/components/management-controller/src/mc-main.js +++ b/components/management-controller/src/mc-main.js @@ -19,10 +19,6 @@ "use strict"; -import * as k8s from '@kubernetes/client-node'; -import yaml from 'yaml'; -import fs from 'node:fs'; -import rhea from 'rhea'; import * as bbLinks from './backbone-links.js'; import * as externalVans from './external-vans.js'; import * as certs from './certs.js'; @@ -53,12 +49,12 @@ if (STANDALONE_NS) { // export async function Main() { try { - await kube.Start(k8s, fs, yaml, STANDALONE_NS); + await kube.Start(STANDALONE_NS); await db.Start(); await config.Start(); await certs.Start(); await prune.Start(); - await amqp.Start(rhea); + await amqp.Start(); await apiserver.Start(!!STANDALONE_NS); await bbLinks.Start(CONTROLLER); await externalVans.Start(); diff --git a/components/site-controller/src/sc-main.js b/components/site-controller/src/sc-main.js index 280f8a05..6d2c5243 100644 --- a/components/site-controller/src/sc-main.js +++ b/components/site-controller/src/sc-main.js @@ -19,10 +19,6 @@ "use strict"; -import * as k8s from '@kubernetes/client-node'; -import yaml from 'yaml'; -import fs from 'node:fs'; -import rhea from 'rhea'; import * as kube from '@skupperx/modules/kube' import * as amqp from '@skupperx/modules/amqp' import * as apiserver from './sc-apiserver.js' @@ -53,8 +49,8 @@ if (STANDALONE_NAMESPACE) { // export async function Main() { try { - await kube.Start(k8s, fs, yaml, STANDALONE_NAMESPACE); - await amqp.Start(rhea); + await kube.Start(STANDALONE_NAMESPACE); + await amqp.Start(); // // Start the API server early so we don't cause readiness-probe problems. diff --git a/modules/src/amqp.js b/modules/src/amqp.js index ae9b6d12..defb8312 100644 --- a/modules/src/amqp.js +++ b/modules/src/amqp.js @@ -17,25 +17,25 @@ under the License. */ +import rhea from 'rhea'; import { Log } from "./log.js" -var container -var nextCid = 1 -var nextMessageId = 1 -var inFlight = {} // { cid : handler } +let nextCid = 1 +let nextMessageId = 1 +const inFlight = {} // { cid : handler } const DEFAULT_TIMEOUT_SECONDS = 5 const rhea_handlers = function () { - container.options.enable_sasl_external = true + rhea.options.enable_sasl_external = true - container.on("connection_open", function (context) { + rhea.on("connection_open", function (context) { const conn = context.connection.skxConn Log(`AMQP Connection '${conn.logName}' is open`) }) - container.on("receiver_open", function (context) { - let conn = context.connection.skxConn + rhea.on("receiver_open", function (context) { + const conn = context.connection.skxConn if (context.receiver == conn.replyReceiver) { const firstTime = conn.replyTo == undefined conn.replyTo = context.receiver.source.address @@ -52,15 +52,15 @@ const rhea_handlers = function () { }) } } else { - let rx = context.receiver.skxReceiver + const rx = context.receiver.skxReceiver if (rx && rx.onAddress) { rx.onAddress(rx.context, context.receiver.source.address) } } }) - container.on("sendable", function (context) { - let conn = context.connection.skxConn + rhea.on("sendable", function (context) { + const conn = context.connection.skxConn conn.senders.forEach((sender) => { if (sender.amqpSender == context.sender) { if (!sender.notified) { @@ -75,11 +75,11 @@ const rhea_handlers = function () { }) }) - container.on("message", function (context) { - let conn = context.connection.skxConn - let message = context.message - let cid = message.correlation_id - var handler + rhea.on("message", function (context) { + const conn = context.connection.skxConn + const message = context.message + const cid = message.correlation_id + let handler if (context.receiver == conn.replyReceiver) { if (cid) { handler = inFlight[cid] @@ -120,8 +120,8 @@ export function OpenConnection( cert = undefined, key = undefined, ) { - let conn = { - amqpConnection: container.connect({ + const conn = { + amqpConnection: rhea.connect({ host: host, hostname: host, transport: transport, @@ -160,7 +160,7 @@ export function OpenSender( // // This is the synchronous version of the function // - let sender = { + const sender = { conn: conn, amqpSender: conn.amqpConnection.open_sender(address), onSendable: onSendable, @@ -179,7 +179,7 @@ export function OpenSender( // This is the asynchronous version of the function which does not resolve until the sender is sendable // return new Promise((resolve, reject) => { - let sender = { + const sender = { conn: conn, amqpSender: null, onSendable: null, @@ -201,7 +201,7 @@ export function OpenSender( } export function OpenReceiver(conn, address, onMessage, context = undefined) { - let receiver = { + const receiver = { amqpReceiver: conn.amqpConnection.open_receiver(address), onMessage: onMessage, onAddress: null, @@ -220,7 +220,7 @@ export function OpenDynamicReceiver( onAddress, context = undefined, ) { - let receiver = { + const receiver = { amqpReceiver: conn.amqpConnection.open_receiver({ source: { dynamic: true }, }), @@ -238,7 +238,7 @@ export function OpenDynamicReceiver( export function SendMessage(sender, messageBody, ap = {}, destination = null) { const messageId = nextMessageId nextMessageId++ - let message = { + const message = { message_id: messageId, reply_to: sender.conn.replyTo, body: messageBody, @@ -260,7 +260,7 @@ export function Request( return new Promise((resolve, reject) => { const cid = nextCid const msgId = nextMessageId - let timer = setTimeout(() => { + const timer = setTimeout(() => { delete inFlight[cid] reject(Error("AMQP request/response timeout")) }, timeoutSeconds * 1000) @@ -270,7 +270,7 @@ export function Request( clearTimeout(timer) resolve([response.application_properties, response.body]) } - let message = { + const message = { message_id: msgId, reply_to: sender.conn.replyTo, correlation_id: cid, @@ -284,8 +284,7 @@ export function Request( }) } -export async function Start(rhea) { +export async function Start() { Log("[AMQP module started]") - container = rhea rhea_handlers() } diff --git a/modules/src/kube.js b/modules/src/kube.js index 02198d52..2d74fe7c 100644 --- a/modules/src/kube.js +++ b/modules/src/kube.js @@ -17,30 +17,30 @@ under the License. */ +import * as k8s from '@kubernetes/client-node'; +import yaml from 'yaml'; +import fs from 'node:fs'; import { Log } from "./log.js" import * as common from "./common.js" const WATCH_ERROR_THRESHOLD = 10 // Log if threshold is exceeded in a minute's time. -var fs -var YAML -var k8s -var kc -var client -var v1Api -var v1AppApi -var customApi -var secretWatch -var certificateWatch -var configMapWatch -var routeWatch -var serviceWatch -var podWatch -var routerAccessWatch -var networkAccessWatch -var watchErrorCount = 0 -var lastWatchError -var namespace = "default" +let kc +let client +let v1Api +let v1AppApi +let customApi +let secretWatch +let certificateWatch +let configMapWatch +let routeWatch +let serviceWatch +let podWatch +let routerAccessWatch +let networkAccessWatch +let watchErrorCount = 0 +let lastWatchError +let namespace = "default" export function Annotation(obj, key) { if (obj && obj.metadata && obj.metadata.annotations) { @@ -58,11 +58,7 @@ export function Namespace() { return namespace } -export async function Start(k8s_mod, fs_mod, yaml_mod, standalone_namespace) { - k8s = k8s_mod - fs = fs_mod - YAML = yaml_mod - +export async function Start(standalone_namespace) { kc = new k8s.KubeConfig() if (!standalone_namespace) { kc.loadFromCluster() @@ -100,7 +96,7 @@ export async function Start(k8s_mod, fs_mod, yaml_mod, standalone_namespace) { } export async function GetIssuers() { - let list = await customApi.listNamespacedCustomObject({ + const list = await customApi.listNamespacedCustomObject({ group: "cert-manager.io", version: "v1", namespace: namespace, @@ -130,7 +126,7 @@ export async function DeleteIssuer(name) { } export async function GetCertificates() { - let list = await customApi.listNamespacedCustomObject({ + const list = await customApi.listNamespacedCustomObject({ group: "cert-manager.io", version: "v1", namespace: namespace, @@ -160,7 +156,7 @@ export async function DeleteCertificate(name) { } export async function GetSecrets() { - let list = await v1Api.listNamespacedSecret({ namespace: namespace }) + const list = await v1Api.listNamespacedSecret({ namespace: namespace }) return list.items } @@ -188,7 +184,7 @@ export async function DeleteSecret(name) { } export async function GetConfigmaps() { - let list = await v1Api.listNamespacedConfigMap({ namespace: namespace }) + const list = await v1Api.listNamespacedConfigMap({ namespace: namespace }) return list.items } @@ -215,7 +211,7 @@ export async function DeleteConfigmap(name) { } export async function GetPods() { - let list = await v1Api.listNamespacedPod({ namespace: namespace }) + const list = await v1Api.listNamespacedPod({ namespace: namespace }) return list.items } @@ -235,11 +231,11 @@ export async function waitPodsRunning(namespace, label, interval=1000, attempts= for (let i=0; i { - let item = {} + const item = {} for (let i = 0; i < keys.length; i++) { item[keys[i]] = values[i] } @@ -44,13 +44,13 @@ export async function ListManagementEntity( timeout, attributes = [], ) { - let requestAp = { + const requestAp = { operation: "QUERY", type: "org.amqp.management", entityType: entityType, name: "self", } - let requestBody = { + const requestBody = { attributeNames: attributes, } @@ -63,7 +63,7 @@ export async function ListManagementEntity( ) if (replyAp.statusCode == 200) { - let items = convertBodyToItems(replyBody) + const items = convertBodyToItems(replyBody) return items } @@ -71,7 +71,7 @@ export async function ListManagementEntity( } export async function CreateManagementEntity(entityType, name, data, timeout) { - let requestAp = { + const requestAp = { operation: "CREATE", type: entityType, name: name, @@ -93,7 +93,7 @@ export async function CreateManagementEntity(entityType, name, data, timeout) { } export async function DeleteManagementEntity(entityType, name, timeout) { - let requestAp = { + const requestAp = { operation: "DELETE", type: entityType, name: name, diff --git a/modules/src/state-sync.js b/modules/src/state-sync.js index 8a8643f2..303499c0 100644 --- a/modules/src/state-sync.js +++ b/modules/src/state-sync.js @@ -40,16 +40,16 @@ export const CLASS_MEMBER = "member" const HEARTBEAT_PERIOD_SECONDS = 10 // TODO - make this much longer const HEARTBEAT_WINDOW_SECONDS = 5 -var localClass -var localId -var localAddress -var addressToUse -var initialBeacon = true -var onNewPeer -var onPeerLost -var onStateChange -var onStateRequest -var onPing +let localClass +let localId +let localAddress +let addressToUse +let initialBeacon = true +let onNewPeer +let onPeerLost +let onStateChange +let onStateRequest +let onPing // // Concepts: @@ -65,9 +65,9 @@ var onPing // RemoteState - The remote state that is intended to be synchronized FROM a peer. // -var extraTargets = [] -var connections = {} // {connectionKey: conn-record} -var peers = {} // {peerId: {connectionKey: , peerClass: , localState: {stateKey: hash}, remoteState: {stateKey: hash}}} +const extraTargets = [] +const connections = {} // {connectionKey: conn-record} +const peers = {} // {peerId: {connectionKey: , peerClass: , localState: {stateKey: hash}, remoteState: {stateKey: hash}}} const timerDelayMsec = function (floorSec) { return ( @@ -76,7 +76,7 @@ const timerDelayMsec = function (floorSec) { } const sendHeartbeat = function (peerId) { - let peer = peers[peerId] + const peer = peers[peerId] if (!!peer) { if (peer.hbTimer) { clearTimeout(peer.hbTimer) @@ -106,8 +106,8 @@ const onHeartbeat = async function ( hashset, address, ) { - var localState - var remoteState + let localState + let remoteState //Log(`SYNC: Received Heartbeat from ${peerId}`); initialBeacon = false @@ -145,8 +145,8 @@ const onHeartbeat = async function ( // // Reconcile the existing remote state against the advertized remote state. // - let toRequestStateKeys = [] - let toDeleteStateKeys = {} + const toRequestStateKeys = [] + const toDeleteStateKeys = {} for (const key of Object.keys(peers[peerId].remoteState)) { toDeleteStateKeys[key] = true } @@ -271,7 +271,7 @@ const processMessage = async function (connectionKey, body, onReply) { } } -var processingContext = {} // peerId => {workQueue, processing} +const processingContext = {} // peerId => {workQueue, processing} const processWorkQueue = async function (siteId) { while (processingContext[siteId].processing) { @@ -353,7 +353,7 @@ export async function AddConnection(backboneId, conn) { throw Error(error) } - let connRecord = { + const connRecord = { conn: conn, apiSender: amqp.OpenSender( "AnonymousSender", diff --git a/modules/src/util.js b/modules/src/util.js index ef44d394..41ac4332 100644 --- a/modules/src/util.js +++ b/modules/src/util.js @@ -28,7 +28,7 @@ const mapEqual_sync = function (left, right) { return false } - var i + let i for (i = 0; i < leftKeys.length; i++) { let key = leftKeys[i] if (!rightKeys.includes(key)) { @@ -87,12 +87,12 @@ export function IsValidUuid(text) { } export function ValidateAndNormalizeFields(fields, table) { - var optional = {} + let optional = {} for (const [key, value] of Object.entries(table)) { optional[key] = value.optional } - var normalized = {} + let normalized = {} for (const [key, value] of Object.entries(fields)) { if (Object.keys(table).indexOf(key) < 0) { @@ -189,7 +189,7 @@ export function UniquifyName(name, existingNames) { return name } - var ordinal = 2 + let ordinal = 2 while (existingNames.indexOf(`${name}.${ordinal}`) >= 0) { ordinal++ } From 64d3fea0f173bea83d3815d18ae704699f5e9e68 Mon Sep 17 00:00:00 2001 From: Ted Ross Date: Fri, 1 May 2026 16:24:09 -0400 Subject: [PATCH 2/4] Update modules/src/util.js Co-authored-by: James Padovano <78662060+JPadovano1483@users.noreply.github.com> --- modules/src/util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/src/util.js b/modules/src/util.js index 41ac4332..7ebbb182 100644 --- a/modules/src/util.js +++ b/modules/src/util.js @@ -28,7 +28,7 @@ const mapEqual_sync = function (left, right) { return false } - let i +for (let i = 0; i < leftKeys.length; i++) { for (i = 0; i < leftKeys.length; i++) { let key = leftKeys[i] if (!rightKeys.includes(key)) { From d36559d1b83ee6ea86e705e6efb151069f3d21aa Mon Sep 17 00:00:00 2001 From: Ted Ross Date: Fri, 1 May 2026 16:25:28 -0400 Subject: [PATCH 3/4] Update modules/src/util.js Co-authored-by: James Padovano <78662060+JPadovano1483@users.noreply.github.com> --- modules/src/util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/src/util.js b/modules/src/util.js index 7ebbb182..5f3a0696 100644 --- a/modules/src/util.js +++ b/modules/src/util.js @@ -87,7 +87,7 @@ export function IsValidUuid(text) { } export function ValidateAndNormalizeFields(fields, table) { - let optional = {} + const optional = {} for (const [key, value] of Object.entries(table)) { optional[key] = value.optional } From 7fdd9c697a00bb5c3eaa41afa5b2941942be6706 Mon Sep 17 00:00:00 2001 From: Ted Ross Date: Fri, 1 May 2026 16:26:08 -0400 Subject: [PATCH 4/4] Update modules/src/util.js Co-authored-by: James Padovano <78662060+JPadovano1483@users.noreply.github.com> --- modules/src/util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/src/util.js b/modules/src/util.js index 5f3a0696..7b0fe503 100644 --- a/modules/src/util.js +++ b/modules/src/util.js @@ -92,7 +92,7 @@ export function ValidateAndNormalizeFields(fields, table) { optional[key] = value.optional } - let normalized = {} + const normalized = {} for (const [key, value] of Object.entries(fields)) { if (Object.keys(table).indexOf(key) < 0) {