51 lines
2.4 KiB
JavaScript
51 lines
2.4 KiB
JavaScript
import { readFileSync } from "node:fs";
|
|
import https from "node:https";
|
|
|
|
const namespace = process.env.NAMESPACE || "";
|
|
const configMap = process.env.CONFIGMAP || "";
|
|
const patch = JSON.parse(Buffer.from(process.env.PATCH_B64 || "", "base64").toString("utf8"));
|
|
const host = process.env.KUBERNETES_SERVICE_HOST;
|
|
const port = Number(process.env.KUBERNETES_SERVICE_PORT || "443");
|
|
const token = readFileSync("/var/run/secrets/kubernetes.io/serviceaccount/token", "utf8").trim();
|
|
const ca = readFileSync("/var/run/secrets/kubernetes.io/serviceaccount/ca.crt");
|
|
|
|
function request(method, path, body, contentType = "application/json") {
|
|
return new Promise((resolve, reject) => {
|
|
const headers = { authorization: `Bearer ${token}` };
|
|
const payload = body === undefined ? null : typeof body === "string" ? body : JSON.stringify(body);
|
|
if (payload !== null) {
|
|
headers["content-type"] = contentType;
|
|
headers["content-length"] = Buffer.byteLength(payload);
|
|
}
|
|
const req = https.request({ host, port, path, method, ca, headers }, (res) => {
|
|
let text = "";
|
|
res.setEncoding("utf8");
|
|
res.on("data", (chunk) => { text += chunk; });
|
|
res.on("end", () => resolve({ status: res.statusCode || 0, text }));
|
|
});
|
|
req.on("error", reject);
|
|
if (payload !== null) req.write(payload);
|
|
req.end();
|
|
});
|
|
}
|
|
|
|
const path = `/api/v1/namespaces/${encodeURIComponent(namespace)}/configmaps/${encodeURIComponent(configMap)}`;
|
|
const before = await request("GET", path);
|
|
if (before.status === 404) {
|
|
process.stdout.write(JSON.stringify({ ok: true, present: false, patched: false, reason: "state-configmap-not-found", parsedDownstreamCliOutput: false }));
|
|
process.exit(0);
|
|
}
|
|
if (before.status < 200 || before.status >= 300) throw new Error(before.text || `kube api GET configmap status ${before.status}`);
|
|
const beforeObject = JSON.parse(before.text);
|
|
const result = await request("PATCH", path, patch, "application/merge-patch+json");
|
|
if (result.status < 200 || result.status >= 300) throw new Error(result.text || `kube api PATCH configmap status ${result.status}`);
|
|
const afterObject = JSON.parse(result.text);
|
|
process.stdout.write(JSON.stringify({
|
|
ok: true,
|
|
present: true,
|
|
patched: true,
|
|
beforeResourceVersion: beforeObject?.metadata?.resourceVersion || null,
|
|
afterResourceVersion: afterObject?.metadata?.resourceVersion || null,
|
|
parsedDownstreamCliOutput: false,
|
|
}));
|