@catladder/cli
Version:
Panter cli tool for cloud CI/CD and DevOps
92 lines (81 loc) • 2.58 kB
text/typescript
import { exec, spawn } from "child-process-promise";
import { getProjectPodNames } from "../../../../../kubernetes";
import { getProjectNamespace } from "../../../../../utils/projects";
const filterMongoDbs = (podNames: string[]) =>
podNames.filter(
(name) =>
name.includes("mongodb") &&
!name.includes("mongodb-backup") &&
!name.includes("arbiter"),
);
export const getProjectMongodbAllPods = async (envComponent: string) =>
filterMongoDbs(await getProjectPodNames(envComponent));
export const getMongodbShell = async (namespace: string, podName: string) => {
const command = `kubectl exec -it ${podName} --namespace ${namespace} mongo`;
try {
await spawn(command, {
shell: true,
stdio: "inherit",
env: {
...process.env,
DEBUG: "",
},
});
} catch (e) {
//
}
};
export const executeMongodbCommand = async (
namespace: string,
podName: string,
mongoCommand: string,
) => {
const fullCommand = `kubectl exec -it ${podName} --namespace ${namespace} -- mongo --quiet --eval "JSON.stringify(${mongoCommand})"`;
const { stdout } = await exec(fullCommand, {
env: {
...process.env,
DEBUG: "",
},
});
return JSON.parse(stdout);
};
export const podIsMaster = async (namespace: string, podName: string) => {
try {
const result = await executeMongodbCommand(
namespace,
podName,
"db.isMaster()",
);
return result.ismaster;
} catch (e) {
// maybe shutting down ?
return null;
}
};
const spaces = (n: number) => " ".repeat(n);
export const getMongoDbPodsWithReplInfo = async (envComponent: string) => {
const namespace = await getProjectNamespace(envComponent);
return (
await Promise.all(
(await getProjectMongodbAllPods(envComponent)).map(async (podName) => ({
podName,
componentName: podName.replace(/-mongodb-replicaset-[0-9]+/, ""),
isMaster: await podIsMaster(namespace, podName),
})),
)
).sort((podA, podB) => (podA.isMaster ? (podB.isMaster ? 0 : -1) : 1));
};
export const getProjectMongodbAllPodsSortedWithLabel = async (
envComponent: string,
) => {
const pods = await getMongoDbPodsWithReplInfo(envComponent);
const maxComponentNameLength = Math.max(
...pods.map((c) => c.componentName.length),
);
return pods.map(({ podName, isMaster, componentName }) => ({
value: podName,
name: `[ ${componentName}${spaces(
maxComponentNameLength - componentName.length,
)} ${isMaster ? " PRIMARY " : " secondary "}] ${podName}`,
}));
};