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/README.md b/README.md index ff9bc9f..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 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-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 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-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 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-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 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-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 diff --git a/deno.json b/deno.json index 68cd98d..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", - "@deno-library/compress": "jsr:@deno-library/compress@^0.5.6", - "@std/yaml": "jsr:@std/yaml@1.0.7" + "@henrygd/semaphore": "jsr:@henrygd/semaphore@^0.0.2", + "@std/yaml": "jsr:@std/yaml@1.0.9" } } diff --git a/deno.lock b/deno.lock index 5e07b0d..226a4e3 100644 --- a/deno.lock +++ b/deno.lock @@ -1,38 +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:@deno-library/compress@~0.5.6": "0.5.6", - "jsr:@deno-library/crc32@1.0.2": "1.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:@henrygd/semaphore@^0.0.2": "0.0.2", + "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/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.10", "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/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:@zip-js/zip-js@2.7.53": "2.7.53", + "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", @@ -41,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" ] @@ -82,43 +75,26 @@ "@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" - ] + "@henrygd/semaphore@0.0.2": { + "integrity": "cdf678250474b9445648d4fb8d8c636fe313f54893a50de616bf8d3e14f3b51e" }, - "@deno-library/crc32@1.0.2": { - "integrity": "d2061bfee30c87c97f285dfca0fdc4458e632dc072a33ecfc73ca5177a5a39a0" + "@std/bytes@1.0.6": { + "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" }, - "@std/bytes@1.0.4": { - "integrity": "11a0debe522707c95c7b7ef89b478c13fb1583a7cfb9a85674cd2cc2e3a28abc" + "@std/fmt@1.0.8": { + "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" }, - "@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/internal@1.0.10": { + "integrity": "e3be62ce42cab0e177c27698e5d9800122f67b766a0bea6ca4867886cbde8cf7" }, "@std/path@1.0.6": { "integrity": "ab2c55f902b380cf28e0eec501b4906e4c1960d13f00e11cfbcd21de15f18fed" }, - "@std/path@1.0.8": { - "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" + "@std/path@1.1.1": { + "integrity": "fe00026bd3a7e6a27f73709b83c607798be40e20c81dde655ce34052fd82ec76", + "dependencies": [ + "jsr:@std/internal" + ] }, "@std/streams@1.0.5": { "integrity": "74e5c73d7d68eeab0d7fba3b05cbee3ba4ac5ae37c5f4e675f67e62f8f53edc4", @@ -126,26 +102,17 @@ "jsr:@std/bytes" ] }, - "@std/streams@1.0.8": { - "integrity": "b41332d93d2cf6a82fe4ac2153b930adf1a859392931e2a19d9fabfb6f154fb3" + "@std/streams@1.0.10": { + "integrity": "75c0b1431873cd0d8b3d679015220204d36d3c7420d93b60acfc379eb0dc30af" }, - "@std/tar@0.1.3": { - "integrity": "531270fc707b37ab9b5f051aa4943e7b16b86905e0398a4ebe062983b0c93115", - "dependencies": [ - "jsr:@std/streams@^1.0.7" - ] - }, - "@std/text@1.0.14": { - "integrity": "1a810108482414d19112b8b506ad0b7cba826000cd13f74274ffda6dd83d273f" + "@std/text@1.0.15": { + "integrity": "91f5cc1e12779a3d95f1be34e763f9c28a75a078b7360e6fcaef0d8d9b1e3e7f" }, "@std/yaml@1.0.5": { "integrity": "71ba3d334305ee2149391931508b2c293a8490f94a337eef3a09cade1a2a2742" }, - "@std/yaml@1.0.7": { - "integrity": "b4b9f6a625a6827ca2b75a3d240558b5ffd8b9a29945ec7614871be7b711a10a" - }, - "@zip-js/zip-js@2.7.53": { - "integrity": "acea5bd8e01feb3fe4c242cfbde7d33dd5e006549a4eb1d15283bc0c778ed672" + "@std/yaml@1.0.9": { + "integrity": "6bad3dc766dd85b4b37eabcba81b6aa4eac7a392792ae29abcfb0f90602d55bb" } }, "npm": { @@ -161,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:@deno-library/compress@~0.5.6", - "jsr:@std/yaml@1.0.7" + "jsr:@henrygd/semaphore@^0.0.2", + "jsr:@std/yaml@1.0.9" ] } } diff --git a/src/gitops.js b/src/gitops.js index 7f025ba..b34a34c 100644 --- a/src/gitops.js +++ b/src/gitops.js @@ -2,14 +2,14 @@ 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(); 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 1dde8a7..144c4fa 100644 --- a/src/logic/core.js +++ b/src/logic/core.js @@ -1,73 +1,105 @@ 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 }); +export async function writeYaml(data, name, dirPath) { + await Deno.mkdir(dirPath, { recursive: true }); const filePath = `${dirPath}/${name}.yaml`; - Deno.writeTextFileSync(filePath, toYaml(data, { skipInvalid: true })); + await Deno.writeTextFile(filePath, toYaml(data, { skipInvalid: true })); } 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.`); + try { + const supportPackageZip = `${dirPath}.tar.gz`; + console.log('Preparing the Support Package'); + 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.`); + } catch (error) { + console.log(error); + console.log(`\nPlease manually compress the directory ${dirPath} and attach it to the support ticket.`); + } } 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; - } + if (!resources || !resources.items || resources.items.length === 0) { + continue; + } + + const semaphore = getSemaphore(k8sType, 10); - if (k8sType == 'pods') { - for (const pod of resources.items) { - delete pod.metadata.managedFields; + if (k8sType == 'pods') { + for (const pod of resources.items) { + 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); + 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(); + } } + 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'); - Deno.writeTextFileSync(`${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; } - - resources.items.map((data) => { - delete data.metadata.managedFields; - writeYaml(data, `${data.metadata.name}_get`, `${dirPath}/${k8sType}`); - }); } } diff --git a/src/logic/k8s.js b/src/logic/k8s.js index 8fbe670..7598063 100644 --- a/src/logic/k8s.js +++ b/src/logic/k8s.js @@ -38,9 +38,13 @@ export async function getPodLogs(pod) { const logs = {}; for (const container of containers) { - logs[container] = await coreApi - .namespace(namespace) - .getPodLog(podName, { container: container, timestamps: true }); + try { + logs[container] = await coreApi + .namespace(namespace) + .getPodLog(podName, { container: container, timestamps: true }); + } catch (error) { + logs[container] = error; + } } return logs; } @@ -65,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 b1d0aa7..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(); @@ -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/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 676baf3..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) { @@ -30,15 +30,15 @@ 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); } } - 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);