fix: 归一 PaC admission 等价差异

This commit is contained in:
Codex
2026-07-13 09:06:36 +02:00
parent 84fa08572e
commit b929e4356e
3 changed files with 119 additions and 9 deletions
@@ -331,6 +331,31 @@ describe("Tekton admission canonicalization", () => {
expect(canonicalizePacPipelineSpec(negative)).toEqual(negative);
expect(nativeCanonicalize(negative)).toEqual(negative);
});
test("normalizes equivalent PipelineRun timeout spellings without hiding different values", () => {
const seconds = { spec: { timeouts: { pipeline: "600s" } } };
const admitted = { spec: { timeouts: { pipeline: "10m0s" } } };
const different = { spec: { timeouts: { pipeline: "601s" } } };
const unrelated = { timeouts: { pipeline: "600s" } };
expect(canonicalizePacPipelineSpec(seconds)).toEqual(canonicalizePacPipelineSpec(admitted));
expect(nativeCanonicalize(seconds)).toEqual(nativeCanonicalize(admitted));
expect(canonicalSha256(seconds)).toBe(canonicalSha256(admitted));
expect(nativeCanonicalSha256(admitted)).toBe(canonicalSha256(seconds));
expect(firstPacSourceArtifactDrift(seconds, admitted)).toBeNull();
expect(firstPacSourceArtifactDrift(seconds, different)?.path).toBe("$.spec.timeouts.pipeline");
expect(canonicalizePacPipelineSpec(unrelated)).toEqual(unrelated);
expect(nativeCanonicalize(unrelated)).toEqual(unrelated);
});
test("removes only empty workspace claim metadata and status added by admission", () => {
const desired = { spec: { workspaces: [{ name: "source", volumeClaimTemplate: { spec: { accessModes: ["ReadWriteOnce"] } } }] } };
const admitted = { spec: { workspaces: [{ name: "source", volumeClaimTemplate: { metadata: {}, spec: { accessModes: ["ReadWriteOnce"] }, status: {} } }] } };
const labeled = { spec: { workspaces: [{ name: "source", volumeClaimTemplate: { metadata: { labels: { owner: "test" } }, spec: { accessModes: ["ReadWriteOnce"] } } }] } };
expect(canonicalizePacPipelineSpec(admitted)).toEqual(canonicalizePacPipelineSpec(desired));
expect(nativeCanonicalize(admitted)).toEqual(nativeCanonicalize(desired));
expect(firstPacSourceArtifactDrift(desired, admitted)).toBeNull();
expect(firstPacSourceArtifactDrift(desired, labeled)?.path).toBe("$.spec.workspaces[0].volumeClaimTemplate.metadata");
});
});
describe("source artifact serialization", () => {
@@ -636,6 +661,9 @@ describe("runtime source-commit selection", () => {
expect(sourceArtifactRuntimeAlignment(aligned, exact, sourceCommit)).toBe("aligned");
expect(sourceArtifactRuntimeAlignment(drifted, exact, sourceCommit)).toBe("drifted");
expect(sourceArtifactRuntimeAlignment(aligned, { ...exact, clean: false }, sourceCommit)).toBe("unavailable");
const embeddedOnly = { ...structuredClone(aligned), live: { ...aligned.live, status: "missing" as const, provenanceAligned: false } };
expect(sourceArtifactRuntimeAlignment(embeddedOnly, exact, sourceCommit, "embedded-pipeline-spec")).toBe("aligned");
expect(sourceArtifactRuntimeAlignment(embeddedOnly, exact, sourceCommit, "remote-pipeline-annotation")).toBe("missing");
expect(JSON.stringify([aligned, drifted])).not.toContain("pending");
});