From d6be20e869ff892f745666360fd67df876be3720 Mon Sep 17 00:00:00 2001 From: shu Date: Tue, 22 Oct 2024 21:23:38 +0900 Subject: [PATCH 1/3] support grafana domain --- src/commands/setup/domains.ts | 11 +++++++++++ src/commands/setup/prep-charts.ts | 2 ++ 2 files changed, 13 insertions(+) diff --git a/src/commands/setup/domains.ts b/src/commands/setup/domains.ts index 384ae86..e10ef5f 100644 --- a/src/commands/setup/domains.ts +++ b/src/commands/setup/domains.ts @@ -183,8 +183,10 @@ export default class SetupDomains extends Command { ROLLUPSCAN_API_URI: `${protocol}://rollup-explorer-backend.${urlEnding}/api`, EXTERNAL_EXPLORER_URI_L2: `${protocol}://blockscout.${urlEnding}`, ADMIN_SYSTEM_DASHBOARD_URI: `${protocol}://admin-system-dashboard.${urlEnding}`, + GRAFANA_URI: `${protocol}://grafana.${urlEnding}`, }; + if (usesAnvil) { domainConfig.EXTERNAL_RPC_URI_L1 = `${protocol}://l1-devnet.${urlEnding}`; domainConfig.EXTERNAL_EXPLORER_URI_L1 = `${protocol}://l1-explorer.${urlEnding}`; @@ -198,6 +200,7 @@ export default class SetupDomains extends Command { RPC_GATEWAY_HOST: `l2-rpc.${urlEnding}`, BLOCKSCOUT_HOST: `blockscout.${urlEnding}`, ADMIN_SYSTEM_DASHBOARD_HOST: `admin-system-dashboard.${urlEnding}`, + GRAFANA_HOST: `grafana.${urlEnding}`, ...(usesAnvil ? { L1_DEVNET_HOST: `l1-devnet.${urlEnding}`, L1_EXPLORER_HOST: `l1-explorer.${urlEnding}` } : {}), }; } else { @@ -239,6 +242,10 @@ export default class SetupDomains extends Command { message: 'Enter ADMIN_SYSTEM_DASHBOARD_HOST:', default: existingConfig.ingress?.ADMIN_SYSTEM_DASHBOARD_HOST || 'admin-system-dashboard.scrollsdk', }), + GRAFANA_HOST: await input({ + message: 'Enter GRAFANA_HOST:', + default: existingConfig.ingress?.GRAFANA_HOST || 'grafana.scrollsdk', + }), }; if (usesAnvil) { @@ -273,6 +280,10 @@ export default class SetupDomains extends Command { message: 'Enter ADMIN_SYSTEM_DASHBOARD_URI:', default: existingConfig.frontend?.ADMIN_SYSTEM_DASHBOARD_URI || `${protocol}://${ingressConfig.ADMIN_SYSTEM_DASHBOARD_HOST}`, }), + GRAFANA_URI: await input({ + message: 'Enter GRAFANA_URI:', + default: existingConfig.frontend?.GRAFANA_URI || `${protocol}://${ingressConfig.GRAFANA_HOST}`, + }), }; if (usesAnvil) { diff --git a/src/commands/setup/prep-charts.ts b/src/commands/setup/prep-charts.ts index 668ca5f..f380171 100644 --- a/src/commands/setup/prep-charts.ts +++ b/src/commands/setup/prep-charts.ts @@ -59,6 +59,7 @@ export default class SetupPrepCharts extends Command { 'L1_DEVNET_HOST': 'ingress.L1_DEVNET_HOST', 'L1_EXPLORER_HOST': 'ingress.L1_EXPLORER_HOST', 'RPC_GATEWAY_WS_HOST': 'ingress.RPC_GATEWAY_WS_HOST', + 'GRAFANA_HOST': 'ingress.GRAFANA_HOST', // Add more mappings as needed } @@ -197,6 +198,7 @@ export default class SetupPrepCharts extends Command { 'l1-devnet': 'L1_DEVNET_HOST', 'blockscout': 'BLOCKSCOUT_HOST', 'admin-system-dashboard': 'ADMIN_SYSTEM_DASHBOARD_HOST', + 'grafana': 'GRAFANA_HOST', }; const alternativeKey = alternativeMappings[chartName]; From aa0a4c2f264d8b757c965603ca19f2068db9f2a7 Mon Sep 17 00:00:00 2001 From: shu Date: Wed, 23 Oct 2024 18:42:20 +0900 Subject: [PATCH 2/3] fix mapping scroll-monitor:GRAFANA_HOST[C --- src/commands/setup/prep-charts.ts | 41 ++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/commands/setup/prep-charts.ts b/src/commands/setup/prep-charts.ts index f380171..ac5618b 100644 --- a/src/commands/setup/prep-charts.ts +++ b/src/commands/setup/prep-charts.ts @@ -198,7 +198,6 @@ export default class SetupPrepCharts extends Command { 'l1-devnet': 'L1_DEVNET_HOST', 'blockscout': 'BLOCKSCOUT_HOST', 'admin-system-dashboard': 'ADMIN_SYSTEM_DASHBOARD_HOST', - 'grafana': 'GRAFANA_HOST', }; const alternativeKey = alternativeMappings[chartName]; @@ -238,6 +237,46 @@ export default class SetupPrepCharts extends Command { } } + if (productionYaml.grafana) { + let ingressUpdated = false; + let ingressValue = productionYaml.grafana.ingress; + if (ingressValue && typeof ingressValue === 'object' && 'hosts' in ingressValue) { + const hosts = ingressValue.hosts as Array; + if (Array.isArray(hosts)) { + for (let i = 0; i < hosts.length; i++) { + if (typeof (hosts[i]) === 'string') { + let configValue: string | undefined; + configValue = this.getConfigValue("ingress.GRAFANA_HOST"); + + if (configValue && (configValue !== hosts[i])) { + changes.push({ key: `ingress.hosts[${i}]`, oldValue: hosts[i], newValue: configValue }); + hosts[i] = configValue; + ingressUpdated = true; + } + } + } + } + } + + if (ingressUpdated) { + updated = true; + // Update the tls section if it exists + for (const [ingressKey, ingressValue] of Object.entries(productionYaml.grafana.ingress)) { + if (ingressValue && typeof ingressValue === 'object' && 'tls' in ingressValue && 'hosts' in ingressValue) { + const tlsEntries = ingressValue.tls as Array<{ hosts: string[] }>; + const hosts = ingressValue.hosts as Array<{ host: string }>; + if (Array.isArray(tlsEntries) && Array.isArray(hosts)) { + tlsEntries.forEach((tlsEntry) => { + if (Array.isArray(tlsEntry.hosts)) { + tlsEntry.hosts = hosts.map((host) => host.host); + } + }); + } + } + } + } + } + if (updated) { this.log(`\nFor ${chalk.cyan(file)}:`) this.log(chalk.green('Changes:')) From ea567d9e941f79f43fd85944f8d6b23d23fc6c9c Mon Sep 17 00:00:00 2001 From: shu Date: Thu, 24 Oct 2024 21:27:23 +0900 Subject: [PATCH 3/3] feat: Add logic to support Grafana's TLS configuration in the `scrollsdk setup tls` command --- src/commands/setup/tls.ts | 93 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/src/commands/setup/tls.ts b/src/commands/setup/tls.ts index 8a3a597..cbe4884 100644 --- a/src/commands/setup/tls.ts +++ b/src/commands/setup/tls.ts @@ -117,6 +117,98 @@ spec: const ingressTypes = ['main', 'websocket'] let updated = false + + /* + grafana: + ingress: + enabled: true + annotations: + kubernetes.io/ingress.class: "nginx" + nginx.ingress.kubernetes.io/ssl-redirect: "true" + tls: + - secretName: admin-system-dashboard-tls + hosts: + - grafana.scsdk.unifra.xyz + hosts: + - grafana.scsdk.unifra.xyz + */ + if (yamlContent.grafana && yamlContent.grafana.ingress) { + const originalContent = yaml.dump(yamlContent.grafana.ingress, { lineWidth: -1, noRefs: true }) + let ingressUpdated = false; + let ingress = yamlContent.grafana.ingress; + if (!ingress.annotations) { + ingress.annotations = {}; + } + + if (ingress.annotations['cert-manager.io/cluster-issuer'] !== issuer) { + ingress.annotations['cert-manager.io/cluster-issuer'] = issuer + ingressUpdated = true + } + + + // Update or add TLS configuration + if (ingress.hosts && ingress.hosts.length > 0) { + const firstHost = ingress.hosts[0]; + if (typeof firstHost === 'string') { + const hostname = firstHost + const secretName = `${chart}-grafana-tls`; + //const secretName = ingressType === 'main' ? `${chart}-tls` : `${chart}-${ingressType}-tls` + + if (!ingress.tls) { + ingress.tls = [{ + secretName: secretName, + hosts: [hostname], + }] + ingressUpdated = true + } else if (ingress.tls.length === 0) { + ingress.tls.push({ + secretName: secretName, + hosts: [hostname], + }) + ingressUpdated = true + } else { + // Update existing TLS configuration + ingress.tls.forEach((tlsConfig: any) => { + if (!tlsConfig.secretName || tlsConfig.secretName !== secretName) { + tlsConfig.secretName = secretName + ingressUpdated = true + } + if (!tlsConfig.hosts || !tlsConfig.hosts.includes(hostname)) { + tlsConfig.hosts = [hostname] + ingressUpdated = true + } + }) + } + } + } + + if (ingressUpdated) { + updated = true + const updatedContent = yaml.dump(ingress, { lineWidth: -1, noRefs: true }) + + if (this.debugMode) { + this.log(chalk.yellow(`\nProposed changes for ${chart} :`)) + this.log(chalk.red('- Original content:')) + this.log(originalContent) + this.log(chalk.green('+ Updated content:')) + this.log(updatedContent) + + const confirmUpdate = await confirm({ + message: chalk.cyan(`Do you want to apply these changes to ${chart}?`), + }) + + if (!confirmUpdate) { + this.log(chalk.yellow(`Skipped updating ${chart}`)); + } + } + + this.log(chalk.green(`Updated TLS configuration for ${chart} `)) + } else { + this.log(chalk.green(`No changes needed for ${chart} ()`)) + } + + } + for (const ingressType of ingressTypes) { if (yamlContent.ingress?.[ingressType]) { const originalContent = yaml.dump(yamlContent.ingress[ingressType], { lineWidth: -1, noRefs: true }) @@ -259,6 +351,7 @@ spec: 'rollup-explorer-backend', 'l2-rpc', 'l1-devnet', + 'scroll-monitor' ] for (const chart of chartsToUpdate) {