Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 0 additions & 19 deletions .devcontainer/devcontainer.json

This file was deleted.

4 changes: 2 additions & 2 deletions deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
}
71 changes: 42 additions & 29 deletions deno.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/gitops.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
105 changes: 55 additions & 50 deletions src/logic/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}));
}
}
15 changes: 10 additions & 5 deletions src/logic/k8s.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion src/onprem.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down
2 changes: 1 addition & 1 deletion src/oss.js
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion src/pipelines.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down