diff --git a/Makefile b/Makefile index e5ee1b6907..c41495a7db 100644 --- a/Makefile +++ b/Makefile @@ -150,6 +150,8 @@ test-clusterclass-e2e: ## Run e2e tests with capi e2e testing framework GINKGO_NOCOLOR ?= false ARTIFACTS ?= $(ROOT_DIR)/_artifacts E2E_CONF_FILE ?= $(ROOT_DIR)/test/e2e/config/e2e_conf.yaml +# E2E_BMCS_CONF_FILE ?= $(ROOT_DIR)/test/e2e/config/bmcs-redfish-virtualmedia.yaml +E2E_BMCS_CONF_FILE ?= $(ROOT_DIR)/test/e2e/config/bmcs.yaml E2E_OUT_DIR ?= $(ROOT_DIR)/test/e2e/_out E2E_CONF_FILE_ENVSUBST ?= $(E2E_OUT_DIR)/$(notdir $(E2E_CONF_FILE)) E2E_CONTAINERS ?= quay.io/metal3-io/cluster-api-provider-metal3 quay.io/metal3-io/baremetal-operator quay.io/metal3-io/ip-address-manager @@ -214,6 +216,7 @@ e2e-tests: $(GINKGO) e2e-substitutions cluster-templates # This target should be --focus="$(GINKGO_FOCUS)" $(_SKIP_ARGS) "$(ROOT_DIR)/$(TEST_DIR)/e2e/" -- \ -e2e.artifacts-folder="$(ARTIFACTS)" \ -e2e.config="$(E2E_CONF_FILE_ENVSUBST)" \ + -e2e.bmcsConfig="$(E2E_BMCS_CONF_FILE)" \ -e2e.skip-resource-cleanup=$(SKIP_CLEANUP) \ -e2e.trigger-ephemeral-test=$(EPHEMERAL_TEST) \ -e2e.use-existing-cluster=$(SKIP_CREATE_MGMT_CLUSTER) diff --git a/hack/e2e/fake-ipa.sh b/hack/e2e/fake-ipa.sh new file mode 100644 index 0000000000..0730f031df --- /dev/null +++ b/hack/e2e/fake-ipa.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +set -euxo pipefail + +launch_fake_ipa() +{ + # Create a folder to host fakeIPA config and certs + mkdir -p "${WORKING_DIR}/fake-ipa" + if [[ "${EPHEMERAL_CLUSTER}" = "kind" ]] && [[ "${IRONIC_TLS_SETUP}" = "true" ]]; then + cp "${IRONIC_CACERT_FILE}" "${WORKING_DIR}/fake-ipa/ironic-ca.crt" + elif [[ "${IRONIC_TLS_SETUP}" = "true" ]]; then + # wait for ironic to be running to ensure ironic-cert is created + kubectl -n baremetal-operator-system wait --for=condition=available deployment/baremetal-operator-ironic --timeout=900s + # Extract ironic-cert to be used inside fakeIPA for TLS + kubectl get secret -n baremetal-operator-system ironic-cert -o json -o=jsonpath="{.data.ca\.crt}" | base64 -d > "${WORKING_DIR}/fake-ipa/ironic-ca.crt" + fi + + # Create fake IPA custom config + cat < "${WORKING_DIR}/fake-ipa/config.py" +FAKE_IPA_API_URL = "https://${CLUSTER_BARE_METAL_PROVISIONER_IP}:${IRONIC_API_PORT}" +FAKE_IPA_INSPECTION_CALLBACK_URL = "${IRONIC_URL}/continue_inspection" +FAKE_IPA_ADVERTISE_ADDRESS_IP = "${EXTERNAL_SUBNET_V4_HOST}" +FAKE_IPA_INSECURE = ${FAKE_IPA_INSECURE:-False} +FAKE_IPA_CAFILE = "${FAKE_IPA_CAFILE:-/root/cert/ironic-ca.crt}" +FAKE_IPA_MIN_BOOT_TIME = ${FAKE_IPA_MIN_BOOT_TIME:-20} +FAKE_IPA_MAX_BOOT_TIME = ${FAKE_IPA_MAX_BOOT_TIME:-30} +EOF + + # shellcheck disable=SC2086 + sudo "${CONTAINER_RUNTIME}" run -d --net host --name fake-ipa ${POD_NAME_INFRA} \ + -v "/opt/metal3-dev-env/fake-ipa":/root/cert -v "/root/.ssh":/root/ssh \ + -e CONFIG='/root/cert/config.py' \ + "${FAKE_IPA_IMAGE}" +} diff --git a/hack/e2e/net.xml b/hack/e2e/net.xml new file mode 100644 index 0000000000..71fdad47e8 --- /dev/null +++ b/hack/e2e/net.xml @@ -0,0 +1,16 @@ + + baremetal-e2e + + + + + + + + + + + + + + diff --git a/hack/ensure-go.sh b/hack/ensure-go.sh index 633db77ec9..af4d1700ae 100755 --- a/hack/ensure-go.sh +++ b/hack/ensure-go.sh @@ -1,49 +1,35 @@ #!/usr/bin/env bash -# Copyright 2021 The Kubernetes Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +set -eux -set -o errexit -set -o nounset -set -o pipefail +MINIMUM_GO_VERSION=go1.22.4 -# Ensure the go tool exists and is a viable version. +# Ensure the go tool exists and is a viable version, or installs it verify_go_version() { - if [[ -z "$(command -v go)" ]]; then - cat << EOF -Can't find 'go' in PATH, please fix and retry. -See http://golang.org/doc/install for installation instructions. -EOF - return 2 + # If go is not available on the path, get it + if ! [ -x "$(command -v go)" ]; then + if [[ "${OSTYPE}" == "linux-gnu" ]]; then + echo 'go not found, installing' + curl -sLo "/tmp/${MINIMUM_GO_VERSION}.linux-amd64.tar.gz" "https://go.dev/dl/${MINIMUM_GO_VERSION}.linux-amd64.tar.gz" + sudo tar -C /usr/local -xzf "/tmp/${MINIMUM_GO_VERSION}.linux-amd64.tar.gz" + export PATH=/usr/local/go/bin:$PATH + else + echo "Missing required binary in path: go" + return 2 + fi fi local go_version IFS=" " read -ra go_version <<< "$(go version)" - local minimum_go_version - minimum_go_version=go1.20 - if [[ "${minimum_go_version}" != $(echo -e "${minimum_go_version}\n${go_version[2]}" | sort -s -t. -k 1,1 -k 2,2n -k 3,3n | head -n1) ]] && [[ "${go_version[2]}" != "devel" ]]; then + if [[ "${MINIMUM_GO_VERSION}" != $(echo -e "${MINIMUM_GO_VERSION}\n${go_version[2]}" | sort -s -t. -k 1,1 -k 2,2n -k 3,3n | head -n1) ]] && [[ "${go_version[2]}" != "devel" ]]; then cat << EOF -Detected go version: ${go_version[*]}. -Kubernetes requires ${minimum_go_version} or greater. -Please install ${minimum_go_version} or later. +Detected go version: ${go_version[2]}. +Requires ${MINIMUM_GO_VERSION} or greater. +Please install ${MINIMUM_GO_VERSION} or later. EOF return 2 fi } verify_go_version - -# Explicitly opt into go modules, even though we're inside a GOPATH directory -export GO111MODULE=on diff --git a/hack/ensure_kubectl.sh b/hack/ensure_kubectl.sh new file mode 100755 index 0000000000..598b2f6a46 --- /dev/null +++ b/hack/ensure_kubectl.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env bash + +# Copyright 2021 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eux + +USR_LOCAL_BIN="/usr/local/bin" +MINIMUM_KUBECTL_VERSION=v1.32.0 + +# Ensure the kubectl tool exists and is a viable version, or installs it +verify_kubectl_version() +{ + # If kubectl is not available on the path, get it + if ! [ -x "$(command -v kubectl)" ]; then + if [[ "${OSTYPE}" == "linux-gnu" ]]; then + echo "kubectl not found, installing" + curl -LO "https://dl.k8s.io/release/${MINIMUM_KUBECTL_VERSION}/bin/linux/amd64/kubectl" + sudo install kubectl "${USR_LOCAL_BIN}/kubectl" + else + echo "Missing required binary in path: kubectl" + return 2 + fi + fi + + local kubectl_version + IFS=" " read -ra kubectl_version <<< "$(kubectl version --client)" + if [[ "${MINIMUM_KUBECTL_VERSION}" != $(echo -e "${MINIMUM_KUBECTL_VERSION}\n${kubectl_version[2]}" | sort -s -t. -k 1,1 -k 2,2n -k 3,3n | head -n1) ]]; then + cat << EOF +Detected kubectl version: ${kubectl_version[2]}. +Requires ${MINIMUM_KUBECTL_VERSION} or greater. +Please install ${MINIMUM_KUBECTL_VERSION} or later. +EOF + return 2 + fi +} + +verify_kubectl_version diff --git a/hack/ensure_minikube.sh b/hack/ensure_minikube.sh new file mode 100755 index 0000000000..c4c48f9938 --- /dev/null +++ b/hack/ensure_minikube.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +set -eux + +USR_LOCAL_BIN="/usr/local/bin" +OS=$(go env GOOS) +ARCH=$(go env GOARCH) +MINIMUM_MINIKUBE_VERSION=v1.33.0 + +verify_minikube_version() { + if ! [ -x "$(command -v minikube)" ]; then + if [[ "${OSTYPE}" == "linux-gnu" ]]; then + echo "minikube not found, installing" + curl -LO "https://storage.googleapis.com/minikube/releases/${MINIMUM_MINIKUBE_VERSION}/minikube-${OS}-${ARCH}" + sudo install minikube-linux-amd64 "${USR_LOCAL_BIN}/minikube" + else + echo "Missing required binary in path: minikube" + return 2 + fi + fi + local minikube_version + minikube_version="$(minikube version --short)" + if [[ "${MINIMUM_MINIKUBE_VERSION}" != $(echo -e "${MINIMUM_MINIKUBE_VERSION}\n${minikube_version}" | sort -V | head -n1) ]]; then + cat << EOF +Detected minikube version: ${minikube_version}. +Requires ${MINIMUM_MINIKUBE_VERSION} or greater. +Please install ${MINIMUM_MINIKUBE_VERSION} or later. +EOF + return 2 + fi +} + +verify_minikube_version diff --git a/hack/ensure_yq.sh b/hack/ensure_yq.sh new file mode 100755 index 0000000000..c4463f3706 --- /dev/null +++ b/hack/ensure_yq.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -eux + +USR_LOCAL_BIN="/usr/local/bin" +YQ_VERSION="v4.40.5" + +# Check if yq tool is installed and install it if not +verify_yq() +{ + if ! [[ -x "$(command -v yq)" ]]; then + if [[ "${OSTYPE}" == "linux-gnu" ]]; then + echo "yq not found, installing" + curl -LO "https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/yq_linux_amd64.tar.gz" + tar xvf yq_linux_amd64.tar.gz + sudo install yq_linux_amd64 "${USR_LOCAL_BIN}/yq" + else + echo "Missing required binary in path: yq" + return 2 + fi + fi +} + +verify_yq diff --git a/scripts/ci-e2e.sh b/scripts/ci-e2e.sh index 211ffa0e33..c80c755e1b 100755 --- a/scripts/ci-e2e.sh +++ b/scripts/ci-e2e.sh @@ -3,21 +3,37 @@ set -euxo pipefail REPO_ROOT=$(realpath "$(dirname "$(realpath "${BASH_SOURCE[0]}")")"/..) -cd "${REPO_ROOT}" +cd "${REPO_ROOT}" || exit 1 export CAPM3PATH="${REPO_ROOT}" -export WORKING_DIR=/opt/metal3-dev-env +export WORKING_DIR=/tmp/metal3-dev-env FORCE_REPO_UPDATE="${FORCE_REPO_UPDATE:-false}" export CAPM3RELEASEBRANCH="${CAPM3RELEASEBRANCH:-main}" +# Verify they are available and have correct versions. +PATH=$PATH:/usr/local/go/bin +PATH=$PATH:$(go env GOPATH)/bin + +"${REPO_ROOT}/hack/ensure-go.sh" +# shellcheck source=./hack/ensure-kind.sh +source "${REPO_ROOT}/hack/ensure-kind.sh" +# shellcheck source=./hack/ensure-kubectl.sh +source "${REPO_ROOT}/hack/ensure_kubectl.sh" +# shellcheck source=./hack/e2e/fake-ipa.sh +source "${REPO_ROOT}/hack/e2e/fake-ipa.sh" + +"${REPO_ROOT}/hack/ensure_minikube.sh" +"${REPO_ROOT}/hack/ensure_yq.sh" +# Ensure kustomize +make kustomize + # Extract release version from release-branch name +export CAPM3RELEASE="v1.10.99" +export CAPI_RELEASE_PREFIX="v1.9." if [[ "${CAPM3RELEASEBRANCH}" == release-* ]]; then CAPM3_RELEASE_PREFIX="${CAPM3RELEASEBRANCH#release-}" export CAPM3RELEASE="v${CAPM3_RELEASE_PREFIX}.99" export CAPI_RELEASE_PREFIX="v${CAPM3_RELEASE_PREFIX}." -else - export CAPM3RELEASE="v1.10.99" - export CAPI_RELEASE_PREFIX="v1.9." fi # Default CAPI_CONFIG_FOLDER to $HOME/.config folder if XDG_CONFIG_HOME not set @@ -27,72 +43,65 @@ export CAPI_CONFIG_FOLDER="${CONFIG_FOLDER}/cluster-api" # shellcheck source=./scripts/environment.sh source "${REPO_ROOT}/scripts/environment.sh" -# Clone dev-env repo -sudo mkdir -p ${WORKING_DIR} -sudo chown "${USER}":"${USER}" ${WORKING_DIR} -M3_DEV_ENV_REPO="https://github.com/metal3-io/metal3-dev-env.git" -M3_DEV_ENV_BRANCH=main -M3_DEV_ENV_PATH="${M3_DEV_ENV_PATH:-${WORKING_DIR}/metal3-dev-env}" -clone_repo "${M3_DEV_ENV_REPO}" "${M3_DEV_ENV_BRANCH}" "${M3_DEV_ENV_PATH}" - -# Config devenv -cat <<-EOF >"${M3_DEV_ENV_PATH}/config_${USER}.sh" -export CAPI_VERSION=${CAPI_VERSION:-"v1beta1"} -export CAPM3_VERSION=${CAPM3_VERSION:-"v1beta1"} -export NUM_NODES=${NUM_NODES:-"4"} -export KUBERNETES_VERSION=${KUBERNETES_VERSION} -export IMAGE_OS=${IMAGE_OS} -export FORCE_REPO_UPDATE="false" -export USE_IRSO="${USE_IRSO:-false}" -EOF -# if running a scalability test skip apply bmhs in dev-env and run fakeIPA -if [[ ${GINKGO_FOCUS:-} == "clusterctl-upgrade" ]]; then - echo 'export SKIP_APPLY_BMH="true"' >>"${M3_DEV_ENV_PATH}/config_${USER}.sh" -fi -if [[ ${GINKGO_FOCUS:-} == "features" ]]; then - mkdir -p "$CAPI_CONFIG_FOLDER" - echo "ENABLE_BMH_NAME_BASED_PREALLOCATION: true" >"$CAPI_CONFIG_FOLDER/clusterctl.yaml" +# Clone BMO repo and install vbmctl +if ! command -v vbmctl >/dev/null 2>&1; then + clone_repo "https://github.com/metal3-io/baremetal-operator.git" "main" "${WORKING_DIR}/baremetal-operator" + pushd "${WORKING_DIR}/baremetal-operator/test/vbmctl/" + go build -tags=e2e,integration -o vbmctl ./main.go + sudo install vbmctl /usr/local/bin/vbmctl + popd fi -# if running a scalability tests, configure dev-env with fakeIPA -if [[ ${GINKGO_FOCUS:-} == "scalability" ]]; then - export NUM_NODES="${NUM_NODES:-100}" - echo 'export NODES_PLATFORM="fake"' >>"${M3_DEV_ENV_PATH}/config_${USER}.sh" - echo 'export SKIP_APPLY_BMH="true"' >>"${M3_DEV_ENV_PATH}/config_${USER}.sh" - sed -i "s/^export NUM_NODES=.*/export NUM_NODES=${NUM_NODES:-100}/" "${M3_DEV_ENV_PATH}/config_${USER}.sh" - mkdir -p "$CAPI_CONFIG_FOLDER" - echo 'CLUSTER_TOPOLOGY: true' >"$CAPI_CONFIG_FOLDER/clusterctl.yaml" - echo 'export EPHEMERAL_CLUSTER="minikube"' >>"${M3_DEV_ENV_PATH}/config_${USER}.sh" -else - # Don't run scalability tests if not asked for. - export GINKGO_SKIP="${GINKGO_SKIP:-} scalability" -fi -# Run make devenv to boot the source cluster -pushd "${M3_DEV_ENV_PATH}" || exit 1 -make -popd || exit 1 -# Binaries checked below should have been installed by metal3-dev-env make. -# Verify they are available and have correct versions. -PATH=$PATH:/usr/local/go/bin -PATH=$PATH:$(go env GOPATH)/bin - -# shellcheck source=./hack/ensure-go.sh -source "${REPO_ROOT}/hack/ensure-go.sh" -# shellcheck source=./hack/ensure-kind.sh -source "${REPO_ROOT}/hack/ensure-kind.sh" -# shellcheck source=./hack/ensure-kubectl.sh -source "${REPO_ROOT}/hack/ensure-kubectl.sh" -# Ensure kustomize -make kustomize - -# shellcheck disable=SC1091,SC1090 -source "${M3_DEV_ENV_PATH}/lib/images.sh" -# shellcheck disable=SC1091,SC1090 -source "${M3_DEV_ENV_PATH}/lib/releases.sh" -# shellcheck disable=SC1091,SC1090 -source "${M3_DEV_ENV_PATH}/lib/ironic_basic_auth.sh" -# shellcheck disable=SC1091,SC1090 -source "${M3_DEV_ENV_PATH}/lib/ironic_tls_setup.sh" +# Set up minikube +minikube start --driver=kvm2 + +virsh -c qemu:///system net-define "${REPO_ROOT}/hack/e2e/net.xml" +virsh -c qemu:///system net-start baremetal-e2e +# Attach baremetal-e2e interface to minikube with specific mac. +# This will give minikube a known reserved IP address that we can use for Ironic +virsh -c qemu:///system attach-interface --domain minikube --mac="52:54:00:6c:3c:01" \ + --model virtio --source baremetal-e2e --type network --config + +# Restart minikube to apply the changes +minikube stop +## Following loop is to avoid minikube restart issue +## https://github.com/kubernetes/minikube/issues/14456 +while ! minikube start; do sleep 30; done + +E2E_BMCS_CONF_FILE="${REPO_ROOT}/test/e2e/config/bmcs.yaml" +vbmctl --yaml-source-file "${E2E_BMCS_CONF_FILE}" + +# This IP is defined by the network above, and is used consistently in all of +# our e2e overlays +export IRONIC_PROVISIONING_IP="192.168.222.199" + +# Start VBMC +docker run --name vbmc --network host -d \ + -v /var/run/libvirt/libvirt-sock:/var/run/libvirt/libvirt-sock \ + -v /var/run/libvirt/libvirt-sock-ro:/var/run/libvirt/libvirt-sock-ro \ + quay.io/metal3-io/vbmc + +# Sushy-tools variables +SUSHY_EMULATOR_FILE="${REPO_ROOT}"/test/e2e/data/sushy-tools/sushy-emulator.conf +# Start sushy-tools +docker run --name sushy-tools -d --network host \ + -v "${SUSHY_EMULATOR_FILE}":/etc/sushy/sushy-emulator.conf:Z \ + -v /var/run/libvirt:/var/run/libvirt:Z \ + -e SUSHY_EMULATOR_CONFIG=/etc/sushy/sushy-emulator.conf \ + quay.io/metal3-io/sushy-tools:latest sushy-emulator + +# Add ipmi nodes to vbmc +readarray -t BMCS < <(yq e -o=j -I=0 '.[]' "${E2E_BMCS_CONF_FILE}") +for bmc in "${BMCS[@]}"; do + address=$(echo "${bmc}" | jq -r '.address') + if [[ "${address}" != ipmi:* ]]; then + continue + fi + hostName=$(echo "${bmc}" | jq -r '.hostName') + vbmc_port="${address##*:}" + docker exec vbmc vbmc add "${hostName}" --port "${vbmc_port}" --libvirt-uri "qemu:///system" + docker exec vbmc vbmc start "${hostName}" +done # Generate credentials BMO_OVERLAYS=( @@ -115,7 +124,7 @@ if [[ "${IRONIC_BASIC_AUTH}" == "true" ]]; then # If usernames and passwords are unset, read them from file or generate them if [[ -z "${IRONIC_USERNAME:-}" ]]; then if [[ ! -f "${IRONIC_AUTH_DIR}/ironic-username" ]]; then - IRONIC_USERNAME="$(uuid-gen)" + IRONIC_USERNAME="$(uuidgen)" echo "${IRONIC_USERNAME}" > "${IRONIC_AUTH_DIR}/ironic-username" else IRONIC_USERNAME="$(cat "${IRONIC_AUTH_DIR}/ironic-username")" @@ -123,7 +132,7 @@ if [[ "${IRONIC_BASIC_AUTH}" == "true" ]]; then fi if [[ -z "${IRONIC_PASSWORD:-}" ]]; then if [ ! -f "${IRONIC_AUTH_DIR}/ironic-password" ]; then - IRONIC_PASSWORD="$(uuid-gen)" + IRONIC_PASSWORD="$(uuidgen)" echo "${IRONIC_PASSWORD}" > "${IRONIC_AUTH_DIR}/ironic-password" else IRONIC_PASSWORD="$(cat "${IRONIC_AUTH_DIR}/ironic-password")" diff --git a/scripts/clean-e2e.sh b/scripts/clean-e2e.sh new file mode 100755 index 0000000000..635e1cd201 --- /dev/null +++ b/scripts/clean-e2e.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +REPO_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. +cd "${REPO_ROOT}" || exit 1 + +minikube delete +docker rm -f vbmc +docker rm -f image-server-e2e +docker rm -f sushy-tools + +"${REPO_ROOT}/test/e2e/data/clean_local_bmh_test_setup.sh" "^node-" + +rm -rf "${REPO_ROOT}/test/e2e/_artifacts" +rm -rf "${REPO_ROOT}"/artifacts-* +rm -rf "${REPO_ROOT}/test/e2e/images" + +# Clear network +virsh -c qemu:///system net-destroy baremetal-e2e +virsh -c qemu:///system net-undefine baremetal-e2e + +# Clean volume pool directory +rm -rf /tmp/pool_oo/* + +# Clean volume pool +virsh pool-destroy default || true +virsh pool-delete default || true +virsh pool-undefine default || true diff --git a/test/e2e/bmc.go b/test/e2e/bmc.go new file mode 100644 index 0000000000..6d67ad350c --- /dev/null +++ b/test/e2e/bmc.go @@ -0,0 +1,40 @@ +package e2e + +import ( + "os" + + "gopkg.in/yaml.v2" +) + +// BMC defines a BMH to use in the tests. +type BMC struct { + // BMC initial username + User string `yaml:"user,omitempty"` + // BMC initial password + Password string `yaml:"password,omitempty"` + // BMC initial address + Address string `yaml:"address,omitempty"` + // BMC Mac address + BootMacAddress string `yaml:"bootMacAddress,omitempty"` + // The Hostname of the node, which will be read into BMH object + HostName string `yaml:"hostName,omitempty"` + // The IP address of the node + // Optional. Only needed if e2eConfig variable + // SSH_CHECK_PROVISIONED is true + IPAddress string `yaml:"ipAddress,omitempty"` + // Optional. Only needed if e2eConfig variable + // SSH_CHECK_PROVISIONED is true + SSHPort string `yaml:"sshPort,omitempty"` +} + +func LoadBMCConfig(configPath string) (*[]BMC, error) { + configData, err := os.ReadFile(configPath) //#nosec + var bmcs []BMC + if err != nil { + return nil, err + } + if err := yaml.Unmarshal(configData, &bmcs); err != nil { + return nil, err + } + return &bmcs, nil +} diff --git a/test/e2e/cert_manager.go b/test/e2e/cert_manager.go new file mode 100644 index 0000000000..b31f268608 --- /dev/null +++ b/test/e2e/cert_manager.go @@ -0,0 +1,89 @@ +package e2e + +import ( + "context" + "fmt" + "io" + "net/http" + + cmapi "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1" + cmmeta "github.com/cert-manager/cert-manager/pkg/apis/meta/v1" + "github.com/pkg/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/cluster-api/test/framework" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +func checkCertManagerAPI(clusterProxy framework.ClusterProxy) error { + certManagerAPIVersion := "cert-manager.io/v1" + clientset := clusterProxy.GetClientSet() + _, err := clientset.Discovery().ServerResourcesForGroupVersion(certManagerAPIVersion) + return err +} + +func installCertManager(ctx context.Context, clusterProxy framework.ClusterProxy, cmVersion string) error { + response, err := http.Get(fmt.Sprintf("https://github.com/cert-manager/cert-manager/releases/download/%s/cert-manager.yaml", cmVersion)) //nolint: noctx + if err != nil { + return errors.Wrapf(err, "Error downloading cert-manager manifest") + } + defer response.Body.Close() + manifests, err := io.ReadAll(response.Body) + if err != nil { + return errors.Wrapf(err, "Error reading downloaded cert-manager manifest") + } + err = clusterProxy.CreateOrUpdate(ctx, manifests) + if err != nil { + return errors.Wrapf(err, "Error installing cert-manager from downloaded manifest") + } + return nil +} + +// checkCertManagerWebhook attempts to perform a dry-run create of a cert-manager +// Issuer and Certificate resources in order to verify that CRDs are installed and all the +// required webhooks are reachable by the K8S API server. +func checkCertManagerWebhook(ctx context.Context, clusterProxy framework.ClusterProxy) error { + scheme := clusterProxy.GetScheme() + const ns = "cert-manager" + err := cmapi.AddToScheme(scheme) + if err != nil { + return err + } + + cl, err := client.New(clusterProxy.GetRESTConfig(), client.Options{ + Scheme: scheme, + }) + if err != nil { + return err + } + c := client.NewNamespacedClient(client.NewDryRunClient(cl), ns) + issuer := &cmapi.Issuer{ + ObjectMeta: metav1.ObjectMeta{ + Name: "cmapichecker", + }, + Spec: cmapi.IssuerSpec{ + IssuerConfig: cmapi.IssuerConfig{ + SelfSigned: &cmapi.SelfSignedIssuer{}, + }, + }, + } + if err = c.Create(ctx, issuer); err != nil { + return errors.Wrapf(err, "cert-manager webhook not ready") + } + cert := &cmapi.Certificate{ + ObjectMeta: metav1.ObjectMeta{ + Name: "cmapichecker", + }, + Spec: cmapi.CertificateSpec{ + DNSNames: []string{"cmapichecker.example"}, + SecretName: "cmapichecker", + IssuerRef: cmmeta.ObjectReference{ + Name: "cmapichecker", + }, + }, + } + + if err = c.Create(ctx, cert); err != nil { + return errors.Wrapf(err, "cert-manager webhook not ready") + } + return nil +} diff --git a/test/e2e/common.go b/test/e2e/common.go index fa036fe20f..ff00947550 100644 --- a/test/e2e/common.go +++ b/test/e2e/common.go @@ -19,6 +19,7 @@ import ( "time" "github.com/blang/semver" + metal3api "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1" bmov1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1" infrav1 "github.com/metal3-io/cluster-api-provider-metal3/api/v1beta1" ipamv1 "github.com/metal3-io/ip-address-manager/api/v1alpha1" @@ -1061,3 +1062,53 @@ func CreateTargetCluster(ctx context.Context, inputGetter func() CreateTargetClu }, input.E2EConfig.GetIntervals(input.SpecName, "wait-all-pod-to-be-running-on-target-cluster")...) return targetCluster, &result } + +func CreateSecret(ctx context.Context, client client.Client, secretNamespace, secretName string, data map[string]string) { + secret := corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: secretName, + Namespace: secretNamespace, + }, + StringData: data, + } + + Expect(client.Create(ctx, &secret)).NotTo(HaveOccurred(), fmt.Sprintf("Failed to create secret '%s/%s'", secretNamespace, secretName)) +} + +type WaitForBmhInProvisioningStateInput struct { + Client client.Client + Bmh metal3api.BareMetalHost + State metal3api.ProvisioningState + UndesiredStates []metal3api.ProvisioningState +} + +func WaitForBmhInProvisioningState(ctx context.Context, input WaitForBmhInProvisioningStateInput, intervals ...interface{}) { + Eventually(func(g Gomega) { + bmh := metal3api.BareMetalHost{} + key := types.NamespacedName{Namespace: input.Bmh.Namespace, Name: input.Bmh.Name} + g.Expect(input.Client.Get(ctx, key, &bmh)).To(Succeed()) + + currentStatus := bmh.Status.Provisioning.State + + // Check if the current state matches any of the undesired states + if isUndesiredState(currentStatus, input.UndesiredStates) { + StopTrying(fmt.Sprintf("BMH is in an unexpected state: %s", currentStatus)).Now() + } + + g.Expect(currentStatus).To(Equal(input.State)) + }, intervals...).Should(Succeed()) +} + +func isUndesiredState(currentState metal3api.ProvisioningState, undesiredStates []metal3api.ProvisioningState) bool { + if undesiredStates == nil { + return false + } + + for _, state := range undesiredStates { + if (state == "" && currentState == "") || currentState == state { + return true + } + } + return false +} + diff --git a/test/e2e/config/bmcs.yaml b/test/e2e/config/bmcs.yaml new file mode 100644 index 0000000000..488e840f8b --- /dev/null +++ b/test/e2e/config/bmcs.yaml @@ -0,0 +1,28 @@ +- user: admin + password: password + address: "ipmi://192.168.222.1:16230" + bootMacAddress: "00:60:2f:31:81:01" + hostName: "node-0" + ipAddress: "192.168.222.122" + sshPort: "22" +- user: admin + password: password + address: "ipmi://192.168.222.1:16231" + bootMacAddress: "00:60:2f:31:81:02" + hostName: "node-1" + ipAddress: "192.168.222.123" + sshPort: "22" +- user: admin + password: password + address: "redfish-virtualmedia+http://192.168.222.1:8000/redfish/v1/Systems/node-3" + bootMacAddress: "00:60:2f:31:81:03" + hostName: "node-3" + ipAddress: "192.168.222.124" + sshPort: "22" +- user: admin + password: password + address: "redfish+http://192.168.222.1:8000/redfish/v1/Systems/node-4" + bootMacAddress: "00:60:2f:31:81:04" + hostName: "node-4" + ipAddress: "192.168.222.125" + sshPort: "22" diff --git a/test/e2e/config/e2e_conf.yaml b/test/e2e/config/e2e_conf.yaml index 7b63b75f0e..bede05bf4c 100644 --- a/test/e2e/config/e2e_conf.yaml +++ b/test/e2e/config/e2e_conf.yaml @@ -300,6 +300,7 @@ variables: BMO_RELEASE_0.9: "data/bmo-deployment/overlays/release-0.9" BMO_RELEASE_LATEST: "data/bmo-deployment/overlays/release-latest" FKAS_RELEASE_LATEST: "data/fkas" + CERT_MANAGER_VERSION: "v1.13.1" intervals: default/wait-controllers: ["10m", "10s"] @@ -313,6 +314,7 @@ intervals: default/wait-nodes-ready: ["15m", "5s"] default/monitor-vm-state: ["1m", "500ms"] default/monitor-provisioning: ["5m", "500ms"] + default/wait-available: ["20m", "1s"] default/wait-deployment: ["30m", "10s"] default/wait-job: ["10m", "10s"] default/wait-service: ["10m", "10s"] diff --git a/test/e2e/data/bmo-deployment/overlays/release-latest/ironic.env b/test/e2e/data/bmo-deployment/overlays/release-latest/ironic.env index 44eb437876..0187ae15e4 100644 --- a/test/e2e/data/bmo-deployment/overlays/release-latest/ironic.env +++ b/test/e2e/data/bmo-deployment/overlays/release-latest/ironic.env @@ -1,4 +1,3 @@ -DEPLOY_KERNEL_URL=http://172.22.0.2:6180/images/ironic-python-agent.kernel -DEPLOY_RAMDISK_URL=http://172.22.0.2:6180/images/ironic-python-agent.initramfs -IRONIC_ENDPOINT=https://172.22.0.2:6385/v1/ -IRONIC_INSPECTOR_ENDPOINT=https://172.22.0.2:5050/v1/ +DEPLOY_KERNEL_URL=http://192.168.222.199:6180/images/ironic-python-agent.kernel +DEPLOY_RAMDISK_URL=http://192.168.222.199:6180/images/ironic-python-agent.initramfs +IRONIC_ENDPOINT=https://192.168.222.199:6385/v1/ diff --git a/test/e2e/data/clean_local_bmh_test_setup.sh b/test/e2e/data/clean_local_bmh_test_setup.sh new file mode 100755 index 0000000000..984f5597ef --- /dev/null +++ b/test/e2e/data/clean_local_bmh_test_setup.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +set -ux + +BMH_NAME_REGEX="${1:-^bmh-test-}" +# Get a list of all virtual machines +VM_LIST=$(virsh -c qemu:///system list --all --name | grep "${BMH_NAME_REGEX}") + +if [[ -n "${VM_LIST}" ]]; then + # Loop through the list and delete each virtual machine + for vm_name in ${VM_LIST}; do + virsh -c qemu:///system destroy --domain "${vm_name}" + virsh -c qemu:///system undefine --domain "${vm_name}" --remove-all-storage --nvram + kubectl delete baremetalhost "${vm_name}" + done +else + echo "No virtual machines found. Skipping..." +fi + +# Clear vbmc +docker rm -f vbmc + +# Clear network +virsh -c qemu:///system net-destroy baremetal-e2e +virsh -c qemu:///system net-undefine baremetal-e2e + +# Cleanup VM and volume qcow2 +rm -rf /tmp/bmo-e2e-*.qcow2 +rm -rf /tmp/pool_oo/bmo-e2e-*.qcow2 diff --git a/test/e2e/data/infrastructure-metal3/bases/cluster-with-topology/cluster-with-topology.yaml b/test/e2e/data/infrastructure-metal3/bases/cluster-with-topology/cluster-with-topology.yaml index 74d3a5066a..a14565dd45 100644 --- a/test/e2e/data/infrastructure-metal3/bases/cluster-with-topology/cluster-with-topology.yaml +++ b/test/e2e/data/infrastructure-metal3/bases/cluster-with-topology/cluster-with-topology.yaml @@ -96,7 +96,7 @@ spec: ipv4: - id: baremetalv4 ipAddressFromIPPool: ${CLUSTER_NAME}-baremetalv4-pool - link: enp2s0 + link: enp1s0 routes: - gateway: fromIPPool: ${CLUSTER_NAME}-baremetalv4-pool diff --git a/test/e2e/data/infrastructure-metal3/bases/cluster/cluster-with-kcp.yaml b/test/e2e/data/infrastructure-metal3/bases/cluster/cluster-with-kcp.yaml index 50fb65f226..063b1ea360 100644 --- a/test/e2e/data/infrastructure-metal3/bases/cluster/cluster-with-kcp.yaml +++ b/test/e2e/data/infrastructure-metal3/bases/cluster/cluster-with-kcp.yaml @@ -108,7 +108,7 @@ spec: ipv4: - id: baremetalv4 ipAddressFromIPPool: baremetalv4-pool - link: enp2s0 + link: enp210 routes: - gateway: fromIPPool: baremetalv4-pool diff --git a/test/e2e/data/infrastructure-metal3/bases/clusterclass-cluster/cluster-with-kcp.yaml b/test/e2e/data/infrastructure-metal3/bases/clusterclass-cluster/cluster-with-kcp.yaml index 620ffef6a3..cfc5aa272d 100644 --- a/test/e2e/data/infrastructure-metal3/bases/clusterclass-cluster/cluster-with-kcp.yaml +++ b/test/e2e/data/infrastructure-metal3/bases/clusterclass-cluster/cluster-with-kcp.yaml @@ -69,7 +69,7 @@ spec: ipv4: - id: baremetalv4 ipAddressFromIPPool: baremetalv4-pool - link: enp2s0 + link: enp1s0 routes: - gateway: fromIPPool: baremetalv4-pool diff --git a/test/e2e/data/infrastructure-metal3/bases/clusterclass-cluster/md.yaml b/test/e2e/data/infrastructure-metal3/bases/clusterclass-cluster/md.yaml index be01049aba..ee2dd0b9dd 100644 --- a/test/e2e/data/infrastructure-metal3/bases/clusterclass-cluster/md.yaml +++ b/test/e2e/data/infrastructure-metal3/bases/clusterclass-cluster/md.yaml @@ -50,7 +50,7 @@ spec: ipv4: - id: baremetalv4 ipAddressFromIPPool: baremetalv4-pool - link: enp2s0 + link: enp1s0 routes: - gateway: fromIPPool: baremetalv4-pool diff --git a/test/e2e/data/infrastructure-metal3/bases/clusterclass-ubuntu-kubeadm-config/clusterclass-ubuntu-kubeadm-config.yaml b/test/e2e/data/infrastructure-metal3/bases/clusterclass-ubuntu-kubeadm-config/clusterclass-ubuntu-kubeadm-config.yaml index dfadf31855..a51d65b286 100644 --- a/test/e2e/data/infrastructure-metal3/bases/clusterclass-ubuntu-kubeadm-config/clusterclass-ubuntu-kubeadm-config.yaml +++ b/test/e2e/data/infrastructure-metal3/bases/clusterclass-ubuntu-kubeadm-config/clusterclass-ubuntu-kubeadm-config.yaml @@ -62,7 +62,7 @@ spec: } vrrp_instance VI_2 { state MASTER - interface enp2s0 + interface enp1s0 virtual_router_id 2 priority 101 advert_int 1 diff --git a/test/e2e/data/infrastructure-metal3/bases/ubuntu-kubeadm-config/ubuntu-kubeadm-config.yaml b/test/e2e/data/infrastructure-metal3/bases/ubuntu-kubeadm-config/ubuntu-kubeadm-config.yaml index b6572fa93d..f3f823122c 100644 --- a/test/e2e/data/infrastructure-metal3/bases/ubuntu-kubeadm-config/ubuntu-kubeadm-config.yaml +++ b/test/e2e/data/infrastructure-metal3/bases/ubuntu-kubeadm-config/ubuntu-kubeadm-config.yaml @@ -54,7 +54,7 @@ spec: } vrrp_instance VI_2 { state MASTER - interface enp2s0 + interface enp1s0 virtual_router_id 2 priority 101 advert_int 1 diff --git a/test/e2e/data/ironic-deployment/overlays/release-latest/ironic-patch.yaml b/test/e2e/data/ironic-deployment/overlays/release-latest/ironic-patch.yaml new file mode 100644 index 0000000000..6e378383e6 --- /dev/null +++ b/test/e2e/data/ironic-deployment/overlays/release-latest/ironic-patch.yaml @@ -0,0 +1,10 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ironic +spec: + template: + spec: + containers: + - name: ironic-dnsmasq + $patch: delete diff --git a/test/e2e/data/ironic-deployment/overlays/release-latest/ironic_bmo_configmap.env b/test/e2e/data/ironic-deployment/overlays/release-latest/ironic_bmo_configmap.env index 7dcaa3fb24..234e3ed249 100644 --- a/test/e2e/data/ironic-deployment/overlays/release-latest/ironic_bmo_configmap.env +++ b/test/e2e/data/ironic-deployment/overlays/release-latest/ironic_bmo_configmap.env @@ -1,11 +1,9 @@ HTTP_PORT=6180 -PROVISIONING_IP=172.22.0.2 -CACHEURL=http://172.22.0.2/images IRONIC_FAST_TRACK=true +PROVISIONING_IP=192.168.222.199 +CACHEURL=http://192.168.222.199/images IRONIC_KERNEL_PARAMS=console=ttyS0 IRONIC_INSPECTOR_VLAN_INTERFACES=all PROVISIONING_INTERFACE=ironicendpoint -DHCP_RANGE=172.22.0.10,172.22.0.100 -DEPLOY_KERNEL_URL=http://172.22.0.2:6180/images/ironic-python-agent.kernel -DEPLOY_RAMDISK_URL=http://172.22.0.2:6180/images/ironic-python-agent.initramfs -IRONIC_ENDPOINT=http://172.22.0.2:6385/v1/ +USE_IRONIC_INSPECTOR=false +DISABLE_DEEP_IMAGE_INSPECTION=true diff --git a/test/e2e/data/ironic-deployment/overlays/release-latest/kustomization.yaml b/test/e2e/data/ironic-deployment/overlays/release-latest/kustomization.yaml index 243c02f908..5f01c8741a 100644 --- a/test/e2e/data/ironic-deployment/overlays/release-latest/kustomization.yaml +++ b/test/e2e/data/ironic-deployment/overlays/release-latest/kustomization.yaml @@ -17,21 +17,21 @@ configMapGenerator: behavior: create patches: -- path: keepalived_patch.yaml +- path: ironic-patch.yaml +# TODO(lentzi90): Remove once issue resolved: +# https://github.com/metal3-io/baremetal-operator/issues/2110 images: - name: quay.io/metal3-io/ironic - newTag: latest + newTag: release-26.0 # NOTE: These credentials are generated automatically in hack/ci-e2e.sh secretGenerator: - name: ironic-htpasswd behavior: create - envs: - - ironic-htpasswd -- name: ironic-auth-config files: - - auth-config=ironic-auth-config + - htpasswd=ironic-htpasswd + type: Opaque replacements: # Replace IRONIC_HOST_IP in certificates with the PROVISIONING_IP from the configmap @@ -44,5 +44,6 @@ replacements: version: v1 group: cert-manager.io kind: Certificate + name: fieldPaths: - .spec.ipAddresses.0 diff --git a/test/e2e/data/sushy-tools/sushy-emulator.conf b/test/e2e/data/sushy-tools/sushy-emulator.conf new file mode 100644 index 0000000000..8921d438fe --- /dev/null +++ b/test/e2e/data/sushy-tools/sushy-emulator.conf @@ -0,0 +1,36 @@ +# Listen on the local IP address 192.168.222.1 +SUSHY_EMULATOR_LISTEN_IP = u'192.168.222.1' + +# Bind to TCP port 8000 +SUSHY_EMULATOR_LISTEN_PORT = 8000 + +# Serve this SSL certificate to the clients +SUSHY_EMULATOR_SSL_CERT = None + +# If SSL certificate is being served, this is its RSA private key +SUSHY_EMULATOR_SSL_KEY = None + +# The OpenStack cloud ID to use. This option enables OpenStack driver. +SUSHY_EMULATOR_OS_CLOUD = None +# The libvirt URI to use. This option enables libvirt driver. +SUSHY_EMULATOR_LIBVIRT_URI = u'qemu:///system' + +# Instruct the libvirt driver to ignore any instructions to +# set the boot device. Allowing the UEFI firmware to instead +# rely on the EFI Boot Manager +# Note: This sets the legacy boot element to dev="fd" +# and relies on the floppy not existing, it likely wont work +# your VM has a floppy drive. +SUSHY_EMULATOR_IGNORE_BOOT_DEVICE = False + +# The map of firmware loaders dependant on the boot mode and +# system architecture. Ideally the x86_64 loader will be capable +# of secure boot or not based on the chosen nvram. +SUSHY_EMULATOR_BOOT_LOADER_MAP = { + u'UEFI': { + u'x86_64': u'/usr/share/OVMF/OVMF_CODE.secboot.fd' + }, + u'Legacy': { + u'x86_64': None + } +} diff --git a/test/e2e/e2e_suite_test.go b/test/e2e/e2e_suite_test.go index 5a2af4bbf7..3973b9013a 100644 --- a/test/e2e/e2e_suite_test.go +++ b/test/e2e/e2e_suite_test.go @@ -12,6 +12,8 @@ import ( "github.com/jinzhu/copier" bmov1alpha1 "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1" + metal3api "github.com/metal3-io/baremetal-operator/apis/metal3.io/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" infrav1 "github.com/metal3-io/cluster-api-provider-metal3/api/v1beta1" ipamv1 "github.com/metal3-io/ip-address-manager/api/v1alpha1" irsov1alpha1 "github.com/metal3-io/ironic-standalone-operator/api/v1alpha1" @@ -29,6 +31,7 @@ import ( const ( KubernetesVersion = "KUBERNETES_VERSION" + metal3Namespace = "metal3" ) // Test suite flags. @@ -36,6 +39,9 @@ var ( // configPath is the path to the e2e config file. configPath string + // bmcConfigPath is the path to the file whose content is the list of bmcs used in the test. + bmcConfigPath string + // useExistingCluster instructs the test to use the current cluster instead of creating a new one (default discovery rules apply). useExistingCluster bool @@ -68,6 +74,9 @@ var ( // bootstrapClusterProxy allows to interact with the bootstrap cluster to be used for the e2e tests. bootstrapClusterProxy framework.ClusterProxy + // namespace where bmo and Ironic are installed + bmoIronicNamespace string + osType string kubeconfigPath string @@ -76,10 +85,12 @@ var ( numberOfControlplane int numberOfWorkers int numberOfAllBmh int + err error ) func init() { flag.StringVar(&configPath, "e2e.config", "", "path to the e2e config file") + flag.StringVar(&bmcConfigPath, "e2e.bmcsConfig", "", "path to the bmcs config file") flag.StringVar(&artifactFolder, "e2e.artifacts-folder", "", "folder where e2e test artifact should be stored") flag.BoolVar(&skipCleanup, "e2e.skip-resource-cleanup", false, "if true, the resource cleanup after tests will be skipped") flag.BoolVar(&upgradeTest, "e2e.trigger-upgrade-test", false, "if true, the e2e upgrade test will be triggered and other tests will be skipped") @@ -115,11 +126,112 @@ var _ = SynchronizedBeforeSuite(func() []byte { numberOfWorkers = int(*e2eConfig.GetInt32PtrVariable("WORKER_MACHINE_COUNT")) numberOfAllBmh = numberOfControlplane + numberOfWorkers - By(fmt.Sprintf("Creating a clusterctl local repository into %q", artifactFolder)) - clusterctlConfigPath = CreateClusterctlLocalRepository(e2eConfig, filepath.Join(artifactFolder, "repository")) - By("Setting up the bootstrap cluster") bootstrapClusterProvider, bootstrapClusterProxy = SetupBootstrapCluster(e2eConfig, scheme, useExistingCluster) + bmoIronicNamespace = e2eConfig.GetVariable(ironicNamespace) + + // Install cert-manager + By("Installing cert-manager") + err = checkCertManagerAPI(bootstrapClusterProxy) + if err != nil { + cmVersion := e2eConfig.GetVariable("CERT_MANAGER_VERSION") + err = installCertManager(ctx, bootstrapClusterProxy, cmVersion) + Expect(err).NotTo(HaveOccurred()) + + By("Waiting for cert-manager webhook") + Eventually(func() error { + return checkCertManagerWebhook(ctx, bootstrapClusterProxy) + }, e2eConfig.GetIntervals("default", "wait-available")...).Should(Succeed()) + err = checkCertManagerAPI(bootstrapClusterProxy) + Expect(err).NotTo(HaveOccurred()) + } + // install ironic + By("Install Ironic in the source cluster as deployments") + ironicDeployLogFolder := filepath.Join(os.TempDir(), "bootstrap_cluster_logs", "ironic-deploy-logs", bootstrapClusterProxy.GetName()) + ironicKustomization := e2eConfig.GetVariable("IRONIC_RELEASE_LATEST") + namePrefix := e2eConfig.GetVariable("NAMEPREFIX") + ironicDeployName := namePrefix + ironicSuffix + By(fmt.Sprintf("Installing Ironic from kustomization %s on the bootstrap cluster", ironicKustomization)) + err = BuildAndApplyKustomization(ctx, &BuildAndApplyKustomizationInput{ + Kustomization: ironicKustomization, + ClusterProxy: bootstrapClusterProxy, + WaitForDeployment: true, + WatchDeploymentLogs: true, + LogPath: ironicDeployLogFolder, + DeploymentName: ironicDeployName, + DeploymentNamespace: bmoIronicNamespace, + WaitIntervals: e2eConfig.GetIntervals("default", "wait-deployment"), + }) + Expect(err).NotTo(HaveOccurred()) + // install bmo + By("Install BMO in the target cluster") + bmoDeployLogFolder := filepath.Join(os.TempDir(), "bootstrap_cluster_logs", "bmo-deploy-logs", bootstrapClusterProxy.GetName()) + bmoKustomization := e2eConfig.GetVariable("BMO_RELEASE_LATEST") + By(fmt.Sprintf("Installing BMO from kustomization %s on the bootstrap cluster", bmoKustomization)) + err = BuildAndApplyKustomization(ctx, &BuildAndApplyKustomizationInput{ + Kustomization: bmoKustomization, + ClusterProxy: bootstrapClusterProxy, + WaitForDeployment: true, + WatchDeploymentLogs: true, + LogPath: bmoDeployLogFolder, + DeploymentName: "baremetal-operator-controller-manager", + DeploymentNamespace: bmoIronicNamespace, + WaitIntervals: e2eConfig.GetIntervals("default", "wait-deployment"), + }) + Expect(err).NotTo(HaveOccurred()) + + // Create metal3 namespace + framework.CreateNamespaceAndWatchEvents(ctx, framework.CreateNamespaceAndWatchEventsInput{ + Creator: bootstrapClusterProxy.GetClient(), + ClientSet: bootstrapClusterProxy.GetClientSet(), + Name: metal3Namespace, + LogFolder: artifactFolder, + }) + + // Instatiate the BMH objects + bmcs, err := LoadBMCConfig(bmcConfigPath) + By("Creating BMH objects") + bmhs := []*metal3api.BareMetalHost{} + for _, bmc := range(*bmcs) { + By("creating a secret with BMH credentials") + bmcCredentialsData := map[string]string{ + "username": bmc.User, + "password": bmc.Password, + } + secretName := fmt.Sprintf("%s-bmc-secret", bmc.HostName) + CreateSecret(ctx, bootstrapClusterProxy.GetClient(), metal3Namespace, secretName, bmcCredentialsData) + + By("creating a BMH") + bmh := metal3api.BareMetalHost{ + ObjectMeta: metav1.ObjectMeta{ + Name: bmc.HostName, + Namespace: metal3Namespace, + }, + Spec: metal3api.BareMetalHostSpec{ + Online: true, + BMC: metal3api.BMCDetails{ + Address: bmc.Address, + CredentialsName: secretName, + }, + BootMode: metal3api.Legacy, + BootMACAddress: bmc.BootMacAddress, + }, + } + err = bootstrapClusterProxy.GetClient().Create(ctx, &bmh) + Expect(err).NotTo(HaveOccurred()) + bmhs = append(bmhs, &bmh) + } + + By("waiting for the BMHs to become available") + for _, bmh := range(bmhs) { + WaitForBmhInProvisioningState(ctx, WaitForBmhInProvisioningStateInput{ + Client: bootstrapClusterProxy.GetClient(), + Bmh: *bmh, + State: metal3api.StateAvailable, + }, e2eConfig.GetIntervals(specName, "wait-available")...) + } + By(fmt.Sprintf("Creating a clusterctl local repository into %q", artifactFolder)) + clusterctlConfigPath = CreateClusterctlLocalRepository(e2eConfig, filepath.Join(artifactFolder, "repository")) By("Initializing the bootstrap cluster") InitBootstrapCluster(bootstrapClusterProxy, e2eConfig, clusterctlConfigPath, artifactFolder) @@ -187,11 +299,7 @@ func CreateClusterctlLocalRepository(config *clusterctl.E2EConfig, repositoryFol // Ensuring a CNI file is defined in the config and register a FileTransformation to inject the referenced file as in place of the CNI_RESOURCES envSubst variable. Expect(config.Variables).To(HaveKey(capi_e2e.CNIPath), "Missing %s variable in the config", capi_e2e.CNIPath) cniPath := config.GetVariable(capi_e2e.CNIPath) - if osType == "centos" { - updateCalico(config, cniPath, "eth1") - } else { - updateCalico(config, cniPath, "enp2s0") - } + // updateCalico(config, cniPath, "eth1") Expect(cniPath).To(BeAnExistingFile(), "The %s variable should resolve to an existing file", capi_e2e.CNIPath) createRepositoryInput.RegisterClusterResourceSetConfigMapTransformation(cniPath, capi_e2e.CNIResources) diff --git a/test/go.mod b/test/go.mod index b35c656eeb..3ab66753b6 100644 --- a/test/go.mod +++ b/test/go.mod @@ -4,6 +4,7 @@ go 1.22.8 require ( github.com/blang/semver v3.5.1+incompatible + github.com/cert-manager/cert-manager v1.16.3 github.com/docker/docker v27.4.1+incompatible github.com/jinzhu/copier v0.4.0 github.com/metal3-io/baremetal-operator/apis v0.9.0 @@ -15,6 +16,7 @@ require ( github.com/pkg/errors v0.9.1 golang.org/x/crypto v0.32.0 golang.org/x/mod v0.22.0 + gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 k8s.io/api v0.31.4 k8s.io/apiextensions-apiserver v0.31.4 @@ -22,7 +24,7 @@ require ( k8s.io/client-go v0.31.4 k8s.io/klog/v2 v2.130.1 k8s.io/kubectl v0.30.8 - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 + k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 sigs.k8s.io/cluster-api v1.9.3 sigs.k8s.io/cluster-api/test v1.9.3 sigs.k8s.io/controller-runtime v0.19.4 @@ -45,7 +47,7 @@ require ( github.com/adrg/xdg v0.5.3 // indirect github.com/alessio/shellescape v1.4.2 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect @@ -57,7 +59,7 @@ require ( github.com/docker/go-units v0.5.0 // indirect github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 // indirect github.com/emicklei/go-restful/v3 v3.12.1 // indirect - github.com/evanphx/json-patch v5.7.0+incompatible // indirect + github.com/evanphx/json-patch v5.9.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/fatih/camelcase v1.0.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect @@ -66,9 +68,9 @@ require ( github.com/go-errors/errors v1.4.2 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.19.6 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gobuffalo/flect v1.0.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -87,12 +89,13 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/hcl v1.0.1-vault-5 // indirect github.com/huandu/xstrings v1.5.0 // indirect - github.com/imdario/mergo v0.3.13 // indirect + github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect @@ -112,7 +115,7 @@ require ( github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect - github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_golang v1.20.4 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect @@ -125,18 +128,18 @@ require ( github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.19.0 // indirect - github.com/stoewer/go-strcase v1.2.0 // indirect + github.com/stoewer/go-strcase v1.3.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/valyala/fastjson v1.6.4 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xlab/treeprint v1.2.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect + go.opentelemetry.io/otel v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.29.0 // indirect go.opentelemetry.io/otel/sdk v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opentelemetry.io/otel/trace v1.29.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect @@ -147,24 +150,24 @@ require ( golang.org/x/sys v0.29.0 // indirect golang.org/x/term v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.5.0 // indirect + golang.org/x/time v0.6.0 // indirect golang.org/x/tools v0.28.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect - google.golang.org/grpc v1.65.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.66.2 // indirect google.golang.org/protobuf v1.36.1 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gotest.tools/v3 v3.5.0 // indirect k8s.io/apiserver v0.31.4 // indirect k8s.io/cli-runtime v0.30.8 // indirect k8s.io/cluster-bootstrap v0.31.3 // indirect k8s.io/component-base v0.31.4 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/kube-openapi v0.0.0-20240903163716-9e1beecbcb38 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect + sigs.k8s.io/gateway-api v1.1.0 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kind v0.25.0 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect diff --git a/test/go.sum b/test/go.sum index 6ecf14b47c..26f73ba585 100644 --- a/test/go.sum +++ b/test/go.sum @@ -22,8 +22,8 @@ github.com/alessio/shellescape v1.4.2 h1:MHPfaU+ddJ0/bYWpgIeUnQUqKrlJ1S7BfEYPM4u github.com/alessio/shellescape v1.4.2/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= @@ -33,6 +33,8 @@ github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2y github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cert-manager/cert-manager v1.16.3 h1:seEF5eidFaeduaCuM85PFEuzH/1X/HOV5Y8zDQrHgpc= +github.com/cert-manager/cert-manager v1.16.3/go.mod h1:6JQ/GAZ6dH+erqS1BbaqorPy8idJzCtWFUmJQBTjo6Q= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= @@ -50,7 +52,6 @@ github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pq github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -69,8 +70,8 @@ github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46 h1:7QPwrLT79GlD5 github.com/drone/envsubst/v2 v2.0.0-20210730161058-179042472c46/go.mod h1:esf2rsHFNlZlxsqsZDojNBcnNs5REqIvRrWRHqX0vEU= github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= -github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= +github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= @@ -92,13 +93,12 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= -github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4= @@ -141,12 +141,12 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92Bcuy github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= +github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= @@ -157,13 +157,14 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= @@ -220,8 +221,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE 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/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= @@ -253,15 +254,14 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= -github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= +github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -286,24 +286,24 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.17 h1:XxnDXAWq2pnxqx76ljWwiQ9jylbpC4rvkAeRVOU go.etcd.io/etcd/client/pkg/v3 v3.5.17/go.mod h1:4DqK1TKacp/86nJk4FLQqo6Mn2vvQFBmruW3pP14H/w= go.etcd.io/etcd/client/v3 v3.5.17 h1:o48sINNeWz5+pjy/Z0+HKpj/xSnBkuVhVvXkjEXbqZY= go.etcd.io/etcd/client/v3 v3.5.17/go.mod h1:j2d4eXTHWkT2ClBgnnEPm/Wuu7jsqku41v9DZ3OtjQo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0 h1:FyjCyI9jVEfqhUh2MoSkmolPjfh5fp2hnV0b0irxH4Q= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0/go.mod h1:hYwym2nDEeZfG/motx0p7L7J1N1vyzIThemQsb4g2qY= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -357,8 +357,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -371,12 +371,12 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= -google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= -google.golang.org/grpc v1.65.1 h1:toSN4j5/Xju+HVovfaY5g1YZVuJeHzQZhP8eJ0L0f1I= -google.golang.org/grpc v1.65.1/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo= +google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -388,12 +388,10 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= @@ -416,12 +414,12 @@ k8s.io/component-base v0.31.4 h1:wCquJh4ul9O8nNBSB8N/o8+gbfu3BVQkVw9jAUY/Qtw= k8s.io/component-base v0.31.4/go.mod h1:G4dgtf5BccwiDT9DdejK0qM6zTK0jwDGEKnCmb9+u/s= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/kube-openapi v0.0.0-20240903163716-9e1beecbcb38 h1:1dWzkmJrrprYvjGwh9kEUxmcUV/CtNU8QM7h1FLWQOo= +k8s.io/kube-openapi v0.0.0-20240903163716-9e1beecbcb38/go.mod h1:coRQXBK9NxO98XUv3ZD6AK3xzHCxV6+b7lrquKwaKzA= k8s.io/kubectl v0.30.8 h1:p/oOy3lbBAJ2secYbIB5w89fqVGJpMcPePlzkcJWEwI= k8s.io/kubectl v0.30.8/go.mod h1:BZH/naEOTQfvADYydXGHfe5L+F46oj0WFWW8nuxuYM8= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 h1:MDF6h2H/h4tbzmtIKTuctcwZmY0tY9mD9fNT47QO6HI= +k8s.io/utils v0.0.0-20240921022957-49e7df575cb6/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= sigs.k8s.io/cluster-api v1.9.3 h1:lKWbrXzyNmJh++IcX54ZbAmnO7tZ2wKgds7WvskpiXY= @@ -430,6 +428,8 @@ sigs.k8s.io/cluster-api/test v1.9.3 h1:65w87EX4X+W+jJ1MkSh+DOTK+T9Di4yS+eMjtCKq9 sigs.k8s.io/cluster-api/test v1.9.3/go.mod h1:RbMw6WR4vwqzu9tx13MmRsnIR+WLQ6xx8BMFtvPYUOY= sigs.k8s.io/controller-runtime v0.19.4 h1:SUmheabttt0nx8uJtoII4oIP27BVVvAKFvdvGFwV/Qo= sigs.k8s.io/controller-runtime v0.19.4/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= +sigs.k8s.io/gateway-api v1.1.0 h1:DsLDXCi6jR+Xz8/xd0Z1PYl2Pn0TyaFMOPPZIj4inDM= +sigs.k8s.io/gateway-api v1.1.0/go.mod h1:ZH4lHrL2sDi0FHZ9jjneb8kKnGzFWyrTya35sWUTrRs= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kind v0.25.0 h1:ugUvgesHKKA0yKmD6QtYTiEev+kPUpGxdTPbMGf8VTU=