From 49837db23afe91caf0bdb116d7da9df25f62490f Mon Sep 17 00:00:00 2001 From: Jakob Naucke Date: Fri, 21 Aug 2026 13:03:00 +0000 Subject: [PATCH 1/8] Update operator to 1b8651e accounting for Containerfile unification, bumping buildroot Signed-off-by: Jakob Naucke Assisted-by: AI --- ...attestation-key-register-pull-request.yaml | 8 +- .tekton/attestation-key-register-push.yaml | 8 +- .tekton/compute-pcrs-pull-request.yaml | 8 +- .tekton/compute-pcrs-push.yaml | 8 +- ...dential-cluster-operator-pull-request.yaml | 8 +- .../confidential-cluster-operator-push.yaml | 8 +- .tekton/registration-server-pull-request.yaml | 8 +- .tekton/registration-server-push.yaml | 8 +- Containerfile | 158 ++++++++++++++++++ Containerfile.attestation-key-register | 53 ------ Containerfile.compute-pcrs | 56 ------- Containerfile.operator | 55 ------ Containerfile.registration-server | 54 ------ README.md | 17 +- drift-cache/Containerfile | 106 ++++++++++++ .../attestation-key-register/Containerfile | 30 ---- drift-cache/compute-pcrs/Containerfile | 31 ---- drift-cache/operator/Containerfile | 33 ---- drift-cache/register-server/Containerfile | 31 ---- operator | 2 +- 20 files changed, 322 insertions(+), 368 deletions(-) create mode 100644 Containerfile delete mode 100644 Containerfile.attestation-key-register delete mode 100644 Containerfile.compute-pcrs delete mode 100644 Containerfile.operator delete mode 100644 Containerfile.registration-server create mode 100644 drift-cache/Containerfile delete mode 100644 drift-cache/attestation-key-register/Containerfile delete mode 100644 drift-cache/compute-pcrs/Containerfile delete mode 100644 drift-cache/operator/Containerfile delete mode 100644 drift-cache/register-server/Containerfile diff --git a/.tekton/attestation-key-register-pull-request.yaml b/.tekton/attestation-key-register-pull-request.yaml index 8d7549a..90ec16d 100644 --- a/.tekton/attestation-key-register-pull-request.yaml +++ b/.tekton/attestation-key-register-pull-request.yaml @@ -8,7 +8,7 @@ metadata: build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/cancel-in-progress: "true" pipelinesascode.tekton.dev/max-keep-runs: "3" - pipelinesascode.tekton.dev/on-cel-expression: event == "pull_request" && target_branch == "main" && (".tekton/attestation-key-register-push.yaml".pathChanged() || ".tekton/attestation-key-register-pull-request.yaml".pathChanged() || "Containerfile.attestation-key-register".pathChanged() || "operator".pathChanged()) + pipelinesascode.tekton.dev/on-cel-expression: event == "pull_request" && target_branch == "main" && (".tekton/attestation-key-register-push.yaml".pathChanged() || ".tekton/attestation-key-register-pull-request.yaml".pathChanged() || "Containerfile".pathChanged() || "operator".pathChanged()) creationTimestamp: labels: appstudio.openshift.io/application: confidential-cluster-operator @@ -27,7 +27,7 @@ spec: - name: image-expires-after value: 5d - name: dockerfile - value: Containerfile.attestation-key-register + value: Containerfile - name: build-args value: - build_type=release @@ -204,6 +204,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: attestation-key-register - name: CONTEXT value: $(params.path-context) - name: HERMETIC @@ -422,6 +424,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: attestation-key-register - name: CONTEXT value: $(params.path-context) - name: HERMETIC diff --git a/.tekton/attestation-key-register-push.yaml b/.tekton/attestation-key-register-push.yaml index abbb877..a1cce7a 100644 --- a/.tekton/attestation-key-register-push.yaml +++ b/.tekton/attestation-key-register-push.yaml @@ -9,7 +9,7 @@ metadata: build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/cancel-in-progress: "false" pipelinesascode.tekton.dev/max-keep-runs: "3" - pipelinesascode.tekton.dev/on-cel-expression: event == "push" && target_branch == "main" && (".tekton/attestation-key-register-push.yaml".pathChanged() || ".tekton/attestation-key-register-pull-request.yaml".pathChanged() || "Containerfile.attestation-key-register".pathChanged() || "operator".pathChanged()) + pipelinesascode.tekton.dev/on-cel-expression: event == "push" && target_branch == "main" && (".tekton/attestation-key-register-push.yaml".pathChanged() || ".tekton/attestation-key-register-pull-request.yaml".pathChanged() || "Containerfile".pathChanged() || "operator".pathChanged()) creationTimestamp: labels: appstudio.openshift.io/application: confidential-cluster-operator @@ -26,7 +26,7 @@ spec: - name: output-image value: quay.io/redhat-user-workloads/cocl-operator-tenant/attestation-key-register:{{revision}} - name: dockerfile - value: Containerfile.attestation-key-register + value: Containerfile - name: build-args value: - build_type=release @@ -203,6 +203,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: attestation-key-register - name: CONTEXT value: $(params.path-context) - name: HERMETIC @@ -421,6 +423,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: attestation-key-register - name: CONTEXT value: $(params.path-context) - name: HERMETIC diff --git a/.tekton/compute-pcrs-pull-request.yaml b/.tekton/compute-pcrs-pull-request.yaml index 6545bdd..ad366a4 100644 --- a/.tekton/compute-pcrs-pull-request.yaml +++ b/.tekton/compute-pcrs-pull-request.yaml @@ -8,7 +8,7 @@ metadata: build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/cancel-in-progress: "true" pipelinesascode.tekton.dev/max-keep-runs: "3" - pipelinesascode.tekton.dev/on-cel-expression: event == "pull_request" && target_branch == "main" && (".tekton/compute-pcrs-push.yaml".pathChanged() || ".tekton/compute-pcrs-pull-request.yaml".pathChanged() || "Containerfile.compute-pcrs".pathChanged() || "operator".pathChanged()) + pipelinesascode.tekton.dev/on-cel-expression: event == "pull_request" && target_branch == "main" && (".tekton/compute-pcrs-push.yaml".pathChanged() || ".tekton/compute-pcrs-pull-request.yaml".pathChanged() || "Containerfile".pathChanged() || "operator".pathChanged()) creationTimestamp: labels: appstudio.openshift.io/application: confidential-cluster-operator @@ -27,7 +27,7 @@ spec: - name: image-expires-after value: 5d - name: dockerfile - value: Containerfile.compute-pcrs + value: Containerfile - name: build-args value: - build_type=release @@ -204,6 +204,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: compute-pcrs - name: CONTEXT value: $(params.path-context) - name: HERMETIC @@ -422,6 +424,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: compute-pcrs - name: CONTEXT value: $(params.path-context) - name: HERMETIC diff --git a/.tekton/compute-pcrs-push.yaml b/.tekton/compute-pcrs-push.yaml index b8dd418..51163ec 100644 --- a/.tekton/compute-pcrs-push.yaml +++ b/.tekton/compute-pcrs-push.yaml @@ -9,7 +9,7 @@ metadata: build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/cancel-in-progress: "false" pipelinesascode.tekton.dev/max-keep-runs: "3" - pipelinesascode.tekton.dev/on-cel-expression: event == "push" && target_branch == "main" && (".tekton/compute-pcrs-push.yaml".pathChanged() || ".tekton/compute-pcrs-pull-request.yaml".pathChanged() || "Containerfile.compute-pcrs".pathChanged() || "operator".pathChanged()) + pipelinesascode.tekton.dev/on-cel-expression: event == "push" && target_branch == "main" && (".tekton/compute-pcrs-push.yaml".pathChanged() || ".tekton/compute-pcrs-pull-request.yaml".pathChanged() || "Containerfile".pathChanged() || "operator".pathChanged()) creationTimestamp: labels: appstudio.openshift.io/application: confidential-cluster-operator @@ -26,7 +26,7 @@ spec: - name: output-image value: quay.io/redhat-user-workloads/cocl-operator-tenant/compute-pcrs:{{revision}} - name: dockerfile - value: Containerfile.compute-pcrs + value: Containerfile - name: build-args value: - build_type=release @@ -203,6 +203,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: compute-pcrs - name: CONTEXT value: $(params.path-context) - name: HERMETIC @@ -421,6 +423,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: compute-pcrs - name: CONTEXT value: $(params.path-context) - name: HERMETIC diff --git a/.tekton/confidential-cluster-operator-pull-request.yaml b/.tekton/confidential-cluster-operator-pull-request.yaml index 886193c..420e152 100644 --- a/.tekton/confidential-cluster-operator-pull-request.yaml +++ b/.tekton/confidential-cluster-operator-pull-request.yaml @@ -8,7 +8,7 @@ metadata: build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/cancel-in-progress: "true" pipelinesascode.tekton.dev/max-keep-runs: "3" - pipelinesascode.tekton.dev/on-cel-expression: event == "pull_request" && target_branch == "main" && (".tekton/confidential-cluster-operator-push.yaml".pathChanged() || ".tekton/confidential-cluster-operator-pull-request.yaml".pathChanged() || "Containerfile.operator".pathChanged() || "operator".pathChanged()) + pipelinesascode.tekton.dev/on-cel-expression: event == "pull_request" && target_branch == "main" && (".tekton/confidential-cluster-operator-push.yaml".pathChanged() || ".tekton/confidential-cluster-operator-pull-request.yaml".pathChanged() || "Containerfile".pathChanged() || "operator".pathChanged()) creationTimestamp: labels: appstudio.openshift.io/application: confidential-cluster-operator @@ -27,7 +27,7 @@ spec: - name: image-expires-after value: 5d - name: dockerfile - value: Containerfile.operator + value: Containerfile - name: build-args value: - build_type=release @@ -204,6 +204,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: operator - name: CONTEXT value: $(params.path-context) - name: HERMETIC @@ -422,6 +424,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: operator - name: CONTEXT value: $(params.path-context) - name: HERMETIC diff --git a/.tekton/confidential-cluster-operator-push.yaml b/.tekton/confidential-cluster-operator-push.yaml index 5e4080f..04db02a 100644 --- a/.tekton/confidential-cluster-operator-push.yaml +++ b/.tekton/confidential-cluster-operator-push.yaml @@ -9,7 +9,7 @@ metadata: build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/cancel-in-progress: "false" pipelinesascode.tekton.dev/max-keep-runs: "3" - pipelinesascode.tekton.dev/on-cel-expression: event == "push" && target_branch == "main" && (".tekton/confidential-cluster-operator-push.yaml".pathChanged() || ".tekton/confidential-cluster-operator-pull-request.yaml".pathChanged() || "Containerfile.operator".pathChanged() || "operator".pathChanged()) + pipelinesascode.tekton.dev/on-cel-expression: event == "push" && target_branch == "main" && (".tekton/confidential-cluster-operator-push.yaml".pathChanged() || ".tekton/confidential-cluster-operator-pull-request.yaml".pathChanged() || "Containerfile".pathChanged() || "operator".pathChanged()) creationTimestamp: labels: appstudio.openshift.io/application: confidential-cluster-operator @@ -26,7 +26,7 @@ spec: - name: output-image value: quay.io/redhat-user-workloads/cocl-operator-tenant/confidential-cluster-operator:{{revision}} - name: dockerfile - value: Containerfile.operator + value: Containerfile - name: build-args value: - build_type=release @@ -203,6 +203,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: operator - name: CONTEXT value: $(params.path-context) - name: HERMETIC @@ -421,6 +423,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: operator - name: CONTEXT value: $(params.path-context) - name: HERMETIC diff --git a/.tekton/registration-server-pull-request.yaml b/.tekton/registration-server-pull-request.yaml index 8dc0fda..4debd07 100644 --- a/.tekton/registration-server-pull-request.yaml +++ b/.tekton/registration-server-pull-request.yaml @@ -8,7 +8,7 @@ metadata: build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/cancel-in-progress: "true" pipelinesascode.tekton.dev/max-keep-runs: "3" - pipelinesascode.tekton.dev/on-cel-expression: event == "pull_request" && target_branch == "main" && (".tekton/registration-server-push.yaml".pathChanged() || ".tekton/registration-server-pull-request.yaml".pathChanged() || "Containerfile.registration-server".pathChanged() || "operator".pathChanged()) + pipelinesascode.tekton.dev/on-cel-expression: event == "pull_request" && target_branch == "main" && (".tekton/registration-server-push.yaml".pathChanged() || ".tekton/registration-server-pull-request.yaml".pathChanged() || "Containerfile".pathChanged() || "operator".pathChanged()) creationTimestamp: labels: appstudio.openshift.io/application: confidential-cluster-operator @@ -27,7 +27,7 @@ spec: - name: image-expires-after value: 5d - name: dockerfile - value: Containerfile.registration-server + value: Containerfile - name: build-args value: - build_type=release @@ -204,6 +204,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: register-server - name: CONTEXT value: $(params.path-context) - name: HERMETIC @@ -422,6 +424,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: register-server - name: CONTEXT value: $(params.path-context) - name: HERMETIC diff --git a/.tekton/registration-server-push.yaml b/.tekton/registration-server-push.yaml index 6bcba17..f2d72aa 100644 --- a/.tekton/registration-server-push.yaml +++ b/.tekton/registration-server-push.yaml @@ -9,7 +9,7 @@ metadata: build.appstudio.redhat.com/target_branch: '{{target_branch}}' pipelinesascode.tekton.dev/cancel-in-progress: "false" pipelinesascode.tekton.dev/max-keep-runs: "3" - pipelinesascode.tekton.dev/on-cel-expression: event == "push" && target_branch == "main" && (".tekton/registration-server-push.yaml".pathChanged() || ".tekton/registration-server-pull-request.yaml".pathChanged() || "Containerfile.registration-server".pathChanged() || "operator".pathChanged()) + pipelinesascode.tekton.dev/on-cel-expression: event == "push" && target_branch == "main" && (".tekton/registration-server-push.yaml".pathChanged() || ".tekton/registration-server-pull-request.yaml".pathChanged() || "Containerfile".pathChanged() || "operator".pathChanged()) creationTimestamp: labels: appstudio.openshift.io/application: confidential-cluster-operator @@ -26,7 +26,7 @@ spec: - name: output-image value: quay.io/redhat-user-workloads/cocl-operator-tenant/registration-server:{{revision}} - name: dockerfile - value: Containerfile.registration-server + value: Containerfile - name: build-args value: - build_type=release @@ -203,6 +203,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: register-server - name: CONTEXT value: $(params.path-context) - name: HERMETIC @@ -421,6 +423,8 @@ spec: value: $(params.output-image) - name: DOCKERFILE value: $(params.dockerfile) + - name: TARGET_STAGE + value: register-server - name: CONTEXT value: $(params.path-context) - name: HERMETIC diff --git a/Containerfile b/Containerfile new file mode 100644 index 0000000..936469d --- /dev/null +++ b/Containerfile @@ -0,0 +1,158 @@ +# based on ./operator/Containerfile +# SPDX-FileCopyrightText: Alice Frosi +# SPDX-FileCopyrightText: Jakob Naucke +# SPDX-FileCopyrightText: Yair Podemsky +# +# SPDX-License-Identifier: CC0-1.0 + +ARG build_type=release +ARG build_target=operator + +# Unified builder stage, compiles all binaries in a single cargo invocation. +FROM quay.io/redhat-user-workloads/cocl-operator-tenant/buildroot@sha256:34806c0eb874b00bcd0fc90241746404e051070b278ac0351e5c8873ffda8b39 +LABEL project=trusted-cluster-operator +ARG build_type +WORKDIR /build + +# Drift detection - ensure local build matches upstream +COPY drift-detection/detector.sh /detector.sh +COPY drift-cache /drift-cache +WORKDIR /tmp +COPY operator/Containerfile . +RUN /detector.sh ./Containerfile /drift-cache/Containerfile + +WORKDIR /build +COPY operator/Makefile operator/Cargo.toml operator/Cargo.lock operator/go.mod operator/go.sum ./ + +COPY operator/api api +COPY operator/lib lib + +# Copy Cargo.toml and lib.rs stubs for dependency pre-build caching. +COPY operator/operator/Cargo.toml operator/ +COPY operator/operator/src/lib.rs operator/src/ +COPY operator/compute-pcrs/Cargo.toml compute-pcrs/ +COPY operator/compute-pcrs/src/lib.rs compute-pcrs/src/ +COPY operator/register-server/Cargo.toml register-server/ +COPY operator/register-server/src/lib.rs register-server/src/ +COPY operator/attestation-key-register/Cargo.toml attestation-key-register/ +COPY operator/attestation-key-register/src/lib.rs attestation-key-register/src/ + +RUN sed -i 's/members = .*/members = ["lib", "operator", "compute-pcrs", "register-server", "attestation-key-register"]/' Cargo.toml && \ + sed -i '/\[dev-dependencies\]/,$d' operator/Cargo.toml && \ + sed -i '/\[dev-dependencies\]/,$d' register-server/Cargo.toml && \ + sed -i '/trusted-cluster-operator-test-utils/d' lib/Cargo.toml + +RUN make crds-rs + +# In debug builds, pre-build dependencies to avoid full rebuild on source changes. +RUN if [ "$build_type" = debug ]; then \ + cargo build -p operator -p compute-pcrs -p register-server -p attestation-key-register; \ + fi + +COPY operator/operator/src operator/src +COPY operator/compute-pcrs/src compute-pcrs/src +COPY operator/register-server/src register-server/src +COPY operator/attestation-key-register/src attestation-key-register/src + +RUN release_flag="" && \ + if [ "$build_type" = release ]; then release_flag="--release"; fi && \ + cargo build \ + -p operator \ + -p compute-pcrs \ + -p register-server \ + -p attestation-key-register \ + $release_flag + +RUN profile_dir="debug" && \ + if [ "$build_type" = release ]; then profile_dir="release"; fi && \ + mkdir -p /output && \ + cp /build/target/${profile_dir}/operator /output/ && \ + cp /build/target/${profile_dir}/compute-pcrs /output/ && \ + cp /build/target/${profile_dir}/register-server /output/ && \ + cp /build/target/${profile_dir}/attestation-key-register /output/ + +# Distribution stages +FROM registry.access.redhat.com/ubi9/ubi-minimal AS operator +COPY --from=builder /output/operator /usr/bin + +# Red Hat labels +LABEL vendor="Red Hat, Inc." \ + name="confidential-clusters-beta/confidential-cluster-operator" \ + version="0.2.1" \ + release="1" \ + description="confidential cluster operator - manages confidential computing resources on OpenShift" \ + io.k8s.description="Kubernetes operator for managing confidential clusters with trusted execution environments" \ + url="https://github.com/confidential-clusters/operator" \ + vcs-type="git" \ + vcs-ref="" \ + distribution-scope="public" \ + com.redhat.component="confidential-cluster-operator" + +ENTRYPOINT ["/usr/bin/operator"] + +FROM registry.access.redhat.com/ubi9/ubi-minimal AS attestation-key-register +COPY --from=builder /output/attestation-key-register /usr/bin + +LABEL vendor="Red Hat, Inc." \ + name="confidential-clusters-beta/attestation-key-register" \ + version="0.2.1" \ + release="1" \ + description="Attestation key registration tool for confidential cluster operator" \ + io.k8s.description="Service for registering and managing attestation keys for confidential workloads" \ + url="https://github.com/confidential-clusters/operator" \ + vcs-type="git" \ + vcs-ref="" \ + distribution-scope="public" \ + com.redhat.component="confidential-cluster-operator-attestation-key-register" + +EXPOSE 8001 +ENTRYPOINT ["/usr/bin/attestation-key-register"] + +FROM registry.access.redhat.com/ubi9/ubi-minimal AS register-server +COPY --from=builder /output/register-server /usr/bin + +LABEL vendor="Red Hat, Inc." \ + name="confidential-clusters-beta/registration-server" \ + version="0.2.1" \ + release="1" \ + description="Registration server for confidential cluster operator" \ + io.k8s.description="HTTP server for registering confidential workloads and managing attestation" \ + url="https://github.com/confidential-clusters/operator" \ + vcs-type="git" \ + vcs-ref="" \ + distribution-scope="public" \ + com.redhat.component="confidential-cluster-operator-registration-server" + +EXPOSE 3030 +ENTRYPOINT ["/usr/bin/register-server"] + + +FROM builder AS compute-pcrs-data +# Pin reference-values to specific commit for reproducible builds +ARG REFERENCE_VALUES_COMMIT=e296603ca106908258ac59326b001b602ed0f037 +RUN git clone https://github.com/trusted-execution-clusters/reference-values && \ + cd reference-values && git checkout ${REFERENCE_VALUES_COMMIT} && cd .. +RUN mkdir -p /output/reference-values && \ + mv /build/reference-values/efivars /output/reference-values/ && \ + mv /build/reference-values/mok-variables /output/reference-values/ + +FROM registry.access.redhat.com/ubi9/ubi-minimal AS compute-pcrs +COPY --from=compute-pcrs-data /output/compute-pcrs /usr/bin +COPY --from=compute-pcrs-data /output/reference-values /reference-values + +LABEL vendor="Red Hat, Inc." \ + name="confidential-clusters-beta/compute-pcrs" \ + version="0.2.1" \ + release="1" \ + description="PCR computation tool for confidential cluster operator" \ + io.k8s.description="Tool for computing Platform Configuration Register values for confidential VMs" \ + url="https://github.com/confidential-clusters/operator" \ + vcs-type="git" \ + vcs-ref="" \ + distribution-scope="public" \ + com.redhat.component="confidential-cluster-operator-compute-pcrs" + +ENTRYPOINT ["/usr/bin/compute-pcrs"] + +# Allow environments without --target support, which only read the last stage, to set the stage through the build arg +FROM ${build_target} AS final diff --git a/Containerfile.attestation-key-register b/Containerfile.attestation-key-register deleted file mode 100644 index 23ac806..0000000 --- a/Containerfile.attestation-key-register +++ /dev/null @@ -1,53 +0,0 @@ -# Based on ./operator/attestation-key-register/Containerfile -# SPDX-FileCopyrightText: Alice Frosi -# -# SPDX-License-Identifier: CC0-1.0 - -ARG build_type -FROM registry.redhat.io/confidential-clusters-beta/buildroot-rhel9@sha256:c805e1edfa7f5be0705cc4a88cece359636a06c3b2aa63a6a739cf763267a8b4 AS builder -ARG build_type -WORKDIR /build - -# Drift detection - ensure local build matches upstream -COPY drift-detection/detector.sh /detector.sh -COPY drift-cache /drift-cache -WORKDIR /tmp -COPY operator/attestation-key-register/Containerfile . -RUN /detector.sh ./Containerfile /drift-cache/attestation-key-register/Containerfile - -WORKDIR /build -COPY operator/Makefile operator/Cargo.toml operator/Cargo.lock operator/go.mod operator/go.sum ./ -COPY operator/api api -COPY operator/lib lib -COPY operator/attestation-key-register/Cargo.toml attestation-key-register/ -COPY operator/attestation-key-register/src/lib.rs attestation-key-register/src/ - -# Set only required crates as members to minimize rebuilds upon changes. -RUN sed -i 's/members =.*/members = ["lib", "attestation-key-register"]/' Cargo.toml && \ - make crds-rs - -# In debug builds, build dependencies to avoid full rebuild. -RUN if [ "$build_type" = debug ]; then cargo build -p attestation-key-register; fi - -COPY operator/attestation-key-register/src attestation-key-register/src -RUN cargo build -p attestation-key-register $(if [ "$build_type" = release ]; then echo --release; fi) - -FROM registry.access.redhat.com/ubi9/ubi-minimal -ARG build_type -COPY --from=builder "/build/target/$build_type/attestation-key-register" /usr/bin - -# Red Hat labels -LABEL vendor="Red Hat, Inc." \ - name="confidential-clusters-beta/attestation-key-register" \ - version="0.2.1" \ - release="1" \ - description="Attestation key registration tool for confidential cluster operator" \ - io.k8s.description="Service for registering and managing attestation keys for confidential workloads" \ - url="https://github.com/confidential-clusters/operator" \ - vcs-type="git" \ - vcs-ref="" \ - distribution-scope="public" \ - com.redhat.component="confidential-cluster-operator-attestation-key-register" - -EXPOSE 8001 -ENTRYPOINT ["/usr/bin/attestation-key-register"] diff --git a/Containerfile.compute-pcrs b/Containerfile.compute-pcrs deleted file mode 100644 index a1b8372..0000000 --- a/Containerfile.compute-pcrs +++ /dev/null @@ -1,56 +0,0 @@ -# Based on ./operator/compute-pcrs/Containerfile -# SPDX-FileCopyrightText: Alice Frosi -# SPDX-FileCopyrightText: Jakob Naucke -# -# SPDX-License-Identifier: CC0-1.0 - -ARG build_type -FROM registry.redhat.io/confidential-clusters-beta/buildroot-rhel9@sha256:c805e1edfa7f5be0705cc4a88cece359636a06c3b2aa63a6a739cf763267a8b4 AS builder -ARG build_type -WORKDIR /build - -# Drift detection - ensure local build matches upstream -COPY drift-detection/detector.sh /detector.sh -COPY drift-cache /drift-cache -WORKDIR /tmp -COPY operator/compute-pcrs/Containerfile . -RUN /detector.sh ./Containerfile /drift-cache/compute-pcrs/Containerfile - -WORKDIR /build -COPY operator/Makefile operator/Cargo.toml operator/Cargo.lock operator/go.mod operator/go.sum ./ -COPY operator/api api -COPY operator/lib lib -COPY operator/compute-pcrs/Cargo.toml compute-pcrs/ -COPY operator/compute-pcrs/src/lib.rs compute-pcrs/src/ - -# Set only required crates as members to minimize rebuilds upon changes. -# Pin reference-values to specific commit for reproducible builds -ARG REFERENCE_VALUES_COMMIT=e296603ca106908258ac59326b001b602ed0f037 -RUN sed -i 's/members =.*/members = ["compute-pcrs", "lib"]/' Cargo.toml && \ - git clone https://github.com/trusted-execution-clusters/reference-values && \ - cd reference-values && git checkout ${REFERENCE_VALUES_COMMIT} && cd .. && \ - make crds-rs - -# In debug builds, build dependencies to avoid full rebuild. -RUN if [ "$build_type" = debug ]; then cargo build -p compute-pcrs; fi - -COPY operator/compute-pcrs/src compute-pcrs/src -RUN cargo build -p compute-pcrs $(if [ "$build_type" = release ]; then echo --release; fi) - -FROM registry.access.redhat.com/ubi9/ubi-minimal -ARG build_type -COPY --from=builder "/build/target/$build_type/compute-pcrs" /usr/bin -COPY --from=builder /build/reference-values /reference-values - -# Red Hat labels -LABEL vendor="Red Hat, Inc." \ - name="confidential-clusters-beta/compute-pcrs" \ - version="0.2.1" \ - release="1" \ - description="PCR computation tool for confidential cluster operator" \ - io.k8s.description="Tool for computing Platform Configuration Register values for confidential VMs" \ - url="https://github.com/confidential-clusters/operator" \ - vcs-type="git" \ - vcs-ref="" \ - distribution-scope="public" \ - com.redhat.component="confidential-cluster-operator-compute-pcrs" diff --git a/Containerfile.operator b/Containerfile.operator deleted file mode 100644 index 14cbfe5..0000000 --- a/Containerfile.operator +++ /dev/null @@ -1,55 +0,0 @@ -# based on ./operator/Containerfile -# SPDX-FileCopyrightText: Alice Frosi -# SPDX-FileCopyrightText: Jakob Naucke -# -# SPDX-License-Identifier: CC0-1.0 - -ARG build_type -# Dependency build stage -FROM registry.redhat.io/confidential-clusters-beta/buildroot-rhel9@sha256:c805e1edfa7f5be0705cc4a88cece359636a06c3b2aa63a6a739cf763267a8b4 AS builder -ARG build_type -WORKDIR /build - -# Drift detection - ensure local build matches upstream -COPY drift-detection/detector.sh /detector.sh -COPY drift-cache /drift-cache -WORKDIR /tmp -COPY operator/Containerfile . -RUN /detector.sh ./Containerfile /drift-cache/operator/Containerfile - -WORKDIR /build -COPY operator/Makefile operator/Cargo.toml operator/Cargo.lock operator/go.mod operator/go.sum ./ -COPY operator/api api -COPY operator/lib lib -COPY operator/operator/Cargo.toml operator/ -COPY operator/operator/src/lib.rs operator/src/ - -# Set only required crates as members to minimize rebuilds upon changes. -RUN sed -i 's/members = .*/members = ["lib", "operator"]/' Cargo.toml && \ - sed -i '/\[dev-dependencies\]/,$d' operator/Cargo.toml && \ - make crds-rs - -# In debug builds, build dependencies to avoid full rebuild. -RUN if [ "$build_type" = debug ]; then cargo build -p operator; fi - -# Target build stage -COPY operator/operator/src operator/src -RUN cargo build -p operator $(if [ "$build_type" = release ]; then echo --release; fi) - -# Distribution stage -FROM registry.access.redhat.com/ubi9/ubi-minimal -ARG build_type -COPY --from=builder "/build/target/$build_type/operator" /usr/bin - -# Red Hat labels -LABEL vendor="Red Hat, Inc." \ - name="confidential-clusters-beta/confidential-cluster-operator" \ - version="0.2.1" \ - release="1" \ - description="confidential cluster operator - manages confidential computing resources on OpenShift" \ - io.k8s.description="Kubernetes operator for managing confidential clusters with trusted execution environments" \ - url="https://github.com/confidential-clusters/operator" \ - vcs-type="git" \ - vcs-ref="" \ - distribution-scope="public" \ - com.redhat.component="confidential-cluster-operator" diff --git a/Containerfile.registration-server b/Containerfile.registration-server deleted file mode 100644 index 036854a..0000000 --- a/Containerfile.registration-server +++ /dev/null @@ -1,54 +0,0 @@ -# Based on ./operator/register-server/Containerfile -# SPDX-FileCopyrightText: Jakob Naucke -# -# SPDX-License-Identifier: CC0-1.0 - -ARG build_type -FROM registry.redhat.io/confidential-clusters-beta/buildroot-rhel9@sha256:c805e1edfa7f5be0705cc4a88cece359636a06c3b2aa63a6a739cf763267a8b4 AS builder -ARG build_type -WORKDIR /build - -# Drift detection - ensure local build matches upstream -COPY drift-detection/detector.sh /detector.sh -COPY drift-cache /drift-cache -WORKDIR /tmp -COPY operator/register-server/Containerfile . -RUN /detector.sh ./Containerfile /drift-cache/register-server/Containerfile - -WORKDIR /build -COPY operator/Makefile operator/Cargo.toml operator/Cargo.lock operator/go.mod operator/go.sum ./ -COPY operator/api api -COPY operator/lib lib -COPY operator/register-server/Cargo.toml register-server/ -COPY operator/register-server/src/lib.rs register-server/src/ - -# Set only required crates as members to minimize rebuilds upon changes. -RUN sed -i 's/members =.*/members = ["lib", "register-server"]/' Cargo.toml && \ - sed -i '/\[dev-dependencies\]/,$d' register-server/Cargo.toml && \ - make crds-rs - -# In debug builds, build dependencies to avoid full rebuild. -RUN if [ "$build_type" = debug ]; then cargo build -p register-server --lib; fi - -COPY operator/register-server/src register-server/src -RUN cargo build -p register-server $(if [ "$build_type" = release ]; then echo --release; fi) - -FROM registry.access.redhat.com/ubi9/ubi-minimal -ARG build_type -COPY --from=builder "/build/target/$build_type/register-server" /usr/bin - -# Red Hat labels -LABEL vendor="Red Hat, Inc." \ - name="confidential-clusters-beta/registration-server" \ - version="0.2.1" \ - release="1" \ - description="Registration server for confidential cluster operator" \ - io.k8s.description="HTTP server for registering confidential workloads and managing attestation" \ - url="https://github.com/confidential-clusters/operator" \ - vcs-type="git" \ - vcs-ref="" \ - distribution-scope="public" \ - com.redhat.component="confidential-cluster-operator-registration-server" - -EXPOSE 3030 -ENTRYPOINT ["/usr/bin/register-server"] diff --git a/README.md b/README.md index c29b071..f1f820e 100644 --- a/README.md +++ b/README.md @@ -45,23 +45,27 @@ Build and push operator and operand images: ```bash ${CONTAINER_CLI} build --build-arg build_type=release \ + --target operator \ -t ${REGISTRY}/confidential-cluster-operator:${TAG} \ - -f Containerfile.operator . + -f Containerfile . ${CONTAINER_CLI} push ${REGISTRY}/confidential-cluster-operator:${TAG} ${CONTAINER_CLI} build --build-arg build_type=release \ + --target compute-pcrs \ -t ${REGISTRY}/compute-pcrs:${TAG} \ - -f Containerfile.compute-pcrs . + -f Containerfile . ${CONTAINER_CLI} push ${REGISTRY}/compute-pcrs:${TAG} ${CONTAINER_CLI} build --build-arg build_type=release \ + --target register-server \ -t ${REGISTRY}/registration-server:${TAG} \ - -f Containerfile.registration-server . + -f Containerfile . ${CONTAINER_CLI} push ${REGISTRY}/registration-server:${TAG} ${CONTAINER_CLI} build --build-arg build_type=release \ + --target attestation-key-register \ -t ${REGISTRY}/attestation-key-register:${TAG} \ - -f Containerfile.attestation-key-register . + -f Containerfile . ${CONTAINER_CLI} push ${REGISTRY}/attestation-key-register:${TAG} ``` @@ -126,10 +130,7 @@ make -C operator cluster-down ``` confidential-cluster-operator/ ├── operator/ # Git submodule (upstream) -├── Containerfile.operator # Operator image -├── Containerfile.compute-pcrs # Compute-pcrs operand -├── Containerfile.registration-server # Registration-server operand -├── Containerfile.attestation-key-register # Attestation-key-register operand +├── Containerfile # Operator + related images (multi-stage, select with --target) ├── Containerfile.bundle # OLM bundle ├── bundle/ │ └── customize-bundle.sh # Applies downstream branding to OLM bundle diff --git a/drift-cache/Containerfile b/drift-cache/Containerfile new file mode 100644 index 0000000..3d54561 --- /dev/null +++ b/drift-cache/Containerfile @@ -0,0 +1,106 @@ +# SPDX-FileCopyrightText: Alice Frosi +# SPDX-FileCopyrightText: Jakob Naucke +# SPDX-FileCopyrightText: Yair Podemsky +# +# SPDX-License-Identifier: CC0-1.0 + +ARG build_type=release +ARG build_target=operator + +# Unified builder stage — compiles all binaries in a single cargo invocation. +FROM ghcr.io/trusted-execution-clusters/buildroot:fedora AS builder +LABEL project=trusted-cluster-operator +ARG build_type +WORKDIR /build + +COPY Makefile Cargo.toml Cargo.lock go.mod go.sum . + +COPY api api +COPY lib lib + +# Copy Cargo.toml and lib.rs stubs for dependency pre-build caching. +COPY operator/Cargo.toml operator/ +COPY operator/src/lib.rs operator/src/ +COPY compute-pcrs/Cargo.toml compute-pcrs/ +COPY compute-pcrs/src/lib.rs compute-pcrs/src/ +COPY register-server/Cargo.toml register-server/ +COPY register-server/src/lib.rs register-server/src/ +COPY attestation-key-register/Cargo.toml attestation-key-register/ +COPY attestation-key-register/src/lib.rs attestation-key-register/src/ + +RUN sed -i 's/members = .*/members = ["lib", "operator", "compute-pcrs", "register-server", "attestation-key-register"]/' Cargo.toml && \ + sed -i '/\[dev-dependencies\]/,$d' operator/Cargo.toml && \ + sed -i '/\[dev-dependencies\]/,$d' register-server/Cargo.toml && \ + sed -i '/trusted-cluster-operator-test-utils/d' lib/Cargo.toml + +RUN --mount=type=cache,target=/build/target \ + --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/root/.cache/go-build \ + --mount=type=cache,target=/root/go/pkg/mod \ + make crds-rs + +# In debug builds, pre-build dependencies to avoid full rebuild on source changes. +RUN --mount=type=cache,target=/build/target \ + --mount=type=cache,target=/usr/local/cargo/registry \ + if [ "$build_type" = debug ]; then \ + cargo build -p operator -p compute-pcrs -p register-server -p attestation-key-register; \ + fi + +COPY operator/src operator/src +COPY compute-pcrs/src compute-pcrs/src +COPY register-server/src register-server/src +COPY attestation-key-register/src attestation-key-register/src + +RUN --mount=type=cache,target=/build/target \ + --mount=type=cache,target=/usr/local/cargo/registry \ + release_flag="" && \ + if [ "$build_type" = release ]; then release_flag="--release"; fi && \ + cargo build \ + -p operator \ + -p compute-pcrs \ + -p register-server \ + -p attestation-key-register \ + $release_flag + +RUN --mount=type=cache,target=/build/target \ + profile_dir="debug" && \ + if [ "$build_type" = release ]; then profile_dir="release"; fi && \ + mkdir -p /output && \ + cp /build/target/${profile_dir}/operator /output/ && \ + cp /build/target/${profile_dir}/compute-pcrs /output/ && \ + cp /build/target/${profile_dir}/register-server /output/ && \ + cp /build/target/${profile_dir}/attestation-key-register /output/ + +# Distribution stages +FROM quay.io/fedora/fedora:43 AS operator +COPY --from=builder /output/operator /usr/bin +ENTRYPOINT ["/usr/bin/operator"] + +FROM quay.io/fedora/fedora:43 AS attestation-key-register +COPY --from=builder /output/attestation-key-register /usr/bin +EXPOSE 8001 +ENTRYPOINT ["/usr/bin/attestation-key-register"] + +FROM quay.io/fedora/fedora:43 AS register-server +COPY --from=builder /output/register-server /usr/bin +EXPOSE 3030 +ENTRYPOINT ["/usr/bin/register-server"] + + +FROM builder AS compute-pcrs-data +RUN rv_line=$(cargo metadata --format-version=1 | jq -r '.packages[] | select(.name == "reference-values") | .source') && \ + rv_repo=$(echo "$rv_line" | sed 's/^git+//;s/[?#].*//') && \ + rv_commit=$(echo "$rv_line" | sed 's/.*#//') && \ + git clone "$rv_repo" reference-values && \ + git -C reference-values checkout "$rv_commit" +RUN mkdir -p /output/reference-values && \ + mv /build/reference-values/efivars /output/reference-values/ && \ + mv /build/reference-values/mok-variables /output/reference-values/ + +FROM quay.io/fedora/fedora:43 AS compute-pcrs +COPY --from=compute-pcrs-data /output/compute-pcrs /usr/bin +COPY --from=compute-pcrs-data /output/reference-values /reference-values +ENTRYPOINT ["/usr/bin/compute-pcrs"] + +# Allow environments without --target support, which only read the last stage, to set the stage through the build arg +FROM ${build_target} AS final diff --git a/drift-cache/attestation-key-register/Containerfile b/drift-cache/attestation-key-register/Containerfile deleted file mode 100644 index f891ded..0000000 --- a/drift-cache/attestation-key-register/Containerfile +++ /dev/null @@ -1,30 +0,0 @@ -# SPDX-FileCopyrightText: Alice Frosi -# -# SPDX-License-Identifier: CC0-1.0 - -ARG build_type -FROM ghcr.io/trusted-execution-clusters/buildroot:fedora AS builder -ARG build_type -WORKDIR /build - -COPY Makefile Cargo.toml Cargo.lock go.mod go.sum . -COPY api api -COPY lib lib -COPY attestation-key-register/Cargo.toml attestation-key-register/ -COPY attestation-key-register/src/lib.rs attestation-key-register/src/ - -# Set only required crates as members to minimize rebuilds upon changes. -RUN sed -i 's/members =.*/members = ["lib", "attestation-key-register"]/' Cargo.toml && \ - make crds-rs - -# In debug builds, build dependencies to avoid full rebuild. -RUN if [ "$build_type" = debug ]; then cargo build -p attestation-key-register; fi - -COPY attestation-key-register/src attestation-key-register/src -RUN cargo build -p attestation-key-register $(if [ "$build_type" = release ]; then echo --release; fi) - -FROM quay.io/fedora/fedora:43 -ARG build_type -COPY --from=builder "/build/target/$build_type/attestation-key-register" /usr/bin -EXPOSE 8001 -ENTRYPOINT ["/usr/bin/attestation-key-register"] diff --git a/drift-cache/compute-pcrs/Containerfile b/drift-cache/compute-pcrs/Containerfile deleted file mode 100644 index c9d27fa..0000000 --- a/drift-cache/compute-pcrs/Containerfile +++ /dev/null @@ -1,31 +0,0 @@ -# SPDX-FileCopyrightText: Alice Frosi -# SPDX-FileCopyrightText: Jakob Naucke -# -# SPDX-License-Identifier: CC0-1.0 - -ARG build_type -FROM ghcr.io/trusted-execution-clusters/buildroot:fedora AS builder -ARG build_type -WORKDIR /build - -COPY Makefile Cargo.toml Cargo.lock go.mod go.sum . -COPY api api -COPY lib lib -COPY compute-pcrs/Cargo.toml compute-pcrs/ -COPY compute-pcrs/src/lib.rs compute-pcrs/src/ - -# Set only required crates as members to minimize rebuilds upon changes. -RUN sed -i 's/members =.*/members = ["compute-pcrs", "lib"]/' Cargo.toml && \ - git clone --depth 1 https://github.com/trusted-execution-clusters/reference-values && \ - make crds-rs - -# Build dependencies in lower layer to make use of caching. -RUN if [ "$build_type" = debug ]; then cargo build -p compute-pcrs; fi - -COPY compute-pcrs/src compute-pcrs/src -RUN cargo build -p compute-pcrs $(if [ "$build_type" = release ]; then echo --release; fi) - -FROM quay.io/fedora/fedora:43 -ARG build_type -COPY --from=builder "/build/target/$build_type/compute-pcrs" /usr/bin -COPY --from=builder /build/reference-values /reference-values diff --git a/drift-cache/operator/Containerfile b/drift-cache/operator/Containerfile deleted file mode 100644 index 5ed99eb..0000000 --- a/drift-cache/operator/Containerfile +++ /dev/null @@ -1,33 +0,0 @@ -# SPDX-FileCopyrightText: Alice Frosi -# SPDX-FileCopyrightText: Jakob Naucke -# -# SPDX-License-Identifier: CC0-1.0 - -ARG build_type -# Dependency build stage -FROM ghcr.io/trusted-execution-clusters/buildroot:fedora AS builder -ARG build_type -WORKDIR /build - -COPY Makefile Cargo.toml Cargo.lock go.mod go.sum . -COPY api api -COPY lib lib -COPY operator/Cargo.toml operator/ -COPY operator/src/lib.rs operator/src/ - -# Set only required crates as members to minimize rebuilds upon changes. -RUN sed -i 's/members = .*/members = ["lib", "operator"]/' Cargo.toml && \ - sed -i '/\[dev-dependencies\]/,$d' operator/Cargo.toml && \ - make crds-rs - -# In debug builds, build dependencies to avoid full rebuild. -RUN if [ "$build_type" = debug ]; then cargo build -p operator; fi - -# Target build stage -COPY operator/src operator/src -RUN cargo build -p operator $(if [ "$build_type" = release ]; then echo --release; fi) - -# Distribution stage -FROM quay.io/fedora/fedora:43 -ARG build_type -COPY --from=builder "/build/target/$build_type/operator" /usr/bin diff --git a/drift-cache/register-server/Containerfile b/drift-cache/register-server/Containerfile deleted file mode 100644 index fe113d0..0000000 --- a/drift-cache/register-server/Containerfile +++ /dev/null @@ -1,31 +0,0 @@ -# SPDX-FileCopyrightText: Jakob Naucke -# -# SPDX-License-Identifier: CC0-1.0 - -ARG build_type -FROM ghcr.io/trusted-execution-clusters/buildroot:fedora AS builder -ARG build_type -WORKDIR /build - -COPY Makefile Cargo.toml Cargo.lock go.mod go.sum . -COPY api api -COPY lib lib -COPY register-server/Cargo.toml register-server/ -COPY register-server/src/lib.rs register-server/src/ - -# Set only required crates as members to minimize rebuilds upon changes. -RUN sed -i 's/members =.*/members = ["lib", "register-server"]/' Cargo.toml && \ - sed -i '/\[dev-dependencies\]/,$d' register-server/Cargo.toml && \ - make crds-rs - -# In debug builds, build dependencies to avoid full rebuild. -RUN if [ "$build_type" = debug ]; then cargo build -p register-server --lib; fi - -COPY register-server/src register-server/src -RUN cargo build -p register-server $(if [ "$build_type" = release ]; then echo --release; fi) - -FROM quay.io/fedora/fedora:43 -ARG build_type -COPY --from=builder "/build/target/$build_type/register-server" /usr/bin -EXPOSE 3030 -ENTRYPOINT ["/usr/bin/register-server"] diff --git a/operator b/operator index 1a7f31b..1b8651e 160000 --- a/operator +++ b/operator @@ -1 +1 @@ -Subproject commit 1a7f31b456ca3185ddcc8234ab843c45ba11b230 +Subproject commit 1b8651e82dccdbeb2843480650d7ccece433958e From 1b00b60634a2349ea33d6b9e9c74aa0be31cd412 Mon Sep 17 00:00:00 2001 From: Jakob Naucke Date: Fri, 14 Aug 2026 09:51:04 +0000 Subject: [PATCH 2/8] Add skill for submodule drift cache update Signed-off-by: Jakob Naucke Assisted-by: AI --- .../skills/sync-operator-submodule/SKILL.md | 43 +++++++++++++++++++ .claude | 1 + 2 files changed, 44 insertions(+) create mode 100644 .agents/skills/sync-operator-submodule/SKILL.md create mode 120000 .claude diff --git a/.agents/skills/sync-operator-submodule/SKILL.md b/.agents/skills/sync-operator-submodule/SKILL.md new file mode 100644 index 0000000..dc11fd5 --- /dev/null +++ b/.agents/skills/sync-operator-submodule/SKILL.md @@ -0,0 +1,43 @@ +--- +name: sync-operator-submodule +description: > + Update the operator submodule to the latest upstream commit, refresh the + drift-cache copy of its Containerfile, and apply the resulting diff to the + root-level Containerfile. Use whenever the upstream operator repo has new + commits that should be pulled into this repo. +--- + +# Sync operator submodule + +## Steps + +1. **Update the submodule** to the latest commit on its tracked branch: + + ``` + git submodule update --init operator + git -C operator fetch origin main + git -C operator checkout # or: git -C operator pull origin main + ``` + +2. **Identify what changed** between the old and new submodule commits: + + ``` + git -C operator diff .. -- Containerfile + ``` + +3. **Copy the updated Containerfile into drift-cache/**: + + ``` + cp operator/Containerfile drift-cache/Containerfile + ``` + +4. **Apply the same diff to the root-level `Containerfile`.** It mirrors the submodule + one (`operator/Containerfile`) but with `operator/` path prefixes on `COPY` + instructions, downstream base images, per-component `LABEL` blocks on each + distribution stage, no `--mount=type=cache` clauses, and a pinned + `REFERENCE_VALUES_COMMIT` in the `compute-pcrs-data` stage instead of the upstream + `cargo metadata` lookup. Translate the diff hunks accordingly. + +5. **Verify** that `drift-cache/Containerfile` matches `operator/Containerfile` exactly + and that the root-level `Containerfile` contains all the same logic changes (adapted + for its path layout and downstream modifications). diff --git a/.claude b/.claude new file mode 120000 index 0000000..c0ca468 --- /dev/null +++ b/.claude @@ -0,0 +1 @@ +.agents \ No newline at end of file From 91b3cc2e90c12327d8cf50263a32f10d7bab2f70 Mon Sep 17 00:00:00 2001 From: Jakob Naucke Date: Thu, 30 Jul 2026 17:30:42 +0200 Subject: [PATCH 3/8] Introduce MachineSet scale test Create MachineConfig, MachineConfigPool & MachineSet. Includes pluggable modules for TEE platforms, and Azure as a first module. Test with 1 & 2 replicas. Test with a replica after deletion. Operator components are deployed in the same cluster, i.e. no bootstrap functionality. Will not work until https://github.com/coreos/fedora-coreos-tracker/issues/2191 is resolved, but already gets to Azure machine creation (with no ignition) in this state. Signed-off-by: Jakob Naucke Assisted-by: AI --- .gitignore | 4 + tests/Cargo.lock | 4129 +++++++++++++++++++++++++++++++++++++++ tests/Cargo.toml | 39 + tests/Makefile | 27 + tests/README.md | 19 + tests/go.mod | 32 + tests/go.sum | 70 + tests/lib/Cargo.toml | 15 + tests/lib/src/kopium.rs | 8 + tests/lib/src/lib.rs | 10 + tests/scale.rs | 456 +++++ tests/tools.go | 6 + 12 files changed, 4815 insertions(+) create mode 100644 .gitignore create mode 100644 tests/Cargo.lock create mode 100644 tests/Cargo.toml create mode 100644 tests/Makefile create mode 100644 tests/README.md create mode 100644 tests/go.mod create mode 100644 tests/go.sum create mode 100644 tests/lib/Cargo.toml create mode 100644 tests/lib/src/kopium.rs create mode 100644 tests/lib/src/lib.rs create mode 100644 tests/scale.rs create mode 100644 tests/tools.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3a66244 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +target/ +tests/config/crd/ +tests/lib/src/kopium/ +tests/target/ diff --git a/tests/Cargo.lock b/tests/Cargo.lock new file mode 100644 index 0000000..4c82b2a --- /dev/null +++ b/tests/Cargo.lock @@ -0,0 +1,4129 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "annotate-snippets" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f211a51805bc641f3ad5b7664c77d2547af685cc33b4cd8d31964027a46f13f1" +dependencies = [ + "anstyle", + "memchr", + "unicode-width 0.2.2", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "aquamarine" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a941c39708478e8eea39243b5983f1c42d2717b3620ee91f4a52115fd02ac43f" +dependencies = [ + "itertools 0.9.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-trait" +version = "0.1.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "autocxx" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba64dd33efd8f09724143d45ab91b48aebcee52f4fb11add3464c998fab47dc" +dependencies = [ + "aquamarine", + "autocxx-macro", + "cxx", + "moveit", +] + +[[package]] +name = "autocxx-macro" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e594e68d030b6eb1ce7e2b40958f4f4ae7150c588c76d76b9f8178d41c47d80" +dependencies = [ + "autocxx-parser", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "autocxx-parser" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef00b2fc378804c31c4fbd693a7fea93f8a90467dce331dae1e4ce41e542953" +dependencies = [ + "indexmap 1.9.3", + "itertools 0.10.5", + "log", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.119", + "thiserror 1.0.69", +] + +[[package]] +name = "backon" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +dependencies = [ + "fastrand", + "gloo-timers", + "tokio", +] + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link", +] + +[[package]] +name = "backtrace-ext" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" +dependencies = [ + "backtrace", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cc" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clevis-pin-trustee-lib" +version = "0.1.0" +source = "git+https://github.com/latchset/clevis-pin-trustee#7394f160efb4f98eb1af3775710e5c23e61c20f1" +dependencies = [ + "serde", +] + +[[package]] +name = "compute-pcrs-lib" +version = "0.1.0" +source = "git+https://github.com/trusted-execution-clusters/compute-pcrs#d2e1ee4b9a8a5d3fc0e1d3759929fc342af9f903" +dependencies = [ + "anyhow", + "glob", + "hex", + "hex-literal", + "itertools 0.14.0", + "lief", + "log", + "openssl", + "serde", + "serde_with", + "sha2", + "strum", + "uuid", +] + +[[package]] +name = "confidential-cluster-operator-test-lib" +version = "0.2.1" +dependencies = [ + "k8s-openapi", + "kube", + "serde", + "serde_json", +] + +[[package]] +name = "confidential-cluster-operator-tests" +version = "0.2.1" +dependencies = [ + "anyhow", + "async-trait", + "confidential-cluster-operator-test-lib", + "ignition-config", + "k8s-openapi", + "kube", + "serde_json", + "tokio", + "trusted-cluster-operator-lib", + "trusted-cluster-operator-test-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cxx" +version = "1.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c15f3b597018782655a05d417f28bac009f6eb60f4b6703eb818998c1aaa16a" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a7eb4c4fd18505f5a935f9c2ee77780350dcdb56da7cd037634e806141c5c43" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d914fcc6452d133236ee067a9538be25ba6a644a450e1a6c617da84bf029854" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.119", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.19", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "either" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "encoding_rs_io" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cc3c5651fb62ab8aa3103998dade57efdd028544bd300516baa31840c252a83" +dependencies = [ + "encoding_rs", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "env_filter" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" +dependencies = [ + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88cf1f829d945f548cf8fec32c61b1f202b6d93b45848602fc02af4b12ad218" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "262590f4fe6afeb0bc83be1daa64e52657fe185690a958af7f3ad0e92085c5ae" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd50c473c80f6d7c3670a752354b8e569b1a7cbfdc0419ec88e5edad85e0dc7" + +[[package]] +name = "futures-io" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4577ecaa3c4f96589d473f679a71b596316f6641bc350038b962a5daf0085d7a" + +[[package]] +name = "futures-macro" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "futures-sink" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e34418ac499d6305c2fb5ad0ed2f6ac998c5f8ca209b4510f7f94242c647e307" + +[[package]] +name = "futures-task" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b231ed28831efb4a61a08580c4bc233ec56bc009f4cd8f52da2c3cb97df0c109" + +[[package]] +name = "futures-util" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a77a90a256fce34da66415271e30f94ee91c57b04b8a2c042d9cf3220179deaa" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "git-version" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" +dependencies = [ + "git-version-macro", +] + +[[package]] +name = "git-version-macro" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "granit-parser" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f50ba32164f9e098d5da618776a32afbb32270adcbe3d3d006107dae11e37c91" +dependencies = [ + "arraydeque", + "smallvec", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.14.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-literal" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e712f64ec3850b98572bffac52e2c6f282b29fe6c5fa6d42334b30be438d95c1" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "hostname" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd" +dependencies = [ + "cfg-if", + "libc", + "windows-link", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http 1.5.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" +dependencies = [ + "bytes", + "futures-core", + "http 1.5.0", + "http-body 1.1.0", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http 1.5.0", + "http-body 1.1.0", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-openssl" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527d4d619ca2c2aafa31ec139a3d1d60bf557bf7578a1f20f743637eccd9ca19" +dependencies = [ + "http 1.5.0", + "hyper 1.11.0", + "hyper-util", + "linked_hash_set", + "once_cell", + "openssl", + "openssl-sys", + "parking_lot", + "pin-project", + "tower-layer", + "tower-service", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.32", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http 1.5.0", + "hyper 1.11.0", + "hyper-util", + "log", + "rustls 0.23.43", + "rustls-native-certs", + "tokio", + "tokio-rustls 0.26.4", + "tower-service", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper 1.11.0", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.5.0", + "http-body 1.1.0", + "hyper 1.11.0", + "libc", + "pin-project-lite", + "socket2 0.6.5", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "ignition-config" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f8d0bd3f69f56a9165dbb360987001e699ab4f57805905d6d85bb7dd884c101" +dependencies = [ + "anyhow", + "semver", + "serde", + "serde_ignored", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "is_ci" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" + +[[package]] +name = "itertools" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jiff" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "js-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7421438de105a0827e44fadd05377727847d717c80ce29a229f85fd04c427b72" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "jsonpath-rust" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f62a190c17bf3c6e3a2a676b522edf09d3ba94046e3cdb85fb9d6f09234fdc82" +dependencies = [ + "pest", + "pest_derive", + "regex", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "jsonptr" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5a3cc660ba5d72bce0b3bb295bf20847ccbb40fd423f3f05b61273672e561fe" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "k8s-openapi" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c6922f6afe80418dd6019818af5d0d34584c371780ff09b9752370c25b4abb" +dependencies = [ + "base64 0.22.1", + "jiff", + "schemars 1.2.2", + "serde", + "serde_json", +] + +[[package]] +name = "kube" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb9108095346a7096d11feeaff419c75dddcac1b2f59acb38d7bf3d13c3e146" +dependencies = [ + "k8s-openapi", + "kube-client", + "kube-core", + "kube-derive", + "kube-runtime", +] + +[[package]] +name = "kube-client" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f628e05bc2264c21fe10d3d675117dc9b43ea3bf4fb07262a222679757537b" +dependencies = [ + "base64 0.22.1", + "bytes", + "either", + "futures", + "http 1.5.0", + "http-body 1.1.0", + "http-body-util", + "hyper 1.11.0", + "hyper-openssl", + "hyper-rustls 0.27.9", + "hyper-timeout", + "hyper-util", + "jiff", + "jsonpath-rust", + "k8s-openapi", + "kube-core", + "openssl", + "pem", + "rustls 0.23.43", + "secrecy", + "serde", + "serde-saphyr", + "serde_json", + "thiserror 2.0.19", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tracing", +] + +[[package]] +name = "kube-core" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b02f5933ba06140d58c7d6727f6c319f0962ec6a344aa5e21e475e891deaa8" +dependencies = [ + "derive_more", + "form_urlencoded", + "http 1.5.0", + "jiff", + "json-patch", + "k8s-openapi", + "schemars 1.2.2", + "serde", + "serde-value", + "serde_json", + "thiserror 2.0.19", +] + +[[package]] +name = "kube-derive" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe171898707dadf1818ef94e81ef57f6beb7edf9ba87b9e814c045dad356c7aa" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.119", +] + +[[package]] +name = "kube-runtime" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99ddec66c540c7cf29a5b41fe4a657a53687f95c346e03bdf00585b70a1bab21" +dependencies = [ + "ahash", + "async-broadcast", + "async-stream", + "backon", + "educe", + "futures", + "hashbrown 0.16.1", + "hostname", + "json-patch", + "k8s-openapi", + "kube-client", + "parking_lot", + "pin-project", + "serde", + "serde_json", + "thiserror 2.0.19", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "lief" +version = "0.17.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a90e3c2a97875731396a088732fe6a3736c51462ff1d3a1d179f296d539a5f7" +dependencies = [ + "bitflags 2.13.1", + "cxx", + "lief-ffi", + "num-bigint", + "num-derive", + "num-traits", + "tempfile", +] + +[[package]] +name = "lief-build" +version = "0.17.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8093a7e3cb03708149414d595e3c0df57b79e5136fee630e3c415d06e6c876e" +dependencies = [ + "git-version", + "miette", + "reqwest", + "semver", + "zip", +] + +[[package]] +name = "lief-ffi" +version = "0.17.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60589ba353bc6e4db8cc4273afbfac2ab5e089583174275450618f4ed1cf51c4" +dependencies = [ + "autocxx", + "cxx", + "lief-build", + "miette", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82" +dependencies = [ + "cc", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linked_hash_set" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "984fb35d06508d1e69fc91050cceba9c0b748f983e6739fa2c7a9237154c52c8" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "miette" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" +dependencies = [ + "backtrace", + "backtrace-ext", + "is-terminal", + "miette-derive", + "once_cell", + "owo-colors", + "supports-color", + "supports-hyperlinks", + "supports-unicode", + "terminal_size", + "textwrap", + "thiserror 1.0.69", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "moveit" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87d7335204cb6ef7bd647fa6db0be3e4d7aa25b5823a7aa030027ddf512cefba" +dependencies = [ + "cxx", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "openssl" +version = "0.10.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" +dependencies = [ + "bitflags 2.13.1", + "cfg-if", + "foreign-types", + "libc", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-sys" +version = "0.9.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p521" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" +dependencies = [ + "base16ct", + "ecdsa", + "elliptic-curve", + "primeorder", + "rand_core", + "sha2", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64 0.22.1", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pest" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2" +dependencies = [ + "memchr", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2dd6fc3b26b3462ee188aac870f5a41d398f1cd5e2408d16531bd71c9591fd" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a7a9205cfb6f596a9e8b689c0a15f9ceb7a1aafae7aaf788150ac65b29975b6" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pest_meta" +version = "2.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85abd351c0de1e8384fc791a0737111a350394937e92b956b743dac12429f57c" +dependencies = [ + "pest", +] + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "portable-atomic" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "ref-cast" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.11.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls 0.24.2", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.12", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration", + "tokio", + "tokio-rustls 0.24.1", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "sha2", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b74b56ffa8bb2830709a538c2cbcae9aa062db0d2a42563bfb09bdaae44020eb" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.13.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.103.13", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 3.0.3", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "secrecy" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" +dependencies = [ + "zeroize", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-saphyr" +version = "0.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5897b4c3faadadd35fdb6689f015641f3bc481d5adaaac56231ea15aeb243db3" +dependencies = [ + "ahash", + "annotate-snippets", + "base64 0.22.1", + "encoding_rs_io", + "getrandom 0.3.4", + "granit-parser", + "nohash-hasher", + "num-traits", + "serde", + "smallvec", + "zmij", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_derive_internals" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "serde_ignored" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115dffd5f3853e06e746965a20dcbae6ee747ae30b543d91b0e089668bb07798" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +dependencies = [ + "base64 0.22.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.0", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.14.0", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" + +[[package]] +name = "smawk" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "ssh-cipher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caac132742f0d33c3af65bfcde7f6aa8f62f0e991d80db99149eb9d44708784f" +dependencies = [ + "cipher", + "ssh-encoding", +] + +[[package]] +name = "ssh-encoding" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9242b9ef4108a78e8cd1a2c98e193ef372437f8c22be363075233321dd4a15" +dependencies = [ + "base64ct", + "pem-rfc7468", + "sha2", +] + +[[package]] +name = "ssh-key" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3" +dependencies = [ + "num-bigint-dig", + "p256", + "p384", + "p521", + "rand_core", + "rsa", + "sec1", + "sha2", + "signature", + "ssh-cipher", + "ssh-encoding", + "subtle", + "zeroize", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "supports-color" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6398cde53adc3c4557306a96ce67b302968513830a77a95b2b17305d9719a89" +dependencies = [ + "is-terminal", + "is_ci", +] + +[[package]] +name = "supports-hyperlinks" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84231692eb0d4d41e4cdd0cabfdd2e6cd9e255e65f80c9aa7c98dd502b4233d" +dependencies = [ + "is-terminal", +] + +[[package]] +name = "supports-unicode" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f850c19edd184a205e883199a261ed44471c81e39bd95b1357f5febbef00e77a" +dependencies = [ + "is-terminal", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "terminal_size" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "textwrap" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" +dependencies = [ + "smawk", + "unicode-linebreak", + "unicode-width 0.1.14", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" +dependencies = [ + "thiserror-impl 2.0.19", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "time" +version = "0.3.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.5", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.43", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "libc", + "pin-project-lite", + "slab", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "base64 0.22.1", + "bitflags 2.13.1", + "bytes", + "http 1.5.0", + "http-body 1.1.0", + "mime", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "trusted-cluster-operator-lib" +version = "0.2.2" +dependencies = [ + "anyhow", + "compute-pcrs-lib", + "k8s-openapi", + "kube", + "serde", + "serde_json", +] + +[[package]] +name = "trusted-cluster-operator-test-utils" +version = "0.2.2" +dependencies = [ + "anyhow", + "async-trait", + "auto_impl", + "chrono", + "clevis-pin-trustee-lib", + "compute-pcrs-lib", + "env_logger", + "fs_extra", + "glob", + "http 1.5.0", + "ignition-config", + "k8s-openapi", + "kube", + "log", + "percent-encoding", + "rand_core", + "serde", + "serde_json", + "serde_yaml", + "ssh-key", + "tokio", + "tower", + "trusted-cluster-operator-lib", + "uuid", + "which", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.119", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.126" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "which" +version = "8.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3ef584124b911bcc3875c2f1472e80f24361ceb789bd1c62b3e9a3df9ff43c" +dependencies = [ + "libc", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "byteorder", + "crc32fast", + "crossbeam-utils", + "flate2", + "time", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/tests/Cargo.toml b/tests/Cargo.toml new file mode 100644 index 0000000..7c6d6b0 --- /dev/null +++ b/tests/Cargo.toml @@ -0,0 +1,39 @@ +# SPDX-FileCopyrightText: Jakob Naucke +# +# SPDX-License-Identifier: CC0-1.0 + +[workspace] +members = ["lib"] + +[workspace.package] +version = "0.2.1" +edition = "2024" +rust-version = "1.88" + +[workspace.dependencies] +k8s-openapi = "0.28.0" +kube = "4.0.0" +serde = "1.0.229" +serde_json = "1.0.151" + +[package] +name = "confidential-cluster-operator-tests" +version.workspace = true +edition.workspace = true +rust-version.workspace = true + +[dependencies] +anyhow = "1.0.104" +async-trait = "0.1" +confidential-cluster-operator-test-lib = { path = "lib" } +ignition-config = "0.6.1" +k8s-openapi.workspace = true +kube.workspace = true +serde_json.workspace = true +tokio = "1.53.1" +trusted-cluster-operator-lib = { path = "../operator/lib" } +trusted-cluster-operator-test-utils = { path = "../operator/test_utils", features = ["virtualization"] } + +[[test]] +name = "scale" +path = "scale.rs" diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..50cff03 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,27 @@ +upstream = ../operator +include $(upstream)/Makefile + +# to avoid interpretation as argument delimiter +comma := , + +$(CRD_RS_PATH)/%.rs: $(CRD_YAML_PATH)/*_%.yaml $(KOPIUM) $(CRD_RS_PATH) + $(KOPIUM) -f $< --derive Default > $@ + sed -Ei 'N; s/, Default\)\]\n(pub struct (MachineConfigPoolStatusPoolSynchronizersStatus(PoolSynchronizerType)?|AzureMachineProviderSpec(DataDisks|DiagnosticsBoot|SecurityProfileSettings)))/)]\n\1/; P; D' $@ + rustfmt $@ + +trusted-cluster-gen-downstream: $(MAKEFILE_DIR)api/trusted-cluster-gen.go + cd $(MAKEFILE_DIR) && go build $< + +generate-downstream: $(CONTROLLER_GEN) + $(call controller-gen,github.com/openshift/api/machineconfiguration/v1,*machineconfig{s$(comma)pools}*) + $(call controller-gen,github.com/openshift/api/machine/v1beta1,*{machinesets$(comma)azure*specs}*) + +crds-rs-downstream: generate-downstream $(KOPIUM) $(CRD_RS_PATH) + cd $(MAKEFILE_DIR) && $(MAKE) crds-rs + $(MAKE) $(shell find $(CRD_YAML_PATH) -type f \ + | sed -E 's|$(CRD_YAML_PATH)/.*_(.*)\.yaml|$(CRD_RS_PATH)/\1.rs|') + +INTEGRATION_TEST_FLAGS = -- --nocapture --test-threads=$(INTEGRATION_TEST_THREADS) +scale-tests: crds-rs-downstream trusted-cluster-gen-downstream + UPSTREAM_DIR=$$(realpath ../operator) PLATFORM=openshift $(INTEGRATION_TEST_ENV) \ + cargo test --test scale $(INTEGRATION_TEST_FLAGS) diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..e3e4254 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,19 @@ +# Confidential Clusters integration tests + +The integration tests evaluate if the operator performs as expected with OpenShift MachineSets. It creates real confidential MachineSet replicas on supported backends. + +Environment variables from the [upstream tests](https://github.com/trusted-execution-clusters/operator/tree/main/tests) are also supported: +- `TEST_NAMESPACE_PREFIX` +- `AZURE_RESOURCE_ID` (bootable image with trustee-attester, required for Azure, formatted `/resourcegroups/…/images/…/versions/…`) + +Additionally, `BOOTC_IMAGE` must be set with a bootable container image to prevent updates to non-trustee-attester images. + +## Usage + +``` +$ make AZURE_RESOURCE_ID=… BOOTC_IMAGE=… scale-tests +``` + +## Supported backends (auto-detected) + +- Azure diff --git a/tests/go.mod b/tests/go.mod new file mode 100644 index 0000000..2c0341f --- /dev/null +++ b/tests/go.mod @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: Jakob Naucke +// +// SPDX-License-Identifier: CC0-1.0 + +module io/confidentialcluster/tests + +go 1.25.0 + +require github.com/openshift/api v0.0.0-20260710200753-d8a1748da7dc + +require ( + github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/x448/float16 v0.8.4 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + golang.org/x/net v0.55.0 // indirect + golang.org/x/text v0.38.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + k8s.io/api v0.35.4 // indirect + k8s.io/apimachinery v0.35.4 // indirect + k8s.io/klog/v2 v2.140.0 // indirect + k8s.io/kube-openapi v0.0.0-20260519202549-bbf5c5577288 // indirect + k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect +) diff --git a/tests/go.sum b/tests/go.sum new file mode 100644 index 0000000..6fc7795 --- /dev/null +++ b/tests/go.sum @@ -0,0 +1,70 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/openshift/api v0.0.0-20260710200753-d8a1748da7dc h1:TsT8DtgBIzdQg+wIWcF9SjKvNGAv2Dj1N1bW9hmzFLU= +github.com/openshift/api v0.0.0-20260710200753-d8a1748da7dc/go.mod h1:7WJ3IPaK6nmWT8bDcaNooHqd0H5WepjVqV/10VlkMEM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= +golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.35.4 h1:P7nFYKl5vo9AGUp1Z+Pmd3p2tA7bX2wbFWCvDeRv988= +k8s.io/api v0.35.4/go.mod h1:yl4lqySWOgYJJf9RERXKUwE9g2y+CkuwG+xmcOK8wXU= +k8s.io/apimachinery v0.35.4 h1:xtdom9RG7e+yDp71uoXoJDWEE2eOiHgeO4GdBzwWpds= +k8s.io/apimachinery v0.35.4/go.mod h1:NNi1taPOpep0jOj+oRha3mBJPqvi0hGdaV8TCqGQ+cc= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= +k8s.io/kube-openapi v0.0.0-20260519202549-bbf5c5577288 h1:A7Lby6ekC6nv+6oO38huCMFBRP0Os+tIeq1GkwxOQes= +k8s.io/kube-openapi v0.0.0-20260519202549-bbf5c5577288/go.mod h1:V/QaCUYDa+0QpcHhVVc5l99Uz56wEMEXBSj9oCDkNDY= +k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= +k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo= +sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/tests/lib/Cargo.toml b/tests/lib/Cargo.toml new file mode 100644 index 0000000..a740702 --- /dev/null +++ b/tests/lib/Cargo.toml @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: Jakob Naucke +# +# SPDX-License-Identifier: CC0-1.0 + +[package] +name = "confidential-cluster-operator-test-lib" +version.workspace = true +edition.workspace = true +rust-version.workspace = true + +[dependencies] +k8s-openapi.workspace = true +kube.workspace = true +serde.workspace = true +serde_json.workspace = true diff --git a/tests/lib/src/kopium.rs b/tests/lib/src/kopium.rs new file mode 100644 index 0000000..f00c720 --- /dev/null +++ b/tests/lib/src/kopium.rs @@ -0,0 +1,8 @@ +// SPDX-FileCopyrightText: Jakob Naucke +// +// SPDX-License-Identifier: MIT + +pub mod azuremachineproviderspecs; +pub mod machineconfigpools; +pub mod machineconfigs; +pub mod machinesets; diff --git a/tests/lib/src/lib.rs b/tests/lib/src/lib.rs new file mode 100644 index 0000000..59a378e --- /dev/null +++ b/tests/lib/src/lib.rs @@ -0,0 +1,10 @@ +// SPDX-FileCopyrightText: Jakob Naucke +// +// SPDX-License-Identifier: MIT + +mod kopium; + +pub use kopium::azuremachineproviderspecs::*; +pub use kopium::machineconfigpools::*; +pub use kopium::machineconfigs::*; +pub use kopium::machinesets::*; diff --git a/tests/scale.rs b/tests/scale.rs new file mode 100644 index 0000000..80f91f0 --- /dev/null +++ b/tests/scale.rs @@ -0,0 +1,456 @@ +// SPDX-FileCopyrightText: Jakob Naucke +// +// SPDX-License-Identifier: MIT + +use anyhow::{Context, Result}; +use confidential_cluster_operator_test_lib::*; +use ignition_config::v3_6::{Config, Resource as IgnitionResource}; +use k8s_openapi::api::core::v1::{Node, ObjectReference, Secret}; +use k8s_openapi::apimachinery::pkg::apis::meta::v1::Condition; +use k8s_openapi::{ByteString, api::apps::v1::Deployment}; +use kube::api::{ListParams, ObjectMeta}; +use kube::{Api, core::Expression, runtime::wait::await_condition}; +use std::{collections::BTreeMap, time::Duration}; +use tokio::time::timeout; +use trusted_cluster_operator_lib::endpoints::*; +use trusted_cluster_operator_test_utils::virt::{NodeBackend, sh_exec}; +use trusted_cluster_operator_test_utils::*; + +const MAPI_NS: &str = "openshift-machine-api"; +const MAPI_ROLE: &str = "machineconfiguration.openshift.io/role"; +const MACHINESET_LABEL: &str = "machine.openshift.io/cluster-api-machineset"; +const MACHINEROLE_LABEL: &str = "machine.openshift.io/cluster-api-machine-role"; + +const NODE_ROLE_PREFIX: &str = "node-role.kubernetes.io/"; + +const BOOTC_IMAGE_ENV: &str = "BOOTC_IMAGE"; +const AZURE_RESOURCE_ENV: &str = "AZURE_RESOURCE_ID"; + +trait TeePlatform { + fn add_tee_options( + &self, + provider_spec: &mut BTreeMap, + ign_secret_name: String, + ) -> Result<()>; +} + +struct Azure {} + +impl TeePlatform for Azure { + fn add_tee_options( + &self, + provider_spec: &mut BTreeMap, + ign_secret_name: String, + ) -> Result<()> { + let resource_id = Some(get_env(AZURE_RESOURCE_ENV)?); + let image = AzureMachineProviderSpecImage { + resource_id, + ..Default::default() + }; + let image_value = serde_json::to_value(image)?; + provider_spec.insert("image".to_string(), image_value); + + let security_profile = AzureMachineProviderSpecSecurityProfile { + settings: Some(AzureMachineProviderSpecSecurityProfileSettings { + confidential_vm: Some(AzureMachineProviderSpecSecurityProfileSettingsConfidentialVm { + uefi_settings: AzureMachineProviderSpecSecurityProfileSettingsConfidentialVmUefiSettings { + secure_boot: Some(AzureMachineProviderSpecSecurityProfileSettingsConfidentialVmUefiSettingsSecureBoot::Enabled), + virtualized_trusted_platform_module: Some(AzureMachineProviderSpecSecurityProfileSettingsConfidentialVmUefiSettingsVirtualizedTrustedPlatformModule::Enabled), + } + }), + security_type: AzureMachineProviderSpecSecurityProfileSettingsSecurityType::ConfidentialVm, + trusted_launch: None, + }), + ..Default::default() + }; + let sec_value = serde_json::to_value(security_profile)?; + provider_spec.insert("securityProfile".to_string(), sec_value); + + let os_disk_key = "osDisk"; + let ctx = format!("ProviderSpec had no {os_disk_key}"); + let os_disk_raw = provider_spec.get(os_disk_key).context(ctx)?; + let mut os_disk: AzureMachineProviderSpecOsDisk = + serde_json::from_value(os_disk_raw.clone())?; + let managed_disk = os_disk.managed_disk.as_mut(); + let disk_security_profile = managed_disk + .and_then(|d| d.security_profile.as_mut()) + .context("osDisk had no securityProfile")?; + disk_security_profile.security_encryption_type = Some(AzureMachineProviderSpecOsDiskManagedDiskSecurityProfileSecurityEncryptionType::VmGuestStateOnly); + let os_disk_value = serde_json::to_value(os_disk)?; + provider_spec.insert(os_disk_key.to_string(), os_disk_value); + + let vm_size_value = serde_json::Value::String("Standard_DC4ads_v5".to_string()); + provider_spec.insert("vmSize".to_string(), vm_size_value); + + let accel_value = serde_json::Value::Bool(false); + provider_spec.insert("acceleratedNetworking".to_string(), accel_value); + + let user_data_secret = AzureMachineProviderSpecUserDataSecret { + name: Some(ign_secret_name), + ..Default::default() + }; + let user_data_value = serde_json::to_value(user_data_secret)?; + provider_spec.insert("userDataSecret".to_string(), user_data_value); + + Ok(()) + } +} + +struct OpenShiftNode { + node_name: String, +} + +#[async_trait::async_trait] +impl NodeBackend for OpenShiftNode { + async fn ssh_exec(&self, command: &str) -> Result { + let full_cmd = format!( + "oc debug node/{} -- nsenter -a -t 1 sh -c '{command}'", + self.node_name, + ); + sh_exec(&full_cmd).await + } +} + +fn create_mcp_object(machine_name: &str) -> MachineConfigPool { + let match_expressions = MachineConfigPoolMachineConfigSelectorMatchExpressions { + key: MAPI_ROLE.to_string(), + operator: "In".to_string(), + values: Some(vec!["worker".to_string(), machine_name.to_string()]), + }; + MachineConfigPool { + metadata: ObjectMeta { + name: Some(machine_name.to_string()), + ..Default::default() + }, + spec: MachineConfigPoolSpec { + machine_config_selector: Some(MachineConfigPoolMachineConfigSelector { + match_expressions: Some(vec![match_expressions]), + ..Default::default() + }), + node_selector: Some(MachineConfigPoolNodeSelector { + match_labels: Some(BTreeMap::from([( + format!("{NODE_ROLE_PREFIX}{machine_name}"), + String::new(), + )])), + ..Default::default() + }), + ..Default::default() + }, + ..Default::default() + } +} + +async fn create_mcp(test_ctx: &TestContext, machine_name: &str, mc_name: &str) -> Result<()> { + let mcp = create_mcp_object(machine_name); + let mcps: Api = Api::all(test_ctx.client().clone()); + test_ctx.info(format!("Creating MachineConfigPool {machine_name}")); + mcps.create(&Default::default(), &mcp).await?; + + let has_mc = |mcp: Option<&MachineConfigPool>| { + let chk_mc = |mc: &ObjectReference| mc.name.as_ref().map(|n| n == mc_name).unwrap_or(false); + let chk_srcs = |srcs: &Vec| srcs.iter().any(chk_mc); + let chk_conf = + |conf: &MachineConfigPoolStatusConfiguration| conf.source.as_ref().map(chk_srcs); + let chk_st = |st: &MachineConfigPoolStatus| st.configuration.as_ref().and_then(chk_conf); + let chk_pool = |p: &MachineConfigPool| p.status.as_ref().and_then(chk_st); + mcp.and_then(chk_pool).unwrap_or(false) + }; + let mc_in = await_condition(mcps.clone(), machine_name, has_mc); + let ctx = format!("waiting for mcp {machine_name} to have mc {mc_name} as config source"); + let duration = scaled_duration(60); + timeout(duration, mc_in).await.context(ctx)??; + test_ctx.info(format!( + "MachineConfigPool {machine_name} has registered {mc_name} as config source" + )); + + let is_updated = |mcp: Option<&MachineConfigPool>| { + let chk_cond = |c: &Condition| c.type_ == "Updated" && c.status == "True"; + let chk_conds = |cs: &Vec| cs.iter().any(chk_cond); + let chk_st = |st: &MachineConfigPoolStatus| st.conditions.as_ref().map(chk_conds); + let chk_pool = |p: &MachineConfigPool| p.status.as_ref().and_then(chk_st); + mcp.and_then(chk_pool).unwrap_or(false) + }; + let mcp_updated = await_condition(mcps.clone(), machine_name, is_updated); + let ctx = format!("waiting for mcp {machine_name} to be updated"); + timeout(duration, mcp_updated).await.context(ctx)??; + test_ctx.info(format!("MachineConfigPool {machine_name} is updated")); + Ok(()) +} + +fn add_register_server( + config: &mut Config, + register_server_url: String, + register_server_cert: String, +) -> Result<()> { + let resource = |s: String| IgnitionResource { + source: Some(s), + ..Default::default() + }; + + config.ignition.version = "3.6.0".to_string(); + + let inner = config.ignition.config.as_mut(); + let ctx = "Ignition from MAPI had no merge"; + let merge = inner.and_then(|c| c.merge.as_mut()).context(ctx)?; + merge.push(resource(register_server_url)); + + let sec = config.ignition.security.as_mut(); + let cas = sec + .and_then(|s| s.tls.as_mut()) + .and_then(|t| t.certificate_authorities.as_mut()) + .context("Ignition from MAPI had no CAs")?; + cas.push(resource(register_server_cert)); + Ok(()) +} + +async fn extend_ign_secret(test_ctx: &TestContext, machine_name: &str) -> Result { + let client = test_ctx.client(); + let ns = test_ctx.namespace(); + let secrets: Api = Api::namespaced(client.clone(), MAPI_NS); + let existing_secret_name = format!("{machine_name}-user-data-managed"); + let existing_secret = secrets.get(&existing_secret_name).await?; + + let user_data_key = "userData"; + let ctx = "user data secret had no data"; + let existing_data = existing_secret.data.context(ctx)?; + let existing_json = existing_data.get(user_data_key).context(ctx)?; + let mut user_data: Config = serde_json::from_slice(&existing_json.0)?; + + let port = Some(REGISTER_SERVER_PORT); + let register_server_url = get_cluster_url(client, ns, REGISTER_SERVER_SERVICE, port).await?; + let reg_server_addr = format!("https://{register_server_url}/{REGISTER_SERVER_RESOURCE}"); + let root_pem = get_encoded_root_pem(client.clone(), ns).await?; + add_register_server(&mut user_data, reg_server_addr, root_pem)?; + let json = ByteString(serde_json::to_vec(&user_data)?); + + let new_secret_name = format!("{machine_name}-cocl-user-data-managed"); + let secret = Secret { + metadata: ObjectMeta { + name: Some(new_secret_name.clone()), + namespace: Some(MAPI_NS.to_string()), + ..Default::default() + }, + data: Some(BTreeMap::from([(user_data_key.to_string(), json)])), + ..Default::default() + }; + + test_ctx.info(format!( + "Creating user data secret {new_secret_name} based on {existing_secret_name}" + )); + secrets.create(&Default::default(), &secret).await?; + + Ok(new_secret_name) +} + +fn adapt_machineset( + mset: &mut MachineSet, + machine_name: &str, + ign_secret_name: String, +) -> Result<()> { + let mset_name = mset.metadata.name.clone().unwrap(); + mset.metadata = ObjectMeta { + name: Some(machine_name.to_string()), + ..Default::default() + }; + mset.spec.replicas = Some(1); + + // TODO once test works, check if these are all necessary + let mset_labels = mset.metadata.labels.get_or_insert_default(); + mset_labels.insert(MACHINESET_LABEL.to_string(), machine_name.to_string()); + let mset_selector = mset.spec.selector.get_or_insert_default(); + let mset_match_labels = mset_selector.match_labels.get_or_insert_default(); + mset_match_labels.insert(MACHINESET_LABEL.to_string(), machine_name.to_string()); + let mset_template = mset.spec.template.get_or_insert_default(); + let mset_template_meta = mset_template.metadata.get_or_insert_default(); + let mset_template_labels = mset_template_meta.labels.get_or_insert_default(); + mset_template_labels.insert(MACHINESET_LABEL.to_string(), machine_name.to_string()); + + let mset_spec = mset_template.spec.get_or_insert_default(); + let raw_mset_provider_spec = mset_spec.provider_spec.get_or_insert_default(); + let mset_provider_spec = raw_mset_provider_spec.value.get_or_insert_default(); + + let platform = match mset_provider_spec.get("kind") { + Some(serde_json::Value::String(s)) if s == "AzureMachineProviderSpec" => Azure {}, + Some(s) => panic!("unsupported MachineSet provider: {s}"), + None => panic!("MachineSet {mset_name} had no provider",), + }; + platform.add_tee_options(mset_provider_spec, ign_secret_name) +} + +struct ScaleContext { + machine_name: String, + mc_name: String, + test_ctx: TestContext, +} + +impl ScaleContext { + async fn new(test_ctx: TestContext) -> Result { + let client = test_ctx.client(); + let ns = test_ctx.namespace(); + let machine_name = format!("worker-cvm-{ns}"); + let mc_name = format!("99-{machine_name}"); + + let bootc_image = get_env(BOOTC_IMAGE_ENV)?; + let mc = MachineConfig { + metadata: ObjectMeta { + name: Some(mc_name.clone()), + labels: Some(BTreeMap::from([ + (MAPI_ROLE.to_string(), machine_name.clone()), + (MACHINESET_LABEL.to_string(), machine_name.clone()), + ])), + ..Default::default() + }, + spec: MachineConfigSpec { + os_image_url: Some(bootc_image), + ..Default::default() + }, + }; + let machineconfigs: Api = Api::all(client.clone()); + test_ctx.info("Creating MachineConfig to override upgrade image"); + machineconfigs.create(&Default::default(), &mc).await?; + + create_mcp(&test_ctx, &machine_name, &mc_name).await?; + let ign_secret_name = extend_ign_secret(&test_ctx, &machine_name).await?; + + let machinesets: Api = Api::namespaced(client.clone(), MAPI_NS); + let sel = Expression::Equal(MACHINEROLE_LABEL.to_string(), "worker".to_string()); + let lp = ListParams::default().labels_from(&sel.into()); + let existing_msets = machinesets.list(&lp).await?; + let ctx = "No existing worker machinesets found"; + let mut mset = existing_msets.items.first().context(ctx)?.clone(); + let mset_name = mset.metadata.name.clone().unwrap(); + adapt_machineset(&mut mset, &machine_name, ign_secret_name)?; + + let info = format!("Creating MachineSet {machine_name}, derived from {mset_name}"); + test_ctx.info(info); + machinesets.create(&Default::default(), &mset).await?; + + Ok(Self { + machine_name, + mc_name, + test_ctx, + }) + } + + async fn has_replicas(&self, replicas: i32, duration: Duration) -> Result<()> { + let has_replicas = |mset: Option<&MachineSet>| { + let chk_st = |st: &MachineSetStatus| st.ready_replicas.unwrap_or(0) == replicas; + let chk_mset = |s: &MachineSet| s.status.as_ref().map(chk_st); + mset.and_then(chk_mset).unwrap_or(false) + }; + + let machinesets: Api = Api::namespaced(self.test_ctx.client().clone(), MAPI_NS); + let machine_name = &self.machine_name; + let replicas_ready = await_condition(machinesets, machine_name, has_replicas); + let ctx = format!("MachineSet {machine_name} did not have desired replicas",); + timeout(duration, replicas_ready).await.context(ctx)??; + self.test_ctx.info(format!( + "MachineSet {machine_name} achieved desired amount replicas ({replicas})" + )); + + Ok(()) + } + + async fn cleanup(self) -> Result<()> { + let client = self.test_ctx.client(); + let machine_name = &self.machine_name; + + self.test_ctx.info("Cleaning up"); + let machinesets: Api = Api::namespaced(client.clone(), MAPI_NS); + let machineconfigs: Api = Api::all(client.clone()); + let mcps: Api = Api::all(client.clone()); + + let dp = Default::default(); + machinesets.delete(machine_name, &dp).await?; + machineconfigs.delete(&self.mc_name, &dp).await?; + mcps.delete(machine_name, &dp).await?; + let duration = scaled_timeout(60); + wait_for_resource_deleted(&machinesets, machine_name, duration).await?; + self.test_ctx + .info(format!("MachineSet {machine_name} has been deleted")); + wait_for_resource_deleted(&machineconfigs, &self.mc_name, duration).await?; + self.test_ctx + .info(format!("MachineConfig {} has been deleted", self.mc_name)); + wait_for_resource_deleted(&mcps, &self.mc_name, duration).await?; + self.test_ctx + .info(format!("MachineConfigPool {machine_name} has been deleted",)); + + self.test_ctx.cleanup().await + } +} + +named_test!( + async fn test_scale() -> anyhow::Result<()> { + let test_ctx = setup!().await?; + let scale_ctx = ScaleContext::new(test_ctx.clone()).await?; + scale_ctx.has_replicas(1, scaled_duration(300)).await?; + let machine_name = &scale_ctx.machine_name; + + let label = format!("{NODE_ROLE_PREFIX}{machine_name}"); + let nodes: Api = Api::all(test_ctx.client().clone()); + let lp = ListParams::default().labels(&label); + let node_list = nodes.list(&lp).await?; + assert!(!node_list.items.is_empty(), "No nodes found for MachineSet"); + for node in &node_list.items { + let node_name = node.metadata.name.as_ref().unwrap(); + let backend = OpenShiftNode { + node_name: node_name.clone(), + }; + test_ctx.info(format!("Verifying encrypted root on node {node_name}")); + let ns = test_ctx.namespace(); + let root_key = backend.get_root_key(test_ctx.client().clone(), ns).await?; + let has_encrypted_root = backend.verify_encrypted_root(root_key.as_deref()).await?; + let err = format!("Node {node_name} should have an encrypted root device"); + assert!(has_encrypted_root, "{err}"); + test_ctx.info(format!("Node {node_name}: encrypted root verified")); + } + + scale_ctx.cleanup().await + } +); + +named_test!( + async fn test_parallel_replicas() -> anyhow::Result<()> { + let test_ctx = setup!().await?; + let scale_ctx = ScaleContext::new(test_ctx.clone()).await?; + + let machinesets: Api = Api::namespaced(test_ctx.client().clone(), MAPI_NS); + let mut mset = machinesets.get(&scale_ctx.machine_name).await?; + mset.spec.replicas = Some(2); + test_ctx.info("Updating MachineSet replicas to 2"); + machinesets + .replace(&scale_ctx.machine_name, &Default::default(), &mset) + .await?; + scale_ctx.has_replicas(2, scaled_duration(300)).await?; + scale_ctx.cleanup().await + } +); + +named_test!( + async fn test_operator_restart() -> anyhow::Result<()> { + let test_ctx = setup!().await?; + let scale_ctx = ScaleContext::new(test_ctx.clone()).await?; + scale_ctx.has_replicas(1, scaled_duration(300)).await?; + let machine_name = &scale_ctx.machine_name; + + let machinesets: Api = Api::namespaced(test_ctx.client().clone(), MAPI_NS); + let mut mset = machinesets.get(&scale_ctx.machine_name).await?; + mset.spec.replicas = Some(0); + test_ctx.info("Updating MachineSet replicas to 0"); + let rp = Default::default(); + machinesets.replace(machine_name, &rp, &mset).await?; + scale_ctx.has_replicas(0, scaled_duration(60)).await?; + + test_ctx.info("Restarting trusted-cluster-operator"); + let deployments: Api = + Api::namespaced(test_ctx.client().clone(), test_ctx.namespace()); + deployments.restart("trusted-cluster-operator").await?; + + test_ctx.info("Updating MachineSet replicas back to 1"); + mset.spec.replicas = Some(1); + machinesets.replace(machine_name, &rp, &mset).await?; + scale_ctx.has_replicas(1, scaled_duration(300)).await?; + + scale_ctx.cleanup().await + } +); diff --git a/tests/tools.go b/tests/tools.go new file mode 100644 index 0000000..c873240 --- /dev/null +++ b/tests/tools.go @@ -0,0 +1,6 @@ +//go:build tools +package tools + +import ( + _ "github.com/openshift/api" +) From 2660e54a650564859c38ed55fac1034bc6ad92ef Mon Sep 17 00:00:00 2001 From: Jakob Naucke Date: Mon, 10 Aug 2026 19:45:17 +0200 Subject: [PATCH 4/8] OpenShift API controller-gen workaround has an incompatible validation rule Signed-off-by: Jakob Naucke Assisted-by: AI --- tests/Makefile | 19 ++++++++++++++++--- tests/scale.rs | 21 +++++++++++++++++---- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/tests/Makefile b/tests/Makefile index 50cff03..a7ddd1c 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -4,6 +4,19 @@ include $(upstream)/Makefile # to avoid interpretation as argument delimiter comma := , +OPENSHIFT_API_DIR = $(shell go list -m -f '{{.Dir}}' github.com/openshift/api) +OPENSHIFT_API_LOCAL = config/crd/openshift-api + +# Work around controller-gen rejecting invalid markers in openshift/api +# until https://github.com/openshift/api/issues/2978 is resolved +$(OPENSHIFT_API_LOCAL): $(OPENSHIFT_API_DIR)/go.mod + rm -rf $(OPENSHIFT_API_LOCAL) + mkdir -p $(OPENSHIFT_API_LOCAL)/machine/v1beta1 + cp $(OPENSHIFT_API_DIR)/go.mod $(OPENSHIFT_API_DIR)/go.sum $(OPENSHIFT_API_LOCAL)/ + cp $(OPENSHIFT_API_DIR)/machine/v1beta1/*.go $(OPENSHIFT_API_LOCAL)/machine/v1beta1/ + sed -i '/+kubebuilder:validation:Pattern=.*InventoryServiceTag/d' \ + $(OPENSHIFT_API_LOCAL)/machine/v1beta1/types_vsphereprovider.go + $(CRD_RS_PATH)/%.rs: $(CRD_YAML_PATH)/*_%.yaml $(KOPIUM) $(CRD_RS_PATH) $(KOPIUM) -f $< --derive Default > $@ sed -Ei 'N; s/, Default\)\]\n(pub struct (MachineConfigPoolStatusPoolSynchronizersStatus(PoolSynchronizerType)?|AzureMachineProviderSpec(DataDisks|DiagnosticsBoot|SecurityProfileSettings)))/)]\n\1/; P; D' $@ @@ -12,13 +25,13 @@ $(CRD_RS_PATH)/%.rs: $(CRD_YAML_PATH)/*_%.yaml $(KOPIUM) $(CRD_RS_PATH) trusted-cluster-gen-downstream: $(MAKEFILE_DIR)api/trusted-cluster-gen.go cd $(MAKEFILE_DIR) && go build $< -generate-downstream: $(CONTROLLER_GEN) +generate-downstream: $(CONTROLLER_GEN) $(OPENSHIFT_API_LOCAL) $(call controller-gen,github.com/openshift/api/machineconfiguration/v1,*machineconfig{s$(comma)pools}*) - $(call controller-gen,github.com/openshift/api/machine/v1beta1,*{machinesets$(comma)azure*specs}*) + $(call controller-gen,./$(OPENSHIFT_API_LOCAL)/machine/v1beta1,*{machinesets$(comma)azure*specs}*) crds-rs-downstream: generate-downstream $(KOPIUM) $(CRD_RS_PATH) cd $(MAKEFILE_DIR) && $(MAKE) crds-rs - $(MAKE) $(shell find $(CRD_YAML_PATH) -type f \ + $(MAKE) $(shell find $(CRD_YAML_PATH) -path $(OPENSHIFT_API_LOCAL) -prune -o -type f -print \ | sed -E 's|$(CRD_YAML_PATH)/.*_(.*)\.yaml|$(CRD_RS_PATH)/\1.rs|') INTEGRATION_TEST_FLAGS = -- --nocapture --test-threads=$(INTEGRATION_TEST_THREADS) diff --git a/tests/scale.rs b/tests/scale.rs index 80f91f0..4cd056a 100644 --- a/tests/scale.rs +++ b/tests/scale.rs @@ -252,7 +252,7 @@ fn adapt_machineset( name: Some(machine_name.to_string()), ..Default::default() }; - mset.spec.replicas = Some(1); + mset.spec.replicas = Some(0); // TODO once test works, check if these are all necessary let mset_labels = mset.metadata.labels.get_or_insert_default(); @@ -345,7 +345,7 @@ impl ScaleContext { let ctx = format!("MachineSet {machine_name} did not have desired replicas",); timeout(duration, replicas_ready).await.context(ctx)??; self.test_ctx.info(format!( - "MachineSet {machine_name} achieved desired amount replicas ({replicas})" + "MachineSet {machine_name} achieved desired number of replicas ({replicas})" )); Ok(()) @@ -383,9 +383,16 @@ named_test!( async fn test_scale() -> anyhow::Result<()> { let test_ctx = setup!().await?; let scale_ctx = ScaleContext::new(test_ctx.clone()).await?; - scale_ctx.has_replicas(1, scaled_duration(300)).await?; let machine_name = &scale_ctx.machine_name; + let machinesets: Api = Api::namespaced(test_ctx.client().clone(), MAPI_NS); + let mut mset = machinesets.get(machine_name).await?; + mset.spec.replicas = Some(1); + test_ctx.info("Updating MachineSet replicas to 1"); + let rp = Default::default(); + machinesets.replace(machine_name, &rp, &mset).await?; + scale_ctx.has_replicas(1, scaled_duration(300)).await?; + let label = format!("{NODE_ROLE_PREFIX}{machine_name}"); let nodes: Api = Api::all(test_ctx.client().clone()); let lp = ListParams::default().labels(&label); @@ -435,9 +442,15 @@ named_test!( let machinesets: Api = Api::namespaced(test_ctx.client().clone(), MAPI_NS); let mut mset = machinesets.get(&scale_ctx.machine_name).await?; + let rp = Default::default(); + + mset.spec.replicas = Some(1); + test_ctx.info("Updating MachineSet replicas to 1"); + machinesets.replace(machine_name, &rp, &mset).await?; + scale_ctx.has_replicas(0, scaled_duration(60)).await?; + mset.spec.replicas = Some(0); test_ctx.info("Updating MachineSet replicas to 0"); - let rp = Default::default(); machinesets.replace(machine_name, &rp, &mset).await?; scale_ctx.has_replicas(0, scaled_duration(60)).await?; From ca249942a67d020fd099b8e669a56eb905c13f8f Mon Sep 17 00:00:00 2001 From: Uri Lublin Date: Thu, 27 Aug 2026 17:49:44 +0000 Subject: [PATCH 5/8] Pass build_target to buildah (.tekton) Assisted-By: Claude Opus 4.8 Signed-off-by: Uri Lublin --- .tekton/attestation-key-register-pull-request.yaml | 1 + .tekton/attestation-key-register-push.yaml | 1 + .tekton/compute-pcrs-pull-request.yaml | 1 + .tekton/compute-pcrs-push.yaml | 1 + .tekton/confidential-cluster-operator-pull-request.yaml | 1 + .tekton/confidential-cluster-operator-push.yaml | 1 + .tekton/registration-server-pull-request.yaml | 1 + .tekton/registration-server-push.yaml | 1 + 8 files changed, 8 insertions(+) diff --git a/.tekton/attestation-key-register-pull-request.yaml b/.tekton/attestation-key-register-pull-request.yaml index 90ec16d..3806e91 100644 --- a/.tekton/attestation-key-register-pull-request.yaml +++ b/.tekton/attestation-key-register-pull-request.yaml @@ -31,6 +31,7 @@ spec: - name: build-args value: - build_type=release + - build_target=attestation-key-register pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/attestation-key-register-push.yaml b/.tekton/attestation-key-register-push.yaml index a1cce7a..d8efab6 100644 --- a/.tekton/attestation-key-register-push.yaml +++ b/.tekton/attestation-key-register-push.yaml @@ -30,6 +30,7 @@ spec: - name: build-args value: - build_type=release + - build_target=attestation-key-register pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/compute-pcrs-pull-request.yaml b/.tekton/compute-pcrs-pull-request.yaml index ad366a4..81d7c0b 100644 --- a/.tekton/compute-pcrs-pull-request.yaml +++ b/.tekton/compute-pcrs-pull-request.yaml @@ -31,6 +31,7 @@ spec: - name: build-args value: - build_type=release + - build_target=compute-pcrs pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/compute-pcrs-push.yaml b/.tekton/compute-pcrs-push.yaml index 51163ec..0d2a2e9 100644 --- a/.tekton/compute-pcrs-push.yaml +++ b/.tekton/compute-pcrs-push.yaml @@ -30,6 +30,7 @@ spec: - name: build-args value: - build_type=release + - build_target=compute-pcrs pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/confidential-cluster-operator-pull-request.yaml b/.tekton/confidential-cluster-operator-pull-request.yaml index 420e152..731225a 100644 --- a/.tekton/confidential-cluster-operator-pull-request.yaml +++ b/.tekton/confidential-cluster-operator-pull-request.yaml @@ -31,6 +31,7 @@ spec: - name: build-args value: - build_type=release + - build_target=operator pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/confidential-cluster-operator-push.yaml b/.tekton/confidential-cluster-operator-push.yaml index 04db02a..4cf9d38 100644 --- a/.tekton/confidential-cluster-operator-push.yaml +++ b/.tekton/confidential-cluster-operator-push.yaml @@ -30,6 +30,7 @@ spec: - name: build-args value: - build_type=release + - build_target=operator pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/registration-server-pull-request.yaml b/.tekton/registration-server-pull-request.yaml index 4debd07..7d3be84 100644 --- a/.tekton/registration-server-pull-request.yaml +++ b/.tekton/registration-server-pull-request.yaml @@ -31,6 +31,7 @@ spec: - name: build-args value: - build_type=release + - build_target=register-server pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/registration-server-push.yaml b/.tekton/registration-server-push.yaml index f2d72aa..953231f 100644 --- a/.tekton/registration-server-push.yaml +++ b/.tekton/registration-server-push.yaml @@ -30,6 +30,7 @@ spec: - name: build-args value: - build_type=release + - build_target=register-server pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. From c92bc6a2206fd521b2801c20a602694dad3f3632 Mon Sep 17 00:00:00 2001 From: Uri Lublin Date: Thu, 27 Aug 2026 21:24:20 +0000 Subject: [PATCH 6/8] Containerfile: add missing "AS builder" The consolidated Containerfile dropped the `AS builder` label. Later stages use it e.g. `COPY --from=builder` / `FROM builder`. Upstream operator/Containerfile has `... AS builder`. Assisted-By: Claude Opus 4.8 Signed-off-by: Uri Lublin --- Containerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Containerfile b/Containerfile index 936469d..c3ac0a7 100644 --- a/Containerfile +++ b/Containerfile @@ -9,7 +9,7 @@ ARG build_type=release ARG build_target=operator # Unified builder stage, compiles all binaries in a single cargo invocation. -FROM quay.io/redhat-user-workloads/cocl-operator-tenant/buildroot@sha256:34806c0eb874b00bcd0fc90241746404e051070b278ac0351e5c8873ffda8b39 +FROM quay.io/redhat-user-workloads/cocl-operator-tenant/buildroot@sha256:34806c0eb874b00bcd0fc90241746404e051070b278ac0351e5c8873ffda8b39 AS builder LABEL project=trusted-cluster-operator ARG build_type WORKDIR /build From 532aeb834f3ba74659d396983bbc4ff8996fe33c Mon Sep 17 00:00:00 2001 From: Uri Lublin Date: Thu, 27 Aug 2026 19:07:42 +0000 Subject: [PATCH 7/8] Update operator submodule to 53fb1ed Bumps the operator submodule from 1b8651e to 53fb1ed (upstream main). This pulls in the fix that adds the reference-values git dependency to operator/Cargo.lock, which is required for hermetic cargo builds: cachi2 prefetch is driven by Cargo.lock and cannot resolve the missing dep offline. (`cargo fetch --locked` now succeeds.) Also refreshes drift-cache/Containerfile to match the upstream Containerfile, whose distribution stages moved fedora:43 -> fedora-minimal:43. The downstream Containerfile already uses ubi9/ubi-minimal for those stages, so no logic change is mirrored there (per the sync-operator-submodule skill). Assisted-By: Claude Opus 4.8 Signed-off-by: Uri Lublin --- drift-cache/Containerfile | 8 ++++---- operator | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/drift-cache/Containerfile b/drift-cache/Containerfile index 3d54561..2f4de56 100644 --- a/drift-cache/Containerfile +++ b/drift-cache/Containerfile @@ -72,16 +72,16 @@ RUN --mount=type=cache,target=/build/target \ cp /build/target/${profile_dir}/attestation-key-register /output/ # Distribution stages -FROM quay.io/fedora/fedora:43 AS operator +FROM quay.io/fedora/fedora-minimal:43 AS operator COPY --from=builder /output/operator /usr/bin ENTRYPOINT ["/usr/bin/operator"] -FROM quay.io/fedora/fedora:43 AS attestation-key-register +FROM quay.io/fedora/fedora-minimal:43 AS attestation-key-register COPY --from=builder /output/attestation-key-register /usr/bin EXPOSE 8001 ENTRYPOINT ["/usr/bin/attestation-key-register"] -FROM quay.io/fedora/fedora:43 AS register-server +FROM quay.io/fedora/fedora-minimal:43 AS register-server COPY --from=builder /output/register-server /usr/bin EXPOSE 3030 ENTRYPOINT ["/usr/bin/register-server"] @@ -97,7 +97,7 @@ RUN mkdir -p /output/reference-values && \ mv /build/reference-values/efivars /output/reference-values/ && \ mv /build/reference-values/mok-variables /output/reference-values/ -FROM quay.io/fedora/fedora:43 AS compute-pcrs +FROM quay.io/fedora/fedora-minimal:43 AS compute-pcrs COPY --from=compute-pcrs-data /output/compute-pcrs /usr/bin COPY --from=compute-pcrs-data /output/reference-values /reference-values ENTRYPOINT ["/usr/bin/compute-pcrs"] diff --git a/operator b/operator index 1b8651e..53fb1ed 160000 --- a/operator +++ b/operator @@ -1 +1 @@ -Subproject commit 1b8651e82dccdbeb2843480650d7ccece433958e +Subproject commit 53fb1ed8bd35adc176d8ba7597e02b10411256a6 From 56a5cb59b3507f4685fcf878ed6ac9a07a8d77f7 Mon Sep 17 00:00:00 2001 From: Uri Lublin Date: Fri, 28 Aug 2026 10:39:07 +0000 Subject: [PATCH 8/8] Enable hermetic builds Activate cachi2 prefetch + network isolation for all build components. - .tekton: set hermetic=true and prefetch-input on the 6 build components (operands: gomod+cargo+generic; bundle: gomod+rpm+generic; buildroot: rpm). FBC is left unchanged (already hermetic, no prefetch needed). - reference-values: vendor as a git submodule (pinned commit) and COPY it in the compute-pcrs-data stage instead of `git clone` in the Containerfile. - Containerfile: copy the cachi2-injected operator/.cargo config into the build workdir so offline cargo resolves the vendored crates; prefetch controller-gen and kopium (musl static) via cachi2 'generic' and place them where 'make crds-rs' expects, so it never hits the network. - Containerfile.bundle: fetch yq, operator-sdk and controller-gen via cachi2 'generic' ; keep the SHA256 verification. - rpm prefetch: add per-component lockfiles: .konflux/buildroot/rpms.{in,lock}.yaml (rust toolchain, base ubi9/go-toolset) .konflux/bundle/rpms.{in,lock}.yaml (git/make/golang, base ubi9/ubi) and point each component's rpm prefetch-input at its path. - artifacts.lock.yaml: controller-gen, kopium, yq, operator-sdk. Assisted-By: Claude Opus 4.8 Signed-off-by: Uri Lublin --- .gitmodules | 3 + .konflux/buildroot/rpms.in.yaml | 21 + .konflux/buildroot/rpms.lock.yaml | 57 ++ .konflux/bundle/rpms.in.yaml | 12 + .konflux/bundle/rpms.lock.yaml | 666 ++++++++++++++++++ ...attestation-key-register-pull-request.yaml | 4 + .tekton/attestation-key-register-push.yaml | 4 + .tekton/buildroot-pull-request.yaml | 4 + .tekton/buildroot-push.yaml | 4 + .tekton/compute-pcrs-pull-request.yaml | 4 + .tekton/compute-pcrs-push.yaml | 4 + ...-cluster-operator-bundle-pull-request.yaml | 4 + ...idential-cluster-operator-bundle-push.yaml | 4 + ...dential-cluster-operator-pull-request.yaml | 4 + .../confidential-cluster-operator-push.yaml | 4 + .tekton/registration-server-pull-request.yaml | 4 + .tekton/registration-server-push.yaml | 4 + Containerfile | 24 +- Containerfile.bundle | 22 +- artifacts.lock.yaml | 32 + reference-values | 1 + 21 files changed, 877 insertions(+), 9 deletions(-) create mode 100644 .konflux/buildroot/rpms.in.yaml create mode 100644 .konflux/buildroot/rpms.lock.yaml create mode 100644 .konflux/bundle/rpms.in.yaml create mode 100644 .konflux/bundle/rpms.lock.yaml create mode 100644 artifacts.lock.yaml create mode 160000 reference-values diff --git a/.gitmodules b/.gitmodules index c4c3fd1..c243292 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,3 +5,6 @@ [submodule "drift-detection"] path = drift-detection url = https://github.com/arewm/drift-detection +[submodule "reference-values"] + path = reference-values + url = https://github.com/trusted-execution-clusters/reference-values diff --git a/.konflux/buildroot/rpms.in.yaml b/.konflux/buildroot/rpms.in.yaml new file mode 100644 index 0000000..3ec4bfe --- /dev/null +++ b/.konflux/buildroot/rpms.in.yaml @@ -0,0 +1,21 @@ +# Input for rpm-lockfile-prototype -> .konflux/buildroot/rpms.lock.yaml, consumed by +# cachi2 rpm prefetch for Containerfile.buildroot (base: ubi9/go-toolset). +# Resolve against the go-toolset base so rust-toolset & friends are found: +# rpm-lockfile-prototype --image registry.access.redhat.com/ubi9/go-toolset:latest \ +# --outfile .konflux/buildroot/rpms.lock.yaml .konflux/buildroot/rpms.in.yaml +contentOrigin: + repofiles: + - /etc/yum.repos.d/ubi.repo +arches: + - x86_64 +packages: + - rust-toolset + - cargo + - rustfmt + - gcc + - gcc-c++ + - make + - git + - jq + - openssl-devel + - pkgconfig diff --git a/.konflux/buildroot/rpms.lock.yaml b/.konflux/buildroot/rpms.lock.yaml new file mode 100644 index 0000000..349682c --- /dev/null +++ b/.konflux/buildroot/rpms.lock.yaml @@ -0,0 +1,57 @@ +--- +lockfileVersion: 1 +lockfileVendor: redhat +arches: +- arch: x86_64 + packages: + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/c/cargo-1.92.0-1.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 9100626 + checksum: sha256:3c4afc2cb56734d01aaaaa8d0c317688f6fe143ad239079342f4fe9b631ded0f + name: cargo + evr: 1.92.0-1.el9 + sourcerpm: rust-1.92.0-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/o/oniguruma-6.9.6-1.el9.5.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 226331 + checksum: sha256:6c884cc2216e5b4699ebd8cde27b39e99532520b367f645ed6cc660d081916dc + name: oniguruma + evr: 6.9.6-1.el9.5 + sourcerpm: oniguruma-6.9.6-1.el9.5.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/r/rust-1.92.0-1.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 31511504 + checksum: sha256:fbc70b11f38999206d70a104789d1f7f21ca9f9090c7a73d6db337bff4f5205b + name: rust + evr: 1.92.0-1.el9 + sourcerpm: rust-1.92.0-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/r/rust-std-static-1.92.0-1.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 42991765 + checksum: sha256:d286394aaa75a796a06db130d2a980bee8e6ab4cbaa38a3b84e12379fbae4671 + name: rust-std-static + evr: 1.92.0-1.el9 + sourcerpm: rust-1.92.0-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/r/rust-toolset-1.92.0-1.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 20406 + checksum: sha256:7c8e4a695621948712693b395c7f099c443e26fea634924760334fe3f627cc5c + name: rust-toolset + evr: 1.92.0-1.el9 + sourcerpm: rust-1.92.0-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/r/rustfmt-1.92.0-1.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 2068695 + checksum: sha256:ca55f1c6162b3dca6621c049c524366dc8a361ece26910d82f87db9c0ad9a2e3 + name: rustfmt + evr: 1.92.0-1.el9 + sourcerpm: rust-1.92.0-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/j/jq-1.6-19.el9_8.2.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 197453 + checksum: sha256:9793a39a4746a09ba89c3d9ccc70150ac6c878286deee26d7e3aabede4666417 + name: jq + evr: 1.6-19.el9_8.2 + sourcerpm: jq-1.6-19.el9_8.2.src.rpm + source: [] + module_metadata: [] diff --git a/.konflux/bundle/rpms.in.yaml b/.konflux/bundle/rpms.in.yaml new file mode 100644 index 0000000..0f8b148 --- /dev/null +++ b/.konflux/bundle/rpms.in.yaml @@ -0,0 +1,12 @@ +# Input for rpm-lockfile-prototype -> .konflux/bundle/rpms.lock.yaml, consumed by cachi2 +# rpm prefetch for Containerfile.bundle (base: ubi9/ubi). Regenerate: +# (in a ubi9/ubi container) rpm-lockfile-prototype --local-system rpms.in.yaml +contentOrigin: + repofiles: + - /etc/yum.repos.d/ubi.repo +arches: + - x86_64 +packages: + - git + - make + - golang diff --git a/.konflux/bundle/rpms.lock.yaml b/.konflux/bundle/rpms.lock.yaml new file mode 100644 index 0000000..168e4dc --- /dev/null +++ b/.konflux/bundle/rpms.lock.yaml @@ -0,0 +1,666 @@ +--- +lockfileVersion: 1 +lockfileVendor: redhat +arches: +- arch: x86_64 + packages: + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/c/cpp-11.5.0-14.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 11226193 + checksum: sha256:3c0ee1cb8b72f3f5176f8945ab518eb733ccc9f950d317fb5d5ac327d0eb9c90 + name: cpp + evr: 11.5.0-14.el9 + sourcerpm: gcc-11.5.0-14.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/g/gcc-11.5.0-14.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 33982584 + checksum: sha256:2082784165bbb246b6e5ef5921ed823f0a9709cacdf5823aa60695fd6d4819a2 + name: gcc + evr: 11.5.0-14.el9 + sourcerpm: gcc-11.5.0-14.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/g/git-2.52.0-1.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 46071 + checksum: sha256:be1c2f855001bf01cb5c5b0ff59d8943ddc4c4eedbbbddd68474d2aa6e11395c + name: git + evr: 2.52.0-1.el9 + sourcerpm: git-2.52.0-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/g/git-core-2.52.0-1.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 5293286 + checksum: sha256:6264aa556d583604f34def3674f5830a70cfee0aac283719e4df295db38acb53 + name: git-core + evr: 2.52.0-1.el9 + sourcerpm: git-2.52.0-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/g/git-core-doc-2.52.0-1.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 3300095 + checksum: sha256:cf375cd9a48d244df37bb0c9ff58aa3c6f3d21d7446cc0cf902c9659fecf8343 + name: git-core-doc + evr: 2.52.0-1.el9 + sourcerpm: git-2.52.0-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/g/glibc-devel-2.34-275.el9_8.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 46499 + checksum: sha256:a3b6ed698d21192fa7c421094a5d6648411fba4252db28c96d629778c86e6cd5 + name: glibc-devel + evr: 2.34-275.el9_8 + sourcerpm: glibc-2.34-275.el9_8.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/g/glibc-headers-2.34-275.el9_8.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 567171 + checksum: sha256:2124192aba2e7931cdf00c2dcd4b70b71b313790c28dcf09b2fb09cc9831c86f + name: glibc-headers + evr: 2.34-275.el9_8 + sourcerpm: glibc-2.34-275.el9_8.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/g/golang-1.26.7-1.el9_8.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 1520026 + checksum: sha256:ab786d635b438822c9fa3ddc2a0f056e1cf9ab83bcfcca285c2ac9714a9b903c + name: golang + evr: 1.26.7-1.el9_8 + sourcerpm: golang-1.26.7-1.el9_8.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/g/golang-bin-1.26.7-1.el9_8.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 47194775 + checksum: sha256:d68cc646382e339b5860d44cdf3c23c135523dc52a5cf52c4919f25130ad7c07 + name: golang-bin + evr: 1.26.7-1.el9_8 + sourcerpm: golang-1.26.7-1.el9_8.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/g/golang-race-1.26.7-1.el9_8.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 1742998 + checksum: sha256:c4f7bcb59a53fb8881935b88869ccb6cac3facf6444b344e2f5adb76e16cf932 + name: golang-race + evr: 1.26.7-1.el9_8 + sourcerpm: golang-1.26.7-1.el9_8.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/g/golang-src-1.26.7-1.el9_8.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 12881267 + checksum: sha256:b570b95df0bc6429486a71a10fb433f56bb3a694f5de8a777131b2a841e81181 + name: golang-src + evr: 1.26.7-1.el9_8 + sourcerpm: golang-1.26.7-1.el9_8.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/k/kernel-headers-5.14.0-687.42.1.el9_8.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 2913473 + checksum: sha256:6a2a1bdb7d755358f35a283de880abb48b359aedd5fdfcd2da80bbe03541688c + name: kernel-headers + evr: 5.14.0-687.42.1.el9_8 + sourcerpm: kernel-5.14.0-687.42.1.el9_8.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/l/libmpc-1.2.1-4.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 66075 + checksum: sha256:b97b4e98c3c6f41dcfc2ceb4ffa1aba7a338b7cfd9e6c4f63e3160dd3cc033d3 + name: libmpc + evr: 1.2.1-4.el9 + sourcerpm: libmpc-1.2.1-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/l/libxcrypt-devel-4.4.18-3.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 33101 + checksum: sha256:c1d171391a7d2e043a6953efd3df3e01edc9b4c6cdb54517e1608d204a5fce18 + name: libxcrypt-devel + evr: 4.4.18-3.el9 + sourcerpm: libxcrypt-4.4.18-3.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/o/openssl-devel-3.5.5-6.el9_8.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 5029526 + checksum: sha256:84e54b3467ecfe70c75688f28dbc0e071e268d845db17b28a1f35a35d45640cd + name: openssl-devel + evr: 1:3.5.5-6.el9_8 + sourcerpm: openssl-3.5.5-6.el9_8.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-AutoLoader-5.74-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 21344 + checksum: sha256:b4557d853be8048aaefde5c4083c43fa34375e224731e93e584e4e3d5db46ac3 + name: perl-AutoLoader + evr: 5.74-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-B-1.80-481.1.el9_6.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 183818 + checksum: sha256:8b5a3d27f69cce8dd4c237510c2aaa2d01b3e884452e5da467d9c41015372c6a + name: perl-B + evr: 1.80-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Carp-1.50-460.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 32039 + checksum: sha256:c51470a55b1dce42f944bdea06a10469f5a42d55be898a33c2fed3a99843fbb2 + name: perl-Carp + evr: 1.50-460.el9 + sourcerpm: perl-Carp-1.50-460.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Class-Struct-0.66-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 22220 + checksum: sha256:d35ff343bd718fbd8531995a8aedb866c6d37fac6a688fcf9a458017781bf058 + name: perl-Class-Struct + evr: 0.66-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Data-Dumper-2.174-462.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 59910 + checksum: sha256:6cd912e640cbc8785e33dae9cf07561509491a0ec76a81c01d6b7a77ad08668d + name: perl-Data-Dumper + evr: 2.174-462.el9 + sourcerpm: perl-Data-Dumper-2.174-462.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Digest-1.19-4.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 29409 + checksum: sha256:e0b8633f818467f9e1bf46b9c0012af7bf8a309ac64e903a2a9faf3fae7705f9 + name: perl-Digest + evr: 1.19-4.el9 + sourcerpm: perl-Digest-1.19-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Digest-MD5-2.58-4.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 40274 + checksum: sha256:2a6b21a144ae1d060e51ee2b6328c5dd1a646f429da160f386c2eb420b1220b4 + name: perl-Digest-MD5 + evr: 2.58-4.el9 + sourcerpm: perl-Digest-MD5-2.58-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-DynaLoader-1.47-481.1.el9_6.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 25958 + checksum: sha256:937d31c9fc324bfa7434e8455cf1828afd46e4502f661566a7286853d8d46bf1 + name: perl-DynaLoader + evr: 1.47-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Encode-3.08-462.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 1802386 + checksum: sha256:d05248697e48928be004ed4c683b04966aa452ae1e2bd81f650c6de108b46956 + name: perl-Encode + evr: 4:3.08-462.el9 + sourcerpm: perl-Encode-3.08-462.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Errno-1.30-481.1.el9_6.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 14862 + checksum: sha256:9c03ad1166d9f8e6d2affb52185f59d625468d160f7c749e3d53a844d5129d4c + name: perl-Errno + evr: 1.30-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Error-0.17029-7.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 47552 + checksum: sha256:17cecf9160050d4709f4817eceba32c637e10d8bc87487a754e8f1764b1e8b6a + name: perl-Error + evr: 1:0.17029-7.el9 + sourcerpm: perl-Error-0.17029-7.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Exporter-5.74-461.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 34509 + checksum: sha256:888e14ebd70c2b69150873236b0df7c3a29c9edd488fd8488527c179e798b409 + name: perl-Exporter + evr: 5.74-461.el9 + sourcerpm: perl-Exporter-5.74-461.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Fcntl-1.13-481.1.el9_6.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 20397 + checksum: sha256:72587bf21b26885361ec991d153e1b4db26e9b117c1c70b92cc2891cecae4575 + name: perl-Fcntl + evr: 1.13-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-File-Basename-2.85-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 17211 + checksum: sha256:e39dcc13a24d3b5a7ba11288e63b22a055a8e1061743b8a409858d98ebd794e4 + name: perl-File-Basename + evr: 2.85-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-File-Path-2.18-4.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 38466 + checksum: sha256:d1df5e509c10365eaa329a0b97e38bc2667874240d3942195eb6ce7a88985a41 + name: perl-File-Path + evr: 2.18-4.el9 + sourcerpm: perl-File-Path-2.18-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-File-Temp-0.231.100-4.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 64150 + checksum: sha256:0a81b062391ac6dac3ec28ff1e435001dd798cf1ff19fdb52cfe1e0720d5de03 + name: perl-File-Temp + evr: 1:0.231.100-4.el9 + sourcerpm: perl-File-Temp-0.231.100-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-File-stat-1.09-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 17117 + checksum: sha256:b235134c1961e9b57f86bddc02e874607c17c155d2aa5ad78cc3ed9c8fd9c95b + name: perl-File-stat + evr: 1.09-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-FileHandle-2.03-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 15452 + checksum: sha256:c2139abdb9b3335f592aa2835ef6d6fcde1e89232eb3d3c5a15f7cc1d0829f8d + name: perl-FileHandle + evr: 2.03-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Getopt-Long-2.52-4.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 65144 + checksum: sha256:055fe33d2a7a421c1de8902b86a2f246ef6457774239d04b604f2d0ec6a00a14 + name: perl-Getopt-Long + evr: 1:2.52-4.el9 + sourcerpm: perl-Getopt-Long-2.52-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Getopt-Std-1.12-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 15551 + checksum: sha256:49bd8381823d680d17c37f3bebfd97dd92bfbf59e8019f15c7606f41dca02a7d + name: perl-Getopt-Std + evr: 1.12-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Git-2.52.0-1.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 44211 + checksum: sha256:3c57cee7cf3de7a79bef821448b01f48473d2fb9367509f57912a2f1ae7c3009 + name: perl-Git + evr: 2.52.0-1.el9 + sourcerpm: git-2.52.0-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-HTTP-Tiny-0.076-462.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 58720 + checksum: sha256:696f388a50f5be81596757d68251067449203e1c126ee8c23a7c5a0ad1ac5418 + name: perl-HTTP-Tiny + evr: 0.076-462.el9 + sourcerpm: perl-HTTP-Tiny-0.076-462.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-IO-1.43-481.1.el9_6.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 90423 + checksum: sha256:e29f5b38c643882a6b9ab9ddbb77bdd476d1a55e3ab649e886e99dd726b3c822 + name: perl-IO + evr: 1.43-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-IO-Socket-IP-0.41-5.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 46457 + checksum: sha256:4c80030ce256198584c4a58171b9dfe3adb4a8d7593110229e40ece76786a32f + name: perl-IO-Socket-IP + evr: 0.41-5.el9 + sourcerpm: perl-IO-Socket-IP-0.41-5.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-IO-Socket-SSL-2.073-2.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 226003 + checksum: sha256:b52d5b6a5081e3c142b2364b3f1ef58f569b39052df045f24363de9bb4f9cfd2 + name: perl-IO-Socket-SSL + evr: 2.073-2.el9 + sourcerpm: perl-IO-Socket-SSL-2.073-2.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-IPC-Open3-1.21-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 22968 + checksum: sha256:7ea36dcf28da3fc7250eb041ba19f99c87543c0870f5da67da614f5ca8d18b92 + name: perl-IPC-Open3 + evr: 1.21-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-MIME-Base64-3.16-4.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 35058 + checksum: sha256:3ae8affe13cc15cfaee1c6dd078ada14891dde5dca263927a9b5ed87f241d2c0 + name: perl-MIME-Base64 + evr: 3.16-4.el9 + sourcerpm: perl-MIME-Base64-3.16-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Mozilla-CA-20200520-6.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 14781 + checksum: sha256:99030bfb6a1a2ac41e0720841abaa8ba58c26e91640f4058cc6133e227e928a7 + name: perl-Mozilla-CA + evr: 20200520-6.el9 + sourcerpm: perl-Mozilla-CA-20200520-6.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-NDBM_File-1.15-481.1.el9_6.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 22193 + checksum: sha256:1c340352c349ee46ad071436947a1fa1bd353e984fb3d8d3328f2c287c8c5421 + name: perl-NDBM_File + evr: 1.15-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Net-SSLeay-1.94-3.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 424361 + checksum: sha256:e786e9bf9a3485be034b5f1ce80f4d1e2fc82502e27ac36a6d1a7681ea0ce261 + name: perl-Net-SSLeay + evr: 1.94-3.el9 + sourcerpm: perl-Net-SSLeay-1.94-3.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-POSIX-1.94-481.1.el9_6.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 98084 + checksum: sha256:434ef22a697f38f3dda351db9ab427e02e7a1220b2dcbc3046087bd9129b742e + name: perl-POSIX + evr: 1.94-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-PathTools-3.78-461.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 94564 + checksum: sha256:0647785b169c4bbdc65adf06d28981ce7fd1c9f93aecaa4e53a4515a21ebbf81 + name: perl-PathTools + evr: 3.78-461.el9 + sourcerpm: perl-PathTools-3.78-461.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Pod-Escapes-1.07-460.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 22564 + checksum: sha256:42fa08cc02a405933395316610a56e2bff58f6f7be16e9a063ec634747199bc0 + name: perl-Pod-Escapes + evr: 1:1.07-460.el9 + sourcerpm: perl-Pod-Escapes-1.07-460.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Pod-Perldoc-3.28.01-461.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 93727 + checksum: sha256:db3285dbe77ddc822d6bb847f857ea7032786cf7996b26d6c01481903b6d26e0 + name: perl-Pod-Perldoc + evr: 3.28.01-461.el9 + sourcerpm: perl-Pod-Perldoc-3.28.01-461.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Pod-Simple-3.42-4.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 234403 + checksum: sha256:2752454ce47a46227c6b7b98a5d9a25dcf3a992f27109a726744a66cd93c7b9a + name: perl-Pod-Simple + evr: 1:3.42-4.el9 + sourcerpm: perl-Pod-Simple-3.42-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Pod-Usage-2.01-4.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 44477 + checksum: sha256:c170870a2d1ff32048d13497fa67c382fe5aaf3d8d21bae639356ac28003dba9 + name: perl-Pod-Usage + evr: 4:2.01-4.el9 + sourcerpm: perl-Pod-Usage-2.01-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Scalar-List-Utils-1.56-462.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 77262 + checksum: sha256:7ce874bde7d9ad15abf70a3b7edbab77548eb2eb8b529c1e48b2426ee7f948f9 + name: perl-Scalar-List-Utils + evr: 4:1.56-462.el9 + sourcerpm: perl-Scalar-List-Utils-1.56-462.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-SelectSaver-1.02-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 11553 + checksum: sha256:8ec404df551d6cc4750efa34b9897d2288d07a26d49cd3d3d2315584976932b0 + name: perl-SelectSaver + evr: 1.02-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Socket-2.031-4.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 59776 + checksum: sha256:762751146305f9aea53b74a21495a610e7bdde956fa3246565d265b1128b56a8 + name: perl-Socket + evr: 4:2.031-4.el9 + sourcerpm: perl-Socket-2.031-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Storable-3.21-460.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 100335 + checksum: sha256:0097fdb40a1f83e56d5bf91160c07151b7cdd64f829fc0e328cdf3b43c2b4fa6 + name: perl-Storable + evr: 1:3.21-460.el9 + sourcerpm: perl-Storable-3.21-460.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Symbol-1.08-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 14061 + checksum: sha256:aa9942be4c837c024c6a0a376b13f9563e16ee8b66631ad6c5ff35cd0124728d + name: perl-Symbol + evr: 1.08-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Term-ANSIColor-5.01-461.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 52228 + checksum: sha256:996148d460395369394e9d4721e9000c5b2fa34ee800390a4a9d885b6db95b23 + name: perl-Term-ANSIColor + evr: 5.01-461.el9 + sourcerpm: perl-Term-ANSIColor-5.01-461.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Term-Cap-1.17-460.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 25043 + checksum: sha256:015a6d02b9c84bd353680d4bad61f3c8d297c53c3a43325e08e4ac4b48f97f17 + name: perl-Term-Cap + evr: 1.17-460.el9 + sourcerpm: perl-Term-Cap-1.17-460.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-TermReadKey-2.38-11.el9.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 41023 + checksum: sha256:5ff266e740a93344e1ce2913f4bec0f38cfdf721841e6762d85ac21d716ee9f8 + name: perl-TermReadKey + evr: 2.38-11.el9 + sourcerpm: perl-TermReadKey-2.38-11.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Text-ParseWords-3.30-460.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 18680 + checksum: sha256:4d47f3ba0ce454be5d781e968cfe15f01f393e68a47c415f35c0d88358ab4af9 + name: perl-Text-ParseWords + evr: 3.30-460.el9 + sourcerpm: perl-Text-ParseWords-3.30-460.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 25935 + checksum: sha256:5ad6ef70bbb4ba8d5cfd6ee0b3dda0ddc8cf0103199959499944019a66f7edcd + name: perl-Text-Tabs+Wrap + evr: 2013.0523-460.el9 + sourcerpm: perl-Text-Tabs+Wrap-2013.0523-460.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-Time-Local-1.300-7.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 37469 + checksum: sha256:e8e1e692b6e52cdb69515b2ad44b84ca71917bea5f47908cb9ae89b2bbd145a1 + name: perl-Time-Local + evr: 2:1.300-7.el9 + sourcerpm: perl-Time-Local-1.300-7.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-URI-5.09-3.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 128279 + checksum: sha256:1635b7d818e4f70445f7207f13e058c63c5d1f5aa081cfd2583912ae45f8e1bd + name: perl-URI + evr: 5.09-3.el9 + sourcerpm: perl-URI-5.09-3.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-base-2.27-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 16220 + checksum: sha256:0be44f055107893b011ed0e88f39ff202ba451db8a94351ad4472d350c780d0d + name: perl-base + evr: 2.27-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-constant-1.33-461.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 25865 + checksum: sha256:8ab94e13cab4e7eee081c7618ea7738b072d8093631d97b8b1f83bff893cf892 + name: perl-constant + evr: 1.33-461.el9 + sourcerpm: perl-constant-1.33-461.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-if-0.60.800-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 13876 + checksum: sha256:ae3ce80bee55e1057ed004ec03a0e826b0cdd90ace4c0784ab2f569a2d81d40c + name: perl-if + evr: 0.60.800-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-interpreter-5.32.1-481.1.el9_6.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 72173 + checksum: sha256:92959263a20ad89d33bc92826cdfed32f507652ff08d0c18b50b604fa5f9f594 + name: perl-interpreter + evr: 4:5.32.1-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-lib-0.65-481.1.el9_6.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 14847 + checksum: sha256:badc59793f32fa6e98fd705101af0b879720db5e0811b46755640d3d64165715 + name: perl-lib + evr: 0.65-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-libnet-3.13-4.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 137289 + checksum: sha256:79156f91a2ee21fb96f10e331047c55ff913e36f9a13ff89d0a479f0fc4dcb98 + name: perl-libnet + evr: 3.13-4.el9 + sourcerpm: perl-libnet-3.13-4.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-libs-5.32.1-481.1.el9_6.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 2303689 + checksum: sha256:aa0e9b31c82b50de7ace1b7e4b85a26ac9572cc77b8ded88866c06915748ccd7 + name: perl-libs + evr: 4:5.32.1-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-mro-1.23-481.1.el9_6.x86_64.rpm + repoid: ubi-9-appstream-rpms + size: 28410 + checksum: sha256:4ed671f36290bc6c15f37d550f67ce33ced1c27a3e2ea24f0a37038d45d1805a + name: perl-mro + evr: 1.23-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-overload-1.31-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 46157 + checksum: sha256:f172df7417780cb61b879effe60ce6b7b4399773c46cb9896a5edf2bfba6dbda + name: perl-overload + evr: 1.31-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-overloading-0.02-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 12747 + checksum: sha256:4aae487e802df60e1e2d778b264592290ad492078877784771299561d45dfd47 + name: perl-overloading + evr: 0.02-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-parent-0.238-460.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 16286 + checksum: sha256:a9b2ccc25a5ed5cc024935ef573772e203ed363f67dd5acc0d2ad5907498c463 + name: perl-parent + evr: 1:0.238-460.el9 + sourcerpm: perl-parent-0.238-460.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-podlators-4.14-460.el9.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 121317 + checksum: sha256:0401f715522a14b53956bccb60954025ad18a73802f7144ab0160d8504951a98 + name: perl-podlators + evr: 1:4.14-460.el9 + sourcerpm: perl-podlators-4.14-460.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-subs-1.03-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 11525 + checksum: sha256:0a7ef4a9a174ab981949d27a4acdc8cec87fd3513e9e607f5869851dc1c74deb + name: perl-subs + evr: 1.03-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/appstream/os/Packages/p/perl-vars-1.05-481.1.el9_6.noarch.rpm + repoid: ubi-9-appstream-rpms + size: 12885 + checksum: sha256:5d3c58094c0158b6193d7f4ba7a4bb7ae06a78738393b31255da8b7aadb10e38 + name: perl-vars + evr: 1.05-481.1.el9_6 + sourcerpm: perl-5.32.1-481.1.el9_6.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/b/binutils-2.35.2-72.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 4821853 + checksum: sha256:bda706d43bf47267e31db8ac62fe3206122f97ff035daa6c93ce9cd5063a63ca + name: binutils + evr: 2.35.2-72.el9 + sourcerpm: binutils-2.35.2-72.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/b/binutils-gold-2.35.2-72.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 758393 + checksum: sha256:4d429d1030d8e1c610ba5aea83f8c63090033f440b2c8f788f0e0acd4a3c51b3 + name: binutils-gold + evr: 2.35.2-72.el9 + sourcerpm: binutils-2.35.2-72.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/d/diffutils-3.7-12.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 411559 + checksum: sha256:2d4c4fdfc10215af3c957c24995b79a26e27e6d76de4ed1f5198d25bf7ef9671 + name: diffutils + evr: 3.7-12.el9 + sourcerpm: diffutils-3.7-12.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/e/elfutils-debuginfod-client-0.194-1.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 43826 + checksum: sha256:1635fd1ecaa9492fa925956dfd56d10063ca336619218f124ab45df0a38b41b0 + name: elfutils-debuginfod-client + evr: 0.194-1.el9 + sourcerpm: elfutils-0.194-1.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/g/groff-base-1.22.4-10.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 1133828 + checksum: sha256:4d8ff13569b3b231b3fb847e9e22615c6e08215d1f2c0c78eac2e345b9efd394 + name: groff-base + evr: 1.22.4-10.el9 + sourcerpm: groff-1.22.4-10.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/l/less-590-6.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 166025 + checksum: sha256:5bd040f9dd813167935fc390d546c119d90e0a9c77447a3d9ed1ef69c6f5a32a + name: less + evr: 590-6.el9 + sourcerpm: less-590-6.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/l/libcbor-0.7.0-5.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 60575 + checksum: sha256:588e8736af3376abfb3cdf372c10baef02c40d916a55958f3bee9767f9ad8526 + name: libcbor + evr: 0.7.0-5.el9 + sourcerpm: libcbor-0.7.0-5.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/l/libedit-3.1-39.20210216cvs.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 112056 + checksum: sha256:65a730688dfea27934b75af3acf30150c6d254c89d8b68b63233ae7f8b6c9b94 + name: libedit + evr: 3.1-39.20210216cvs.el9 + sourcerpm: libedit-3.1-39.20210216cvs.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/l/libfido2-1.13.0-2.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 102746 + checksum: sha256:6da940c0528f3e4453db84cb85b402c8f4293a197b1921158df9651edb4845e0 + name: libfido2 + evr: 1.13.0-2.el9 + sourcerpm: libfido2-1.13.0-2.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/l/libpkgconf-1.7.3-10.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 38387 + checksum: sha256:4feae5941b73640bd86b8d506a657cac5b770043db1464fbcd207721b2159dda + name: libpkgconf + evr: 1.7.3-10.el9 + sourcerpm: pkgconf-1.7.3-10.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/m/make-4.3-8.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 553896 + checksum: sha256:561f0c2251e9217c81a6c88de4d2d9231a039aaab37e8a0d2559d36ce9fa85fd + name: make + evr: 1:4.3-8.el9 + sourcerpm: make-4.3-8.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/n/ncurses-6.2-12.20210508.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 416252 + checksum: sha256:d2835ed9dbf6c4e1db0dfae027cc2a3615b62e4593c8c38eec7273c995b8ac39 + name: ncurses + evr: 6.2-12.20210508.el9 + sourcerpm: ncurses-6.2-12.20210508.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/o/openssh-9.9p1-9.el9_8.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 442241 + checksum: sha256:cd14a09ebe95a8d09a779838bf71f8e05f809cbd1d7ef4553294284d35249a60 + name: openssh + evr: 9.9p1-9.el9_8 + sourcerpm: openssh-9.9p1-9.el9_8.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/o/openssh-clients-9.9p1-9.el9_8.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 799148 + checksum: sha256:2e10d31aa0d2c2aaf521b4b1b46cd76b734a781a9ffaf496f8d39c53f4897705 + name: openssh-clients + evr: 9.9p1-9.el9_8 + sourcerpm: openssh-9.9p1-9.el9_8.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/p/pkgconf-1.7.3-10.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 45675 + checksum: sha256:bb47b4ecc499c308f41031a99e723827d152d5d750f59849d0c265d820944a26 + name: pkgconf + evr: 1.7.3-10.el9 + sourcerpm: pkgconf-1.7.3-10.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/p/pkgconf-m4-1.7.3-10.el9.noarch.rpm + repoid: ubi-9-baseos-rpms + size: 16054 + checksum: sha256:91bafd6e06099451f60288327b275cfcc651822f6145176a157c6b0fa5131e02 + name: pkgconf-m4 + evr: 1.7.3-10.el9 + sourcerpm: pkgconf-1.7.3-10.el9.src.rpm + - url: https://cdn-ubi.redhat.com/content/public/ubi/dist/ubi9/9/x86_64/baseos/os/Packages/p/pkgconf-pkg-config-1.7.3-10.el9.x86_64.rpm + repoid: ubi-9-baseos-rpms + size: 12438 + checksum: sha256:9a502d81d73d3303ceb53a06ad7ce525c97117ea64352174a33708bf3429283d + name: pkgconf-pkg-config + evr: 1.7.3-10.el9 + sourcerpm: pkgconf-1.7.3-10.el9.src.rpm + source: [] + module_metadata: [] diff --git a/.tekton/attestation-key-register-pull-request.yaml b/.tekton/attestation-key-register-pull-request.yaml index 3806e91..0299857 100644 --- a/.tekton/attestation-key-register-pull-request.yaml +++ b/.tekton/attestation-key-register-pull-request.yaml @@ -32,6 +32,10 @@ spec: value: - build_type=release - build_target=attestation-key-register + - name: hermetic + value: "true" + - name: prefetch-input + value: '[{"type": "gomod", "path": "operator"}, {"type": "cargo", "path": "operator"}, {"type": "generic"}]' pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/attestation-key-register-push.yaml b/.tekton/attestation-key-register-push.yaml index d8efab6..5edf52f 100644 --- a/.tekton/attestation-key-register-push.yaml +++ b/.tekton/attestation-key-register-push.yaml @@ -31,6 +31,10 @@ spec: value: - build_type=release - build_target=attestation-key-register + - name: hermetic + value: "true" + - name: prefetch-input + value: '[{"type": "gomod", "path": "operator"}, {"type": "cargo", "path": "operator"}, {"type": "generic"}]' pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/buildroot-pull-request.yaml b/.tekton/buildroot-pull-request.yaml index 7b75e93..ea93a0c 100644 --- a/.tekton/buildroot-pull-request.yaml +++ b/.tekton/buildroot-pull-request.yaml @@ -28,6 +28,10 @@ spec: value: 5d - name: dockerfile value: Containerfile.buildroot + - name: hermetic + value: "true" + - name: prefetch-input + value: '[{"type": "rpm", "path": ".konflux/buildroot"}]' pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/buildroot-push.yaml b/.tekton/buildroot-push.yaml index 9fa68be..bdef6e3 100644 --- a/.tekton/buildroot-push.yaml +++ b/.tekton/buildroot-push.yaml @@ -25,6 +25,10 @@ spec: value: quay.io/redhat-user-workloads/cocl-operator-tenant/buildroot:{{revision}} - name: dockerfile value: Containerfile.buildroot + - name: hermetic + value: "true" + - name: prefetch-input + value: '[{"type": "rpm", "path": ".konflux/buildroot"}]' pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/compute-pcrs-pull-request.yaml b/.tekton/compute-pcrs-pull-request.yaml index 81d7c0b..d3d1ba5 100644 --- a/.tekton/compute-pcrs-pull-request.yaml +++ b/.tekton/compute-pcrs-pull-request.yaml @@ -32,6 +32,10 @@ spec: value: - build_type=release - build_target=compute-pcrs + - name: hermetic + value: "true" + - name: prefetch-input + value: '[{"type": "gomod", "path": "operator"}, {"type": "cargo", "path": "operator"}, {"type": "generic"}]' pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/compute-pcrs-push.yaml b/.tekton/compute-pcrs-push.yaml index 0d2a2e9..40c79b7 100644 --- a/.tekton/compute-pcrs-push.yaml +++ b/.tekton/compute-pcrs-push.yaml @@ -31,6 +31,10 @@ spec: value: - build_type=release - build_target=compute-pcrs + - name: hermetic + value: "true" + - name: prefetch-input + value: '[{"type": "gomod", "path": "operator"}, {"type": "cargo", "path": "operator"}, {"type": "generic"}]' pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/confidential-cluster-operator-bundle-pull-request.yaml b/.tekton/confidential-cluster-operator-bundle-pull-request.yaml index 2182207..a22f4c5 100644 --- a/.tekton/confidential-cluster-operator-bundle-pull-request.yaml +++ b/.tekton/confidential-cluster-operator-bundle-pull-request.yaml @@ -31,6 +31,10 @@ spec: - name: build-args value: - TAG=0.2.1 + - name: hermetic + value: "true" + - name: prefetch-input + value: '[{"type": "gomod", "path": "operator"}, {"type": "rpm", "path": ".konflux/bundle"}, {"type": "generic"}]' pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/confidential-cluster-operator-bundle-push.yaml b/.tekton/confidential-cluster-operator-bundle-push.yaml index 9dc59e3..44017b3 100644 --- a/.tekton/confidential-cluster-operator-bundle-push.yaml +++ b/.tekton/confidential-cluster-operator-bundle-push.yaml @@ -29,6 +29,10 @@ spec: - name: build-args value: - TAG=0.2.1 + - name: hermetic + value: "true" + - name: prefetch-input + value: '[{"type": "gomod", "path": "operator"}, {"type": "rpm", "path": ".konflux/bundle"}, {"type": "generic"}]' pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/confidential-cluster-operator-pull-request.yaml b/.tekton/confidential-cluster-operator-pull-request.yaml index 731225a..c4ee328 100644 --- a/.tekton/confidential-cluster-operator-pull-request.yaml +++ b/.tekton/confidential-cluster-operator-pull-request.yaml @@ -32,6 +32,10 @@ spec: value: - build_type=release - build_target=operator + - name: hermetic + value: "true" + - name: prefetch-input + value: '[{"type": "gomod", "path": "operator"}, {"type": "cargo", "path": "operator"}, {"type": "generic"}]' pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/confidential-cluster-operator-push.yaml b/.tekton/confidential-cluster-operator-push.yaml index 4cf9d38..6ed3f1e 100644 --- a/.tekton/confidential-cluster-operator-push.yaml +++ b/.tekton/confidential-cluster-operator-push.yaml @@ -31,6 +31,10 @@ spec: value: - build_type=release - build_target=operator + - name: hermetic + value: "true" + - name: prefetch-input + value: '[{"type": "gomod", "path": "operator"}, {"type": "cargo", "path": "operator"}, {"type": "generic"}]' pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/registration-server-pull-request.yaml b/.tekton/registration-server-pull-request.yaml index 7d3be84..012a7f4 100644 --- a/.tekton/registration-server-pull-request.yaml +++ b/.tekton/registration-server-pull-request.yaml @@ -32,6 +32,10 @@ spec: value: - build_type=release - build_target=register-server + - name: hermetic + value: "true" + - name: prefetch-input + value: '[{"type": "gomod", "path": "operator"}, {"type": "cargo", "path": "operator"}, {"type": "generic"}]' pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/.tekton/registration-server-push.yaml b/.tekton/registration-server-push.yaml index 953231f..ca1c9fd 100644 --- a/.tekton/registration-server-push.yaml +++ b/.tekton/registration-server-push.yaml @@ -31,6 +31,10 @@ spec: value: - build_type=release - build_target=register-server + - name: hermetic + value: "true" + - name: prefetch-input + value: '[{"type": "gomod", "path": "operator"}, {"type": "cargo", "path": "operator"}, {"type": "generic"}]' pipelineSpec: description: | This pipeline is ideal for building container images from a Containerfile while maintaining trust after pipeline customization. diff --git a/Containerfile b/Containerfile index c3ac0a7..23fa043 100644 --- a/Containerfile +++ b/Containerfile @@ -24,6 +24,12 @@ RUN /detector.sh ./Containerfile /drift-cache/Containerfile WORKDIR /build COPY operator/Makefile operator/Cargo.toml operator/Cargo.lock operator/go.mod operator/go.sum ./ +# cachi2/hermeto injects the vendored-sources cargo config at operator/.cargo during the +# prefetch step. The build flattens operator/ into /build, so copy the config here too; +# without it, offline (hermetic) `cargo build`/`cargo install` can't resolve the vendored +# crates (incl. the git deps) and the build fails. +COPY operator/.cargo .cargo + COPY operator/api api COPY operator/lib lib @@ -42,6 +48,16 @@ RUN sed -i 's/members = .*/members = ["lib", "operator", "compute-pcrs", "regist sed -i '/\[dev-dependencies\]/,$d' register-server/Cargo.toml && \ sed -i '/trusted-cluster-operator-test-utils/d' lib/Cargo.toml +# controller-gen and kopium are prefetched via cachi2 'generic' (artifacts.lock.yaml) and +# mounted at /cachi2/output/deps/generic. Place them at $(LOCALBIN)=/build/bin with the +# exact `-` names `make crds-rs` expects, so its existence guards skip the +# network curl / go-install / cargo-install (which don't work under hermetic). +RUN mkdir -p bin && \ + cp /cachi2/output/deps/generic/controller-gen-linux-amd64 bin/controller-gen-v0.20.1 && \ + tar -xJf /cachi2/output/deps/generic/kopium-x86_64-unknown-linux-musl.tar.xz -C bin --strip-components=1 && \ + mv bin/kopium bin/kopium-0.23.0 && \ + chmod +x bin/controller-gen-v0.20.1 bin/kopium-0.23.0 + RUN make crds-rs # In debug builds, pre-build dependencies to avoid full rebuild on source changes. @@ -128,10 +144,10 @@ ENTRYPOINT ["/usr/bin/register-server"] FROM builder AS compute-pcrs-data -# Pin reference-values to specific commit for reproducible builds -ARG REFERENCE_VALUES_COMMIT=e296603ca106908258ac59326b001b602ed0f037 -RUN git clone https://github.com/trusted-execution-clusters/reference-values && \ - cd reference-values && git checkout ${REFERENCE_VALUES_COMMIT} && cd .. +# reference-values is vendored as a git submodule (pinned commit), fetched by the Konflux +# git-clone task and copied from the build context. This replaces an in-build `git clone`, +# which cannot run under hermetic (network-isolated) builds. +COPY reference-values reference-values RUN mkdir -p /output/reference-values && \ mv /build/reference-values/efivars /output/reference-values/ && \ mv /build/reference-values/mok-variables /output/reference-values/ diff --git a/Containerfile.bundle b/Containerfile.bundle index 94b1397..06a453c 100644 --- a/Containerfile.bundle +++ b/Containerfile.bundle @@ -22,14 +22,19 @@ ARG YQ_SHA256=99df6047f5b577a9d25f969f7c3823ada3488de2e2115b30a0abb10d9324fd9f ARG OPERATOR_SDK_SHA256=35f759010c05aef7fed9deb31a46a6682aedff7abf8c109331ccd931c966e6c0 RUN dnf -y update && \ - dnf install -y git make golang wget && \ - wget https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/yq_linux_amd64 -O /usr/bin/yq && \ + dnf install -y git make golang && \ + dnf clean all + +# yq and operator-sdk are prefetched via the cachi2 'generic' fetcher (see +# artifacts.lock.yaml) and mounted under /cachi2/output/deps/generic during hermetic +# builds. This replaces the previous in-build `wget` downloads (which cannot run with the +# network isolated). The SHA256 verification is preserved. +RUN cp /cachi2/output/deps/generic/yq_linux_amd64 /usr/bin/yq && \ echo "${YQ_SHA256} /usr/bin/yq" | sha256sum -c - && \ chmod +x /usr/bin/yq && \ - wget https://github.com/operator-framework/operator-sdk/releases/download/${OPERATOR_SDK_VERSION}/operator-sdk_linux_amd64 -O /usr/bin/operator-sdk && \ + cp /cachi2/output/deps/generic/operator-sdk_linux_amd64 /usr/bin/operator-sdk && \ echo "${OPERATOR_SDK_SHA256} /usr/bin/operator-sdk" | sha256sum -c - && \ - chmod +x /usr/bin/operator-sdk && \ - dnf clean all + chmod +x /usr/bin/operator-sdk RUN mkdir -p /workspace/source && \ chown -R 1001:1001 /workspace @@ -42,6 +47,13 @@ WORKDIR /workspace/source # Note: git submodule initialization should be done before the build COPY --chown=1001:1001 . . +# controller-gen is prefetched via cachi2 'generic' (artifacts.lock.yaml) and placed where +# `make -C operator manifests` expects it ($(LOCALBIN)=operator/bin), so it skips the +# network curl / go-install / cargo-install under hermetic (network-isolated) builds. +RUN mkdir -p operator/bin && \ + cp /cachi2/output/deps/generic/controller-gen-linux-amd64 operator/bin/controller-gen-v0.20.1 && \ + chmod +x operator/bin/controller-gen-v0.20.1 + # Note: We use upstream's CSV and metadata templates as-is # All downstream customizations are applied by bundle/customize-bundle.sh after generation # diff --git a/artifacts.lock.yaml b/artifacts.lock.yaml new file mode 100644 index 0000000..556e3e5 --- /dev/null +++ b/artifacts.lock.yaml @@ -0,0 +1,32 @@ +# cachi2 "generic" fetcher lockfile. +# Prefetches build-time binaries not covered by a language package manager, so the builds +# can run hermetically (network-isolated). During the Konflux build these land under +# /cachi2/output/deps/generic/ and are placed where each build expects them. +# +# The operator Makefile normally `curl`s these exact release assets (then falls back to +# go install / cargo install); prefetching them here and pre-placing them lets `make +# crds-rs` / `make manifests` skip all network access. +# +# Versions must track what the Makefile derives dynamically: +# controller-gen -> `go list -m sigs.k8s.io/controller-tools` (go.mod, v0.20.1) +# kopium -> `cargo metadata` kopium (Cargo.lock, 0.23.0) +# yq / operator-sdk -> pinned in Containerfile.bundle (v4.48.1 / v1.38.0) +metadata: + version: "1.0" +artifacts: + # --- Rust/Go build tools for `make crds-rs` (operands) and `make manifests` (bundle) --- + - download_url: https://github.com/kubernetes-sigs/controller-tools/releases/download/v0.20.1/controller-gen-linux-amd64 + checksum: "sha256:55ba0a1f7205cb529b03c09af0ee1d37e0ff30544b13569c0bf7873976af6ef3" + filename: controller-gen-linux-amd64 + # musl (static) build: the gnu build needs GLIBC_2.39, newer than the ubi9 buildroot's + # glibc 2.34; musl is statically linked and runs anywhere. + - download_url: https://github.com/kube-rs/kopium/releases/download/0.23.0/kopium-x86_64-unknown-linux-musl.tar.xz + checksum: "sha256:7882bc8827e630f17862549a9d0479d27d65540014ce7a2d5f31a03a92665c70" + filename: kopium-x86_64-unknown-linux-musl.tar.xz + # --- bundle image tooling --- + - download_url: https://github.com/mikefarah/yq/releases/download/v4.48.1/yq_linux_amd64 + checksum: "sha256:99df6047f5b577a9d25f969f7c3823ada3488de2e2115b30a0abb10d9324fd9f" + filename: yq_linux_amd64 + - download_url: https://github.com/operator-framework/operator-sdk/releases/download/v1.38.0/operator-sdk_linux_amd64 + checksum: "sha256:35f759010c05aef7fed9deb31a46a6682aedff7abf8c109331ccd931c966e6c0" + filename: operator-sdk_linux_amd64 diff --git a/reference-values b/reference-values new file mode 160000 index 0000000..e296603 --- /dev/null +++ b/reference-values @@ -0,0 +1 @@ +Subproject commit e296603ca106908258ac59326b001b602ed0f037