176 lines
6.2 KiB
JavaScript
176 lines
6.2 KiB
JavaScript
import assert from "node:assert/strict";
|
|
|
|
import {
|
|
applyRuntimeLaneDeployConfig,
|
|
isNamedRuntimeLane,
|
|
isRuntimeLane,
|
|
isVersionRuntimeLane,
|
|
runtimeNamespaceForRuntimeLane,
|
|
runtimeRelativePathForRuntimeLane
|
|
} from "./runtime-lane.ts";
|
|
import {
|
|
gitopsPathForProfile,
|
|
namespaceNameForProfile,
|
|
parseArgs,
|
|
runtimeFrpConfigForProfile,
|
|
runtimePathForProfile,
|
|
transformServices
|
|
} from "./gitops-render/core.mjs";
|
|
import { nodeFrpcManifest } from "./gitops-render/runtime-manifests.mjs";
|
|
|
|
const namedLaneDeploy = {
|
|
nodes: {
|
|
NC01: {
|
|
gitopsRoot: "deploy/gitops/node/nc01",
|
|
sourceRepo: "git@github.com:pikasTech/HWLAB.git"
|
|
}
|
|
},
|
|
lanes: {
|
|
production: {
|
|
name: "Production",
|
|
node: "NC01",
|
|
sourceBranch: "release",
|
|
gitopsBranch: "hwlab-production",
|
|
gitReadUrl: "http://gitea.example/mirrors/hwlab.git",
|
|
gitWriteUrl: "http://git-mirror-write.example/pikasTech/HWLAB.git",
|
|
artifactCatalog: "deploy/artifact-catalog.production.json",
|
|
runtimePath: "runtime-production",
|
|
namespace: "hwlab-production",
|
|
imageTagMode: "full",
|
|
publicEndpoints: {
|
|
frontend: "https://hwlab.example",
|
|
api: "https://api.hwlab.example"
|
|
},
|
|
publicServices: {
|
|
nodes: {
|
|
NC01: [{
|
|
name: "hwlab-cloud-web-public",
|
|
selector: { "app.kubernetes.io/name": "hwlab-cloud-web" },
|
|
port: 80,
|
|
targetPort: 8080,
|
|
nodePort: 32010
|
|
}]
|
|
}
|
|
},
|
|
frp: {
|
|
server: { address: "203.0.113.10", bindPort: 22000 },
|
|
proxies: [
|
|
{ name: "production-web", endpointId: "frontend", localHost: "web.hwlab-production.svc.cluster.local", localPort: 8080, remotePort: 22090 },
|
|
{ name: "production-api", endpointId: "api", localHost: "api.hwlab-production.svc.cluster.local", localPort: 6667, remotePort: 22088 }
|
|
]
|
|
},
|
|
envReuseServices: ["hwlab-cloud-web"],
|
|
serviceDeclarations: {
|
|
"hwlab-cloud-web": { healthPort: 8080, healthPath: "/health/live" }
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
const defaultArgs = {
|
|
lane: "production",
|
|
nodeId: "node",
|
|
outDir: "deploy/gitops/node",
|
|
gitopsRoot: "deploy/gitops/node",
|
|
sourceBranch: "node",
|
|
gitopsBranch: "node-gitops",
|
|
catalogPath: "deploy/artifact-catalog.dev.json",
|
|
imageTagMode: "full",
|
|
runtimeEndpoint: "http://74.48.78.17:17667",
|
|
webEndpoint: "http://74.48.78.17:17666",
|
|
sourceRepo: "git@github.com:pikasTech/HWLAB.git"
|
|
};
|
|
|
|
assert.equal(isRuntimeLane("production"), true);
|
|
assert.equal(isNamedRuntimeLane("production"), true);
|
|
assert.equal(isVersionRuntimeLane("production"), false);
|
|
assert.equal(isVersionRuntimeLane("v03"), true);
|
|
assert.equal(parseArgs(["--lane", "production", "--no-write"]).lane, "production");
|
|
|
|
const resolved = applyRuntimeLaneDeployConfig(defaultArgs, namedLaneDeploy);
|
|
assert.deepEqual({
|
|
nodeId: resolved.nodeId,
|
|
gitopsRoot: resolved.gitopsRoot,
|
|
sourceBranch: resolved.sourceBranch,
|
|
gitopsBranch: resolved.gitopsBranch,
|
|
gitReadUrl: resolved.gitReadUrl,
|
|
gitWriteUrl: resolved.gitWriteUrl,
|
|
catalogPath: resolved.catalogPath,
|
|
runtimeEndpoint: resolved.runtimeEndpoint,
|
|
webEndpoint: resolved.webEndpoint
|
|
}, {
|
|
nodeId: "NC01",
|
|
gitopsRoot: "deploy/gitops/node/nc01",
|
|
sourceBranch: "release",
|
|
gitopsBranch: "hwlab-production",
|
|
gitReadUrl: "http://gitea.example/mirrors/hwlab.git",
|
|
gitWriteUrl: "http://git-mirror-write.example/pikasTech/HWLAB.git",
|
|
catalogPath: "deploy/artifact-catalog.production.json",
|
|
runtimeEndpoint: "https://api.hwlab.example",
|
|
webEndpoint: "https://hwlab.example"
|
|
});
|
|
assert.equal(runtimeNamespaceForRuntimeLane(namedLaneDeploy, "production"), "hwlab-production");
|
|
assert.equal(runtimeRelativePathForRuntimeLane(namedLaneDeploy, "production"), "runtime-production");
|
|
assert.equal(namespaceNameForProfile("production", namedLaneDeploy), "hwlab-production");
|
|
assert.equal(runtimePathForProfile("production", namedLaneDeploy), "runtime-production");
|
|
assert.equal(
|
|
gitopsPathForProfile(resolved, "production", namedLaneDeploy),
|
|
"deploy/gitops/node/nc01/runtime-production"
|
|
);
|
|
|
|
const services = transformServices({
|
|
services: { apiVersion: "v1", kind: "List", items: [] },
|
|
namespace: "hwlab-production",
|
|
labels: {},
|
|
annotations: {},
|
|
profile: "production",
|
|
deploy: namedLaneDeploy,
|
|
nodeId: "NC01"
|
|
});
|
|
assert.deepEqual(services.items[0].spec.ports[0], { name: "http", port: 80, targetPort: 8080, nodePort: 32010 });
|
|
|
|
const frp = runtimeFrpConfigForProfile(namedLaneDeploy, "production", { nodeId: "NC01" });
|
|
assert.deepEqual({
|
|
serverAddr: frp.serverAddr,
|
|
serverPort: frp.serverPort,
|
|
webLocalHost: frp.webLocalHost,
|
|
webLocalPort: frp.webLocalPort,
|
|
webRemotePort: frp.webRemotePort,
|
|
edgeLocalHost: frp.edgeLocalHost,
|
|
edgeLocalPort: frp.edgeLocalPort,
|
|
edgeRemotePort: frp.edgeRemotePort
|
|
}, {
|
|
serverAddr: "203.0.113.10",
|
|
serverPort: 22000,
|
|
webLocalHost: "web.hwlab-production.svc.cluster.local",
|
|
webLocalPort: 8080,
|
|
webRemotePort: 22090,
|
|
edgeLocalHost: "api.hwlab-production.svc.cluster.local",
|
|
edgeLocalPort: 6667,
|
|
edgeRemotePort: 22088
|
|
});
|
|
|
|
const frpDisabledDeploy = structuredClone(namedLaneDeploy);
|
|
frpDisabledDeploy.lanes.production.frp = { enabled: false };
|
|
assert.deepEqual(nodeFrpcManifest({ profile: "production", deploy: frpDisabledDeploy }).items, []);
|
|
|
|
const incompleteDeploy = structuredClone(namedLaneDeploy);
|
|
delete incompleteDeploy.lanes.production.namespace;
|
|
assert.throws(
|
|
() => applyRuntimeLaneDeployConfig(defaultArgs, incompleteDeploy),
|
|
/deploy\.lanes\.production\.namespace must be a non-empty string/u
|
|
);
|
|
|
|
const versionLaneDeploy = {
|
|
nodes: { G14: { gitopsRoot: "deploy/gitops/node/G14", publicHost: "74.48.78.17" } },
|
|
lanes: { v03: { node: "G14" } }
|
|
};
|
|
const versionResolved = applyRuntimeLaneDeployConfig({ ...defaultArgs, lane: "v03" }, versionLaneDeploy);
|
|
assert.equal(versionResolved.sourceBranch, "v0.3");
|
|
assert.equal(versionResolved.gitopsBranch, "v0.3-gitops");
|
|
assert.equal(versionResolved.catalogPath, "deploy/artifact-catalog.v03.json");
|
|
assert.equal(runtimeNamespaceForRuntimeLane(versionLaneDeploy, "v03"), "hwlab-v03");
|
|
assert.equal(runtimeRelativePathForRuntimeLane(versionLaneDeploy, "v03"), "runtime-v03");
|
|
|
|
console.log(JSON.stringify({ ok: true, tests: 20, namedLane: "production", versionLane: "v03" }));
|