From c902c868c13b66e8c988079eba93cc3b2a444db1 Mon Sep 17 00:00:00 2001 From: Luke Goodfellow <107487942+ThatAmatoGuy@users.noreply.github.com> Date: Mon, 23 Jun 2025 10:27:03 -0700 Subject: [PATCH 01/10] uppdate Package command --- deno.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deno.json b/deno.json index f39cf74..68cd98d 100644 --- a/deno.json +++ b/deno.json @@ -18,7 +18,7 @@ "compile:apple_arm64": "deno compile --config=./deno.json --allow-env --allow-read --allow-write --allow-net --unsafely-ignore-certificate-errors --allow-run --output=./bin/cf-support_darwin_arm64 --target=aarch64-apple-darwin ./main.js", "compile:windows": "deno compile --config=./deno.json --allow-env --allow-read --allow-write --allow-net --unsafely-ignore-certificate-errors --allow-run --output=./bin/cf-support_windows_amd64 --target=x86_64-pc-windows-msvc ./main.js", "compile": "deno task pre-compile && deno task compile:linux_amd64 && deno task compile:linux_arm64 && deno task compile:windows && deno task compile:apple_amd64 && deno task compile:apple_arm64", - "package": "tar -czvf ./bin/cf-support_linux_amd64.tar.gz ./bin/cf-support_linux_amd64 && tar -czvf ./bin/cf-support_linux_arm64.tar.gz ./bin/cf-support_linux_arm64 && tar -czvf ./bin/cf-support_darwin_amd64.tar.gz ./bin/cf-support_darwin_amd64 && tar -czvf ./bin/cf-support_darwin_arm64.tar.gz ./bin/cf-support_darwin_arm64 && zip ./bin/cf-support_windows_amd64.zip ./bin/cf-support_windows_amd64.exe" + "package": "cd bin && tar -czvf ./cf-support_linux_amd64.tar.gz cf-support_linux_amd64 && tar -czvf ./cf-support_linux_arm64.tar.gz ./cf-support_linux_arm64 && tar -czvf ./cf-support_darwin_amd64.tar.gz ./cf-support_darwin_amd64 && tar -czvf ./cf-support_darwin_arm64.tar.gz ./cf-support_darwin_arm64 && zip ./cf-support_windows_amd64.zip ./cf-support_windows_amd64.exe" }, "imports": { "@cliffy/command": "jsr:@cliffy/command@1.0.0-rc.7", From a0be9d43d509bcdb5f3ecaf283a1ee4fbfd123ab Mon Sep 17 00:00:00 2001 From: Luke Goodfellow <107487942+ThatAmatoGuy@users.noreply.github.com> Date: Mon, 23 Jun 2025 15:28:10 -0700 Subject: [PATCH 02/10] Update devcontainer.json Signed-off-by: Luke Goodfellow <107487942+ThatAmatoGuy@users.noreply.github.com> --- .devcontainer/devcontainer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index e4ca88f..441e305 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,7 +1,7 @@ // For format details, see https://aka.ms/devcontainer.json. { "name": "Codefresh Support Package", - "image": "mcr.microsoft.com/devcontainers/base:ubuntu", + "image": "mcr.microsoft.com/devcontainers/universal:3", "onCreateCommand": "curl -fsSL https://deno.land/install.sh | sh -s -- -y", "customizations": { "vscode": { @@ -16,4 +16,4 @@ ] } } -} \ No newline at end of file +} From 188d219b192aea33f0a41a253010a6e8a60e2c74 Mon Sep 17 00:00:00 2001 From: Luke Goodfellow <107487942+ThatAmatoGuy@users.noreply.github.com> Date: Mon, 23 Jun 2025 22:43:44 +0000 Subject: [PATCH 03/10] Fixed error for Event Date --- deno.lock | 14 +++++++++++++- src/logic/core.js | 3 +-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/deno.lock b/deno.lock index 6f811fa..5e07b0d 100644 --- a/deno.lock +++ b/deno.lock @@ -27,7 +27,8 @@ "jsr:@std/yaml@1": "1.0.7", "jsr:@std/yaml@1.0.5": "1.0.5", "jsr:@std/yaml@1.0.7": "1.0.7", - "jsr:@zip-js/zip-js@2.7.53": "2.7.53" + "jsr:@zip-js/zip-js@2.7.53": "2.7.53", + "npm:@types/node@*": "22.15.15" }, "jsr": { "@cliffy/command@1.0.0-rc.7": { @@ -147,6 +148,17 @@ "integrity": "acea5bd8e01feb3fe4c242cfbde7d33dd5e006549a4eb1d15283bc0c778ed672" } }, + "npm": { + "@types/node@22.15.15": { + "integrity": "sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A==", + "dependencies": [ + "undici-types" + ] + }, + "undici-types@6.21.0": { + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + } + }, "workspace": { "dependencies": [ "jsr:@cliffy/command@1.0.0-rc.7", diff --git a/src/logic/core.js b/src/logic/core.js index 5840ca1..75aae79 100644 --- a/src/logic/core.js +++ b/src/logic/core.js @@ -46,8 +46,7 @@ export async function processData(dirPath, k8sResources) { if (k8sType == 'events.k8s.io') { const formattedEvents = resources.items.map((event) => { - const lastSeen = new Date(event.lastTimestamp || event.eventTime || event.metadata.creationTimestamp) - .toISOString(); + const lastSeen = event.metadata.creationTimestamp || 'Invalid Date'; const type = event.type || 'Unknown'; const reason = event.reason || 'Unknown'; const object = `${event.involvedObject.kind}/${event.involvedObject.name}`; From 72ce7643ad55234d1923a038f55bc4ccb28ef14f Mon Sep 17 00:00:00 2001 From: Luke Goodfellow <107487942+ThatAmatoGuy@users.noreply.github.com> Date: Mon, 23 Jun 2025 22:48:07 +0000 Subject: [PATCH 04/10] fixed formating of event date --- main.js | 2 +- src/logic/core.js | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/main.js b/main.js index 021a4a1..3977f88 100644 --- a/main.js +++ b/main.js @@ -5,7 +5,7 @@ await new Command() .name('cf-support') .version('__APP_VERSION__') .description('Tool to gather information for Codefresh Support') - .action( function () { + .action(function () { this.showHelp(); }) .command( diff --git a/src/logic/core.js b/src/logic/core.js index 75aae79..1dde8a7 100644 --- a/src/logic/core.js +++ b/src/logic/core.js @@ -24,7 +24,7 @@ export async function processData(dirPath, k8sResources) { const resources = await fetcher(); if (!resources) { - continue + continue; } if (k8sType == 'pods') { @@ -46,7 +46,9 @@ export async function processData(dirPath, k8sResources) { if (k8sType == 'events.k8s.io') { const formattedEvents = resources.items.map((event) => { - const lastSeen = event.metadata.creationTimestamp || 'Invalid Date'; + const lastSeen = event.metadata.creationTimestamp + ? new Date(event.metadata.creationTimestamp).toISOString() + : 'Invalid Date'; const type = event.type || 'Unknown'; const reason = event.reason || 'Unknown'; const object = `${event.involvedObject.kind}/${event.involvedObject.name}`; @@ -63,7 +65,6 @@ export async function processData(dirPath, k8sResources) { continue; } - resources.items.map((data) => { delete data.metadata.managedFields; writeYaml(data, `${data.metadata.name}_get`, `${dirPath}/${k8sType}`); From 44552067c010bbb46a4543ce72a877a94be336d7 Mon Sep 17 00:00:00 2001 From: Luke Goodfellow <107487942+ThatAmatoGuy@users.noreply.github.com> Date: Tue, 24 Jun 2025 15:45:39 -0700 Subject: [PATCH 05/10] Fix to many files open (#35) * add semaphore to limit number of files open * made request async instead of sync --- deno.json | 1 + deno.lock | 5 ++++ src/logic/core.js | 69 +++++++++++++++++++++++++++++++---------------- src/onprem.js | 23 ++++++++++------ src/pipelines.js | 6 ++--- 5 files changed, 70 insertions(+), 34 deletions(-) diff --git a/deno.json b/deno.json index 68cd98d..6494e75 100644 --- a/deno.json +++ b/deno.json @@ -25,6 +25,7 @@ "@cloudydeno/kubernetes-apis": "jsr:@cloudydeno/kubernetes-apis@0.5.2", "@cloudydeno/kubernetes-client": "jsr:@cloudydeno/kubernetes-client@0.7.5", "@deno-library/compress": "jsr:@deno-library/compress@^0.5.6", + "@henrygd/semaphore": "jsr:@henrygd/semaphore@^0.0.2", "@std/yaml": "jsr:@std/yaml@1.0.7" } } diff --git a/deno.lock b/deno.lock index 5e07b0d..8e616ba 100644 --- a/deno.lock +++ b/deno.lock @@ -11,6 +11,7 @@ "jsr:@cloudydeno/stream-observables@1": "1.4.1", "jsr:@deno-library/compress@~0.5.6": "0.5.6", "jsr:@deno-library/crc32@1.0.2": "1.0.2", + "jsr:@henrygd/semaphore@^0.0.2": "0.0.2", "jsr:@std/bytes@^1.0.2": "1.0.4", "jsr:@std/fmt@~1.0.2": "1.0.3", "jsr:@std/fs@1.0.5": "1.0.5", @@ -96,6 +97,9 @@ "@deno-library/crc32@1.0.2": { "integrity": "d2061bfee30c87c97f285dfca0fdc4458e632dc072a33ecfc73ca5177a5a39a0" }, + "@henrygd/semaphore@0.0.2": { + "integrity": "cdf678250474b9445648d4fb8d8c636fe313f54893a50de616bf8d3e14f3b51e" + }, "@std/bytes@1.0.4": { "integrity": "11a0debe522707c95c7b7ef89b478c13fb1583a7cfb9a85674cd2cc2e3a28abc" }, @@ -165,6 +169,7 @@ "jsr:@cloudydeno/kubernetes-apis@0.5.2", "jsr:@cloudydeno/kubernetes-client@0.7.5", "jsr:@deno-library/compress@~0.5.6", + "jsr:@henrygd/semaphore@^0.0.2", "jsr:@std/yaml@1.0.7" ] } diff --git a/src/logic/core.js b/src/logic/core.js index 1dde8a7..8ff4b27 100644 --- a/src/logic/core.js +++ b/src/logic/core.js @@ -1,20 +1,33 @@ import { stringify as toYaml } from '@std/yaml'; import { tgz } from '@deno-library/compress'; import { getPodLogs } from './k8s.js'; +import { getSemaphore } from '@henrygd/semaphore'; -export function writeYaml(data, name, dirPath) { - Deno.mkdirSync(dirPath, { recursive: true }); - const filePath = `${dirPath}/${name}.yaml`; - Deno.writeTextFileSync(filePath, toYaml(data, { skipInvalid: true })); +const semaphore = getSemaphore('supportPackageSemaphore', 10); + +export async function writeYaml(data, name, dirPath) { + await semaphore.acquire(); + try { + await Deno.mkdir(dirPath, { recursive: true }); + const filePath = `${dirPath}/${name}.yaml`; + await Deno.writeTextFile(filePath, toYaml(data, { skipInvalid: true })); + } finally { + semaphore.release(); + } } export async function preparePackage(dirPath) { - const supportPackageZip = `${dirPath}.tar.gz`; - console.log('Preparing the Support Package'); - await tgz.compress(dirPath, supportPackageZip); - console.log('Cleaning up temp directory'); - Deno.removeSync(dirPath, { recursive: true }); - console.log(`\nPlease attach ${supportPackageZip} to your support ticket.`); + await semaphore.acquire(); + try { + const supportPackageZip = `${dirPath}.tar.gz`; + console.log('Preparing the Support Package'); + await tgz.compress(dirPath, supportPackageZip); + console.log('Cleaning up temp directory'); + await Deno.remove(dirPath, { recursive: true }); + console.log(`\nPlease attach ${supportPackageZip} to your support ticket.`); + } finally { + semaphore.release(); + } } export async function processData(dirPath, k8sResources) { @@ -29,16 +42,21 @@ export async function processData(dirPath, k8sResources) { if (k8sType == 'pods') { for (const pod of resources.items) { - delete pod.metadata.managedFields; + await semaphore.acquire(); + try { + delete pod.metadata.managedFields; - writeYaml(pod, `spec_${pod.metadata.name}`, `${dirPath}/${k8sType}/${pod.metadata.name}`); + await writeYaml(pod, `spec_${pod.metadata.name}`, `${dirPath}/${k8sType}/${pod.metadata.name}`); - const logs = await getPodLogs(pod); - for (const [containerName, logData] of Object.entries(logs)) { - Deno.writeTextFileSync( - `${dirPath}/${k8sType}/${pod.metadata.name}/log_${containerName}.log`, - logData, - ); + const logs = await getPodLogs(pod); + for (const [containerName, logData] of Object.entries(logs)) { + await Deno.writeTextFile( + `${dirPath}/${k8sType}/${pod.metadata.name}/log_${containerName}.log`, + logData, + ); + } + } finally { + semaphore.release(); } } continue; @@ -60,14 +78,19 @@ export async function processData(dirPath, k8sResources) { const header = 'LAST SEEN\tTYPE\tREASON\tOBJECT\tMESSAGE\n'; const content = header + formattedEvents.join('\n'); - Deno.writeTextFileSync(`${dirPath}/${k8sType}.csv`, content); + await Deno.writeTextFile(`${dirPath}/${k8sType}.csv`, content); continue; } - resources.items.map((data) => { - delete data.metadata.managedFields; - writeYaml(data, `${data.metadata.name}_get`, `${dirPath}/${k8sType}`); - }); + await Promise.all(resources.items.map(async (data) => { + await semaphore.acquire(); + try { + delete data.metadata.managedFields; + await writeYaml(data, `${data.metadata.name}_get`, `${dirPath}/${k8sType}`); + } finally { + semaphore.release(); + } + })); } } diff --git a/src/onprem.js b/src/onprem.js index b1d0aa7..0573cf8 100644 --- a/src/onprem.js +++ b/src/onprem.js @@ -27,14 +27,21 @@ export async function onprem(namespace) { } if (cfCreds) { - const accounts = await getAllAccounts(cfCreds); - writeYaml(accounts, 'OnPrem_Accounts', dirPath); - const runtimes = await getAllRuntimes(cfCreds); - writeYaml(runtimes, 'OnPrem_Runtimes', dirPath); - const featureFlags = await getSystemFeatureFlags(cfCreds); - writeYaml(featureFlags, 'OnPrem_Feature_Flags', dirPath); - const totalUsers = await getTotalUsers(cfCreds); - writeYaml(totalUsers, 'OnPrem_Total_Users', dirPath); + const dataFetchers = [ + { name: 'OnPrem_Accounts', fetcher: getAllAccounts }, + { name: 'OnPrem_Runtimes', fetcher: getAllRuntimes }, + { name: 'OnPrem_Feature_Flags', fetcher: getSystemFeatureFlags }, + { name: 'OnPrem_Total_Users', fetcher: getTotalUsers }, + ]; + + for (const { name, fetcher } of dataFetchers) { + try { + const data = await fetcher(cfCreds); + await writeYaml(data, name, dirPath); + } catch (error) { + console.error(`Failed to fetch or write ${name}:`, error.message); + } + } } console.log(`Gathering data in the '${namespace}' namespace for Codefresh OnPrem`); diff --git a/src/pipelines.js b/src/pipelines.js index 676baf3..5370519 100644 --- a/src/pipelines.js +++ b/src/pipelines.js @@ -30,11 +30,11 @@ export async function pipelines(namespace, runtime) { } while (isNaN(selection) || selection < 1 || selection > runtimes.length); const reSpec = runtimes[selection - 1]; - writeYaml(reSpec, 'Runtime_Spec', dirPath); + await writeYaml(reSpec, 'Runtime_Spec', dirPath); } } else { - const reSpec = getRuntimeSpec(cfCreds, runtime); - writeYaml(reSpec, 'Runtime_Spec', dirPath); + const reSpec = await getRuntimeSpec(cfCreds, runtime); + await writeYaml(reSpec, 'Runtime_Spec', dirPath); } } From 4dc09779a95bbdf27beaa6a3a7024ec7afb16029 Mon Sep 17 00:00:00 2001 From: Luke Goodfellow <107487942+ThatAmatoGuy@users.noreply.github.com> Date: Wed, 2 Jul 2025 11:23:01 -0700 Subject: [PATCH 06/10] July 2025 Update (#36) * fixed wordings and typos * Catch error if pods are not initilized for logs * Changed how to get Version * moved semphore to functions * updated wording for pipelines * fixed output for gathering logs --- README.md | 16 ++++++++-------- src/gitops.js | 2 +- src/logic/core.js | 20 ++++++++++---------- src/logic/k8s.js | 7 ++++++- src/pipelines.js | 2 +- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index ff9bc9f..e5d0607 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,8 @@ The binary is built on using `ubuntu-latest`. You can find what is included in ### macOS - arm64 ```shell -# get the latest version or change to a specific version -VERSION=$(curl --silent "https://api.github.com/repos/codefresh-support/codefresh-support-package/releases/latest" | jq -r ".tag_name") +# Get the version at https://github.com/codefresh-support/codefresh-support-package/releases +VERSION=v#.#.# # download and extract the binary curl -L --output - https://github.com/codefresh-support/codefresh-support-package/releases/download/$VERSION/cf-support_darwin_arm64.tar.gz | tar -zx -O cf-support_darwin_arm64 > cf-support @@ -42,8 +42,8 @@ chmod +x cf-support ### macOS - amd64 ```shell -# get the latest version or change to a specific version -VERSION=$(curl --silent "https://api.github.com/repos/codefresh-support/codefresh-support-package/releases/latest" | jq -r ".tag_name") +# Get the version at https://github.com/codefresh-support/codefresh-support-package/releases +VERSION=v#.#.# # download and extract the binary curl -L --output - https://github.com/codefresh-support/codefresh-support-package/releases/download/$VERSION/cf-support_darwin_amd64.tar.gz | tar -zx -O cf-support_darwin_amd64 > cf-support @@ -58,8 +58,8 @@ chmod +x cf-support ### linux - arm64 ```shell -# get the latest version or change to a specific version -VERSION=$(curl --silent "https://api.github.com/repos/codefresh-support/codefresh-support-package/releases/latest" | jq -r ".tag_name") +# Get the version at https://github.com/codefresh-support/codefresh-support-package/releases +VERSION=v#.#.# # download and extract the binary curl -L --output - https://github.com/codefresh-support/codefresh-support-package/releases/download/$VERSION/cf-support_linux_arm64.tar.gz | tar -zx -O cf-support_linux_arm64 > cf-support @@ -74,8 +74,8 @@ chmod +x cf-support ### linux - amd64 ```shell -# get the latest version or change to a specific version -VERSION=$(curl --silent "https://api.github.com/repos/codefresh-support/codefresh-support-package/releases/latest" | jq -r ".tag_name") +# Get the version at https://github.com/codefresh-support/codefresh-support-package/releases +VERSION=v#.#.# # download and extract the binary curl -L --output - https://github.com/codefresh-support/codefresh-support-package/releases/download/$VERSION/cf-support_linux_amd64.tar.gz | tar -zx -O cf-support_linux_amd64 > cf-support diff --git a/src/gitops.js b/src/gitops.js index 7f025ba..302c5fe 100644 --- a/src/gitops.js +++ b/src/gitops.js @@ -9,7 +9,7 @@ export async function gitops(namespace) { namespace = selected; } - console.log(`Gatheing data in the '${namespace}' namespace for the GitOps Runtime`); + console.log(`Gathering data in the '${namespace}' namespace for the GitOps Runtime`); const k8sResources = getResources(namespace); await processData(dirPath, k8sResources); await preparePackage(dirPath); diff --git a/src/logic/core.js b/src/logic/core.js index 8ff4b27..f16f5c6 100644 --- a/src/logic/core.js +++ b/src/logic/core.js @@ -3,20 +3,16 @@ import { tgz } from '@deno-library/compress'; import { getPodLogs } from './k8s.js'; import { getSemaphore } from '@henrygd/semaphore'; -const semaphore = getSemaphore('supportPackageSemaphore', 10); + export async function writeYaml(data, name, dirPath) { - await semaphore.acquire(); - try { - await Deno.mkdir(dirPath, { recursive: true }); - const filePath = `${dirPath}/${name}.yaml`; - await Deno.writeTextFile(filePath, toYaml(data, { skipInvalid: true })); - } finally { - semaphore.release(); - } + await Deno.mkdir(dirPath, { recursive: true }); + const filePath = `${dirPath}/${name}.yaml`; + await Deno.writeTextFile(filePath, toYaml(data, { skipInvalid: true })); } export async function preparePackage(dirPath) { + const semaphore = getSemaphore("zipfile", 10); await semaphore.acquire(); try { const supportPackageZip = `${dirPath}.tar.gz`; @@ -40,6 +36,9 @@ export async function processData(dirPath, k8sResources) { continue; } + const semaphore = getSemaphore(k8sType, 10); + console.log(`Processing Data for ${k8sType}`) + if (k8sType == 'pods') { for (const pod of resources.items) { await semaphore.acquire(); @@ -48,7 +47,8 @@ export async function processData(dirPath, k8sResources) { await writeYaml(pod, `spec_${pod.metadata.name}`, `${dirPath}/${k8sType}/${pod.metadata.name}`); - const logs = await getPodLogs(pod); + const logs = await getPodLogs(pod.metadata.name); + console.log(`Gathering logs for pod ${pod}`); for (const [containerName, logData] of Object.entries(logs)) { await Deno.writeTextFile( `${dirPath}/${k8sType}/${pod.metadata.name}/log_${containerName}.log`, diff --git a/src/logic/k8s.js b/src/logic/k8s.js index 8fbe670..3dca57c 100644 --- a/src/logic/k8s.js +++ b/src/logic/k8s.js @@ -38,9 +38,14 @@ export async function getPodLogs(pod) { const logs = {}; for (const container of containers) { - logs[container] = await coreApi + try { + logs[container] = await coreApi .namespace(namespace) .getPodLog(podName, { container: container, timestamps: true }); + } catch (error) { + logs[container] = error + } + } return logs; } diff --git a/src/pipelines.js b/src/pipelines.js index 5370519..11ace64 100644 --- a/src/pipelines.js +++ b/src/pipelines.js @@ -38,7 +38,7 @@ export async function pipelines(namespace, runtime) { } } - console.log(`Gathering data in the '${namespace}' namespace for Codefresh OnPrem`); + console.log(`Gathering data in the '${namespace}' namespace for Pipelines Runtime`); const k8sResources = getResources(namespace); await processData(dirPath, k8sResources); await preparePackage(dirPath); From 6e73b3b455a1cd7e620db32a5726dda13d50bdd4 Mon Sep 17 00:00:00 2001 From: Luke Goodfellow <107487942+ThatAmatoGuy@users.noreply.github.com> Date: Tue, 8 Jul 2025 08:21:25 -0700 Subject: [PATCH 07/10] Fixed Gather Pod Logs --- src/logic/core.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/logic/core.js b/src/logic/core.js index f16f5c6..1d08378 100644 --- a/src/logic/core.js +++ b/src/logic/core.js @@ -47,8 +47,8 @@ export async function processData(dirPath, k8sResources) { await writeYaml(pod, `spec_${pod.metadata.name}`, `${dirPath}/${k8sType}/${pod.metadata.name}`); - const logs = await getPodLogs(pod.metadata.name); - console.log(`Gathering logs for pod ${pod}`); + const logs = await getPodLogs(pod); + console.log(`Gathering logs for pod ${pod.metadata.name}`); for (const [containerName, logData] of Object.entries(logs)) { await Deno.writeTextFile( `${dirPath}/${k8sType}/${pod.metadata.name}/log_${containerName}.log`, From 202e8de7b4da95dbcc4bd81723a18d2606eaa958 Mon Sep 17 00:00:00 2001 From: Luke Goodfellow <107487942+ThatAmatoGuy@users.noreply.github.com> Date: Tue, 8 Jul 2025 10:54:00 -0700 Subject: [PATCH 08/10] Update Compression (#37) --- deno.json | 1 - deno.lock | 55 ++--------------------------------------------- src/logic/core.js | 22 +++++++++++-------- src/logic/k8s.js | 7 +++--- 4 files changed, 18 insertions(+), 67 deletions(-) diff --git a/deno.json b/deno.json index 6494e75..0cb9447 100644 --- a/deno.json +++ b/deno.json @@ -24,7 +24,6 @@ "@cliffy/command": "jsr:@cliffy/command@1.0.0-rc.7", "@cloudydeno/kubernetes-apis": "jsr:@cloudydeno/kubernetes-apis@0.5.2", "@cloudydeno/kubernetes-client": "jsr:@cloudydeno/kubernetes-client@0.7.5", - "@deno-library/compress": "jsr:@deno-library/compress@^0.5.6", "@henrygd/semaphore": "jsr:@henrygd/semaphore@^0.0.2", "@std/yaml": "jsr:@std/yaml@1.0.7" } diff --git a/deno.lock b/deno.lock index 8e616ba..b758444 100644 --- a/deno.lock +++ b/deno.lock @@ -9,26 +9,17 @@ "jsr:@cloudydeno/kubernetes-client@0.7.3": "0.7.3", "jsr:@cloudydeno/kubernetes-client@0.7.5": "0.7.5", "jsr:@cloudydeno/stream-observables@1": "1.4.1", - "jsr:@deno-library/compress@~0.5.6": "0.5.6", - "jsr:@deno-library/crc32@1.0.2": "1.0.2", "jsr:@henrygd/semaphore@^0.0.2": "0.0.2", "jsr:@std/bytes@^1.0.2": "1.0.4", "jsr:@std/fmt@~1.0.2": "1.0.3", - "jsr:@std/fs@1.0.5": "1.0.5", - "jsr:@std/io@0.225.0": "0.225.0", - "jsr:@std/path@1": "1.0.8", + "jsr:@std/path@1": "1.0.6", "jsr:@std/path@1.0.6": "1.0.6", - "jsr:@std/path@1.0.8": "1.0.8", - "jsr:@std/path@^1.0.7": "1.0.8", - "jsr:@std/streams@1": "1.0.8", + "jsr:@std/streams@1": "1.0.5", "jsr:@std/streams@1.0.5": "1.0.5", - "jsr:@std/streams@^1.0.7": "1.0.8", - "jsr:@std/tar@0.1.3": "0.1.3", "jsr:@std/text@~1.0.7": "1.0.14", "jsr:@std/yaml@1": "1.0.7", "jsr:@std/yaml@1.0.5": "1.0.5", "jsr:@std/yaml@1.0.7": "1.0.7", - "jsr:@zip-js/zip-js@2.7.53": "2.7.53", "npm:@types/node@*": "22.15.15" }, "jsr": { @@ -83,20 +74,6 @@ "@cloudydeno/stream-observables@1.4.1": { "integrity": "555aa3d786fcfd066d096fc943ea47afc688618e95146e615705e981008f57c0" }, - "@deno-library/compress@0.5.6": { - "integrity": "9d76e37e7682fc8d3d99d5641a7af454ce4689b1df3fd3062141a1deb64453cd", - "dependencies": [ - "jsr:@deno-library/crc32", - "jsr:@std/fs", - "jsr:@std/io", - "jsr:@std/path@1.0.8", - "jsr:@std/tar", - "jsr:@zip-js/zip-js" - ] - }, - "@deno-library/crc32@1.0.2": { - "integrity": "d2061bfee30c87c97f285dfca0fdc4458e632dc072a33ecfc73ca5177a5a39a0" - }, "@henrygd/semaphore@0.0.2": { "integrity": "cdf678250474b9445648d4fb8d8c636fe313f54893a50de616bf8d3e14f3b51e" }, @@ -106,39 +83,15 @@ "@std/fmt@1.0.3": { "integrity": "97765c16aa32245ff4e2204ecf7d8562496a3cb8592340a80e7e554e0bb9149f" }, - "@std/fs@1.0.5": { - "integrity": "41806ad6823d0b5f275f9849a2640d87e4ef67c51ee1b8fb02426f55e02fd44e", - "dependencies": [ - "jsr:@std/path@^1.0.7" - ] - }, - "@std/io@0.225.0": { - "integrity": "c1db7c5e5a231629b32d64b9a53139445b2ca640d828c26bf23e1c55f8c079b3", - "dependencies": [ - "jsr:@std/bytes" - ] - }, "@std/path@1.0.6": { "integrity": "ab2c55f902b380cf28e0eec501b4906e4c1960d13f00e11cfbcd21de15f18fed" }, - "@std/path@1.0.8": { - "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" - }, "@std/streams@1.0.5": { "integrity": "74e5c73d7d68eeab0d7fba3b05cbee3ba4ac5ae37c5f4e675f67e62f8f53edc4", "dependencies": [ "jsr:@std/bytes" ] }, - "@std/streams@1.0.8": { - "integrity": "b41332d93d2cf6a82fe4ac2153b930adf1a859392931e2a19d9fabfb6f154fb3" - }, - "@std/tar@0.1.3": { - "integrity": "531270fc707b37ab9b5f051aa4943e7b16b86905e0398a4ebe062983b0c93115", - "dependencies": [ - "jsr:@std/streams@^1.0.7" - ] - }, "@std/text@1.0.14": { "integrity": "1a810108482414d19112b8b506ad0b7cba826000cd13f74274ffda6dd83d273f" }, @@ -147,9 +100,6 @@ }, "@std/yaml@1.0.7": { "integrity": "b4b9f6a625a6827ca2b75a3d240558b5ffd8b9a29945ec7614871be7b711a10a" - }, - "@zip-js/zip-js@2.7.53": { - "integrity": "acea5bd8e01feb3fe4c242cfbde7d33dd5e006549a4eb1d15283bc0c778ed672" } }, "npm": { @@ -168,7 +118,6 @@ "jsr:@cliffy/command@1.0.0-rc.7", "jsr:@cloudydeno/kubernetes-apis@0.5.2", "jsr:@cloudydeno/kubernetes-client@0.7.5", - "jsr:@deno-library/compress@~0.5.6", "jsr:@henrygd/semaphore@^0.0.2", "jsr:@std/yaml@1.0.7" ] diff --git a/src/logic/core.js b/src/logic/core.js index 1d08378..21b603a 100644 --- a/src/logic/core.js +++ b/src/logic/core.js @@ -1,10 +1,7 @@ import { stringify as toYaml } from '@std/yaml'; -import { tgz } from '@deno-library/compress'; import { getPodLogs } from './k8s.js'; import { getSemaphore } from '@henrygd/semaphore'; - - export async function writeYaml(data, name, dirPath) { await Deno.mkdir(dirPath, { recursive: true }); const filePath = `${dirPath}/${name}.yaml`; @@ -12,17 +9,24 @@ export async function writeYaml(data, name, dirPath) { } export async function preparePackage(dirPath) { - const semaphore = getSemaphore("zipfile", 10); - await semaphore.acquire(); try { const supportPackageZip = `${dirPath}.tar.gz`; console.log('Preparing the Support Package'); - await tgz.compress(dirPath, supportPackageZip); + const command = new Deno.Command('tar', { + args: ['-czf', supportPackageZip, dirPath], + }); + const { code, _stdout, stderr } = await command.output(); + + if (code !== 0) { + console.error(new TextDecoder().decode(stderr)); + throw new Error(`Failed to create tar.gz file: ${supportPackageZip}. \n ${stderr}`); + } console.log('Cleaning up temp directory'); await Deno.remove(dirPath, { recursive: true }); console.log(`\nPlease attach ${supportPackageZip} to your support ticket.`); - } finally { - semaphore.release(); + } catch (error) { + console.log(error); + console.log(`\nPlease manually compress the directory ${dirPath} and attach it to the support ticket.`); } } @@ -37,7 +41,7 @@ export async function processData(dirPath, k8sResources) { } const semaphore = getSemaphore(k8sType, 10); - console.log(`Processing Data for ${k8sType}`) + console.log(`Processing Data for ${k8sType}`); if (k8sType == 'pods') { for (const pod of resources.items) { diff --git a/src/logic/k8s.js b/src/logic/k8s.js index 3dca57c..68d0cf6 100644 --- a/src/logic/k8s.js +++ b/src/logic/k8s.js @@ -40,12 +40,11 @@ export async function getPodLogs(pod) { for (const container of containers) { try { logs[container] = await coreApi - .namespace(namespace) - .getPodLog(podName, { container: container, timestamps: true }); + .namespace(namespace) + .getPodLog(podName, { container: container, timestamps: true }); } catch (error) { - logs[container] = error + logs[container] = error; } - } return logs; } From 51eea437aa45981dfed00c3a5e3463bacd0e5e9d Mon Sep 17 00:00:00 2001 From: Luke Goodfellow <107487942+ThatAmatoGuy@users.noreply.github.com> Date: Fri, 11 Jul 2025 08:35:45 -0700 Subject: [PATCH 09/10] Updated repo location --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index e5d0607..9293bec 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,11 @@ The binary is built on using `ubuntu-latest`. You can find what is included in ### macOS - arm64 ```shell -# Get the version at https://github.com/codefresh-support/codefresh-support-package/releases +# Get the version at https://github.com/codefresh-io/codefresh-support-package/releases VERSION=v#.#.# # download and extract the binary -curl -L --output - https://github.com/codefresh-support/codefresh-support-package/releases/download/$VERSION/cf-support_darwin_arm64.tar.gz | tar -zx -O cf-support_darwin_arm64 > cf-support +curl -L --output - https://github.com/codefresh-io/codefresh-support-package/releases/download/$VERSION/cf-support_darwin_arm64.tar.gz | tar -zx -O cf-support_darwin_arm64 > cf-support # set execution to binary chmod +x cf-support @@ -42,11 +42,11 @@ chmod +x cf-support ### macOS - amd64 ```shell -# Get the version at https://github.com/codefresh-support/codefresh-support-package/releases +# Get the version at https://github.com/codefresh-io/codefresh-support-package/releases VERSION=v#.#.# # download and extract the binary -curl -L --output - https://github.com/codefresh-support/codefresh-support-package/releases/download/$VERSION/cf-support_darwin_amd64.tar.gz | tar -zx -O cf-support_darwin_amd64 > cf-support +curl -L --output - https://github.com/codefresh-io/codefresh-support-package/releases/download/$VERSION/cf-support_darwin_amd64.tar.gz | tar -zx -O cf-support_darwin_amd64 > cf-support # set execution to binary chmod +x cf-support @@ -58,11 +58,11 @@ chmod +x cf-support ### linux - arm64 ```shell -# Get the version at https://github.com/codefresh-support/codefresh-support-package/releases +# Get the version at https://github.com/codefresh-io/codefresh-support-package/releases VERSION=v#.#.# # download and extract the binary -curl -L --output - https://github.com/codefresh-support/codefresh-support-package/releases/download/$VERSION/cf-support_linux_arm64.tar.gz | tar -zx -O cf-support_linux_arm64 > cf-support +curl -L --output - https://github.com/codefresh-io/codefresh-support-package/releases/download/$VERSION/cf-support_linux_arm64.tar.gz | tar -zx -O cf-support_linux_arm64 > cf-support # set execution to binary chmod +x cf-support @@ -74,11 +74,11 @@ chmod +x cf-support ### linux - amd64 ```shell -# Get the version at https://github.com/codefresh-support/codefresh-support-package/releases +# Get the version at https://github.com/codefresh-io/codefresh-support-package/releases VERSION=v#.#.# # download and extract the binary -curl -L --output - https://github.com/codefresh-support/codefresh-support-package/releases/download/$VERSION/cf-support_linux_amd64.tar.gz | tar -zx -O cf-support_linux_amd64 > cf-support +curl -L --output - https://github.com/codefresh-io/codefresh-support-package/releases/download/$VERSION/cf-support_linux_amd64.tar.gz | tar -zx -O cf-support_linux_amd64 > cf-support # set execution to binary chmod +x cf-support @@ -89,7 +89,7 @@ chmod +x cf-support ### Windows - amd6 -1. Go the the [Latest](https://github.com/codefresh-support/codefresh-support-package/releases/latest) release. +1. Go the the [Latest](https://github.com/codefresh-io/codefresh-support-package/releases/latest) release. 1. Download the cf-support_windows_amd64.zip file 1. Run the `.exe` file via CMD or PowerShell From 0a68ad401453e64fd45fc0b8360c4f5b3de49b64 Mon Sep 17 00:00:00 2001 From: Luke Goodfellow <107487942+ThatAmatoGuy@users.noreply.github.com> Date: Tue, 5 Aug 2025 12:20:52 -0700 Subject: [PATCH 10/10] Support Package Update August (#40) * change date to be YYYY-MM-DDTHH-mm-ssZ * add logic to catch errors for processing * updated dependencies * updated file name --- .devcontainer/devcontainer.json | 19 ------ deno.json | 4 +- deno.lock | 71 ++++++++++++--------- src/gitops.js | 2 +- src/logic/core.js | 105 +++++++++++++++++--------------- src/logic/k8s.js | 15 +++-- src/onprem.js | 2 +- src/oss.js | 2 +- src/pipelines.js | 2 +- 9 files changed, 113 insertions(+), 109 deletions(-) delete mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 441e305..0000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,19 +0,0 @@ -// For format details, see https://aka.ms/devcontainer.json. -{ - "name": "Codefresh Support Package", - "image": "mcr.microsoft.com/devcontainers/universal:3", - "onCreateCommand": "curl -fsSL https://deno.land/install.sh | sh -s -- -y", - "customizations": { - "vscode": { - "settings": { - "deno.enable": true, - "deno.lint": true - }, - "extensions": [ - "denoland.vscode-deno", - "davidanson.vscode-markdownlint", - "redhat.vscode-yaml" - ] - } - } -} diff --git a/deno.json b/deno.json index 0cb9447..00834ae 100644 --- a/deno.json +++ b/deno.json @@ -21,10 +21,10 @@ "package": "cd bin && tar -czvf ./cf-support_linux_amd64.tar.gz cf-support_linux_amd64 && tar -czvf ./cf-support_linux_arm64.tar.gz ./cf-support_linux_arm64 && tar -czvf ./cf-support_darwin_amd64.tar.gz ./cf-support_darwin_amd64 && tar -czvf ./cf-support_darwin_arm64.tar.gz ./cf-support_darwin_arm64 && zip ./cf-support_windows_amd64.zip ./cf-support_windows_amd64.exe" }, "imports": { - "@cliffy/command": "jsr:@cliffy/command@1.0.0-rc.7", + "@cliffy/command": "jsr:@cliffy/command@1.0.0-rc.8", "@cloudydeno/kubernetes-apis": "jsr:@cloudydeno/kubernetes-apis@0.5.2", "@cloudydeno/kubernetes-client": "jsr:@cloudydeno/kubernetes-client@0.7.5", "@henrygd/semaphore": "jsr:@henrygd/semaphore@^0.0.2", - "@std/yaml": "jsr:@std/yaml@1.0.7" + "@std/yaml": "jsr:@std/yaml@1.0.9" } } diff --git a/deno.lock b/deno.lock index b758444..226a4e3 100644 --- a/deno.lock +++ b/deno.lock @@ -1,30 +1,31 @@ { "version": "5", "specifiers": { - "jsr:@cliffy/command@1.0.0-rc.7": "1.0.0-rc.7", - "jsr:@cliffy/flags@1.0.0-rc.7": "1.0.0-rc.7", - "jsr:@cliffy/internal@1.0.0-rc.7": "1.0.0-rc.7", - "jsr:@cliffy/table@1.0.0-rc.7": "1.0.0-rc.7", + "jsr:@cliffy/command@1.0.0-rc.8": "1.0.0-rc.8", + "jsr:@cliffy/flags@1.0.0-rc.8": "1.0.0-rc.8", + "jsr:@cliffy/internal@1.0.0-rc.8": "1.0.0-rc.8", + "jsr:@cliffy/table@1.0.0-rc.8": "1.0.0-rc.8", "jsr:@cloudydeno/kubernetes-apis@0.5.2": "0.5.2", "jsr:@cloudydeno/kubernetes-client@0.7.3": "0.7.3", "jsr:@cloudydeno/kubernetes-client@0.7.5": "0.7.5", "jsr:@cloudydeno/stream-observables@1": "1.4.1", "jsr:@henrygd/semaphore@^0.0.2": "0.0.2", - "jsr:@std/bytes@^1.0.2": "1.0.4", - "jsr:@std/fmt@~1.0.2": "1.0.3", - "jsr:@std/path@1": "1.0.6", + "jsr:@std/bytes@^1.0.2": "1.0.6", + "jsr:@std/fmt@~1.0.2": "1.0.8", + "jsr:@std/internal@^1.0.9": "1.0.10", + "jsr:@std/path@1": "1.1.1", "jsr:@std/path@1.0.6": "1.0.6", - "jsr:@std/streams@1": "1.0.5", + "jsr:@std/streams@1": "1.0.10", "jsr:@std/streams@1.0.5": "1.0.5", - "jsr:@std/text@~1.0.7": "1.0.14", - "jsr:@std/yaml@1": "1.0.7", + "jsr:@std/text@~1.0.7": "1.0.15", + "jsr:@std/yaml@1": "1.0.9", "jsr:@std/yaml@1.0.5": "1.0.5", - "jsr:@std/yaml@1.0.7": "1.0.7", + "jsr:@std/yaml@1.0.9": "1.0.9", "npm:@types/node@*": "22.15.15" }, "jsr": { - "@cliffy/command@1.0.0-rc.7": { - "integrity": "1288808d7a3cd18b86c24c2f920e47a6d954b7e23cadc35c8cbd78f8be41f0cd", + "@cliffy/command@1.0.0-rc.8": { + "integrity": "758147790797c74a707e5294cc7285df665422a13d2a483437092ffce40b5557", "dependencies": [ "jsr:@cliffy/flags", "jsr:@cliffy/internal", @@ -33,17 +34,17 @@ "jsr:@std/text" ] }, - "@cliffy/flags@1.0.0-rc.7": { - "integrity": "318d9be98f6a6417b108e03dec427dea96cdd41a15beb21d2554ae6da450a781", + "@cliffy/flags@1.0.0-rc.8": { + "integrity": "0f1043ce6ef037ba1cb5fe6b1bcecb25dc2f29371a1c17f278ab0f45e4b6f46c", "dependencies": [ "jsr:@std/text" ] }, - "@cliffy/internal@1.0.0-rc.7": { - "integrity": "10412636ab3e67517d448be9eaab1b70c88eba9be22617b5d146257a11cc9b17" + "@cliffy/internal@1.0.0-rc.8": { + "integrity": "34cdf2fad9b084b5aed493b138d573f52d4e988767215f7460daf0b918ff43d8" }, - "@cliffy/table@1.0.0-rc.7": { - "integrity": "9fdd9776eda28a0b397981c400eeb1aa36da2371b43eefe12e6ff555290e3180", + "@cliffy/table@1.0.0-rc.8": { + "integrity": "8bbcdc2ba5e0061b4b13810a24e6f5c6ab19c09f0cce9eb691ccd76c7c6c9db5", "dependencies": [ "jsr:@std/fmt" ] @@ -77,29 +78,41 @@ "@henrygd/semaphore@0.0.2": { "integrity": "cdf678250474b9445648d4fb8d8c636fe313f54893a50de616bf8d3e14f3b51e" }, - "@std/bytes@1.0.4": { - "integrity": "11a0debe522707c95c7b7ef89b478c13fb1583a7cfb9a85674cd2cc2e3a28abc" + "@std/bytes@1.0.6": { + "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" }, - "@std/fmt@1.0.3": { - "integrity": "97765c16aa32245ff4e2204ecf7d8562496a3cb8592340a80e7e554e0bb9149f" + "@std/fmt@1.0.8": { + "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" + }, + "@std/internal@1.0.10": { + "integrity": "e3be62ce42cab0e177c27698e5d9800122f67b766a0bea6ca4867886cbde8cf7" }, "@std/path@1.0.6": { "integrity": "ab2c55f902b380cf28e0eec501b4906e4c1960d13f00e11cfbcd21de15f18fed" }, + "@std/path@1.1.1": { + "integrity": "fe00026bd3a7e6a27f73709b83c607798be40e20c81dde655ce34052fd82ec76", + "dependencies": [ + "jsr:@std/internal" + ] + }, "@std/streams@1.0.5": { "integrity": "74e5c73d7d68eeab0d7fba3b05cbee3ba4ac5ae37c5f4e675f67e62f8f53edc4", "dependencies": [ "jsr:@std/bytes" ] }, - "@std/text@1.0.14": { - "integrity": "1a810108482414d19112b8b506ad0b7cba826000cd13f74274ffda6dd83d273f" + "@std/streams@1.0.10": { + "integrity": "75c0b1431873cd0d8b3d679015220204d36d3c7420d93b60acfc379eb0dc30af" + }, + "@std/text@1.0.15": { + "integrity": "91f5cc1e12779a3d95f1be34e763f9c28a75a078b7360e6fcaef0d8d9b1e3e7f" }, "@std/yaml@1.0.5": { "integrity": "71ba3d334305ee2149391931508b2c293a8490f94a337eef3a09cade1a2a2742" }, - "@std/yaml@1.0.7": { - "integrity": "b4b9f6a625a6827ca2b75a3d240558b5ffd8b9a29945ec7614871be7b711a10a" + "@std/yaml@1.0.9": { + "integrity": "6bad3dc766dd85b4b37eabcba81b6aa4eac7a392792ae29abcfb0f90602d55bb" } }, "npm": { @@ -115,11 +128,11 @@ }, "workspace": { "dependencies": [ - "jsr:@cliffy/command@1.0.0-rc.7", + "jsr:@cliffy/command@1.0.0-rc.8", "jsr:@cloudydeno/kubernetes-apis@0.5.2", "jsr:@cloudydeno/kubernetes-client@0.7.5", "jsr:@henrygd/semaphore@^0.0.2", - "jsr:@std/yaml@1.0.7" + "jsr:@std/yaml@1.0.9" ] } } diff --git a/src/gitops.js b/src/gitops.js index 302c5fe..b34a34c 100644 --- a/src/gitops.js +++ b/src/gitops.js @@ -2,7 +2,7 @@ import { getResources, selectNamespace } from './logic/k8s.js'; import { preparePackage, processData } from './logic/core.js'; export async function gitops(namespace) { - const dirPath = `./cf-support-gitops-${Math.floor(Date.now() / 1000)}`; + const dirPath = `./cf-support-gitops-${new Date().toISOString().replace(/[:.]/g, '-').replace(/\.\d{3}Z$/, 'Z')}`; if (!namespace) { const selected = await selectNamespace(); diff --git a/src/logic/core.js b/src/logic/core.js index 21b603a..144c4fa 100644 --- a/src/logic/core.js +++ b/src/logic/core.js @@ -34,67 +34,72 @@ export async function processData(dirPath, k8sResources) { console.log('Processing and Saving Data'); for (const [k8sType, fetcher] of Object.entries(k8sResources)) { - const resources = await fetcher(); + try { + console.log(`Processing Data for ${k8sType}`); + const resources = await fetcher(); - if (!resources) { - continue; - } - - const semaphore = getSemaphore(k8sType, 10); - console.log(`Processing Data for ${k8sType}`); - - if (k8sType == 'pods') { - for (const pod of resources.items) { - await semaphore.acquire(); - try { - delete pod.metadata.managedFields; - - await writeYaml(pod, `spec_${pod.metadata.name}`, `${dirPath}/${k8sType}/${pod.metadata.name}`); + if (!resources || !resources.items || resources.items.length === 0) { + continue; + } - const logs = await getPodLogs(pod); - console.log(`Gathering logs for pod ${pod.metadata.name}`); - for (const [containerName, logData] of Object.entries(logs)) { - await Deno.writeTextFile( - `${dirPath}/${k8sType}/${pod.metadata.name}/log_${containerName}.log`, - logData, - ); + const semaphore = getSemaphore(k8sType, 10); + + if (k8sType == 'pods') { + for (const pod of resources.items) { + await semaphore.acquire(); + try { + delete pod.metadata.managedFields; + + await writeYaml(pod, `spec_${pod.metadata.name}`, `${dirPath}/${k8sType}/${pod.metadata.name}`); + + const logs = await getPodLogs(pod); + console.log(`Gathering logs for pod ${pod.metadata.name}`); + for (const [containerName, logData] of Object.entries(logs)) { + await Deno.writeTextFile( + `${dirPath}/${k8sType}/${pod.metadata.name}/log_${containerName}.log`, + logData, + ); + } + } finally { + semaphore.release(); } - } finally { - semaphore.release(); } + continue; } - continue; - } - if (k8sType == 'events.k8s.io') { - const formattedEvents = resources.items.map((event) => { - const lastSeen = event.metadata.creationTimestamp - ? new Date(event.metadata.creationTimestamp).toISOString() - : 'Invalid Date'; - const type = event.type || 'Unknown'; - const reason = event.reason || 'Unknown'; - const object = `${event.involvedObject.kind}/${event.involvedObject.name}`; - const message = event.message || 'No message'; + if (k8sType == 'events.k8s.io') { + const formattedEvents = resources.items.map((event) => { + const lastSeen = event.metadata.creationTimestamp + ? new Date(event.metadata.creationTimestamp).toISOString() + : 'Invalid Date'; + const type = event.type || 'Unknown'; + const reason = event.reason || 'Unknown'; + const object = `${event.involvedObject.kind}/${event.involvedObject.name}`; + const message = event.message || 'No message'; + + return `${lastSeen}\t${type}\t${reason}\t${object}\t${message}`; + }); - return `${lastSeen}\t${type}\t${reason}\t${object}\t${message}`; - }); + const header = 'LAST SEEN\tTYPE\tREASON\tOBJECT\tMESSAGE\n'; + const content = header + formattedEvents.join('\n'); - const header = 'LAST SEEN\tTYPE\tREASON\tOBJECT\tMESSAGE\n'; - const content = header + formattedEvents.join('\n'); + await Deno.writeTextFile(`${dirPath}/${k8sType}.csv`, content); - await Deno.writeTextFile(`${dirPath}/${k8sType}.csv`, content); + continue; + } + await Promise.all(resources.items.map(async (data) => { + await semaphore.acquire(); + try { + delete data.metadata.managedFields; + await writeYaml(data, `${data.metadata.name}_get`, `${dirPath}/${k8sType}`); + } finally { + semaphore.release(); + } + })); + } catch (error) { + console.warn(`Failed to fetch ${k8sType}: ${error.message}`); continue; } - - await Promise.all(resources.items.map(async (data) => { - await semaphore.acquire(); - try { - delete data.metadata.managedFields; - await writeYaml(data, `${data.metadata.name}_get`, `${dirPath}/${k8sType}`); - } finally { - semaphore.release(); - } - })); } } diff --git a/src/logic/k8s.js b/src/logic/k8s.js index 68d0cf6..7598063 100644 --- a/src/logic/k8s.js +++ b/src/logic/k8s.js @@ -69,11 +69,16 @@ async function getCrd(type, namespace) { } async function getSortedEvents(namespace) { - const events = await coreApi.namespace(namespace).getEventList(); - events.items = events.items.sort((a, b) => - new Date(a.metadata.creationTimestamp) - new Date(b.metadata.creationTimestamp) - ); - return events; + try { + const events = await coreApi.namespace(namespace).getEventList(); + events.items = events.items.sort((a, b) => + new Date(a.metadata.creationTimestamp) - new Date(b.metadata.creationTimestamp) + ); + return events; + } catch (error) { + console.warn(`Failed to fetch events: ${error.message}`); + return { items: [] }; // Return empty events list + } } export function getResources(namespace) { diff --git a/src/onprem.js b/src/onprem.js index 0573cf8..6ffe7a5 100644 --- a/src/onprem.js +++ b/src/onprem.js @@ -9,7 +9,7 @@ import { } from './logic/codefresh.js'; export async function onprem(namespace) { - const dirPath = `./cf-support-onprem-${Math.floor(Date.now() / 1000)}`; + const dirPath = `./cf-support-onprem-${new Date().toISOString().replace(/[:.]/g, '-').replace(/\.\d{3}Z$/, 'Z')}`; const cfCreds = getCodefreshCredentials(); diff --git a/src/oss.js b/src/oss.js index d98664a..7bb1a25 100644 --- a/src/oss.js +++ b/src/oss.js @@ -2,7 +2,7 @@ import { getResources, selectNamespace } from './logic/k8s.js'; import { preparePackage, processData } from './logic/core.js'; export async function oss(namespace) { - const dirPath = `./cf-support-oss-${Math.floor(Date.now() / 1000)}`; + const dirPath = `./cf-support-oss-${new Date().toISOString().replace(/[:.]/g, '-').replace(/\.\d{3}Z$/, 'Z')}`; if (!namespace) { const selected = await selectNamespace(); diff --git a/src/pipelines.js b/src/pipelines.js index 11ace64..71902e9 100644 --- a/src/pipelines.js +++ b/src/pipelines.js @@ -3,7 +3,7 @@ import { preparePackage, processData, writeYaml } from './logic/core.js'; import { getAccountRuntimes, getCodefreshCredentials, getRuntimeSpec } from './logic/codefresh.js'; export async function pipelines(namespace, runtime) { - const dirPath = `./cf-support-pipelines-${Math.floor(Date.now() / 1000)}`; + const dirPath = `./cf-support-pipelines-${new Date().toISOString().replace(/[:.]/g, '-').replace(/\.\d{3}Z$/, 'Z')}`; const cfCreds = getCodefreshCredentials(); if (!namespace) {