mirror of
https://github.com/KevinMidboe/infra-map.git
synced 2026-01-13 04:36:33 +00:00
152 lines
3.6 KiB
TypeScript
152 lines
3.6 KiB
TypeScript
import * as k8s from '@kubernetes/client-node';
|
|
import stream from 'stream';
|
|
import { writable } from 'svelte/store';
|
|
import fs from 'fs';
|
|
import { env } from '$env/dynamic/private';
|
|
|
|
/*
|
|
const kubeCaPath =
|
|
env.KUBERNETES_CA_CERT_PATH || '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt';
|
|
const kubeCaCert = fs.readFileSync(kubeCaPath, 'utf8');
|
|
|
|
// const kubeSaTokenPath = env.KUBERNETES_SA_TOKEN_PATH || '/var/run/secrets/kubernetes.io/serviceaccount/token';
|
|
const token = fs.readFileSync(kubeSaTokenPath, 'utf8');
|
|
*/
|
|
|
|
const kubeConfig: k8s.KubeConfig = {
|
|
clusters: [
|
|
{
|
|
name: 'kazan',
|
|
server: env.KUBERNETES_SERVICE_HOST || 'https://kubernetes.default.svc',
|
|
// caData: kubeCaCert,
|
|
// skipTLSVerify: true
|
|
skipTLSVerify: true
|
|
}
|
|
],
|
|
users: [
|
|
{
|
|
name: 'pod-user',
|
|
token: env.KUBERNETES_SA_TOKEN
|
|
}
|
|
],
|
|
contexts: [
|
|
{
|
|
name: 'default-context',
|
|
user: 'pod-user',
|
|
cluster: 'kazan'
|
|
}
|
|
],
|
|
currentContext: 'default-context'
|
|
};
|
|
|
|
const kc = new k8s.KubeConfig();
|
|
kc.loadFromOptions(kubeConfig);
|
|
|
|
const k8sApi = kc.makeApiClient(k8s.CoreV1Api);
|
|
const appsV1Api = kc.makeApiClient(k8s.AppsV1Api);
|
|
|
|
const k8sLog = new k8s.Log(kc);
|
|
|
|
export async function getReplicas() {
|
|
try {
|
|
const allReplicas = await appsV1Api.listReplicaSetForAllNamespaces();
|
|
return allReplicas.items;
|
|
} catch (error) {
|
|
console.log('error when getting replicas:', error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export async function getPods() {
|
|
try {
|
|
const allPods = await k8sApi.listPodForAllNamespaces();
|
|
return allPods.items;
|
|
} catch (error) {
|
|
console.log('error when getting k8s resources:', error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export async function getPod(name: string, namespace: string) {
|
|
try {
|
|
return await k8sApi.readNamespacedPodTemplate({ name, namespace });
|
|
} catch (error) {
|
|
console.log(`error when getting pod:`, error);
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
export async function getDeployments() {
|
|
try {
|
|
const allDeploys = await appsV1Api.listDeploymentForAllNamespaces();
|
|
return allDeploys.items;
|
|
} catch (error) {
|
|
console.log('error when getting deployments:', error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export async function getDaemons() {
|
|
try {
|
|
const allDaemons = await appsV1Api.listDaemonSetForAllNamespaces();
|
|
return allDaemons.items;
|
|
} catch (error) {
|
|
console.log('error when getting daemons:', error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export async function getNodes() {
|
|
try {
|
|
const nodes = await k8sApi.listNode();
|
|
return nodes.items;
|
|
} catch (error) {
|
|
console.log('error when getting k8s nodes:', error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export function createLogStream(podName: string, namespace: string, containerName: string) {
|
|
// const logEmitter = new EventTarget(); // use EventTarget or EventEmitter
|
|
const logEmitter = writable();
|
|
|
|
const maxLines = 400;
|
|
let liveStream: stream.PassThrough | null = null;
|
|
let logAbortController;
|
|
|
|
async function start() {
|
|
// Live logs
|
|
liveStream = new stream.PassThrough();
|
|
liveStream.on('data', (chunk) => {
|
|
let chunks = chunk.toString().split('\n').filter(Boolean);
|
|
|
|
console.log('chynjks length:', chunks?.length);
|
|
if (chunks?.length > maxLines) {
|
|
chunks = chunks.slice(maxLines);
|
|
}
|
|
|
|
chunks.forEach((line) => logEmitter.set(line));
|
|
});
|
|
|
|
console.log('setting logAbortController, prev:', logAbortController);
|
|
try {
|
|
logAbortController = await k8sLog.log(namespace, podName, containerName, liveStream, {
|
|
follow: true,
|
|
timestamps: false,
|
|
pretty: false,
|
|
tailLines: maxLines
|
|
});
|
|
} catch (error) {
|
|
console.log('ERROR SETTING UP WS', error);
|
|
}
|
|
}
|
|
|
|
function stop() {
|
|
console.log('ending livestream!!');
|
|
logAbortController?.abort();
|
|
liveStream?.end();
|
|
}
|
|
|
|
return { start, stop, logEmitter };
|
|
}
|