81 lines
2.5 KiB
JavaScript
81 lines
2.5 KiB
JavaScript
import { execSync } from 'child_process';
|
|
import { resolve } from 'path';
|
|
import { fileURLToPath } from 'url';
|
|
import { dirname } from 'path';
|
|
import process from 'process';
|
|
import { createInterface } from 'readline';
|
|
|
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
const ROOT = resolve(__dirname, '..');
|
|
|
|
// colors
|
|
const G = (s) => `\x1b[0;32m${s}\x1b[0m`;
|
|
const Y = (s) => `\x1b[1;33m${s}\x1b[0m`;
|
|
const R = (s) => `\x1b[0;31m${s}\x1b[0m`;
|
|
|
|
const log = (msg) => console.log(`${G('[OK]')} ${msg}`);
|
|
const warn = (msg) => console.warn(`${Y('[WARN]')} ${msg}`);
|
|
const err = (msg) => console.error(`${R('[ERR]')} ${msg}`);
|
|
|
|
// ── defaults ──
|
|
const NAMESPACE = process.env.NAMESPACE || 'app';
|
|
const RELEASE = process.env.RELEASE || 'deploy';
|
|
const CONFIG_MAP = process.env.CONFIG_MAP || 'app-env';
|
|
const PVC_NAME = process.env.PVC_NAME || 'shared-data';
|
|
|
|
// ── confirm ──
|
|
function confirm(msg) {
|
|
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
return new Promise((resolve) => {
|
|
rl.question(msg, (answer) => { rl.close(); resolve(answer); });
|
|
});
|
|
}
|
|
|
|
console.log('');
|
|
warn(`This will remove Helm release '${RELEASE}' from namespace '${NAMESPACE}'.`);
|
|
warn('The following resources are PROTECTED and will NOT be deleted:');
|
|
warn(` - Namespace: ${NAMESPACE}`);
|
|
warn(` - ConfigMap: ${CONFIG_MAP}`);
|
|
warn(` - PVC: ${PVC_NAME}`);
|
|
console.log('');
|
|
|
|
const answer = await confirm('Continue? [y/N] ');
|
|
if (answer !== 'y' && answer !== 'Y') {
|
|
log('Cancelled');
|
|
process.exit(0);
|
|
}
|
|
|
|
// ── uninstall ──
|
|
log(`Uninstalling Helm release ${RELEASE}...`);
|
|
execSync(`helm uninstall "${RELEASE}" --namespace "${NAMESPACE}"`, { stdio: 'inherit' });
|
|
|
|
log('Helm release uninstalled');
|
|
|
|
// ── verify protected ──
|
|
function exists(cmd) {
|
|
try { execSync(cmd, { stdio: 'pipe' }); return true; } catch { return false; }
|
|
}
|
|
|
|
log('Verifying protected resources still exist...');
|
|
|
|
if (exists(`kubectl get namespace "${NAMESPACE}"`)) {
|
|
log(`Namespace '${NAMESPACE}' preserved`);
|
|
} else {
|
|
err(`Namespace '${NAMESPACE}' was deleted!`);
|
|
}
|
|
|
|
if (exists(`kubectl get configmap "${CONFIG_MAP}" -n "${NAMESPACE}"`)) {
|
|
log(`ConfigMap '${CONFIG_MAP}' preserved`);
|
|
} else {
|
|
err(`ConfigMap '${CONFIG_MAP}' was deleted!`);
|
|
}
|
|
|
|
if (exists(`kubectl get pvc "${PVC_NAME}" -n "${NAMESPACE}"`)) {
|
|
log(`PVC '${PVC_NAME}' preserved`);
|
|
} else {
|
|
err(`PVC '${PVC_NAME}' was deleted!`);
|
|
}
|
|
|
|
log(`Uninstall complete — remaining resources in namespace ${NAMESPACE}:`);
|
|
execSync(`kubectl get all,pvc,configmap,ingress -n "${NAMESPACE}"`, { stdio: 'inherit' });
|