fix(sentinel): preserve service POST bodies
This commit is contained in:
@@ -2913,19 +2913,29 @@ function callSentinelService(state: SentinelCicdState, method: "GET" | "POST", p
|
|||||||
const namespace = stringAt(state.runtime, "namespace");
|
const namespace = stringAt(state.runtime, "namespace");
|
||||||
const serviceName = stringAt(state.runtime, "serviceName");
|
const serviceName = stringAt(state.runtime, "serviceName");
|
||||||
const servicePort = numberAt(state.runtime, "servicePort");
|
const servicePort = numberAt(state.runtime, "servicePort");
|
||||||
|
const deploymentName = stringAt(state.runtime, "deploymentName");
|
||||||
const url = `http://${serviceName}.${namespace}.svc.cluster.local:${servicePort}${pathWithQuery}`;
|
const url = `http://${serviceName}.${namespace}.svc.cluster.local:${servicePort}${pathWithQuery}`;
|
||||||
const proxyPath = `/api/v1/namespaces/${namespace}/services/${serviceName}:${servicePort}/proxy${pathWithQuery}`;
|
const proxyPath = `/api/v1/namespaces/${namespace}/services/${serviceName}:${servicePort}/proxy${pathWithQuery}`;
|
||||||
const bodyB64 = Buffer.from(body === null ? "" : JSON.stringify(body), "utf8").toString("base64");
|
const bodyB64 = Buffer.from(body === null ? "" : JSON.stringify(body), "utf8").toString("base64");
|
||||||
|
const pathB64 = Buffer.from(pathWithQuery, "utf8").toString("base64");
|
||||||
|
const postScript = [
|
||||||
|
"const path = Buffer.from(process.env.SENTINEL_PATH_B64 || '', 'base64').toString('utf8');",
|
||||||
|
"const body = Buffer.from(process.env.SENTINEL_BODY_B64 || '', 'base64').toString('utf8');",
|
||||||
|
`const url = 'http://127.0.0.1:${servicePort}' + path;`,
|
||||||
|
"fetch(url, { method: 'POST', headers: { 'content-type': 'application/json' }, body }).then(async (response) => {",
|
||||||
|
" const text = await response.text();",
|
||||||
|
" process.stdout.write(text);",
|
||||||
|
" if (!response.ok) process.exit(22);",
|
||||||
|
"}).catch((error) => {",
|
||||||
|
" console.error(error && error.stack ? error.stack : String(error));",
|
||||||
|
" process.exit(23);",
|
||||||
|
"});",
|
||||||
|
].join(" ");
|
||||||
const script = method === "GET"
|
const script = method === "GET"
|
||||||
? `kubectl get --raw ${shellQuote(proxyPath)}`
|
? `kubectl get --raw ${shellQuote(proxyPath)}`
|
||||||
: [
|
: [
|
||||||
"set -eu",
|
"set -eu",
|
||||||
`proxy_path=${shellQuote(proxyPath)}`,
|
`kubectl exec -n ${shellQuote(namespace)} deploy/${shellQuote(deploymentName)} -- env SENTINEL_PATH_B64=${shellQuote(pathB64)} SENTINEL_BODY_B64=${shellQuote(bodyB64)} node -e ${shellQuote(postScript)}`,
|
||||||
`body_b64=${shellQuote(bodyB64)}`,
|
|
||||||
"body_file=$(mktemp \"${TMPDIR:-/tmp}/sentinel-service-proxy.body.XXXXXX\")",
|
|
||||||
"trap 'rm -f \"$body_file\"' EXIT",
|
|
||||||
"printf %s \"$body_b64\" | base64 -d >\"$body_file\"",
|
|
||||||
"kubectl create --raw \"$proxy_path\" -f \"$body_file\"",
|
|
||||||
].join("\n");
|
].join("\n");
|
||||||
const maxAttempts = method === "GET" ? 3 : 1;
|
const maxAttempts = method === "GET" ? 3 : 1;
|
||||||
const attemptTimeoutSeconds = Math.max(5, Math.min(timeoutSeconds, method === "GET" ? 15 : 60));
|
const attemptTimeoutSeconds = Math.max(5, Math.min(timeoutSeconds, method === "GET" ? 15 : 60));
|
||||||
|
|||||||
Reference in New Issue
Block a user