From 2c49c13b4762fca2606baff894769280f059cee1 Mon Sep 17 00:00:00 2001 From: adil ghaffar Date: Mon, 15 Apr 2024 13:05:16 +0300 Subject: [PATCH] Fixing bmo version for clusterctl tests Signed-off-by: adil ghaffar --- scripts/ci-e2e.sh | 70 +++++- test/e2e/common.go | 203 ++++++++++++++++++ test/e2e/config/e2e_conf.yaml | 12 +- .../basic-auth/credentials_patch.yaml | 18 ++ .../components/basic-auth/kustomization.yaml | 19 ++ .../components/tls/kustomization.yaml | 8 + .../components/tls/tls_ca_patch.yaml | 17 ++ .../overlays/release-0.4/ironic.env | 4 + .../overlays/release-0.4/kustomization.yaml | 40 ++++ .../overlays/release-0.5/ironic.env | 4 + .../overlays/release-0.5/kustomization.yaml | 38 ++++ .../overlays/release-0.6/ironic.env | 4 + .../overlays/release-0.6/kustomization.yaml | 34 +++ .../components/basic-auth/auth.yaml | 15 ++ .../basic-auth/ironic-auth-config-tpl | 4 + .../components/basic-auth/kustomization.yaml | 17 ++ .../release-23.1/ironic_bmo_configmap.env | 12 ++ .../release-23.1/keepalived_patch.yaml | 28 +++ .../overlays/release-23.1/kustomization.yaml | 55 +++++ .../release-24.0/ironic_bmo_configmap.env | 12 ++ .../release-24.0/keepalived_patch.yaml | 28 +++ .../overlays/release-24.0/kustomization.yaml | 55 +++++ .../release-24.1/ironic_bmo_configmap.env | 12 ++ .../release-24.1/keepalived_patch.yaml | 28 +++ .../overlays/release-24.1/kustomization.yaml | 48 +++++ test/e2e/upgrade_baremetal_operator.go | 62 ------ test/e2e/upgrade_clusterctl_test.go | 187 +++++++++------- test/e2e/upgrade_ironic.go | 63 ------ test/go.mod | 13 +- test/go.sum | 92 +++++++- 30 files changed, 987 insertions(+), 215 deletions(-) create mode 100644 test/e2e/data/bmo-deployment/components/basic-auth/credentials_patch.yaml create mode 100644 test/e2e/data/bmo-deployment/components/basic-auth/kustomization.yaml create mode 100644 test/e2e/data/bmo-deployment/components/tls/kustomization.yaml create mode 100644 test/e2e/data/bmo-deployment/components/tls/tls_ca_patch.yaml create mode 100644 test/e2e/data/bmo-deployment/overlays/release-0.4/ironic.env create mode 100644 test/e2e/data/bmo-deployment/overlays/release-0.4/kustomization.yaml create mode 100644 test/e2e/data/bmo-deployment/overlays/release-0.5/ironic.env create mode 100644 test/e2e/data/bmo-deployment/overlays/release-0.5/kustomization.yaml create mode 100644 test/e2e/data/bmo-deployment/overlays/release-0.6/ironic.env create mode 100644 test/e2e/data/bmo-deployment/overlays/release-0.6/kustomization.yaml create mode 100644 test/e2e/data/ironic-deployment/components/basic-auth/auth.yaml create mode 100644 test/e2e/data/ironic-deployment/components/basic-auth/ironic-auth-config-tpl create mode 100644 test/e2e/data/ironic-deployment/components/basic-auth/kustomization.yaml create mode 100644 test/e2e/data/ironic-deployment/overlays/release-23.1/ironic_bmo_configmap.env create mode 100644 test/e2e/data/ironic-deployment/overlays/release-23.1/keepalived_patch.yaml create mode 100644 test/e2e/data/ironic-deployment/overlays/release-23.1/kustomization.yaml create mode 100644 test/e2e/data/ironic-deployment/overlays/release-24.0/ironic_bmo_configmap.env create mode 100644 test/e2e/data/ironic-deployment/overlays/release-24.0/keepalived_patch.yaml create mode 100644 test/e2e/data/ironic-deployment/overlays/release-24.0/kustomization.yaml create mode 100644 test/e2e/data/ironic-deployment/overlays/release-24.1/ironic_bmo_configmap.env create mode 100644 test/e2e/data/ironic-deployment/overlays/release-24.1/keepalived_patch.yaml create mode 100644 test/e2e/data/ironic-deployment/overlays/release-24.1/kustomization.yaml delete mode 100644 test/e2e/upgrade_baremetal_operator.go delete mode 100644 test/e2e/upgrade_ironic.go diff --git a/scripts/ci-e2e.sh b/scripts/ci-e2e.sh index 9117a147d..f233017f3 100755 --- a/scripts/ci-e2e.sh +++ b/scripts/ci-e2e.sh @@ -44,8 +44,8 @@ export IMAGE_OS=${IMAGE_OS} export FORCE_REPO_UPDATE="false" EOF if [[ ${GINKGO_FOCUS:-} == "features" ]]; then - mkdir -p "$CAPI_CONFIG_FOLDER" - echo "enableBMHNameBasedPreallocation: true" >"$CAPI_CONFIG_FOLDER/clusterctl.yaml" + mkdir -p "$CAPI_CONFIG_FOLDER" + echo "enableBMHNameBasedPreallocation: true" >"$CAPI_CONFIG_FOLDER/clusterctl.yaml" fi # Run make devenv to boot the source cluster pushd "${M3_DEV_ENV_PATH}" || exit 1 @@ -118,5 +118,71 @@ export CONTRACT_TO="v1beta1" # image for live iso testing export LIVE_ISO_IMAGE="https://artifactory.nordix.org/artifactory/metal3/images/iso/minimal_linux_live-v2.iso" +# Generate credentials +BMO_OVERLAYS=( + "${REPO_ROOT}/test/e2e/data/bmo-deployment/overlays/release-0.4" + "${REPO_ROOT}/test/e2e/data/bmo-deployment/overlays/release-0.5" + "${REPO_ROOT}/test/e2e/data/bmo-deployment/overlays/release-0.6" +) +IRONIC_OVERLAYS=( + "${REPO_ROOT}/test/e2e/data/ironic-deployment/overlays/release-23.1" + "${REPO_ROOT}/test/e2e/data/ironic-deployment/overlays/release-24.0" + "${REPO_ROOT}/test/e2e/data/ironic-deployment/overlays/release-24.1" +) + +# Create usernames and passwords and other files related to ironi basic auth if they +# are missing +if [[ "${IRONIC_BASIC_AUTH}" == "true" ]]; then + IRONIC_AUTH_DIR="${IRONIC_AUTH_DIR:-${IRONIC_DATA_DIR}/auth}" + mkdir -p "${IRONIC_AUTH_DIR}" + + # 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)" + echo "${IRONIC_USERNAME}" > "${IRONIC_AUTH_DIR}/ironic-username" + else + IRONIC_USERNAME="$(cat "${IRONIC_AUTH_DIR}/ironic-username")" + fi + fi + if [[ -z "${IRONIC_PASSWORD:-}" ]]; then + if [ ! -f "${IRONIC_AUTH_DIR}/ironic-password" ]; then + IRONIC_PASSWORD="$(uuid-gen)" + echo "${IRONIC_PASSWORD}" > "${IRONIC_AUTH_DIR}/ironic-password" + else + IRONIC_PASSWORD="$(cat "${IRONIC_AUTH_DIR}/ironic-password")" + fi + fi + IRONIC_INSPECTOR_USERNAME="${IRONIC_INSPECTOR_USERNAME:-${IRONIC_USERNAME}}" + IRONIC_INSPECTOR_PASSWORD="${IRONIC_INSPECTOR_PASSWORD:-${IRONIC_PASSWORD}}" + + export IRONIC_USERNAME + export IRONIC_PASSWORD + export IRONIC_INSPECTOR_USERNAME + export IRONIC_INSPECTOR_PASSWORD +fi + +for overlay in "${BMO_OVERLAYS[@]}"; do + echo "${IRONIC_USERNAME}" > "${overlay}/ironic-username" + echo "${IRONIC_PASSWORD}" > "${overlay}/ironic-password" + if [[ "${overlay}" =~ release-0\.[1-5]$ ]]; then + echo "${IRONIC_INSPECTOR_USERNAME}" > "${overlay}/ironic-inspector-username" + echo "${IRONIC_INSPECTOR_PASSWORD}" > "${overlay}/ironic-inspector-password" + fi +done + +for overlay in "${IRONIC_OVERLAYS[@]}"; do + echo "IRONIC_HTPASSWD=$(htpasswd -n -b -B "${IRONIC_USERNAME}" "${IRONIC_PASSWORD}")" > \ + "${overlay}/ironic-htpasswd" + envsubst < "${REPO_ROOT}/test/e2e/data/ironic-deployment/components/basic-auth/ironic-auth-config-tpl" > \ + "${overlay}/ironic-auth-config" + IRONIC_INSPECTOR_AUTH_CONFIG_TPL="/tmp/ironic-inspector-auth-config-tpl" + curl -o "${IRONIC_INSPECTOR_AUTH_CONFIG_TPL}" https://raw.githubusercontent.com/metal3-io/baremetal-operator/release-0.5/ironic-deployment/components/basic-auth/ironic-inspector-auth-config-tpl + envsubst < "${IRONIC_INSPECTOR_AUTH_CONFIG_TPL}" > \ + "${overlay}/ironic-inspector-auth-config" + echo "INSPECTOR_HTPASSWD=$(htpasswd -n -b -B "${IRONIC_INSPECTOR_USERNAME}" \ + "${IRONIC_INSPECTOR_PASSWORD}")" > "${overlay}/ironic-inspector-htpasswd" +done + # run e2e tests make e2e-tests diff --git a/test/e2e/common.go b/test/e2e/common.go index ce7f583e2..182f1a79e 100644 --- a/test/e2e/common.go +++ b/test/e2e/common.go @@ -12,11 +12,13 @@ import ( "os/exec" "path" "path/filepath" + "sort" "strconv" "strings" "text/tabwriter" "time" + "github.com/blang/semver" 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" @@ -24,6 +26,7 @@ import ( . "github.com/onsi/gomega" "github.com/pkg/errors" "golang.org/x/crypto/ssh" + v1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -35,8 +38,11 @@ import ( expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1" "sigs.k8s.io/cluster-api/test/framework" "sigs.k8s.io/cluster-api/test/framework/clusterctl" + testexec "sigs.k8s.io/cluster-api/test/framework/exec" "sigs.k8s.io/cluster-api/util/patch" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/kustomize/api/filesys" + "sigs.k8s.io/kustomize/api/krusty" ) type vmState string @@ -793,3 +799,200 @@ func GetCAPM3StableReleaseOfMinor(ctx context.Context, minorRelease string) (str releaseMarker := fmt.Sprintf(releaseMarkerPrefix, minorRelease) return clusterctl.ResolveRelease(ctx, releaseMarker) } + +// GetLatestPatchRelease returns latest patch release against minor release. +func GetLatestPatchRelease(goProxyPath string, minorReleaseVersion string) (string, error) { + if strings.EqualFold("main", minorReleaseVersion) || strings.EqualFold("latest", minorReleaseVersion) { + return strings.ToUpper(minorReleaseVersion), nil + } + minorReleaseVersion += ".0" + semVersion, err := semver.Parse(minorReleaseVersion) + if err != nil { + return "", errors.Wrapf(err, "parsing semver for %s", minorReleaseVersion) + } + parsedTags, err := getVersions(goProxyPath) + if err != nil { + return "", err + } + + var picked semver.Version + for i, tag := range parsedTags { + if tag.Major == semVersion.Major && tag.Minor == semVersion.Minor { + picked = parsedTags[i] + } + } + if picked.Major == 0 && picked.Minor == 0 && picked.Patch == 0 { + return "", errors.Errorf("no suitable release available for path %s and version %s", goProxyPath, minorReleaseVersion) + } + return picked.String(), nil +} + +// GetVersions returns the a sorted list of semantical versions which exist for a go module. +func getVersions(gomodulePath string) (semver.Versions, error) { + // Get the data + /* #nosec G107 */ + resp, err := http.Get(gomodulePath) //nolint:noctx + if err != nil { + return nil, err + } + if resp.StatusCode != http.StatusOK { + return nil, errors.Errorf("failed to get versions from url %s got %d %s", gomodulePath, resp.StatusCode, http.StatusText(resp.StatusCode)) + } + defer resp.Body.Close() + + rawResponse, err := io.ReadAll(resp.Body) + if err != nil { + retryError := errors.Wrap(err, "failed to get versions: error reading goproxy response body") + return nil, retryError + } + parsedVersions := semver.Versions{} + for _, s := range strings.Split(string(rawResponse), "\n") { + if s == "" { + continue + } + s = strings.TrimSuffix(s, "+incompatible") + parsedVersion, err := semver.ParseTolerant(s) + if err != nil { + // Discard releases with tags that are not a valid semantic versions (the user can point explicitly to such releases). + continue + } + parsedVersions = append(parsedVersions, parsedVersion) + } + + if len(parsedVersions) == 0 { + return nil, fmt.Errorf("no versions found for go module %q", gomodulePath) + } + sort.Sort(parsedVersions) + return parsedVersions, nil +} + +// BuildAndApplyKustomizationInput provides input for BuildAndApplyKustomize(). +// If WaitForDeployment and/or WatchDeploymentLogs is set to true, then DeploymentName +// and DeploymentNamespace are expected. +type BuildAndApplyKustomizationInput struct { + // Path to the kustomization to build + Kustomization string + + ClusterProxy framework.ClusterProxy + + // If this is set to true. Perform a wait until the deployment specified by + // DeploymentName and DeploymentNamespace is available or WaitIntervals is timed out + WaitForDeployment bool + + // If this is set to true. Set up a log watcher for the deployment specified by + // DeploymentName and DeploymentNamespace + WatchDeploymentLogs bool + + // DeploymentName and DeploymentNamespace specified a deployment that will be waited and/or logged + DeploymentName string + DeploymentNamespace string + + // Path to store the deployment logs + LogPath string + + // Intervals to use in checking and waiting for the deployment + WaitIntervals []interface{} +} + +func (input *BuildAndApplyKustomizationInput) validate() error { + // If neither WaitForDeployment nor WatchDeploymentLogs is true, we don't need to validate the input + if !input.WaitForDeployment && !input.WatchDeploymentLogs { + return nil + } + if input.WaitForDeployment && input.WaitIntervals == nil { + return errors.Errorf("WaitIntervals is expected if WaitForDeployment is set to true") + } + if input.WatchDeploymentLogs && input.LogPath == "" { + return errors.Errorf("LogPath is expected if WatchDeploymentLogs is set to true") + } + if input.DeploymentName == "" || input.DeploymentNamespace == "" { + return errors.Errorf("DeploymentName and DeploymentNamespace are expected if WaitForDeployment or WatchDeploymentLogs is true") + } + return nil +} + +// BuildAndApplyKustomization takes input from BuildAndApplyKustomizationInput. It builds the provided kustomization +// and apply it to the cluster provided by clusterProxy. +func BuildAndApplyKustomization(ctx context.Context, input *BuildAndApplyKustomizationInput) error { + Expect(input.validate()).To(Succeed()) + var err error + kustomization := input.Kustomization + clusterProxy := input.ClusterProxy + manifest, err := buildKustomizeManifest(kustomization) + if err != nil { + return err + } + + err = clusterProxy.Apply(ctx, manifest) + if err != nil { + return err + } + + if !input.WaitForDeployment && !input.WatchDeploymentLogs { + return nil + } + + deployment := &v1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: input.DeploymentName, + Namespace: input.DeploymentNamespace, + }, + } + + if input.WaitForDeployment { + // Wait for the deployment to become available + framework.WaitForDeploymentsAvailable(ctx, framework.WaitForDeploymentsAvailableInput{ + Getter: clusterProxy.GetClient(), + Deployment: deployment, + }, input.WaitIntervals...) + } + + if input.WatchDeploymentLogs { + // Set up log watcher + framework.WatchDeploymentLogsByName(ctx, framework.WatchDeploymentLogsByNameInput{ + GetLister: clusterProxy.GetClient(), + Cache: clusterProxy.GetCache(ctx), + ClientSet: clusterProxy.GetClientSet(), + Deployment: deployment, + LogPath: input.LogPath, + }) + } + return nil +} + +// BuildAndRemoveKustomization builds the provided kustomization to resources and removes them from the cluster +// provided by clusterProxy. +func BuildAndRemoveKustomization(ctx context.Context, kustomization string, clusterProxy framework.ClusterProxy) error { + manifest, err := buildKustomizeManifest(kustomization) + if err != nil { + return err + } + return KubectlDelete(ctx, clusterProxy.GetKubeconfigPath(), manifest) +} + +// KubectlDelete shells out to kubectl delete. +func KubectlDelete(ctx context.Context, kubeconfigPath string, resources []byte, args ...string) error { + aargs := append([]string{"delete", "--kubeconfig", kubeconfigPath, "-f", "-"}, args...) + rbytes := bytes.NewReader(resources) + deleteCmd := testexec.NewCommand( + testexec.WithCommand("kubectl"), + testexec.WithArgs(aargs...), + testexec.WithStdin(rbytes), + ) + + fmt.Printf("Running kubectl %s\n", strings.Join(aargs, " ")) + stdout, stderr, err := deleteCmd.Run(ctx) + fmt.Printf("stderr:\n%s\n", string(stderr)) + fmt.Printf("stdout:\n%s\n", string(stdout)) + return err +} + +func buildKustomizeManifest(source string) ([]byte, error) { + kustomizer := krusty.MakeKustomizer(krusty.MakeDefaultOptions()) + fSys := filesys.MakeFsOnDisk() + resources, err := kustomizer.Run(fSys, source) + if err != nil { + return nil, err + } + return resources.AsYaml() +} diff --git a/test/e2e/config/e2e_conf.yaml b/test/e2e/config/e2e_conf.yaml index 03112b5b6..a475becbb 100644 --- a/test/e2e/config/e2e_conf.yaml +++ b/test/e2e/config/e2e_conf.yaml @@ -166,12 +166,20 @@ variables: IMAGE_CHECKSUM_TYPE: "sha256" IMAGE_USERNAME: "metal3" NODE_DRAIN_TIMEOUT: "0s" + IRONIC_RELEASE_23.1: "data/ironic-deployment/overlays/release-23.1" + IRONIC_RELEASE_24.0: "data/ironic-deployment/overlays/release-24.0" + IRONIC_RELEASE_24.1: "data/ironic-deployment/overlays/release-24.1" + IRONIC_RELEASE_LATEST: "data/ironic-deployment/overlays/release-latest" + BMO_RELEASE_0.4: "data/bmo-deployment/overlays/release-0.4" + BMO_RELEASE_0.5: "data/bmo-deployment/overlays/release-0.5" + BMO_RELEASE_0.6: "data/bmo-deployment/overlays/release-0.6" + BMO_RELEASE_LATEST: "data/bmo-deployment/overlays/release-latest" intervals: - default/wait-controllers: ["5m", "10s"] + default/wait-controllers: ["10m", "10s"] default/wait-cluster: ["20m", "30s"] # The second time to check the availibility of the cluster should happen late, so kcp object has time to be created default/wait-control-plane: ["30m", "10s"] - default/wait-worker-nodes: ["30m", "10s"] + default/wait-worker-nodes: ["60m", "10s"] default/wait-delete-cluster: ["20m", "10s"] default/wait-machine-upgrade: ["50m", "10s"] default/wait-machine-remediation: ["30m", "10s"] diff --git a/test/e2e/data/bmo-deployment/components/basic-auth/credentials_patch.yaml b/test/e2e/data/bmo-deployment/components/basic-auth/credentials_patch.yaml new file mode 100644 index 000000000..3048c16f3 --- /dev/null +++ b/test/e2e/data/bmo-deployment/components/basic-auth/credentials_patch.yaml @@ -0,0 +1,18 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system +spec: + template: + spec: + containers: + - name: manager + volumeMounts: + - name: ironic-credentials + mountPath: "/opt/metal3/auth/ironic" + readOnly: true + volumes: + - name: ironic-credentials + secret: + secretName: ironic-credentials diff --git a/test/e2e/data/bmo-deployment/components/basic-auth/kustomization.yaml b/test/e2e/data/bmo-deployment/components/basic-auth/kustomization.yaml new file mode 100644 index 000000000..9e91544ef --- /dev/null +++ b/test/e2e/data/bmo-deployment/components/basic-auth/kustomization.yaml @@ -0,0 +1,19 @@ +apiVersion: kustomize.config.k8s.io/v1alpha1 +kind: Component + +# NOTE: This component requires a secret with the basic auth credentials! +# How you create it is up to you. The required secrets is: +# - ironic-credentials +# +# It should contain 2 fields: username and password. Example: +# +# apiVersion: v1 +# kind: Secret +# metadata: +# name: ironic-credentials +# data: +# password: +# username: + +patches: +- path: credentials_patch.yaml diff --git a/test/e2e/data/bmo-deployment/components/tls/kustomization.yaml b/test/e2e/data/bmo-deployment/components/tls/kustomization.yaml new file mode 100644 index 000000000..3854f3020 --- /dev/null +++ b/test/e2e/data/bmo-deployment/components/tls/kustomization.yaml @@ -0,0 +1,8 @@ +apiVersion: kustomize.config.k8s.io/v1alpha1 +kind: Component + +patches: +- path: tls_ca_patch.yaml + target: + kind: Deployment + name: controller-manager diff --git a/test/e2e/data/bmo-deployment/components/tls/tls_ca_patch.yaml b/test/e2e/data/bmo-deployment/components/tls/tls_ca_patch.yaml new file mode 100644 index 000000000..ae8fc021f --- /dev/null +++ b/test/e2e/data/bmo-deployment/components/tls/tls_ca_patch.yaml @@ -0,0 +1,17 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager +spec: + template: + spec: + containers: + - name: manager + volumeMounts: + - name: cacert + mountPath: "/opt/metal3/certs/ca" + readOnly: true + volumes: + - name: cacert + secret: + secretName: ironic-cacert diff --git a/test/e2e/data/bmo-deployment/overlays/release-0.4/ironic.env b/test/e2e/data/bmo-deployment/overlays/release-0.4/ironic.env new file mode 100644 index 000000000..44eb43787 --- /dev/null +++ b/test/e2e/data/bmo-deployment/overlays/release-0.4/ironic.env @@ -0,0 +1,4 @@ +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/ diff --git a/test/e2e/data/bmo-deployment/overlays/release-0.4/kustomization.yaml b/test/e2e/data/bmo-deployment/overlays/release-0.4/kustomization.yaml new file mode 100644 index 000000000..2b09a51c4 --- /dev/null +++ b/test/e2e/data/bmo-deployment/overlays/release-0.4/kustomization.yaml @@ -0,0 +1,40 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: baremetal-operator-system +resources: +- https://github.com/metal3-io/baremetal-operator/config/tls?ref=release-0.4 +components: +- ../../components/basic-auth +configMapGenerator: +- name: ironic + behavior: merge + envs: + - ironic.env +patches: +- patch: | + # Don't try to pull again the pre-loaded image + - op: replace + path: /spec/template/spec/containers/0/imagePullPolicy + value: IfNotPresent + target: + kind: Deployment + name: controller-manager +images: +- name: quay.io/metal3-io/baremetal-operator + newTag: release-0.4 +- name: gcr.io/kubebuilder/kube-rbac-proxy + newTag: v0.8.0 +# We cannot use suffix hashes since the kustomizations we build on +# cannot be aware of what suffixes we add. +generatorOptions: + disableNameSuffixHash: true +# NOTE: These credentials are generated automatically in hack/ci-e2e.sh +secretGenerator: +- name: ironic-credentials + files: + - username=ironic-username + - password=ironic-password +- name: ironic-inspector-credentials + files: + - username=ironic-inspector-username + - password=ironic-inspector-password diff --git a/test/e2e/data/bmo-deployment/overlays/release-0.5/ironic.env b/test/e2e/data/bmo-deployment/overlays/release-0.5/ironic.env new file mode 100644 index 000000000..44eb43787 --- /dev/null +++ b/test/e2e/data/bmo-deployment/overlays/release-0.5/ironic.env @@ -0,0 +1,4 @@ +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/ diff --git a/test/e2e/data/bmo-deployment/overlays/release-0.5/kustomization.yaml b/test/e2e/data/bmo-deployment/overlays/release-0.5/kustomization.yaml new file mode 100644 index 000000000..079c02772 --- /dev/null +++ b/test/e2e/data/bmo-deployment/overlays/release-0.5/kustomization.yaml @@ -0,0 +1,38 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: baremetal-operator-system +resources: +- https://github.com/metal3-io/baremetal-operator/config/overlays/basic-auth_tls?ref=release-0.5 +configMapGenerator: +- name: ironic + behavior: create + envs: + - ironic.env +patches: +- patch: | + # Don't try to pull again the pre-loaded image + - op: replace + path: /spec/template/spec/containers/0/imagePullPolicy + value: IfNotPresent + target: + kind: Deployment + name: controller-manager +images: +- name: quay.io/metal3-io/baremetal-operator + newTag: release-0.5 +- name: gcr.io/kubebuilder/kube-rbac-proxy + newTag: v0.8.0 +# We cannot use suffix hashes since the kustomizations we build on +# cannot be aware of what suffixes we add. +generatorOptions: + disableNameSuffixHash: true +# NOTE: These credentials are generated automatically in hack/ci-e2e.sh +secretGenerator: +- name: ironic-credentials + files: + - username=ironic-username + - password=ironic-password +- name: ironic-inspector-credentials + files: + - username=ironic-inspector-username + - password=ironic-inspector-password diff --git a/test/e2e/data/bmo-deployment/overlays/release-0.6/ironic.env b/test/e2e/data/bmo-deployment/overlays/release-0.6/ironic.env new file mode 100644 index 000000000..44eb43787 --- /dev/null +++ b/test/e2e/data/bmo-deployment/overlays/release-0.6/ironic.env @@ -0,0 +1,4 @@ +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/ diff --git a/test/e2e/data/bmo-deployment/overlays/release-0.6/kustomization.yaml b/test/e2e/data/bmo-deployment/overlays/release-0.6/kustomization.yaml new file mode 100644 index 000000000..83449c291 --- /dev/null +++ b/test/e2e/data/bmo-deployment/overlays/release-0.6/kustomization.yaml @@ -0,0 +1,34 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: baremetal-operator-system +resources: +- https://github.com/metal3-io/baremetal-operator/config/overlays/basic-auth_tls?ref=release-0.6 +configMapGenerator: +- name: ironic + behavior: create + envs: + - ironic.env +patches: +- patch: | + # Don't try to pull again the pre-loaded image + - op: replace + path: /spec/template/spec/containers/0/imagePullPolicy + value: IfNotPresent + target: + kind: Deployment + name: controller-manager +images: +- name: quay.io/metal3-io/baremetal-operator + newTag: release-0.6 +- name: gcr.io/kubebuilder/kube-rbac-proxy + newTag: v0.8.0 +# We cannot use suffix hashes since the kustomizations we build on +# cannot be aware of what suffixes we add. +generatorOptions: + disableNameSuffixHash: true +# NOTE: These credentials are generated automatically in hack/ci-e2e.sh +secretGenerator: +- name: ironic-credentials + files: + - username=ironic-username + - password=ironic-password diff --git a/test/e2e/data/ironic-deployment/components/basic-auth/auth.yaml b/test/e2e/data/ironic-deployment/components/basic-auth/auth.yaml new file mode 100644 index 000000000..b15875de2 --- /dev/null +++ b/test/e2e/data/ironic-deployment/components/basic-auth/auth.yaml @@ -0,0 +1,15 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ironic +spec: + template: + spec: + containers: + - name: ironic + envFrom: + # This is the htpassword matching the ironic password + - secretRef: + name: ironic-htpasswd + - configMapRef: + name: ironic-bmo-configmap diff --git a/test/e2e/data/ironic-deployment/components/basic-auth/ironic-auth-config-tpl b/test/e2e/data/ironic-deployment/components/basic-auth/ironic-auth-config-tpl new file mode 100644 index 000000000..6e8c83258 --- /dev/null +++ b/test/e2e/data/ironic-deployment/components/basic-auth/ironic-auth-config-tpl @@ -0,0 +1,4 @@ +[ironic] +auth_type=http_basic +username=${IRONIC_USERNAME} +password=${IRONIC_PASSWORD} diff --git a/test/e2e/data/ironic-deployment/components/basic-auth/kustomization.yaml b/test/e2e/data/ironic-deployment/components/basic-auth/kustomization.yaml new file mode 100644 index 000000000..e261e1c43 --- /dev/null +++ b/test/e2e/data/ironic-deployment/components/basic-auth/kustomization.yaml @@ -0,0 +1,17 @@ +apiVersion: kustomize.config.k8s.io/v1alpha1 +kind: Component + +# NOTE: This component requires secrets with the basic auth credential! +# How you create them is up to you. The required secret is ironic-htpasswd. +# +# The content should be as in these examples: +# +# apiVersion: v1 +# kind: Secret +# metadata: +# name: ironic-htpasswd +# data: +# IRONIC_HTPASSWD: + +patches: +- path: auth.yaml diff --git a/test/e2e/data/ironic-deployment/overlays/release-23.1/ironic_bmo_configmap.env b/test/e2e/data/ironic-deployment/overlays/release-23.1/ironic_bmo_configmap.env new file mode 100644 index 000000000..147589278 --- /dev/null +++ b/test/e2e/data/ironic-deployment/overlays/release-23.1/ironic_bmo_configmap.env @@ -0,0 +1,12 @@ +HTTP_PORT=6180 +PROVISIONING_IP=172.22.0.2 +CACHEURL=http://172.22.0.2/images +IRONIC_FAST_TRACK=true +IRONIC_KERNEL_PARAMS=console=ttyS0 +IRONIC_INSPECTOR_VLAN_INTERFACES=all +USE_IRONIC_INSPECTOR=true +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/ diff --git a/test/e2e/data/ironic-deployment/overlays/release-23.1/keepalived_patch.yaml b/test/e2e/data/ironic-deployment/overlays/release-23.1/keepalived_patch.yaml new file mode 100644 index 000000000..a6a03cdfb --- /dev/null +++ b/test/e2e/data/ironic-deployment/overlays/release-23.1/keepalived_patch.yaml @@ -0,0 +1,28 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ironic +spec: + template: + spec: + containers: + # Change the value of image field below to your controller image URL + - image: quay.io/metal3-io/keepalived + name: ironic-endpoint-keepalived + securityContext: + # Must be true so dnsmasq may get the capabilities via file caps + # KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-security/2763-ambient-capabilities/README.md + allowPrivilegeEscalation: true + capabilities: + drop: + - ALL + add: + - NET_ADMIN + - NET_BROADCAST + - NET_RAW + privileged: false + runAsUser: 65532 + runAsGroup: 65532 + envFrom: + - configMapRef: + name: ironic-bmo-configmap diff --git a/test/e2e/data/ironic-deployment/overlays/release-23.1/kustomization.yaml b/test/e2e/data/ironic-deployment/overlays/release-23.1/kustomization.yaml new file mode 100644 index 000000000..4d6cabbeb --- /dev/null +++ b/test/e2e/data/ironic-deployment/overlays/release-23.1/kustomization.yaml @@ -0,0 +1,55 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: baremetal-operator-system +namePrefix: baremetal-operator- +resources: +- https://github.com/metal3-io/baremetal-operator/config/namespace?ref=release-0.5 +- https://github.com/metal3-io/baremetal-operator/ironic-deployment/base?ref=release-0.5 + +components: +- https://github.com/metal3-io/baremetal-operator/ironic-deployment/components/basic-auth?ref=release-0.5 +- https://github.com/metal3-io/baremetal-operator/ironic-deployment/components/tls?ref=release-0.5 + +configMapGenerator: +- envs: + - ironic_bmo_configmap.env + name: ironic-bmo-configmap + behavior: create + +patches: +- path: keepalived_patch.yaml + +images: +- name: quay.io/metal3-io/ironic + newTag: release-23.1 + +# NOTE: These credentials are generated automatically in hack/ci-e2e.sh +secretGenerator: +- name: ironic-htpasswd + behavior: create + envs: + - ironic-htpasswd +- name: ironic-inspector-htpasswd + behavior: create + envs: + - ironic-inspector-htpasswd +- name: ironic-auth-config + files: + - auth-config=ironic-auth-config +- name: ironic-inspector-auth-config + files: + - auth-config=ironic-inspector-auth-config + +replacements: +# Replace IRONIC_HOST_IP in certificates with the PROVISIONING_IP from the configmap +- source: + kind: ConfigMap + name: ironic-bmo-configmap + fieldPath: .data.PROVISIONING_IP + targets: + - select: + version: v1 + group: cert-manager.io + kind: Certificate + fieldPaths: + - .spec.ipAddresses.0 diff --git a/test/e2e/data/ironic-deployment/overlays/release-24.0/ironic_bmo_configmap.env b/test/e2e/data/ironic-deployment/overlays/release-24.0/ironic_bmo_configmap.env new file mode 100644 index 000000000..5a1971baa --- /dev/null +++ b/test/e2e/data/ironic-deployment/overlays/release-24.0/ironic_bmo_configmap.env @@ -0,0 +1,12 @@ +HTTP_PORT=6180 +PROVISIONING_IP=172.22.0.2 +CACHEURL=http://172.22.0.2/images +IRONIC_FAST_TRACK=true +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=true diff --git a/test/e2e/data/ironic-deployment/overlays/release-24.0/keepalived_patch.yaml b/test/e2e/data/ironic-deployment/overlays/release-24.0/keepalived_patch.yaml new file mode 100644 index 000000000..a6a03cdfb --- /dev/null +++ b/test/e2e/data/ironic-deployment/overlays/release-24.0/keepalived_patch.yaml @@ -0,0 +1,28 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ironic +spec: + template: + spec: + containers: + # Change the value of image field below to your controller image URL + - image: quay.io/metal3-io/keepalived + name: ironic-endpoint-keepalived + securityContext: + # Must be true so dnsmasq may get the capabilities via file caps + # KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-security/2763-ambient-capabilities/README.md + allowPrivilegeEscalation: true + capabilities: + drop: + - ALL + add: + - NET_ADMIN + - NET_BROADCAST + - NET_RAW + privileged: false + runAsUser: 65532 + runAsGroup: 65532 + envFrom: + - configMapRef: + name: ironic-bmo-configmap diff --git a/test/e2e/data/ironic-deployment/overlays/release-24.0/kustomization.yaml b/test/e2e/data/ironic-deployment/overlays/release-24.0/kustomization.yaml new file mode 100644 index 000000000..dc18b1e42 --- /dev/null +++ b/test/e2e/data/ironic-deployment/overlays/release-24.0/kustomization.yaml @@ -0,0 +1,55 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: baremetal-operator-system +namePrefix: baremetal-operator- +resources: +- https://github.com/metal3-io/baremetal-operator/config/namespace?ref=release-0.5 +- https://github.com/metal3-io/baremetal-operator/ironic-deployment/base?ref=release-0.5 + +components: +- https://github.com/metal3-io/baremetal-operator/ironic-deployment/components/basic-auth?ref=release-0.5 +- https://github.com/metal3-io/baremetal-operator/ironic-deployment/components/tls?ref=release-0.5 + +configMapGenerator: +- envs: + - ironic_bmo_configmap.env + name: ironic-bmo-configmap + behavior: create + +patches: +- path: keepalived_patch.yaml + +images: +- name: quay.io/metal3-io/ironic + newTag: release-24.0 + +# NOTE: These credentials are generated automatically in hack/ci-e2e.sh +secretGenerator: +- name: ironic-htpasswd + behavior: create + envs: + - ironic-htpasswd +- name: ironic-inspector-htpasswd + behavior: create + envs: + - ironic-inspector-htpasswd +- name: ironic-auth-config + files: + - auth-config=ironic-auth-config +- name: ironic-inspector-auth-config + files: + - auth-config=ironic-inspector-auth-config + +replacements: +# Replace IRONIC_HOST_IP in certificates with the PROVISIONING_IP from the configmap +- source: + kind: ConfigMap + name: ironic-bmo-configmap + fieldPath: .data.PROVISIONING_IP + targets: + - select: + version: v1 + group: cert-manager.io + kind: Certificate + fieldPaths: + - .spec.ipAddresses.0 diff --git a/test/e2e/data/ironic-deployment/overlays/release-24.1/ironic_bmo_configmap.env b/test/e2e/data/ironic-deployment/overlays/release-24.1/ironic_bmo_configmap.env new file mode 100644 index 000000000..031be5daf --- /dev/null +++ b/test/e2e/data/ironic-deployment/overlays/release-24.1/ironic_bmo_configmap.env @@ -0,0 +1,12 @@ +HTTP_PORT=6180 +PROVISIONING_IP=172.22.0.2 +CACHEURL=http://172.22.0.2/images +IRONIC_FAST_TRACK=true +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 diff --git a/test/e2e/data/ironic-deployment/overlays/release-24.1/keepalived_patch.yaml b/test/e2e/data/ironic-deployment/overlays/release-24.1/keepalived_patch.yaml new file mode 100644 index 000000000..a6a03cdfb --- /dev/null +++ b/test/e2e/data/ironic-deployment/overlays/release-24.1/keepalived_patch.yaml @@ -0,0 +1,28 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ironic +spec: + template: + spec: + containers: + # Change the value of image field below to your controller image URL + - image: quay.io/metal3-io/keepalived + name: ironic-endpoint-keepalived + securityContext: + # Must be true so dnsmasq may get the capabilities via file caps + # KEP: https://github.com/kubernetes/enhancements/blob/master/keps/sig-security/2763-ambient-capabilities/README.md + allowPrivilegeEscalation: true + capabilities: + drop: + - ALL + add: + - NET_ADMIN + - NET_BROADCAST + - NET_RAW + privileged: false + runAsUser: 65532 + runAsGroup: 65532 + envFrom: + - configMapRef: + name: ironic-bmo-configmap diff --git a/test/e2e/data/ironic-deployment/overlays/release-24.1/kustomization.yaml b/test/e2e/data/ironic-deployment/overlays/release-24.1/kustomization.yaml new file mode 100644 index 000000000..e725a8d8b --- /dev/null +++ b/test/e2e/data/ironic-deployment/overlays/release-24.1/kustomization.yaml @@ -0,0 +1,48 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: baremetal-operator-system +namePrefix: baremetal-operator- +resources: +- https://github.com/metal3-io/baremetal-operator/config/namespace?ref=release-0.6 +- https://github.com/metal3-io/baremetal-operator/ironic-deployment/base?ref=release-0.6 + +components: +- https://github.com/metal3-io/baremetal-operator/ironic-deployment/components/basic-auth?ref=release-0.6 +- https://github.com/metal3-io/baremetal-operator/ironic-deployment/components/tls?ref=release-0.6 + +configMapGenerator: +- envs: + - ironic_bmo_configmap.env + name: ironic-bmo-configmap + behavior: create + +patches: +- path: keepalived_patch.yaml + +images: +- name: quay.io/metal3-io/ironic + newTag: release-24.1 + +# 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 + +replacements: +# Replace IRONIC_HOST_IP in certificates with the PROVISIONING_IP from the configmap +- source: + kind: ConfigMap + name: ironic-bmo-configmap + fieldPath: .data.PROVISIONING_IP + targets: + - select: + version: v1 + group: cert-manager.io + kind: Certificate + fieldPaths: + - .spec.ipAddresses.0 diff --git a/test/e2e/upgrade_baremetal_operator.go b/test/e2e/upgrade_baremetal_operator.go deleted file mode 100644 index 11e78b7f0..000000000 --- a/test/e2e/upgrade_baremetal_operator.go +++ /dev/null @@ -1,62 +0,0 @@ -package e2e - -import ( - "context" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/cluster-api/test/framework" - "sigs.k8s.io/cluster-api/test/framework/clusterctl" -) - -type upgradeBMOInput struct { - E2EConfig *clusterctl.E2EConfig - ManagementCluster framework.ClusterProxy - SpecName string -} - -// upgradeBMO upgrades BMO image to the latest. -func upgradeBMO(ctx context.Context, inputGetter func() upgradeBMOInput) { - Logf("Starting BMO containers upgrade tests") - input := inputGetter() - var ( - clientSet = input.ManagementCluster.GetClientSet() - namePrefix = input.E2EConfig.GetVariable("NAMEPREFIX") - // BMO and Ironic share namespace - bmoNamespace = input.E2EConfig.GetVariable("IRONIC_NAMESPACE") - bmoDeployName = namePrefix + "-controller-manager" - containerRegistry = input.E2EConfig.GetVariable("CONTAINER_REGISTRY") - bmoImageTag = input.E2EConfig.GetVariable("UPGRADED_BMO_IMAGE_TAG") - bmoImage = containerRegistry + "/metal3-io/baremetal-operator:" + bmoImageTag - ) - - Logf("namePrefix %v", namePrefix) - Logf("bmoNamespace %v", bmoNamespace) - Logf("bmoDeployName %v", bmoDeployName) - Logf("containerRegistry %v", containerRegistry) - Logf("bmoImageTag %v", bmoImageTag) - - By("Upgrading BMO deployment") - deploy, err := clientSet.AppsV1().Deployments(bmoNamespace).Get(ctx, bmoDeployName, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) - for i, container := range deploy.Spec.Template.Spec.Containers { - if container.Name == "manager" { - Logf("Old image: %v", deploy.Spec.Template.Spec.Containers[i].Image) - Logf("New image: %v", bmoImage) - deploy.Spec.Template.Spec.Containers[i].Image = bmoImage - } - } - - _, err = clientSet.AppsV1().Deployments(bmoNamespace).Update(ctx, deploy, metav1.UpdateOptions{}) - Expect(err).ToNot(HaveOccurred()) - - By("Waiting for BMO update to rollout") - Eventually(func() bool { - return DeploymentRolledOut(ctx, clientSet, bmoDeployName, bmoNamespace, deploy.Status.ObservedGeneration+1) - }, - input.E2EConfig.GetIntervals(input.SpecName, "wait-deployment")..., - ).Should(BeTrue()) - - By("BMO UPGRADE TESTS PASSED!") -} diff --git a/test/e2e/upgrade_clusterctl_test.go b/test/e2e/upgrade_clusterctl_test.go index e54eab4c8..47e49c7ba 100644 --- a/test/e2e/upgrade_clusterctl_test.go +++ b/test/e2e/upgrade_clusterctl_test.go @@ -25,6 +25,8 @@ var ( providerCAPIPrefix = "cluster-api:v%s" providerKubeadmPrefix = "kubeadm:v%s" providerMetal3Prefix = "metal3:v%s" + ironicGoproxy = "https://proxy.golang.org/github.com/metal3-io/ironic-image/@v/list" + bmoGoproxy = "https://proxy.golang.org/github.com/metal3-io/baremetal-operator/@v/list" ) var _ = Describe("When testing cluster upgrade from releases (v1.6=>current) [clusterctl-upgrade]", func() { @@ -60,17 +62,21 @@ var _ = Describe("When testing cluster upgrade from releases (v1.6=>current) [cl WorkloadKubernetesVersion: "v1.29.0", InitWithBinary: fmt.Sprintf(clusterctlDownloadURL, capiStableRelease), PreInit: func(clusterProxy framework.ClusterProxy) { - preInitFunc(clusterProxy) + preInitFunc(clusterProxy, "0.5", "24.0") // Override capi/capm3 versions exported in preInit os.Setenv("CAPI_VERSION", "v1beta1") os.Setenv("CAPM3_VERSION", "v1beta1") os.Setenv("KUBECONFIG_BOOTSTRAP", bootstrapClusterProxy.GetKubeconfigPath()) }, - PostNamespaceCreated: postNamespaceCreated, - PreUpgrade: preUpgrade, - PreCleanupManagementCluster: preCleanupManagementCluster, - MgmtFlavor: osType, - WorkloadFlavor: osType, + PostNamespaceCreated: postNamespaceCreated, + PreUpgrade: func(clusterProxy framework.ClusterProxy) { + preUpgrade(clusterProxy, "24.1", "0.6") + }, + PreCleanupManagementCluster: func(clusterProxy framework.ClusterProxy) { + preCleanupManagementCluster(clusterProxy, "24.1") + }, + MgmtFlavor: osType, + WorkloadFlavor: osType, } }) AfterEach(func() { @@ -94,7 +100,7 @@ var _ = Describe("When testing cluster upgrade from releases (v1.6=>current) [cl }) }) -var _ = Describe("When testing cluster upgrade from releases (v1.5=>current) [clusterctl-upgrade]", func() { +var _ = Describe("When testing cluster upgrade from releases (v1.6=>current) [clusterctl-upgrade]", func() { BeforeEach(func() { osType := strings.ToLower(os.Getenv("OS")) Expect(osType).ToNot(Equal("")) @@ -127,17 +133,21 @@ var _ = Describe("When testing cluster upgrade from releases (v1.5=>current) [cl WorkloadKubernetesVersion: "v1.28.1", InitWithBinary: fmt.Sprintf(clusterctlDownloadURL, capiStableRelease), PreInit: func(clusterProxy framework.ClusterProxy) { - preInitFunc(clusterProxy) + preInitFunc(clusterProxy, "0.5", "23.1") // Override capi/capm3 versions exported in preInit os.Setenv("CAPI_VERSION", "v1beta1") os.Setenv("CAPM3_VERSION", "v1beta1") os.Setenv("KUBECONFIG_BOOTSTRAP", bootstrapClusterProxy.GetKubeconfigPath()) }, - PostNamespaceCreated: postNamespaceCreated, - PreUpgrade: preUpgrade, - PreCleanupManagementCluster: preCleanupManagementCluster, - MgmtFlavor: osType, - WorkloadFlavor: osType, + PostNamespaceCreated: postNamespaceCreated, + PreUpgrade: func(clusterProxy framework.ClusterProxy) { + preUpgrade(clusterProxy, "24.1", "0.6") + }, + PreCleanupManagementCluster: func(clusterProxy framework.ClusterProxy) { + preCleanupManagementCluster(clusterProxy, "24.1") + }, + MgmtFlavor: osType, + WorkloadFlavor: osType, } }) AfterEach(func() { @@ -194,7 +204,7 @@ func postNamespaceCreated(clusterProxy framework.ClusterProxy, clusterNamespace // preInitFunc hook function that should be called from ClusterctlUpgradeSpec before init the management cluster // it installs certManager, BMO and Ironic and overrides the default IPs for the workload cluster. -func preInitFunc(clusterProxy framework.ClusterProxy) { +func preInitFunc(clusterProxy framework.ClusterProxy, bmoRelease string, ironicRelease string) { installCertManager := func(clusterProxy framework.ClusterProxy) { certManagerLink := fmt.Sprintf("https://github.com/cert-manager/cert-manager/releases/download/%s/cert-manager.yaml", config.CertManagerDefaultVersion) err := DownloadFile("/tmp/certManager.yaml", certManagerLink) @@ -249,46 +259,42 @@ func preInitFunc(clusterProxy framework.ClusterProxy) { NamePrefix: e2eConfig.GetVariable(NamePrefix), } }) - + bmoIronicNamespace := e2eConfig.GetVariable(ironicNamespace) // install ironic By("Install Ironic in the target cluster") - installIronicBMO(ctx, func() installIronicBMOInput { - return installIronicBMOInput{ - ManagementCluster: clusterProxy, - BMOPath: e2eConfig.GetVariable(bmoPath), - deployIronic: true, - deployBMO: false, - deployIronicTLSSetup: getBool(e2eConfig.GetVariable(ironicTLSSetup)), - deployIronicBasicAuth: getBool(e2eConfig.GetVariable(ironicBasicAuth)), - deployIronicKeepalived: getBool(e2eConfig.GetVariable(ironicKeepalived)), - deployIronicMariadb: getBool(e2eConfig.GetVariable(ironicMariadb)), - Namespace: e2eConfig.GetVariable(ironicNamespace), - NamePrefix: e2eConfig.GetVariable(NamePrefix), - RestartContainerCertUpdate: getBool(e2eConfig.GetVariable(restartContainerCertUpdate)), - E2EConfig: e2eConfig, - SpecName: specName, - } + ironicDeployLogFolder := filepath.Join(os.TempDir(), "ironic-deploy-logs", clusterProxy.GetName()) + ironicKustomizePath := fmt.Sprintf("IRONIC_RELEASE_%s", ironicRelease) + initIronicKustomization := e2eConfig.GetVariable(ironicKustomizePath) + By(fmt.Sprintf("Installing Ironic from kustomization %s on the upgrade cluster", initIronicKustomization)) + err := BuildAndApplyKustomization(ctx, &BuildAndApplyKustomizationInput{ + Kustomization: initIronicKustomization, + ClusterProxy: clusterProxy, + WaitForDeployment: true, + WatchDeploymentLogs: true, + LogPath: ironicDeployLogFolder, + DeploymentName: "baremetal-operator-ironic", + DeploymentNamespace: bmoIronicNamespace, + WaitIntervals: e2eConfig.GetIntervals("default", "wait-deployment"), }) + Expect(err).NotTo(HaveOccurred()) // install bmo - By("Install BMO") - installIronicBMO(ctx, func() installIronicBMOInput { - return installIronicBMOInput{ - ManagementCluster: clusterProxy, - BMOPath: e2eConfig.GetVariable(bmoPath), - deployIronic: false, - deployBMO: true, - deployIronicTLSSetup: getBool(e2eConfig.GetVariable(ironicTLSSetup)), - deployIronicBasicAuth: getBool(e2eConfig.GetVariable(ironicBasicAuth)), - deployIronicKeepalived: getBool(e2eConfig.GetVariable(ironicKeepalived)), - deployIronicMariadb: getBool(e2eConfig.GetVariable(ironicMariadb)), - Namespace: e2eConfig.GetVariable(ironicNamespace), - NamePrefix: e2eConfig.GetVariable(NamePrefix), - RestartContainerCertUpdate: getBool(e2eConfig.GetVariable(restartContainerCertUpdate)), - E2EConfig: e2eConfig, - SpecName: specName, - } + By("Install BMO in the target cluster") + bmoDeployLogFolder := filepath.Join(os.TempDir(), "bmo-deploy-logs", clusterProxy.GetName()) + bmoKustomizePath := fmt.Sprintf("BMO_RELEASE_%s", bmoRelease) + initBMOKustomization := e2eConfig.GetVariable(bmoKustomizePath) + By(fmt.Sprintf("Installing BMO from kustomization %s on the upgrade cluster", initBMOKustomization)) + err = BuildAndApplyKustomization(ctx, &BuildAndApplyKustomizationInput{ + Kustomization: initBMOKustomization, + ClusterProxy: clusterProxy, + WaitForDeployment: true, + WatchDeploymentLogs: true, + LogPath: bmoDeployLogFolder, + DeploymentName: "baremetal-operator-controller-manager", + DeploymentNamespace: bmoIronicNamespace, + WaitIntervals: e2eConfig.GetIntervals("default", "wait-deployment"), }) + Expect(err).NotTo(HaveOccurred()) // Export capi/capm3 versions os.Setenv("CAPI_VERSION", "v1beta1") @@ -308,27 +314,48 @@ func preInitFunc(clusterProxy framework.ClusterProxy) { // preUpgrade hook should be called from ClusterctlUpgradeSpec before upgrading the management cluster // it upgrades Ironic and BMO before upgrading the providers. -func preUpgrade(clusterProxy framework.ClusterProxy) { - upgradeIronic(ctx, func() upgradeIronicInput { - return upgradeIronicInput{ - E2EConfig: e2eConfig, - ManagementCluster: clusterProxy, - SpecName: specName, - } +func preUpgrade(clusterProxy framework.ClusterProxy, ironicUpgradeToRelease string, bmoUpgradeToRelease string) { + bmoIronicNamespace := e2eConfig.GetVariable(ironicNamespace) + + By("Upgrade Ironic in the target cluster") + ironicDeployLogFolder := filepath.Join(os.TempDir(), "ironic-deploy-logs", clusterProxy.GetName()) + ironicKustomizePath := fmt.Sprintf("IRONIC_RELEASE_%s", ironicUpgradeToRelease) + initIronicKustomization := e2eConfig.GetVariable(ironicKustomizePath) + By(fmt.Sprintf("Upgrading Ironic from kustomization %s on the upgrade cluster", initIronicKustomization)) + err := BuildAndApplyKustomization(ctx, &BuildAndApplyKustomizationInput{ + Kustomization: initIronicKustomization, + ClusterProxy: clusterProxy, + WaitForDeployment: true, + WatchDeploymentLogs: true, + LogPath: ironicDeployLogFolder, + DeploymentName: "baremetal-operator-ironic", + DeploymentNamespace: bmoIronicNamespace, + WaitIntervals: e2eConfig.GetIntervals("default", "wait-deployment"), }) - upgradeBMO(ctx, func() upgradeBMOInput { - return upgradeBMOInput{ - E2EConfig: e2eConfig, - ManagementCluster: clusterProxy, - SpecName: specName, - } + Expect(err).NotTo(HaveOccurred()) + + // install bmo + By("Upgrade BMO in the target cluster") + bmoDeployLogFolder := filepath.Join(os.TempDir(), "bmo-deploy-logs", clusterProxy.GetName()) + bmoKustomizePath := fmt.Sprintf("BMO_RELEASE_%s", bmoUpgradeToRelease) + initBMOKustomization := e2eConfig.GetVariable(bmoKustomizePath) + By(fmt.Sprintf("Upgrading BMO from kustomization %s on the upgrade cluster", initBMOKustomization)) + err = BuildAndApplyKustomization(ctx, &BuildAndApplyKustomizationInput{ + Kustomization: initBMOKustomization, + ClusterProxy: clusterProxy, + WaitForDeployment: true, + WatchDeploymentLogs: true, + LogPath: bmoDeployLogFolder, + DeploymentName: "baremetal-operator-controller-manager", + DeploymentNamespace: bmoIronicNamespace, + WaitIntervals: e2eConfig.GetIntervals("default", "wait-deployment"), }) + Expect(err).NotTo(HaveOccurred()) } // preCleanupManagementCluster hook should be called from ClusterctlUpgradeSpec before cleaning the target management cluster // it moves back Ironic to the bootstrap cluster. -func preCleanupManagementCluster(clusterProxy framework.ClusterProxy) { - // Abort the test in case of failure and keepTestEnv is true during keep VM trigger +func preCleanupManagementCluster(clusterProxy framework.ClusterProxy, ironicRelease string) { if CurrentSpecReport().Failed() { // Fetch logs in case of failure in management cluster By("Fetch logs from management cluster") @@ -359,7 +386,7 @@ func preCleanupManagementCluster(clusterProxy framework.ClusterProxy) { } os.Unsetenv("KUBECONFIG_WORKLOAD") os.Unsetenv("KUBECONFIG_BOOTSTRAP") - + bmoIronicNamespace := e2eConfig.GetVariable(ironicNamespace) // Reinstall ironic reInstallIronic := func() { By("Reinstate Ironic containers and BMH") @@ -375,23 +402,23 @@ func preCleanupManagementCluster(clusterProxy framework.ClusterProxy) { Expect(err).ToNot(HaveOccurred(), "Cannot run local ironic") } else { By("Install Ironic in the source cluster as deployments") - installIronicBMO(ctx, func() installIronicBMOInput { - return installIronicBMOInput{ - ManagementCluster: bootstrapClusterProxy, - BMOPath: e2eConfig.GetVariable(bmoPath), - deployIronic: true, - deployBMO: false, - deployIronicTLSSetup: getBool(e2eConfig.GetVariable(ironicTLSSetup)), - deployIronicBasicAuth: getBool(e2eConfig.GetVariable(ironicBasicAuth)), - deployIronicKeepalived: getBool(e2eConfig.GetVariable(ironicKeepalived)), - deployIronicMariadb: getBool(e2eConfig.GetVariable(ironicMariadb)), - Namespace: e2eConfig.GetVariable(ironicNamespace), - NamePrefix: e2eConfig.GetVariable(NamePrefix), - RestartContainerCertUpdate: getBool(e2eConfig.GetVariable(restartContainerCertUpdate)), - E2EConfig: e2eConfig, - SpecName: specName, - } + ironicDeployLogFolder := filepath.Join(os.TempDir(), "ironic-deploy-logs", bootstrapClusterProxy.GetName()) + ironicKustomizePath := fmt.Sprintf("IRONIC_RELEASE_%s", ironicRelease) + initIronicKustomization := e2eConfig.GetVariable(ironicKustomizePath) + namePrefix := e2eConfig.GetVariable("NAMEPREFIX") + ironicDeployName := namePrefix + ironicSuffix + By(fmt.Sprintf("Installing Ironic from kustomization %s on the upgrade cluster", initIronicKustomization)) + err := BuildAndApplyKustomization(ctx, &BuildAndApplyKustomizationInput{ + Kustomization: initIronicKustomization, + ClusterProxy: bootstrapClusterProxy, + WaitForDeployment: true, + WatchDeploymentLogs: true, + LogPath: ironicDeployLogFolder, + DeploymentName: ironicDeployName, + DeploymentNamespace: bmoIronicNamespace, + WaitIntervals: e2eConfig.GetIntervals("default", "wait-deployment"), }) + Expect(err).NotTo(HaveOccurred()) } } removeIronic(ctx, func() RemoveIronicInput { diff --git a/test/e2e/upgrade_ironic.go b/test/e2e/upgrade_ironic.go deleted file mode 100644 index 99cc7b777..000000000 --- a/test/e2e/upgrade_ironic.go +++ /dev/null @@ -1,63 +0,0 @@ -package e2e - -import ( - "context" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/cluster-api/test/framework" - "sigs.k8s.io/cluster-api/test/framework/clusterctl" -) - -type upgradeIronicInput struct { - E2EConfig *clusterctl.E2EConfig - ManagementCluster framework.ClusterProxy - SpecName string -} - -// upgradeIronic upgrades ironic image to the latest. -func upgradeIronic(ctx context.Context, inputGetter func() upgradeIronicInput) { - Logf("Starting ironic containers upgrade tests") - input := inputGetter() - var ( - clientSet = input.ManagementCluster.GetClientSet() - namePrefix = input.E2EConfig.GetVariable("NAMEPREFIX") - ironicNamespace = input.E2EConfig.GetVariable("IRONIC_NAMESPACE") - ironicDeployName = namePrefix + ironicSuffix - containerRegistry = input.E2EConfig.GetVariable("CONTAINER_REGISTRY") - ironicImageTag = input.E2EConfig.GetVariable("IRONIC_IMAGE_TAG") - ) - - Logf("namePrefix %v", namePrefix) - Logf("ironicNamespace %v", ironicNamespace) - Logf("ironicDeployName %v", ironicDeployName) - Logf("containerRegistry %v", containerRegistry) - Logf("ironicImageTag %v", ironicImageTag) - - By("Upgrading ironic image based containers") - deploy, err := clientSet.AppsV1().Deployments(ironicNamespace).Get(ctx, ironicDeployName, metav1.GetOptions{}) - Expect(err).ToNot(HaveOccurred()) - for i, container := range deploy.Spec.Template.Spec.Containers { - switch container.Name { - case - "ironic", - "ironic-dnsmasq", - "ironic-log-watch", - "ironic-inspector": - deploy.Spec.Template.Spec.Containers[i].Image = containerRegistry + "/metal3-io/ironic:" + ironicImageTag - } - } - - _, err = clientSet.AppsV1().Deployments(ironicNamespace).Update(ctx, deploy, metav1.UpdateOptions{}) - Expect(err).ToNot(HaveOccurred()) - - By("Waiting for ironic update to rollout") - Eventually(func() bool { - return DeploymentRolledOut(ctx, clientSet, ironicDeployName, ironicNamespace, deploy.Status.ObservedGeneration+1) - }, - input.E2EConfig.GetIntervals(input.SpecName, "wait-deployment")..., - ).Should(BeTrue()) - - By("IRONIC CONTAINERS UPGRADE TESTS PASSED!") -} diff --git a/test/go.mod b/test/go.mod index 85d9610f4..fac538b33 100644 --- a/test/go.mod +++ b/test/go.mod @@ -3,6 +3,7 @@ module github.com/metal3-io/cluster-api-provider-metal3/test go 1.21 require ( + github.com/blang/semver v3.5.1+incompatible github.com/docker/docker v26.0.2+incompatible github.com/jinzhu/copier v0.4.0 github.com/metal3-io/baremetal-operator/apis v0.6.1 @@ -21,12 +22,13 @@ require ( sigs.k8s.io/cluster-api v1.7.3 sigs.k8s.io/cluster-api/test v1.7.3 sigs.k8s.io/controller-runtime v0.17.3 + sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 ) replace github.com/metal3-io/cluster-api-provider-metal3/api => ./../api require ( - github.com/BurntSushi/toml v1.0.0 // indirect + github.com/BurntSushi/toml v1.1.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver/v3 v3.2.0 // indirect @@ -52,6 +54,7 @@ require ( github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/go-errors/errors v1.4.2 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect @@ -70,6 +73,7 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.4.0 // indirect @@ -88,9 +92,10 @@ require ( github.com/moby/docker-image-spec v1.3.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/prometheus/client_golang v1.18.0 // indirect @@ -99,6 +104,7 @@ require ( github.com/prometheus/procfs v0.12.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sergi/go-diff v1.2.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect @@ -109,10 +115,12 @@ require ( github.com/stoewer/go-strcase v1.2.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/valyala/fastjson v1.6.4 // indirect + github.com/xlab/treeprint v1.2.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.0 // indirect go.opentelemetry.io/otel v1.22.0 // indirect go.opentelemetry.io/otel/metric v1.22.0 // indirect go.opentelemetry.io/otel/trace v1.22.0 // indirect + go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.17.0 // indirect @@ -140,6 +148,7 @@ require ( k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kind v0.23.0 // indirect + sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/test/go.sum b/test/go.sum index ed6cf8feb..a03111aa5 100644 --- a/test/go.sum +++ b/test/go.sum @@ -1,7 +1,9 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU= -github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= +github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= @@ -24,13 +26,20 @@ github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/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= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= @@ -63,6 +72,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.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 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 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= @@ -74,6 +85,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= @@ -94,8 +107,18 @@ github.com/gobuffalo/flect v1.0.2 h1:eqjPGSo2WmjgY2XlpGwo2NXgL3RucAKo4k4qQMNA5sA github.com/gobuffalo/flect v1.0.2/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= @@ -105,6 +128,11 @@ github.com/google/cel-go v0.17.7/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulN github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -121,6 +149,8 @@ github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQN github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 h1:SJ+NtwL6QaZ21U+IrK7d0gGgpjGGvd2kz+FzTHVzdqI= github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2/go.mod h1:Tv1PlzqC9t8wNnpPdctvtSUOPUUg4SHeE6vR1Ir2hmg= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -147,6 +177,7 @@ 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.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -185,6 +216,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -195,8 +228,8 @@ github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= +github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= @@ -208,6 +241,7 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= @@ -221,6 +255,8 @@ github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6ke github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -243,9 +279,11 @@ github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ai github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= 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 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 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= @@ -258,6 +296,8 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ= github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= @@ -287,6 +327,8 @@ go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -300,13 +342,21 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -316,14 +366,18 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -332,6 +386,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -339,6 +394,7 @@ golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= @@ -352,6 +408,10 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 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= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -364,21 +424,38 @@ 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/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/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= @@ -386,6 +463,7 @@ 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.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -396,6 +474,8 @@ 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= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/api v0.29.6 h1:eDxIl8+PeEpwbe2YyS5RXJ9vdn4hnKWMBf4WUJP9DQM= k8s.io/api v0.29.6/go.mod h1:ZuUPMhJV74DJXapldbg6upaHfiOjrBb+0ffUbBi1jaw= k8s.io/apiextensions-apiserver v0.29.6 h1:tUu1N6Zt9GT8KVcPF5aGDqfISz1mveM4yFh7eL5bxmE= @@ -428,6 +508,10 @@ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMm sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kind v0.23.0 h1:8fyDGWbWTeCcCTwA04v4Nfr45KKxbSPH1WO9K+jVrBg= sigs.k8s.io/kind v0.23.0/go.mod h1:ZQ1iZuJLh3T+O8fzhdi3VWcFTzsdXtNv2ppsHc8JQ7s= +sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 h1:XX3Ajgzov2RKUdc5jW3t5jwY7Bo7dcRm+tFxT+NfgY0= +sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3/go.mod h1:9n16EZKMhXBNSiUC5kSdFQJkdH3zbxS/JoO619G1VAY= +sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3 h1:W6cLQc5pnqM7vh3b7HvGNfXrJ/xL6BDMS0v1V/HHg5U= +sigs.k8s.io/kustomize/kyaml v0.14.3-0.20230601165947-6ce0bf390ce3/go.mod h1:JWP1Fj0VWGHyw3YUPjXSQnRnrwezrZSrApfX5S0nIag= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=