diff --git a/.buildkite/testsuite.yml b/.buildkite/testsuite.yml index 63c58f7eb..6246e089c 100644 --- a/.buildkite/testsuite.yml +++ b/.buildkite/testsuite.yml @@ -93,7 +93,7 @@ steps: automatic: limit: 3 soft_fail: false - timeout_in_minutes: 90 + timeout_in_minutes: 150 - continue_on_failure: true wait: null - agents: diff --git a/.changes/unreleased/charts-redpanda-Deprecated-20251021-143834.yaml b/.changes/unreleased/charts-redpanda-Deprecated-20251021-143834.yaml new file mode 100644 index 000000000..4e119631c --- /dev/null +++ b/.changes/unreleased/charts-redpanda-Deprecated-20251021-143834.yaml @@ -0,0 +1,4 @@ +project: charts/redpanda +kind: Deprecated +body: '- `statefulset.sideCars.controllers.createRBAC` is deprecated and no longer respected. In most cases, setting this field to `false` would result in a broken deployment. RBAC may be controlled via `rbac.enabled` or per controller via `statefulset.sideCars.controllers.{pvcUnbinder,brokerDecommissioner}.enabled`.' +time: 2025-10-21T14:38:34.206376-04:00 diff --git a/.changes/unreleased/charts-redpanda-Deprecated-20251021-144413.yaml b/.changes/unreleased/charts-redpanda-Deprecated-20251021-144413.yaml new file mode 100644 index 000000000..56b691e97 --- /dev/null +++ b/.changes/unreleased/charts-redpanda-Deprecated-20251021-144413.yaml @@ -0,0 +1,4 @@ +project: charts/redpanda +kind: Deprecated +body: '`statefulset.sideCars.controllers.run` has been unused for many releases and is now deprecated. Individual controllers may be enabled/disabled by setting their enabled field: `statefulset.sideCars.pvcUnbinder.enabled`, `statefulset.sideCars.brokerDecommissioner.enabled`.' +time: 2025-10-21T14:44:13.331483-04:00 diff --git a/Taskfile.yml b/Taskfile.yml index d1acdf424..4dbecdc37 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -170,6 +170,8 @@ tasks: vars: CLI_ARGS: '' # Don't forward CLI args to build:image - task: build:charts + vars: + RUN: '{{ default `"^TestIntegration"` .RUN }}' cmds: - task: charts:kind-cluster - kind load docker-image localhost/redpanda-operator:dev @@ -177,7 +179,7 @@ tasks: vars: GO_TEST_RUNNER: ref: .GO_TEST_RUNNER - CLI_ARGS: '{{.CLI_ARGS}} -p=1 -run "^TestIntegration" -timeout 60m -tags integration' + CLI_ARGS: '{{.CLI_ARGS}} -p=1 -run {{.RUN}} -timeout 60m -tags integration' test:acceptance: desc: "Run all acceptance tests (~90m)" @@ -191,16 +193,6 @@ tasks: RUN: '{{ default `"^TestAcceptance"` .RUN }}' GO_TEST_RUNNER: '{{default "go test" .GO_TEST_RUNNER}}' cmds: - - defer: 'k3d cluster delete harpoon' - - | - k3d cluster create harpoon \ - --agents=5 --timeout=3m --image=rancher/k3s:v1.29.6-k3s2 \ - --k3s-arg --kube-controller-manager-arg=node-monitor-grace-period=10s@server:* \ - --k3s-arg --kube-apiserver-arg=default-not-ready-toleration-seconds=10@server:* \ - --k3s-arg --kube-apiserver-arg=default-unreachable-toleration-seconds=10@server:* \ - --k3s-arg --disable=traefik@server:* \ - --verbose - - task: test:import-images - task: test:unit vars: GO_TEST_RUNNER: @@ -238,31 +230,3 @@ tasks: cmds: - for: {var: IMAGES} cmd: docker inspect {{.ITEM}} > /dev/null || docker pull {{.ITEM}} - - test:import-images: - vars: - DEFAULT_TEST_CERTMANAGER_VERSION: v1.14.2 - DEFAULT_TEST_REDPANDA_REPO: docker.redpanda.com/redpandadata/redpanda - DEFAULT_TEST_REDPANDA_VERSION: v25.1.1 - DEFAULT_TEST_UPGRADE_REDPANDA_REPO: docker.redpanda.com/redpandadata/redpanda - DEFAULT_TEST_UPGRADE_REDPANDA_VERSION: v24.3.11 - DEFAULT_TEST_UPGRADE_OPERATOR_VERSION: v2.3.9-24.3.11 - TEST_CERTMANAGER_VERSION: '{{ .TEST_CERTMANAGER_VERSION | default .DEFAULT_TEST_CERTMANAGER_VERSION }}' - TEST_REDPANDA_REPO: '{{ .TEST_REDPANDA_REPO | default .DEFAULT_TEST_REDPANDA_REPO }}' - TEST_REDPANDA_VERSION: '{{ .TEST_REDPANDA_VERSION | default .DEFAULT_TEST_REDPANDA_VERSION }}' - TEST_UPGRADE_REDPANDA_REPO: '{{ .TEST_UPGRADE_REDPANDA_REPO | default .DEFAULT_TEST_UPGRADE_REDPANDA_REPO }}' - TEST_UPGRADE_REDPANDA_VERSION: '{{ .TEST_UPGRADE_REDPANDA_VERSION | default .DEFAULT_TEST_UPGRADE_REDPANDA_VERSION }}' - TEST_UPGRADE_OPERATOR_VERSION: '{{ .TEST_UPGRADE_OPERATOR_VERSION | default .DEFAULT_TEST_UPGRADE_OPERATOR_VERSION }}' - IMAGES: - - quay.io/jetstack/cert-manager-controller:{{.TEST_CERTMANAGER_VERSION}} - - quay.io/jetstack/cert-manager-cainjector:{{.TEST_CERTMANAGER_VERSION}} - - quay.io/jetstack/cert-manager-startupapicheck:{{.TEST_CERTMANAGER_VERSION}} - - quay.io/jetstack/cert-manager-webhook:{{.TEST_CERTMANAGER_VERSION}} - - '{{.TEST_REDPANDA_REPO}}:{{.TEST_REDPANDA_VERSION}}' - - '{{.DEFAULT_TEST_UPGRADE_REDPANDA_REPO}}:{{.TEST_UPGRADE_REDPANDA_VERSION}}' - - docker.redpanda.com/redpandadata/redpanda-operator:{{.TEST_UPGRADE_OPERATOR_VERSION}} - - localhost/redpanda-operator:dev - - cmds: - - for: {var: IMAGES} - cmd: k3d image import {{.ITEM}} -c harpoon diff --git a/acceptance/features/helm-chart.feature b/acceptance/features/helm-chart.feature new file mode 100644 index 000000000..0f8090eda --- /dev/null +++ b/acceptance/features/helm-chart.feature @@ -0,0 +1,39 @@ +@operator:none +Feature: Redpanda Helm Chart + + Scenario: Tolerating Node Failure + Given I helm install "redpanda" "../charts/redpanda" with values: + ```yaml + nameOverride: foobar + fullnameOverride: bazquux + + statefulset: + sideCars: + image: + tag: dev + repository: localhost/redpanda-operator + pvcUnbinder: + enabled: true + unbindAfter: 15s + brokerDecommissioner: + enabled: true + decommissionAfter: 15s + ``` + When I stop the Node running Pod "bazquux-2" + And Pod "bazquux-2" is eventually Pending + Then Pod "bazquux-2" will eventually be Running + And kubectl exec -it "bazquux-0" "rpk redpanda admin brokers list | sed -E 's/\s+/ /gm' | cut -d ' ' -f 1,6" will eventually output: + ``` + ID MEMBERSHIP + 0 active + 1 active + 3 active + ``` + And kubectl exec -it "bazquux-0" "rpk redpanda admin brokers list --include-decommissioned | sed -E 's/\s+/ /gm' | cut -d ' ' -f 1,6" will eventually output: + ``` + ID MEMBERSHIP + 0 active + 1 active + 3 active + 2 - + ``` diff --git a/acceptance/features/migration.feature b/acceptance/features/migration.feature new file mode 100644 index 000000000..81cbd07c6 --- /dev/null +++ b/acceptance/features/migration.feature @@ -0,0 +1,33 @@ +Feature: Helm chart to Redpanda Operator migration + + @skip:gke @skip:aks @skip:eks + Scenario: Migrate from a Helm chart release to a Redpanda custom resource + Given I helm install "redpanda-migration-example" "../charts/redpanda" with values: + """ + # tag::helm-values[] + fullnameOverride: name-override + # end::helm-values[] + # Without the below values, the operator would have to modify the cluster after the migration. + # As this is test specific because we use a local version of the operator, this block is excluded from the helm-values tag above. + statefulset: + sideCars: + image: + repository: localhost/redpanda-operator + tag: dev + """ + When I apply Kubernetes manifest: + """ + # tag::redpanda-custom-resource-manifest[] + --- + apiVersion: cluster.redpanda.com/v1alpha2 + kind: Redpanda + metadata: + name: redpanda-migration-example + spec: + # This manifest is a copy of Redpanda release Helm values + clusterSpec: + fullnameOverride: name-override + # end::redpanda-custom-resource-manifest[] + """ + Then cluster "redpanda-migration-example" is available + And the cluster "redpanda-migration-example" is healthy diff --git a/acceptance/go.mod b/acceptance/go.mod index 4caea6031..a6197b4fc 100644 --- a/acceptance/go.mod +++ b/acceptance/go.mod @@ -9,10 +9,10 @@ require ( github.com/go-logr/logr v1.4.2 github.com/prometheus/common v0.55.0 github.com/quasilyte/go-ruleguard/dsl v0.3.22 - github.com/redpanda-data/common-go/rpadmin v0.1.13-0.20250109154132-12ac78a58f95 + github.com/redpanda-data/common-go/rpadmin v0.1.14-0.20250425125657-8ab73f3ad62e github.com/redpanda-data/redpanda-operator/harpoon v0.0.0-00010101000000-000000000000 - github.com/redpanda-data/redpanda-operator/operator v0.0.0-20250123152815-98530dc8f04d - github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20250123101329-b89e4b888a74 + github.com/redpanda-data/redpanda-operator/operator v0.0.0-20251125071431-634f74e9db59 + github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20251125071431-634f74e9db59 github.com/stretchr/testify v1.10.0 github.com/twmb/franz-go v1.18.0 github.com/twmb/franz-go/pkg/kadm v1.12.0 @@ -22,6 +22,7 @@ require ( k8s.io/client-go v0.30.3 k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 sigs.k8s.io/controller-runtime v0.18.5 + sigs.k8s.io/yaml v1.4.0 ) require ( @@ -32,12 +33,23 @@ require ( buf.build/gen/go/redpandadata/common/protocolbuffers/go v1.34.2-20240715174743-9c0afe867874.2 // indirect buf.build/gen/go/redpandadata/dataplane/connectrpc/go v1.16.2-20240620104934-3415ce922cfb.1 // indirect buf.build/gen/go/redpandadata/dataplane/protocolbuffers/go v1.34.2-20240620104934-3415ce922cfb.2 // indirect + cloud.google.com/go/auth v0.9.9 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect + cloud.google.com/go/compute/metadata v0.5.2 // indirect + cloud.google.com/go/iam v1.2.1 // indirect + cloud.google.com/go/secretmanager v1.14.2 // indirect connectrpc.com/connect v1.16.2 // indirect dario.cat/mergo v1.0.1 // indirect emperror.dev/errors v0.8.1 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect github.com/AlecAivazis/survey/v2 v2.3.7 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets v0.12.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect github.com/BurntSushi/toml v1.4.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect @@ -45,7 +57,22 @@ require ( github.com/Masterminds/sprig/v3 v3.3.0 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect github.com/Microsoft/hcsshim v0.12.3 // indirect + github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect + github.com/aws/aws-sdk-go-v2 v1.32.3 // indirect + github.com/aws/aws-sdk-go-v2/config v1.28.1 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.42 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 // indirect + github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect + github.com/aws/smithy-go v1.22.0 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/buger/jsonparser v1.1.1 // indirect @@ -62,7 +89,7 @@ require ( github.com/containerd/log v0.1.0 // indirect github.com/cucumber/gherkin/go/v26 v26.2.0 // indirect github.com/cucumber/messages/go/v21 v21.0.1 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/cyphar/filepath-securejoin v0.2.5 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/cli v25.0.1+incompatible // indirect @@ -72,7 +99,7 @@ require ( github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-metrics v0.0.1 // 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/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/color v1.17.0 // indirect @@ -80,18 +107,22 @@ require ( github.com/fluxcd/pkg/apis/acl v0.1.0 // indirect github.com/fluxcd/pkg/apis/kustomize v1.2.0 // indirect github.com/fluxcd/pkg/apis/meta v1.2.0 // indirect + github.com/fluxcd/pkg/runtime v0.43.3 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-chi/chi/v5 v5.0.12 // indirect github.com/go-errors/errors v1.5.1 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-logr/zapr v1.3.0 // 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.1 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v5 v5.2.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/gonvenience/bunt v1.3.5 // indirect @@ -100,14 +131,18 @@ require ( github.com/gonvenience/text v1.0.7 // indirect github.com/gonvenience/wrap v1.2.0 // indirect github.com/gonvenience/ytbx v1.4.4 // indirect - github.com/google/btree v1.1.2 // indirect - github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/cel-go v0.18.2 // indirect + github.com/google/gnostic-models v0.6.9 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/s2a-go v0.1.8 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.13.0 // indirect github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect github.com/gosuri/uitable v0.0.4 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -134,6 +169,7 @@ require ( github.com/knadh/koanf v1.5.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/lib/pq v1.10.9 // indirect @@ -165,21 +201,27 @@ require ( github.com/opencontainers/image-spec v1.1.0 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.76.2 // indirect - github.com/prometheus/client_golang v1.20.0 // indirect + github.com/prometheus/client_golang v1.20.4 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/redpanda-data/common-go/net v0.1.0 // indirect + github.com/redpanda-data/common-go/secrets v0.1.3 // indirect github.com/redpanda-data/console/backend v0.0.0-20240303221210-05d5d9e85f20 // indirect - github.com/redpanda-data/redpanda-operator/charts v0.0.0-20250117101058-ffdbfad7bc6b // indirect + github.com/redpanda-data/redpanda-operator/charts/connectors v0.0.0-20250407202713-3127fa24d322 // indirect + github.com/redpanda-data/redpanda-operator/charts/console v0.0.0-20250407202713-3127fa24d322 // indirect + github.com/redpanda-data/redpanda-operator/charts/redpanda/v5 v5.9.29 // indirect + github.com/redpanda-data/redpanda-operator/gotohelm v1.1.0 // indirect github.com/redpanda-data/redpanda/src/go/rpk v0.0.0-20240827155712-244863ea0ae8 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/rubenv/sql-migrate v1.5.2 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect + github.com/scalalang2/golang-fifo v1.0.2 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/sethgrid/pester v1.2.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect @@ -188,7 +230,11 @@ require ( github.com/spf13/cast v1.7.0 // indirect github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/stoewer/go-strcase v1.3.0 // indirect github.com/texttheater/golang-levenshtein v1.0.1 // indirect + github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.1 // indirect github.com/twmb/franz-go/pkg/kmsg v1.9.0 // indirect github.com/twmb/franz-go/pkg/sasl/kerberos v1.1.0 // indirect github.com/twmb/tlscfg v1.2.1 // indirect @@ -198,10 +244,12 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // 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/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.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/metric v1.29.0 // indirect + go.opentelemetry.io/otel/trace v1.29.0 // indirect go.starlark.net v0.0.0-20231121155337-90ade8b19d09 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect @@ -209,19 +257,20 @@ require ( golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect golang.org/x/mod v0.22.0 // indirect golang.org/x/net v0.38.0 // indirect - golang.org/x/oauth2 v0.22.0 // indirect + golang.org/x/oauth2 v0.28.0 // indirect golang.org/x/sync v0.12.0 // indirect golang.org/x/sys v0.31.0 // indirect golang.org/x/term v0.30.0 // indirect golang.org/x/text v0.23.0 // indirect - golang.org/x/time v0.6.0 // indirect - golang.org/x/tools v0.27.0 // indirect + golang.org/x/time v0.7.0 // indirect + golang.org/x/tools v0.29.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/genproto v0.0.0-20240725223205-93522f1f2a9f // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240808171019-573a1156607a // indirect - google.golang.org/grpc v1.65.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect + google.golang.org/api v0.203.0 // indirect + google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect + google.golang.org/grpc v1.67.1 // indirect + google.golang.org/protobuf v1.35.1 // indirect gopkg.in/evanphx/json-patch.v5 v5.7.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect @@ -235,12 +284,11 @@ require ( k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f // indirect k8s.io/kubectl v0.30.3 // indirect oras.land/oras-go v1.2.5 // indirect - sigs.k8s.io/gateway-api v1.0.0 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/gateway-api v1.1.0 // indirect + sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/kustomize/api v0.16.0 // indirect sigs.k8s.io/kustomize/kyaml v0.17.2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect ) replace github.com/redpanda-data/redpanda-operator/harpoon => ../harpoon diff --git a/acceptance/go.sum b/acceptance/go.sum index 2aebbb120..e38819a58 100644 --- a/acceptance/go.sum +++ b/acceptance/go.sum @@ -14,18 +14,49 @@ buf.build/gen/go/redpandadata/dataplane/protocolbuffers/go v1.34.2-2024062010493 buf.build/gen/go/redpandadata/dataplane/protocolbuffers/go v1.34.2-20240620104934-3415ce922cfb.2/go.mod h1:AcLjVYZHtwlZvBrjuqyjtZtHv9BbDaHD6C92lO/gJFI= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= +cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= +cloud.google.com/go/auth v0.9.9 h1:BmtbpNQozo8ZwW2t7QJjnrQtdganSdmqeIBxHxNkEZQ= +cloud.google.com/go/auth v0.9.9/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= +cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= +cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= +cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU= +cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g= +cloud.google.com/go/secretmanager v1.14.2 h1:2XscWCfy//l/qF96YE18/oUaNJynAx749Jg3u0CjQr8= +cloud.google.com/go/secretmanager v1.14.2/go.mod h1:Q18wAPMM6RXLC/zVpWTlqq2IBSbbm7pKBlM3lCKsmjw= connectrpc.com/connect v1.16.2 h1:ybd6y+ls7GOlb7Bh5C8+ghA6SvCBajHwxssO2CGFjqE= connectrpc.com/connect v1.16.2/go.mod h1:n2kgwskMHXC+lVqb18wngEpF95ldBHXjZYJussz5FRc= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= emperror.dev/errors v0.8.1 h1:UavXZ5cSX/4u9iyvH6aDcuGkVjeexUGJ7Ij7G4VfQT0= emperror.dev/errors v0.8.1/go.mod h1:YcRvLPh626Ubn2xqtoprejnA5nFha+TJ+2vew48kWuE= +fortio.org/assert v1.2.1 h1:48I39urpeDj65RP1KguF7akCjILNeu6vICiYMEysR7Q= +fortio.org/assert v1.2.1/go.mod h1:039mG+/iYDPO8Ibx8TrNuJCm2T2SuhwRI3uL9nHTTls= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= +github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 h1:B/dfvscEQtew9dVuoxqxrUKKv8Ih2f55PydknDamU+g= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0/go.mod h1:fiPSssYvltE08HJchL04dOy+RD4hgrjph0cwGGMntdI= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0 h1:+m0M/LFxN43KvULkDNfdXOgrjtg6UYJPFBJyuEcRCAw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0/go.mod h1:PwOyop78lveYMRs6oCxjiVyBdyCgIYH6XHIVZO9/SFQ= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets v0.12.0 h1:xnO4sFyG8UH2fElBkcqLTOZsAajvKfnSlgBBW8dXYjw= +github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets v0.12.0/go.mod h1:XD3DIOOVgBCO03OleB1fHjgktVRFxlT++KwKgIOewdM= +github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 h1:FbH3BbSb4bvGluTesZZ+ttN/MDsnMmQP36OSnDuSXqw= +github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1/go.mod h1:9V2j0jn9jDEkCkv8w/bKTNppX/d0FVA1ud77xCIP4KA= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= @@ -55,6 +86,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +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/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -64,15 +97,43 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkY 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/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2 v1.32.3 h1:T0dRlFBKcdaUPGNtkBSwHZxrtis8CQU17UpNBZYd0wk= +github.com/aws/aws-sdk-go-v2 v1.32.3/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= github.com/aws/aws-sdk-go-v2/config v1.8.3/go.mod h1:4AEiLtAb8kLs7vgw2ZV3p2VZ1+hBavOc84hqxVNpCyw= +github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw= +github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI= github.com/aws/aws-sdk-go-v2/credentials v1.4.3/go.mod h1:FNNC6nQZQUuyhq5aE5c7ata8o9e4ECGmS4lAXC7o1mQ= +github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM= +github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.6.0/go.mod h1:gqlclDEZp4aqJOancXK6TN24aKhT0W0Ae9MHk3wzTMM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 h1:Jw50LwEkVjuVzE1NzkhNKkBf9cRN7MtE1F/b2cOKTUM= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22/go.mod h1:Y/SmAyPcOTmpeVaWSzSKiILfXTVJwrGmYZhcRbhWuEY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 h1:981MHwBaRZM7+9QSR6XamDzF/o7ouUGxFzr+nVSIhrs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22/go.mod h1:1RA1+aBEfn+CAB/Mh0MB6LsdCYCnjZm7tKXtnk499ZQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.2.4/go.mod h1:ZcBrrI3zBKlhGFNYWvju0I3TR93I7YIgAfy82Fh4lcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= github.com/aws/aws-sdk-go-v2/service/appconfig v1.4.2/go.mod h1:FZ3HkCe+b10uFZZkFdvf98LHW21k49W8o8J366lqVKY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2/go.mod h1:72HRZDLMtmVQiLG2tLfQcaWLCssELvGl+Zf2WVxMmR8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.3 h1:CyA6J82ePPoh1Nj8ErOR2e/JRlzfFzWpGwGMFzFjwZg= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.3/go.mod h1:EliITPlGcBz0FRiVl7lRLtzI1cnDybFcfLYMZedOInE= github.com/aws/aws-sdk-go-v2/service/sso v1.4.2/go.mod h1:NBvT9R1MEF+Ud6ApJKM0G+IkPchKS7p7c2YPKwHmBOk= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58= github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g= +github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs= +github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= +github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -143,12 +204,16 @@ github.com/cucumber/godog v0.14.1/go.mod h1:FX3rzIDybWABU4kuIXLZ/qtqEe1Ac5RdXmqv github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= github.com/cucumber/messages/go/v22 v22.0.0/go.mod h1:aZipXTKc0JnjCsXrJnuZpWhtay93k7Rn3Dee7iyPJjs= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo= +github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/distribution/distribution/v3 v3.0.0-20230821124843-59dd684cc897 h1:RXk089SU5PMqorzuuFhr7w3Xk+01sbnOUEgJY4iFxfM= github.com/distribution/distribution/v3 v3.0.0-20230821124843-59dd684cc897/go.mod h1:6icnq9cRyk6D46s6DLfsYnQBYIPmx0pM0QYIV4SAYoo= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= @@ -179,8 +244,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= 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.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/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= @@ -200,6 +265,8 @@ github.com/fluxcd/pkg/apis/kustomize v1.2.0 h1:vkVs+OumxaWso0jNCqdgFFfMHdh+qtZhy github.com/fluxcd/pkg/apis/kustomize v1.2.0/go.mod h1:VF7tR/WuVFeum+HaMTHwp+eCtsHiiQlY6ihgqtAnW/M= github.com/fluxcd/pkg/apis/meta v1.2.0 h1:O766PzGAdMdQKybSflGL8oV0+GgCNIkdsxfalRyzeO8= github.com/fluxcd/pkg/apis/meta v1.2.0/go.mod h1:fU/Az9AoVyIxC0oI4ihG0NVMNnvrcCzdEym3wxjIQsc= +github.com/fluxcd/pkg/runtime v0.43.3 h1:z6umKKONWvuxy0TWbeDUJOI30FTbS1P7QrK2J+NjLsM= +github.com/fluxcd/pkg/runtime v0.43.3/go.mod h1:dhhNV45B3tekg7qPzATFTuWOulvUzMoO1bV+vc2pSts= github.com/fluxcd/source-controller/api v1.2.3 h1:71mXv3Qg9HEhcpqOq1ObmoE+P/HuZNaAvxfI7dqZMo8= github.com/fluxcd/source-controller/api v1.2.3/go.mod h1:5gaIVVH7hgb8p3HKFp8P6hGmZEC8fKSt4EcrG3g5vZI= github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI= @@ -248,6 +315,8 @@ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEe 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/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobuffalo/logger v1.0.6 h1:nnZNpxYo0zx+Aj9RfMPBm+x9zAU2OayFh/xrAWi34HU= github.com/gobuffalo/logger v1.0.6/go.mod h1:J31TBEHR1QLV2683OXTAItYIg8pv2JMHnF/quuAbMjs= github.com/gobuffalo/packd v1.0.1 h1:U2wXfRr4E9DH8IdsDLlRFwTZTK7hLfq9qT/QHXGVe/0= @@ -256,6 +325,8 @@ github.com/gobuffalo/packr/v2 v2.8.3 h1:xE1yzvnO56cUC0sTpKR3DIbxZgB54AftTFMhB2XE github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXsOdiU5KwbKc= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -264,7 +335,10 @@ github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 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= @@ -300,15 +374,18 @@ github.com/gonvenience/wrap v1.2.0/go.mod h1:iNijaTmFD8+ORmNp9iS+dSBcCJrmIwwyoYL github.com/gonvenience/ytbx v1.4.4 h1:jQopwyaLsVGuwdxSiN4WkXjsEaFNPJ3V4lUj7eyEpzo= github.com/gonvenience/ytbx v1.4.4/go.mod h1:w37+MKCPcCMY/jpPNmEklD4xKqrOAVBO6kIWW2+uI6M= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= -github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/cel-go v0.18.2 h1:L0B6sNBSVmt0OyECi8v6VOS74KOc9W/tLiWKfZABvf4= +github.com/google/cel-go v0.18.2/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg= +github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= +github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= 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.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/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.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -321,19 +398,25 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= 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.2/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= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= +github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= @@ -442,6 +525,8 @@ github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs= +github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw= 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/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= @@ -467,6 +552,18 @@ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k= +github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= +github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= +github.com/lestrrat-go/jwx v1.2.29 h1:QT0utmUJ4/12rmsVQrJ3u55bycPkKqGYuGT4tyRhxSQ= +github.com/lestrrat-go/jwx v1.2.29/go.mod h1:hU8k2l6WF0ncx20uQdOmik/Gjg6E3/wIRtXSNFeZuB8= +github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= +github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= @@ -516,8 +613,8 @@ github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQ github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= -github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= +github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= +github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -604,6 +701,8 @@ github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -625,8 +724,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI= -github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +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.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -648,18 +747,28 @@ github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0leargg github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= +github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= github.com/redpanda-data/common-go/net v0.1.0 h1:JnJioRJuL961r1QXiJQ1tW9+yEaJfu8FpXnUmvQbwNM= github.com/redpanda-data/common-go/net v0.1.0/go.mod h1:iOdNkjxM7a1T8F3cYHTaKIPFCHzzp/ia6TN+Z+7Tt5w= -github.com/redpanda-data/common-go/rpadmin v0.1.13-0.20250109154132-12ac78a58f95 h1:TmbXxlIHlKEF2wO5z82sQz98Su/WSgs+bC0k8s26Lsg= -github.com/redpanda-data/common-go/rpadmin v0.1.13-0.20250109154132-12ac78a58f95/go.mod h1:zgE/M2UihQZRdivHfbm4x9Rb3Vm/crO5kiX3GQrxhG4= +github.com/redpanda-data/common-go/rpadmin v0.1.14-0.20250425125657-8ab73f3ad62e h1:0kdPPgbSCZ8XX6K/51x61/9cas2/sXj8UgdoiLJnOqQ= +github.com/redpanda-data/common-go/rpadmin v0.1.14-0.20250425125657-8ab73f3ad62e/go.mod h1:zgE/M2UihQZRdivHfbm4x9Rb3Vm/crO5kiX3GQrxhG4= +github.com/redpanda-data/common-go/secrets v0.1.3 h1:VRo+OFS4Zgb2UMvwcIuUujdMhAPNGoGESZgcF4gjgcY= +github.com/redpanda-data/common-go/secrets v0.1.3/go.mod h1:WjUU/5saSXwItZx6veFOGbQZUgPQz4MQ65z22y0Ky84= github.com/redpanda-data/console/backend v0.0.0-20240303221210-05d5d9e85f20 h1:+zsE3W1V86k2sjAGWOySIlF0xn5R1aXXQBaIdr80F48= github.com/redpanda-data/console/backend v0.0.0-20240303221210-05d5d9e85f20/go.mod h1:DC42/3+k5PefSo4IalYbDN3yRZrVFP0b69+gC/NwGd4= -github.com/redpanda-data/redpanda-operator/charts v0.0.0-20250117101058-ffdbfad7bc6b h1:3M4OLinhrcMO5hlKNMwLHPq6OLA2XlbACvdV0HIHkew= -github.com/redpanda-data/redpanda-operator/charts v0.0.0-20250117101058-ffdbfad7bc6b/go.mod h1:lI25qZ21w4dOrGb8NbussBlHMK22BVqVMoV3iY3foz4= -github.com/redpanda-data/redpanda-operator/operator v0.0.0-20250123152815-98530dc8f04d h1:JtWS8TYK10ucCWq/LpwTqFjZXFfMeqqOCCEqPB8v6ho= -github.com/redpanda-data/redpanda-operator/operator v0.0.0-20250123152815-98530dc8f04d/go.mod h1:ujOb7b3jt/JIGgX18H+jRSOeLcS86NDI+9tBNNlCFmk= -github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20250123101329-b89e4b888a74 h1:kUQfTikTwGpspksa78MyeC5LoqlRTY0XCeBId0VGAyU= -github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20250123101329-b89e4b888a74/go.mod h1:RLmeTQHyGNaTMZLzf+wPD7hFjkDMQMKz5gSG8X4Gp58= +github.com/redpanda-data/redpanda-operator/charts/connectors v0.0.0-20250407202713-3127fa24d322 h1:WmLU3VqQQxKa12ejeA0wrGXO5irkm0qiwDwsKzhpoIk= +github.com/redpanda-data/redpanda-operator/charts/connectors v0.0.0-20250407202713-3127fa24d322/go.mod h1:o6FEj/SPoAxl6Rn1X9+XO1tlzSl2V64vAiBDgHntfVc= +github.com/redpanda-data/redpanda-operator/charts/console v0.0.0-20250407202713-3127fa24d322 h1:6k08sCRY3vaojlGxnyUfPtJOY/UssPfiX/Dws/nIUOM= +github.com/redpanda-data/redpanda-operator/charts/console v0.0.0-20250407202713-3127fa24d322/go.mod h1:Sof2HY8U+RLesHJInGLoqhUMzN8iN8gUHXALbROsew8= +github.com/redpanda-data/redpanda-operator/charts/redpanda/v5 v5.9.29 h1:iwjRD8RTIwqdNPoNv9QdVpnOW5HxQllAZeEvuMvdPJk= +github.com/redpanda-data/redpanda-operator/charts/redpanda/v5 v5.9.29/go.mod h1:BHprU4V3Bpqj0OGyPsfy2EtT+qUABigHYZa7uF0ACvs= +github.com/redpanda-data/redpanda-operator/gotohelm v1.1.0 h1:IV2Ic66JDKPtCnNU4Kn1naJlzZmhl0izRj17qgTCo20= +github.com/redpanda-data/redpanda-operator/gotohelm v1.1.0/go.mod h1:usCpPzzzhgtPrRTiUQOzFqGmukce8U0SrzEeX2ONDFE= +github.com/redpanda-data/redpanda-operator/operator v0.0.0-20251125071431-634f74e9db59 h1:p3XNChNq9XdC9W0VKlgX00/TBIkai6yRpr39O/zG1PA= +github.com/redpanda-data/redpanda-operator/operator v0.0.0-20251125071431-634f74e9db59/go.mod h1:vgZ4e/50r8w/HITjGVJCIaIp8ChgPiVfmA3tP5dcvDA= +github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20251125071431-634f74e9db59 h1:COc0Qp+e7ac+SVJoLrAxUIob09VdFZ146f1S+m9PNxQ= +github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20251125071431-634f74e9db59/go.mod h1:sYyDsfxEjwNk1mtkON7VkGU9+ut0uaUW6+XJ+AZh1Ow= github.com/redpanda-data/redpanda/src/go/rpk v0.0.0-20240827155712-244863ea0ae8 h1:uTQKqF8UPNxYxKBJ11VlG6Vt2l9ctkkeXsmmjHUSUG4= github.com/redpanda-data/redpanda/src/go/rpk v0.0.0-20240827155712-244863ea0ae8/go.mod h1:97qkjcMI3gDL+y+aY/w5o0xF2qGHFof6rCXIYjnTalM= github.com/rhnvrm/simples3 v0.6.1/go.mod h1:Y+3vYm2V7Y4VijFoJHHTrja6OgPrJ2cBti8dPGkC3sA= @@ -679,6 +788,8 @@ github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFo github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/scalalang2/golang-fifo v1.0.2 h1:sfOJBB86iXuqB5WoLtVI7+wxn8UOEOr9SnJaTakinBA= +github.com/scalalang2/golang-fifo v1.0.2/go.mod h1:TsyVkLbka5m8tmfqsWBXwJ7Om1jV/uuOuvoPulZbMmA= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= @@ -704,6 +815,8 @@ github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= 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/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.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -730,6 +843,13 @@ github.com/testcontainers/testcontainers-go/modules/redpanda v0.32.0 h1:YicRA+Up github.com/testcontainers/testcontainers-go/modules/redpanda v0.32.0/go.mod h1:4DNyEf4H091/q4qdXpVdxOne1EvvcFgNf7atLv3FqkU= github.com/texttheater/golang-levenshtein v1.0.1 h1:+cRNoVrfiwufQPhoMzB6N0Yf/Mqajr6t1lOv8GyGE2U= github.com/texttheater/golang-levenshtein v1.0.1/go.mod h1:PYAKrbF5sAiq9wd+H82hs7gNaen0CplQ9uvm6+enD/8= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= @@ -772,14 +892,18 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3 go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -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/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -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/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/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.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= +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.starlark.net v0.0.0-20231121155337-90ade8b19d09 h1:hzy3LFnSN8kuQK8h9tHl4ndF6UruMj47OqwqsS+/Ai4= go.starlark.net v0.0.0-20231121155337-90ade8b19d09/go.mod h1:LcLNIzVOMp4oV+uusnpk+VU+SzXaJakUuBjoCSWH5dM= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -831,6 +955,7 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= @@ -845,8 +970,8 @@ golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= -golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= +golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= 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-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -898,6 +1023,7 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= @@ -919,8 +1045,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.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= @@ -933,14 +1059,16 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= -golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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/api v0.203.0 h1:SrEeuwU3S11Wlscsn+LA1kb/Y5xT8uggJSkIhD08NAU= +google.golang.org/api v0.203.0/go.mod h1:BuOVyCSYEPwJb3npWvDnNmFI92f3GeRnHNkETneT3SI= 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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -949,12 +1077,12 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20240725223205-93522f1f2a9f h1:htT2I9bZvGm+110zq8bIErMX+WgBWxCzV3ChwbvnKnc= -google.golang.org/genproto v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:Sk3mLpoDFTAp6R4OvlcUgaG4ISTspKeFsIAXMn9Bm4Y= -google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f h1:b1Ln/PG8orm0SsBbHZWke8dDp2lrCD4jSmfglFpTZbk= -google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:AHT0dDg3SoMOgZGnZk29b5xTbPHMoEC8qthmBLJCpys= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240808171019-573a1156607a h1:EKiZZXueP9/T68B8Nl0GAx9cjbQnCId0yP3qPMgaaHs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240808171019-573a1156607a/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53 h1:Df6WuGvthPzc+JiQ/G+m+sNX24kc0aTBqoDN/0yyykE= +google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53/go.mod h1:fheguH3Am2dGp1LfXkrvwqC/KlFq8F0nLq3LryOMrrE= +google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 h1:T6rh4haD3GVYsgEfWExoCZA2o2FmbNyKpTuAxbEFPTg= +google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= @@ -962,9 +1090,10 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= 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= @@ -976,8 +1105,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD 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.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1038,10 +1167,10 @@ pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= sigs.k8s.io/controller-runtime v0.18.5 h1:nTHio/W+Q4aBlQMgbnC5hZb4IjIidyrizMai9P6n4Rk= sigs.k8s.io/controller-runtime v0.18.5/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg= -sigs.k8s.io/gateway-api v1.0.0 h1:iPTStSv41+d9p0xFydll6d7f7MOBGuqXM6p2/zVYMAs= -sigs.k8s.io/gateway-api v1.0.0/go.mod h1:4cUgr0Lnp5FZ0Cdq8FdRwCvpiWws7LVhLHGIudLlf4c= -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/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-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/kustomize/api v0.16.0 h1:/zAR4FOQDCkgSDmVzV2uiFbuy9bhu3jEzthrHCuvm1g= sigs.k8s.io/kustomize/api v0.16.0/go.mod h1:MnFZ7IP2YqVyVwMWoRxPtgl/5hpA+eCCrQR/866cm5c= sigs.k8s.io/kustomize/kyaml v0.17.2 h1:+AzvoJUY0kq4QAhH/ydPHHMRLijtUKiyVyh7fOSshr0= diff --git a/acceptance/main_test.go b/acceptance/main_test.go index a1e77003a..2e4795da2 100644 --- a/acceptance/main_test.go +++ b/acceptance/main_test.go @@ -11,8 +11,10 @@ package main import ( "context" + "fmt" "os" "path/filepath" + "slices" "sync" "testing" @@ -26,6 +28,7 @@ import ( _ "github.com/redpanda-data/redpanda-operator/acceptance/steps" framework "github.com/redpanda-data/redpanda-operator/harpoon" + "github.com/redpanda-data/redpanda-operator/harpoon/providers" redpandav1alpha1 "github.com/redpanda-data/redpanda-operator/operator/api/redpanda/v1alpha1" redpandav1alpha2 "github.com/redpanda-data/redpanda-operator/operator/api/redpanda/v1alpha2" "github.com/redpanda-data/redpanda-operator/pkg/helm" @@ -48,7 +51,7 @@ var setupSuite = sync.OnceValues(func() (*framework.Suite, error) { RegisterProvider("eks", framework.NoopProvider). RegisterProvider("gke", framework.NoopProvider). RegisterProvider("aks", framework.NoopProvider). - RegisterProvider("k3d", framework.NoopProvider). + RegisterProvider("k3d", providers.NewK3D(5).RetainCluster()). WithDefaultProvider("k3d"). WithImportedImages([]string{ "localhost/redpanda-operator:dev", @@ -85,12 +88,15 @@ var setupSuite = sync.OnceValues(func() (*framework.Suite, error) { }). WithCRDDirectory("../operator/config/crd/bases"). WithCRDDirectory("../operator/config/crd/bases/toolkit.fluxcd.io"). - OnFeature(func(ctx context.Context, t framework.TestingT) { + OnFeature(func(ctx context.Context, t framework.TestingT, tags ...framework.ParsedTag) { // this actually switches namespaces, run it first namespace := t.IsolateNamespace(ctx) - t.Log("Installing Redpanda operator chart") - t.InstallLocalHelmChart(ctx, "../operator/chart", helm.InstallOptions{ + if slices.ContainsFunc(tags, shouldSkipOperatorInstall) { + return + } + t.Log("Installing default Redpanda operator chart") + t.InstallHelmChart(ctx, "../operator/chart", helm.InstallOptions{ Name: "redpanda-operator", Namespace: namespace, Values: map[string]any{ @@ -144,7 +150,8 @@ var setupSuite = sync.OnceValues(func() (*framework.Suite, error) { } }) }). - RegisterTag("cluster", 1, ClusterTag). + RegisterTag("operator", 1, OperatorTag). + RegisterTag("cluster", 2, ClusterTag). ExitOnCleanupFailures(). Build() }) @@ -170,3 +177,25 @@ func ClusterTag(ctx context.Context, t framework.TestingT, args ...string) conte return ctx } + +func OperatorTag(ctx context.Context, t framework.TestingT, args ...string) context.Context { + require.Greater(t, len(args), 0, "operator tags can only be used with additional arguments") + name := args[0] + if name == "none" { + t.Log("Skipping Redpanda operator installation") + return ctx + } + + t.Logf("Installing Redpanda operator chart: %q", name) + t.InstallHelmChart(ctx, "../operator/chart", helm.InstallOptions{ + Name: "redpanda-operator", + Namespace: t.Namespace(), + ValuesFile: filepath.Join("operator", fmt.Sprintf("%s.yaml", name)), + }) + + return ctx +} + +func shouldSkipOperatorInstall(tag framework.ParsedTag) bool { + return tag.Name == "operator" +} diff --git a/acceptance/steps/cluster.go b/acceptance/steps/cluster.go index 389008bfa..42e923556 100644 --- a/acceptance/steps/cluster.go +++ b/acceptance/steps/cluster.go @@ -12,10 +12,15 @@ package steps import ( "context" "fmt" + "math/rand/v2" "time" + "github.com/redpanda-data/common-go/rpadmin" "github.com/stretchr/testify/require" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" framework "github.com/redpanda-data/redpanda-operator/harpoon" redpandav1alpha2 "github.com/redpanda-data/redpanda-operator/operator/api/redpanda/v1alpha2" @@ -42,3 +47,115 @@ func checkClusterAvailability(ctx context.Context, t framework.TestingT, cluster })) t.Logf("Cluster %q is ready!", clusterName) } + +func redpandaClusterIsHealthy(ctx context.Context, t framework.TestingT, cluster string) { + clients := clientsForCluster(ctx, cluster) + var health rpadmin.ClusterHealthOverview + var err error + + c := clients.RedpandaAdmin(ctx) + + require.Eventually(t, func() bool { + health, err = c.GetHealthOverview(ctx) + require.NoError(t, err) + + t.Logf("Cluster health: %v", health.IsHealthy) + return health.IsHealthy + }, 5*time.Minute, 5*time.Second, `Cluster %q never become healthy: %+v`, cluster, health) +} + +func checkClusterUnhealthy(ctx context.Context, t framework.TestingT, clusterName string) { + checkClusterHealthCondition(ctx, t, clusterName, "NotHealthy", metav1.ConditionFalse) +} + +func checkClusterHealthy(ctx context.Context, t framework.TestingT, clusterName string) { + checkClusterHealthCondition(ctx, t, clusterName, "Healthy", metav1.ConditionTrue) +} + +func checkClusterHealthCondition(ctx context.Context, t framework.TestingT, clusterName, reason string, status metav1.ConditionStatus) { + var cluster redpandav1alpha2.Redpanda + + key := t.ResourceKey(clusterName) + + t.Logf("Checking cluster %q Healthy reason %q", clusterName, reason) + require.Eventually(t, func() bool { + require.NoError(t, t.Get(ctx, key, &cluster)) + hasCondition := t.HasCondition(metav1.Condition{ + Type: "Healthy", + Status: status, + Reason: reason, + }, cluster.Status.Conditions) + + t.Logf(`Checking cluster conditions contains Healthy reason %q? %v`, reason, hasCondition) + return hasCondition + }, 5*time.Minute, 5*time.Second, "%s", delayLog(func() string { + return fmt.Sprintf(`Cluster %q never contained the condition reason %q, final Conditions: %+v`, key.String(), reason, cluster.Status.Conditions) + })) + t.Logf("Cluster %q contains Healthy reason %q!", clusterName, reason) +} + +func shutdownRandomClusterNode(ctx context.Context, t framework.TestingT, clusterName string) { + var clusterSet appsv1.StatefulSet + + key := t.ResourceKey(clusterName) + + require.NoError(t, t.Get(ctx, key, &clusterSet)) + + selector, err := metav1.LabelSelectorAsSelector(clusterSet.Spec.Selector) + require.NoError(t, err) + + var pods corev1.PodList + require.NoError(t, t.List(ctx, &pods, client.MatchingLabelsSelector{ + Selector: selector, + })) + + require.Greater(t, len(pods.Items), 0) + + index := rand.IntN(len(pods.Items)) // nolint:gosec + pod := pods.Items[index] + + t.ShutdownNode(ctx, pod.Spec.NodeName) +} + +func shutdownNodeOfPod(ctx context.Context, t framework.TestingT, podName string) { + t.ResourceKey(podName) + + var pod corev1.Pod + require.NoError(t, t.Get(ctx, t.ResourceKey(podName), &pod)) + + var node corev1.Node + require.NoError(t, t.Get(ctx, t.ResourceKey(pod.Spec.NodeName), &node)) + + node.Spec.Taints = append(node.Spec.Taints, corev1.Taint{ + Key: "node.kubernetes.io/out-of-service", + Effect: corev1.TaintEffectNoExecute, + }) + + require.NoError(t, t.Update(ctx, &node)) + + t.ShutdownNode(ctx, pod.Spec.NodeName) +} + +func deleteNotReadyKubernetesNodes(ctx context.Context, t framework.TestingT) { + var nodes corev1.NodeList + require.NoError(t, t.List(ctx, &nodes)) + for _, node := range nodes.Items { + for _, condition := range node.Status.Conditions { + if condition.Type == corev1.NodeReady && (condition.Status == corev1.ConditionFalse || condition.Status == corev1.ConditionUnknown) { + t.Logf("Deleting Kubernetes node: %q", node.Name) + t.DeleteNode(ctx, node.Name) + } + } + } +} + +func checkClusterStableWithCount(ctx context.Context, t framework.TestingT, clusterName string, nodeCount int32) { + t.Logf("check cluster %q is stable", clusterName) + // currently operator does not have Stable status condition and status does not return node pools status and node count + checkClusterAvailability(ctx, t, clusterName) +} + +func setLogLevelOn(ctx context.Context, t framework.TestingT, level, logger, version, cluster string) { + clients := clientsForCluster(ctx, cluster) + clients.SetLogLevel(ctx, level, logger) +} diff --git a/acceptance/steps/helm.go b/acceptance/steps/helm.go new file mode 100644 index 000000000..91cbf84e2 --- /dev/null +++ b/acceptance/steps/helm.go @@ -0,0 +1,63 @@ +// Copyright 2025 Redpanda Data, Inc. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.md +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0 + +package steps + +import ( + "context" + "fmt" + "strings" + + "github.com/cucumber/godog" + "github.com/stretchr/testify/require" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/yaml" + + framework "github.com/redpanda-data/redpanda-operator/harpoon" + "github.com/redpanda-data/redpanda-operator/pkg/helm" +) + +func iHelmInstall(ctx context.Context, t framework.TestingT, name, chart, version string, values *godog.DocString) { + // We don't really reference anything other than the redpanda repo, so just + // handle repos as a naive check here. + if strings.HasPrefix(chart, "redpanda/") { + t.AddHelmRepo(ctx, "redpanda", "https://charts.redpanda.com") + } + + var valuesMap map[string]any + require.NoError(t, yaml.Unmarshal([]byte(values.Content), &valuesMap)) + + t.InstallHelmChart(ctx, chart, helm.InstallOptions{ + Name: name, + Version: version, + Values: valuesMap, + Namespace: t.Namespace(), + }) +} + +func iHelmUpgrade(ctx context.Context, t framework.TestingT, name, chart, version string, values *godog.DocString) { + var valuesMap map[string]any + require.NoError(t, yaml.Unmarshal([]byte(values.Content), &valuesMap)) + + t.UpgradeHelmChart(ctx, name, chart, helm.UpgradeOptions{ + Version: version, + Values: valuesMap, + Namespace: t.Namespace(), + }) +} + +func iDeleteHelmReleaseSecret(ctx context.Context, t framework.TestingT, helmReleaseName string) { + require.NoError(t, t.Delete(ctx, &corev1.Secret{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("sh.helm.release.v1.%s.v1", helmReleaseName), + Namespace: t.Namespace(), + }, + })) +} diff --git a/acceptance/steps/helpers.go b/acceptance/steps/helpers.go index 8ec4ac52a..c921fbb4f 100644 --- a/acceptance/steps/helpers.go +++ b/acceptance/steps/helpers.go @@ -171,14 +171,30 @@ func (c *clusterClients) checkSchema(ctx context.Context, schema string, exists t.Logf("Pulling list of schema subjects from cluster") schemaRegistry := c.SchemaRegistry(ctx) subjects, err = schemaRegistry.Subjects(ctx) - require.NoError(t, err) + if err != nil { + // just retry on error, sometimes v1 stuff is slow to come up even after + // the broker is marked as healthy + return false + } return exists == slices.Contains(subjects, schema) }, 10*time.Second, 1*time.Second, message) { + require.NoError(t, err) t.Errorf("Final list of schema subjects: %v", subjects) } } +func (c *clusterClients) CreateTopic(ctx context.Context, topic string) { + t := framework.T(ctx) + + admin := kadm.NewClient(c.Kafka(ctx)) + defer admin.Close() + + response, err := admin.CreateTopic(ctx, 1, 1, map[string]*string{}, topic) + require.NoError(t, err) + require.NoError(t, response.Err) +} + func (c *clusterClients) ExpectTopic(ctx context.Context, topic string) { t := framework.T(ctx) @@ -195,6 +211,16 @@ func (c *clusterClients) ExpectNoTopic(ctx context.Context, topic string) { t.Logf("Found no topic %q in cluster %q", topic, c.cluster) } +// Set log level for given logger. +func (c *clusterClients) SetLogLevel(ctx context.Context, level, logger string) { + t := framework.T(ctx) + + admin := c.RedpandaAdmin(ctx) + defer admin.Close() + + require.NoError(t, admin.SetLogLevel(ctx, logger, level, 0)) +} + func (c *clusterClients) checkTopic(ctx context.Context, topic string, exists bool, message string) { t := framework.T(ctx) @@ -238,10 +264,21 @@ func (c *clusterClients) checkUser(ctx context.Context, user string, exists bool func clientsForCluster(ctx context.Context, cluster string) *clusterClients { t := framework.T(ctx) + t.Logf("Creating clients for cluster %q in namespace %q", cluster, t.Namespace()) + + // First verify the cluster exists + var testCluster redpandav1alpha2.Redpanda + clusterKey := t.ResourceKey(cluster) + if err := t.Get(ctx, clusterKey, &testCluster); err != nil { + t.Fatalf("Failed to find cluster %q in namespace %q: %v", cluster, t.Namespace(), err) + } + t.Logf("Found cluster %q with status: %+v", cluster, testCluster.Status) + // we construct a fake user to grab all of the clients for the cluster referencer := &redpandav1alpha2.User{ ObjectMeta: metav1.ObjectMeta{ Namespace: t.Namespace(), + Name: "test-user-" + cluster, // Add a name for debugging }, Spec: redpandav1alpha2.UserSpec{ ClusterSource: &redpandav1alpha2.ClusterSource{ @@ -252,13 +289,19 @@ func clientsForCluster(ctx context.Context, cluster string) *clusterClients { }, } + t.Logf("Created fake user %q looking for cluster %q in namespace %q", referencer.Name, cluster, t.Namespace()) + t.Logf("Fake user cluster ref: name=%q", referencer.Spec.ClusterSource.ClusterRef.Name) + factory := client.NewFactory(t.RestConfig(), t).WithDialer(kube.NewPodDialer(t.RestConfig()).DialContext) - return &clusterClients{ + clients := &clusterClients{ resourceTarget: referencer, cluster: cluster, factory: factory, } + + t.Logf("Successfully created clients for cluster %q", cluster) + return clients } func usersFromACLTable(t framework.TestingT, cluster string, table *godog.Table) []*redpandav1alpha2.User { @@ -329,6 +372,7 @@ func userFromRow(t framework.TestingT, cluster, name, password, mechanism, acls }, }, } + if mechanism != "" || password != "" { user.Spec.Authentication = &redpandav1alpha2.UserAuthenticationSpec{ Type: ptr.To(redpandav1alpha2.SASLMechanism(mechanism)), diff --git a/acceptance/steps/k8s.go b/acceptance/steps/k8s.go new file mode 100644 index 000000000..49ed10658 --- /dev/null +++ b/acceptance/steps/k8s.go @@ -0,0 +1,229 @@ +// Copyright 2025 Redpanda Data, Inc. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.md +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0 + +package steps + +import ( + "bytes" + "context" + "fmt" + "reflect" + "strings" + "time" + + "github.com/cucumber/godog" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/util/jsonpath" + "sigs.k8s.io/controller-runtime/pkg/client" + + framework "github.com/redpanda-data/redpanda-operator/harpoon" + redpandav1alpha2 "github.com/redpanda-data/redpanda-operator/operator/api/redpanda/v1alpha2" + "github.com/redpanda-data/redpanda-operator/pkg/kube" +) + +// this is a nasty hack due to the fact that we can't disable the linter for typecheck +// that reports sigs.k8s.io/controller-runtime/pkg/client as unused when it's solely used +// for type assertions +var _ client.Object = (client.Object)(nil) + +func podWillEventuallyBeInPhase(ctx context.Context, t framework.TestingT, podName string, phase string) { + require.EventuallyWithT(t, func(c *assert.CollectT) { + var pod corev1.Pod + require.NoError(c, t.Get(ctx, t.ResourceKey(podName), &pod)) + + require.Equal(c, corev1.PodPhase(phase), pod.Status.Phase) + }, 5*time.Minute, 5*time.Second) +} + +func kubernetesObjectHasClusterOwner(ctx context.Context, t framework.TestingT, groupVersionKind, resourceName, clusterName string) { + var cluster redpandav1alpha2.Redpanda + + gvk, _ := schema.ParseKindArg(groupVersionKind) + obj, err := t.Scheme().New(*gvk) + require.NoError(t, err) + + o := obj.(client.Object) + + require.NoError(t, t.Get(ctx, t.ResourceKey(resourceName), o)) + + require.Eventually(t, func() bool { + require.NoError(t, t.Get(ctx, t.ResourceKey(clusterName), &cluster)) + require.NoError(t, t.Get(ctx, t.ResourceKey(resourceName), o)) + cluster.SetGroupVersionKind(redpandav1alpha2.GroupVersion.WithKind("Redpanda")) + + references := o.GetOwnerReferences() + if len(references) != 1 { + t.Logf("object has %d owner references", len(references)) + return false + } + + actual := references[0] + expected := cluster.OwnerShipRefObj() + + matchesAPIVersion := actual.APIVersion == expected.APIVersion + matchesKind := actual.Kind == expected.Kind + matchesName := actual.Name == expected.Name + + matches := matchesAPIVersion && matchesKind && matchesName + + t.Logf(`Checking object contains cluster owner reference? (actual: %s/%s -> %s) (expected: %s/%s -> %s)`, actual.Kind, actual.APIVersion, actual.Name, expected.Kind, expected.APIVersion, expected.Name) + return matches + }, 5*time.Minute, 5*time.Second, "", delayLog(func() string { + return fmt.Sprintf(`Object %q never contained owner reference for cluster %q, final OwnerReference: %+v`, resourceName, clusterName, o.GetOwnerReferences()) + })) + + t.Logf("Object has cluster owner reference for %q", clusterName) +} + +type recordedVariable string + +func recordVariable(ctx context.Context, t framework.TestingT, jsonPath, groupVersionKind, resourceName, variableName string) context.Context { + return context.WithValue(ctx, recordedVariable(variableName), execJSONPath(ctx, t, jsonPath, groupVersionKind, resourceName)) +} + +func assertVariableValue(ctx context.Context, t framework.TestingT, variableName, jsonPath, groupVersionKind, resourceName string) { + currentValue := execJSONPath(ctx, t, jsonPath, groupVersionKind, resourceName) + previousValue := ctx.Value(recordedVariable(variableName)) + require.Equal(t, previousValue, currentValue) +} + +func assertVariableValueIncremented(ctx context.Context, t framework.TestingT, variableName, jsonPath, groupVersionKind, resourceName string) { + currentValue := execJSONPath(ctx, t, jsonPath, groupVersionKind, resourceName) + previousValue := ctx.Value(recordedVariable(variableName)) + + if reflect.TypeOf(previousValue) != reflect.TypeOf(currentValue) { + t.Fatalf("unmatched types: %T, %T", previousValue, currentValue) + return + } + + // check if we're dealing with integer types + // NOTE: this verbose switch statement is painful + // but there's not a great way of incrementing + // a number otherwise via reflection + switch value := previousValue.(type) { + case int: + require.Equal(t, value+1, currentValue) + case int8: + require.Equal(t, value+1, currentValue) + case int16: + require.Equal(t, value+1, currentValue) + case int32: + require.Equal(t, value+1, currentValue) + case int64: + require.Equal(t, value+1, currentValue) + case uint: + require.Equal(t, value+1, currentValue) + case uint8: + require.Equal(t, value+1, currentValue) + case uint16: + require.Equal(t, value+1, currentValue) + case uint32: + require.Equal(t, value+1, currentValue) + case uint64: + require.Equal(t, value+1, currentValue) + default: + t.Fatalf("unsupported type: %T", previousValue) + } +} + +func execJSONPath(ctx context.Context, t framework.TestingT, jsonPath, groupVersionKind, resourceName string) any { + gvk, _ := schema.ParseKindArg(groupVersionKind) + + obj, err := t.Scheme().New(*gvk) + require.NoError(t, err) + + require.NoError(t, t.Get(ctx, t.ResourceKey(resourceName), obj.(client.Object))) + + // See https://kubernetes.io/docs/reference/kubectl/jsonpath/ + path := jsonpath.New("").AllowMissingKeys(true) + require.NoError(t, path.Parse(jsonPath)) + + results, err := path.FindResults(obj) + require.NoError(t, err) + + // If jsonPath contains a range loop or {range}{end} block, the result + // will be an array of values. If not, the results are still an array + // but test writers would expect it to be a single value. + resultIsArray := strings.Contains(jsonPath, "*") || strings.Contains(jsonPath, "{range") + + for _, result := range results { + var unwrapped []any + for _, x := range result { + unwrapped = append(unwrapped, x.Interface()) + } + + if resultIsArray { + return unwrapped + } else { + require.Len(t, unwrapped, 1, "non iterating JSON path found multiple results: %s", jsonPath) + return unwrapped[0] + } + } + return nil +} + +func execInPodEventuallyMatches( + ctx context.Context, + t framework.TestingT, + podName string, + cmd string, + expected *godog.DocString, +) { + ctl, err := kube.FromRESTConfig(t.RestConfig()) + require.NoError(t, err) + + pod, err := kube.Get[corev1.Pod](ctx, ctl, kube.ObjectKey{Namespace: t.Namespace(), Name: podName}) + require.NoErrorf(t, err, "Pod with name %q not found", podName) + + execInPod(t, ctx, ctl, pod, cmd, expected) +} + +func execInPodMatchingEventuallyMatches( + ctx context.Context, + t framework.TestingT, + cmd, + selectorStr string, + expected *godog.DocString, +) { + selector, err := labels.Parse(selectorStr) + require.NoError(t, err) + + ctl, err := kube.FromRESTConfig(t.RestConfig()) + require.NoError(t, err) + + pods, err := kube.List[corev1.PodList](ctx, ctl, client.MatchingLabelsSelector{Selector: selector}) + require.NoError(t, err) + + require.True(t, len(pods.Items) > 0, "selector %q found no Pods", selector.String()) + + execInPod(t, ctx, ctl, &pods.Items[0], cmd, expected) +} + +func execInPod( + t framework.TestingT, + ctx context.Context, + ctl *kube.Ctl, + pod *corev1.Pod, + cmd string, + expected *godog.DocString, +) { + require.EventuallyWithT(t, func(collect *assert.CollectT) { + var stdout bytes.Buffer + require.NoError(collect, ctl.Exec(ctx, pod, kube.ExecOptions{ + Command: []string{"sh", "-c", cmd}, + Stdout: &stdout, + })) + + assert.Equal(collect, strings.TrimSpace(expected.Content), strings.TrimSpace(stdout.String())) + }, 5*time.Minute, 5*time.Second) +} diff --git a/acceptance/steps/manifest.go b/acceptance/steps/manifest.go index 2b6676086..c0f6e0648 100644 --- a/acceptance/steps/manifest.go +++ b/acceptance/steps/manifest.go @@ -33,3 +33,7 @@ func iApplyKubernetesManifest(ctx context.Context, t framework.TestingT, manifes t.ApplyManifest(ctx, file.Name()) } + +func iInstallLocalCRDs(ctx context.Context, t framework.TestingT, directory string) { + t.ApplyManifest(ctx, directory) +} diff --git a/acceptance/steps/register.go b/acceptance/steps/register.go index b3d86eb71..bd92c00b1 100644 --- a/acceptance/steps/register.go +++ b/acceptance/steps/register.go @@ -13,9 +13,16 @@ import framework "github.com/redpanda-data/redpanda-operator/harpoon" func init() { // General scenario steps - framework.RegisterStep(`^cluster "([^"]*)" is available$`, checkClusterAvailability) - framework.RegisterStep("running `(.*)` will output:$", runScriptInClusterCheckOutput) + framework.RegisterStep(`^I apply Kubernetes manifest:$`, iApplyKubernetesManifest) + framework.RegisterStep(`^I exec "([^"]+)" in a Pod matching "([^"]+)", it will output:$`, execInPodMatchingEventuallyMatches) + framework.RegisterStep(`^kubectl exec -it "([^"]+)" "([^"]+)" will eventually output:$`, execInPodEventuallyMatches) + framework.RegisterStep(`Pod "([^"]+)" (?:will|is) eventually(?: be)? (Running|Pending)`, podWillEventuallyBeInPhase) + + framework.RegisterStep(`^I store "([^"]*)" of Kubernetes object with type "([^"]*)" and name "([^"]*)" as "([^"]*)"$`, recordVariable) + framework.RegisterStep(`^the recorded value "([^"]*)" has the same value as "([^"]*)" of the Kubernetes object with type "([^"]*)" and name "([^"]*)"$`, assertVariableValue) + framework.RegisterStep(`^the recorded value "([^"]*)" is one less than "([^"]*)" of the Kubernetes object with type "([^"]*)" and name "([^"]*)"$`, assertVariableValueIncremented) + framework.RegisterStep(`^I enable "([^"]*)" logging for the "([^"]*)" logger on( vectorized)? cluster "([^"]*)"`, setLogLevelOn) framework.RegisterStep(`^I apply Kubernetes manifest:$`, iApplyKubernetesManifest) @@ -43,10 +50,47 @@ func init() { framework.RegisterStep(`^"([^"]*)" should be able to authenticate to the "([^"]*)" cluster with password "([^"]*)" and mechanism "([^"]*)"$`, shouldBeAbleToAuthenticateToTheClusterWithPasswordAndMechanism) framework.RegisterStep(`^there should be ACLs in the cluster "([^"]*)" for user "([^"]*)"$`, thereShouldBeACLsInTheClusterForUser) - // Operator scenario steps + // Metrics scenario steps framework.RegisterStep(`^the operator is running$`, operatorIsRunning) framework.RegisterStep(`^its metrics endpoint should reject http request with status code "([^"]*)"$`, requestMetricsEndpointPlainHTTP) framework.RegisterStep(`^its metrics endpoint should reject authorization random token request with status code "([^"]*)"$`, requestMetricsEndpointWithTLSAndRandomToken) framework.RegisterStep(`^"([^"]*)" service account has bounded "([^"]*)" cluster role$`, createClusterRoleBinding) framework.RegisterStep(`^its metrics endpoint should accept https request with "([^"]*)" service account token$`, acceptServiceAccountMetricsRequest) + + // Helm steps + // I helm install "release-name" "chart/path" with values: + // I can helm install "release-name" "chart/path" with values: + // I helm install "release-name" "chart/path" --version v1.2.3 with values: + framework.RegisterStep(`I(?: can)? helm install "([^"]+)" "([^"]+)"(?: --version (\S+))? with values:`, iHelmInstall) + // I helm upgrade "release-name" "chart/path" with values: + // I can helm upgrade "release-name" "chart/path" with values: + // I helm upgrade "release-name" "chart/path" --version v1.2.3 with values: + framework.RegisterStep(`I(?: can)? helm upgrade "([^"]+)" "([^"]+)"(?: --version (\S+))? with values:`, iHelmUpgrade) + + // Helm migration scenario steps + framework.RegisterStep(`^the Kubernetes object of type "([^"]*)" with name "([^"]*)" has an OwnerReference pointing to the cluster "([^"]*)"$`, kubernetesObjectHasClusterOwner) + framework.RegisterStep(`^the helm release for "([^"]*)" can be deleted by removing its stored secret$`, iDeleteHelmReleaseSecret) + framework.RegisterStep(`^the cluster "([^"]*)" is healthy$`, redpandaClusterIsHealthy) + + // Scaling scenario steps + framework.RegisterStep(`^cluster "([^"]*)" should be stable with (\d+) nodes$`, checkClusterStableWithCount) + framework.RegisterStep(`^cluster "([^"]*)" is stable with (\d+) nodes$`, checkClusterStableWithCount) + framework.RegisterStep(`^I create a basic cluster "([^"]*)" with (\d+) nodes$`, iCreateABasicClusterWithNodes) + framework.RegisterStep(`^I scale "([^"]*)" to (\d+) nodes$`, iScaleToNodes) + + // General cluster scenario steps + framework.RegisterStep(`^service "([^"]*)" has named port "([^"]*)" with value (\d+)$`, checkServiceWithPort) + framework.RegisterStep(`^service "([^"]*)" should have named port "([^"]*)" with value (\d+)$`, checkServiceWithPort) + framework.RegisterStep(`^rpk is configured correctly in "([^"]*)" cluster$`, checkRPKCommands) + framework.RegisterStep("running `(.*)` will output:$", runScriptInClusterCheckOutput) + + // Decommissioning scenario steps + framework.RegisterStep(`^cluster "([^"]*)" is unhealthy$`, checkClusterUnhealthy) + framework.RegisterStep(`^cluster "([^"]*)" should recover$`, checkClusterHealthy) + framework.RegisterStep(`^I physically shutdown a kubernetes node for cluster "([^"]*)"$`, shutdownRandomClusterNode) + framework.RegisterStep(`^I prune any kubernetes node that is now in a NotReady status$`, deleteNotReadyKubernetesNodes) + framework.RegisterStep(`I stop the Node running Pod "([^"]+)"`, shutdownNodeOfPod) + + // Operator upgrade scenario steps + framework.RegisterStep(`^I install local CRDs from "([^"]*)"`, iInstallLocalCRDs) } diff --git a/acceptance/steps/rpk.go b/acceptance/steps/rpk.go index 356f8586c..d705e6a40 100644 --- a/acceptance/steps/rpk.go +++ b/acceptance/steps/rpk.go @@ -1,9 +1,20 @@ +// Copyright 2025 Redpanda Data, Inc. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.md +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0 + package steps import ( "bytes" "context" + "fmt" "strings" + "time" "github.com/cucumber/godog" "github.com/stretchr/testify/require" @@ -18,48 +29,141 @@ import ( ) func runScriptInClusterCheckOutput(ctx context.Context, t framework.TestingT, command string, output *godog.DocString) { - var redpandas redpandav1alpha2.RedpandaList - require.NoError(t, t.List(ctx, &redpandas)) + expected := strings.TrimSpace(output.Content) - if len(redpandas.Items) != 1 { - require.FailNow(t, "expected to find 1 %T but found %d", (*redpandav1alpha2.Redpanda)(nil), len(redpandas.Items)) - } + require.Eventually(t, func() bool { + var redpandas redpandav1alpha2.RedpandaList + require.NoError(t, t.List(ctx, &redpandas)) - redpanda := redpandas.Items[0] + if len(redpandas.Items) != 1 { + require.FailNow(t, "expected to find 1 %T but found %d", (*redpandav1alpha2.Redpanda)(nil), len(redpandas.Items)) + } - var sts appsv1.StatefulSet - require.NoError(t, t.Get(ctx, t.ResourceKey(redpanda.Name), &sts)) + redpanda := redpandas.Items[0] - selector, err := metav1.LabelSelectorAsSelector(sts.Spec.Selector) - require.NoError(t, err) + var sts appsv1.StatefulSet + require.NoError(t, t.Get(ctx, t.ResourceKey(redpanda.Name), &sts)) - var pods corev1.PodList - require.NoError(t, t.List(ctx, &pods, client.MatchingLabelsSelector{ - Selector: selector, - })) + selector, err := metav1.LabelSelectorAsSelector(sts.Spec.Selector) + require.NoError(t, err) - if len(pods.Items) < 1 { - require.FailNow(t, "expected to find at least 1 Pod but found none") - } + var pods corev1.PodList + require.NoError(t, t.List(ctx, &pods, client.MatchingLabelsSelector{ + Selector: selector, + })) + + if len(pods.Items) < 1 { + t.Log("expected to find at least 1 Pod but found none, retrying") + return false + } + + pod := pods.Items[0] + + ctl, err := kube.FromRESTConfig(t.RestConfig()) + require.NoError(t, err) + + t.Logf("executing %q in Pod %q", command, pod.Name) - pod := pods.Items[0] + var stdout bytes.Buffer + if err := ctl.Exec(ctx, &pod, kube.ExecOptions{ + Container: "redpanda", + Command: []string{"/bin/bash", "-c", command}, + Stdout: &stdout, + }); err != nil { + t.Logf("retrying after error executing %q in Pod %q: %v", command, pod.Name, err) + return false + } + // Correct for extra whitespace from either the command itself or from + // godog's parsing. + actual := strings.TrimSpace(stdout.String()) + + if expected != actual { + t.Logf("%q != %q", actual, expected) + return false + } + + return true + }, 5*time.Minute, 5*time.Second, "%s", delayLog(func() string { + return fmt.Sprintf(`Never succeeded in executing %q with output %q`, command, expected) + })) +} + +func checkRPKCommands(ctx context.Context, t framework.TestingT, clusterName string) { ctl, err := kube.FromRESTConfig(t.RestConfig()) require.NoError(t, err) - t.Logf("executing %q in Pod %q", command, pod.Name) + key := t.ResourceKey(clusterName) + + var clusterSet appsv1.StatefulSet + require.NoError(t, t.Get(ctx, key, &clusterSet)) - var stdout bytes.Buffer - require.NoError(t, ctl.Exec(ctx, &pod, kube.ExecOptions{ - Container: "redpanda", - Command: []string{"/bin/bash", "-c", command}, - Stdout: &stdout, + selector, err := metav1.LabelSelectorAsSelector(clusterSet.Spec.Selector) + require.NoError(t, err) + + var pods corev1.PodList + require.NoError(t, t.List(ctx, &pods, client.MatchingLabelsSelector{ + Selector: selector, })) - // Correct for extra whitespace from either the command itself or from - // godog's parsing. - expected := strings.Trim(output.Content, "\n ") - actual := strings.Trim(stdout.String(), "\n ") + for _, p := range pods.Items { + t.Logf("Checking rpk commands on pod %q", p.Name) + var stdout bytes.Buffer + var stderr bytes.Buffer + // rpk.yaml is not available in operator v2. The v1 (Cluster custom resource) needs to + // create rpk profile file to overcome the problem with flux dependency (kubernetes version + // mismatch between rpk and flux fork). + //require.NoErrorf(t, ctl.Exec(ctx, &p, kube.ExecOptions{ + // Container: "redpanda", + // Command: []string{"rpk", "profile", "print"}, + // Stdin: nil, + // Stdout: &stdout, + // Stderr: &stderr, + //}), "\nStdout: %s\nStderr: %s\n", stdout.String(), stderr.String()) + //require.Len(t, stderr.Bytes(), 0) + + require.NoErrorf(t, ctl.Exec(ctx, &p, kube.ExecOptions{ + Container: "redpanda", + Command: []string{"rpk", "redpanda", "admin", "brokers", "list"}, + Stdin: nil, + Stdout: &stdout, + Stderr: &stderr, + }), "\nStdout: %s\nStderr: %s\n", stdout.String(), stderr.String()) + require.Len(t, stderr.Bytes(), 0) + stdout.Reset() + + require.Eventually(t, func() bool { + command := []string{"rpk", "registry", "schema", "list"} + err := ctl.Exec(ctx, &p, kube.ExecOptions{ + Container: "redpanda", + Command: command, + Stdin: nil, + Stdout: &stdout, + Stderr: &stderr, + }) + if err != nil { + t.Logf("rpk command %q failed with error: %v\nStdout: %s\nStderr: %s\n", strings.Join(command, " "), err, stdout.String(), stderr.String()) + stdout.Reset() + return false + } + if len(stderr.Bytes()) != 0 { + t.Logf("rpk command %q failed with \nStdout: %s\nStderr: %s\n", strings.Join(command, " "), stdout.String(), stderr.String()) + stderr.Reset() + stdout.Reset() + return false + } + return true + }, time.Minute, 10*time.Second) + stdout.Reset() + + require.NoErrorf(t, ctl.Exec(ctx, &p, kube.ExecOptions{ + Container: "redpanda", + Command: []string{"rpk", "topic", "list"}, + Stdin: nil, + Stdout: &stdout, + Stderr: &stderr, + }), "\nStdout: %s\nStderr: %s\n", stdout.String(), stderr.String()) + require.Len(t, stderr.Bytes(), 0) - require.Equal(t, expected, actual) + } } diff --git a/acceptance/steps/scaling.go b/acceptance/steps/scaling.go new file mode 100644 index 000000000..41017ff90 --- /dev/null +++ b/acceptance/steps/scaling.go @@ -0,0 +1,92 @@ +// Copyright 2025 Redpanda Data, Inc. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.md +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0 + +package steps + +import ( + "context" + "time" + + "github.com/stretchr/testify/require" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" + + framework "github.com/redpanda-data/redpanda-operator/harpoon" + redpandav1alpha2 "github.com/redpanda-data/redpanda-operator/operator/api/redpanda/v1alpha2" +) + +func iCreateABasicClusterWithNodes(ctx context.Context, t framework.TestingT, clusterName string, nodeCount int) { + key := t.ResourceKey(clusterName) + image := &redpandav1alpha2.RedpandaImage{ + Tag: ptr.To("dev"), + Repository: ptr.To("localhost/redpanda-operator"), + } + + require.NoError(t, t.Create(ctx, &redpandav1alpha2.Redpanda{ + ObjectMeta: metav1.ObjectMeta{ + Name: key.Name, + Namespace: key.Namespace, + }, + Spec: redpandav1alpha2.RedpandaSpec{ + ClusterSpec: &redpandav1alpha2.RedpandaClusterSpec{ + Statefulset: &redpandav1alpha2.Statefulset{ + Replicas: ptr.To(nodeCount), + SideCars: &redpandav1alpha2.SideCars{ + Image: image, + Controllers: &redpandav1alpha2.RPControllers{ + Image: image, + }, + }, + }, + }, + }, + })) + + t.Cleanup(func(ctx context.Context) { + t := framework.T(ctx) + + t.Log("cleaning up Redpanda cluster") + require.NoError(t, t.Delete(ctx, &redpandav1alpha2.Redpanda{ + ObjectMeta: metav1.ObjectMeta{ + Name: key.Name, + Namespace: key.Namespace, + }, + })) + + var cluster redpandav1alpha2.Redpanda + require.Eventually(t, func() bool { + // this can take some time + deleted := false + if err := t.Get(ctx, key, &cluster); err != nil && apierrors.IsNotFound(err) { + deleted = true + } + + t.Logf("checking that Redpanda cluster %q is fully deleted: %v", clusterName, deleted) + + return deleted + }, 2*time.Minute, 5*time.Second, `Cluster %q still exists`, clusterName) + }) +} + +func iScaleToNodes(ctx context.Context, t framework.TestingT, clusterName string, nodeCount int) { + var cluster redpandav1alpha2.Redpanda + var err error + + key := t.ResourceKey(clusterName) + + require.Eventually(t, func() bool { + // do this in a loop in case we are racing with the controller + require.NoError(t, t.Get(ctx, key, &cluster)) + cluster.Spec.ClusterSpec.Statefulset.Replicas = ptr.To(nodeCount) + + err = t.Update(ctx, &cluster) + return err == nil + }, 20*time.Second, 2*time.Second, `Cluster %q was unable to scale, last error: %v`, key.String(), err) +} diff --git a/acceptance/steps/service.go b/acceptance/steps/service.go new file mode 100644 index 000000000..8932cdd93 --- /dev/null +++ b/acceptance/steps/service.go @@ -0,0 +1,46 @@ +// Copyright 2025 Redpanda Data, Inc. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.md +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0 + +package steps + +import ( + "context" + "fmt" + "time" + + "github.com/stretchr/testify/require" + corev1 "k8s.io/api/core/v1" + + framework "github.com/redpanda-data/redpanda-operator/harpoon" +) + +func checkServiceWithPort(ctx context.Context, t framework.TestingT, serviceName, portName string, port int32) { + var service corev1.Service + + key := t.ResourceKey(serviceName) + + t.Logf("Checking service %q has port %q with value %d", serviceName, portName, port) + require.Eventually(t, func() bool { + require.NoError(t, t.Get(ctx, key, &service)) + + for _, servicePort := range service.Spec.Ports { + if servicePort.Name == portName { + hasMatchingPort := servicePort.Port == port + t.Logf(`Checking port %q has value %d? %v (%d)`, portName, port, hasMatchingPort, servicePort.Port) + return hasMatchingPort + } + } + + t.Logf(`Did not find port named %q`, portName) + return false + }, 5*time.Minute, 5*time.Second, "%s", delayLog(func() string { + return fmt.Sprintf(`Service %q never contained port named %q with value %d`, key.String(), portName, port) + })) + t.Logf("Found port named %q on service %q with value %d!", portName, serviceName, port) +} diff --git a/charts/connectors/go.mod b/charts/connectors/go.mod index f36beb93b..f5e9a4677 100644 --- a/charts/connectors/go.mod +++ b/charts/connectors/go.mod @@ -7,7 +7,7 @@ require ( github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.76.2 github.com/quasilyte/go-ruleguard/dsl v0.3.22 github.com/redpanda-data/redpanda-operator/gotohelm v1.1.0 - github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20250124085449-058118a82f50 + github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20251125071431-634f74e9db59 github.com/stretchr/testify v1.10.0 golang.org/x/tools v0.29.0 k8s.io/api v0.30.3 diff --git a/charts/console/go.mod b/charts/console/go.mod index 13af0c84a..a06df7d17 100644 --- a/charts/console/go.mod +++ b/charts/console/go.mod @@ -6,7 +6,7 @@ require ( github.com/google/gofuzz v1.2.0 github.com/quasilyte/go-ruleguard/dsl v0.3.22 github.com/redpanda-data/redpanda-operator/gotohelm v1.1.0 - github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20250124085449-058118a82f50 + github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20251125071431-634f74e9db59 github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 github.com/stretchr/testify v1.10.0 golang.org/x/tools v0.29.0 diff --git a/charts/redpanda/README.md b/charts/redpanda/README.md index d2e32db33..53d4defce 100644 --- a/charts/redpanda/README.md +++ b/charts/redpanda/README.md @@ -998,12 +998,24 @@ DEPRECATED: Please use statefulset.sideCars.brokerDecommissioner and statefulset {"createRBAC":true,"enabled":false,"healthProbeAddress":":8085","image":{"repository":"docker.redpanda.com/redpandadata/redpanda-operator","tag":"v2.3.14-24.3.17"},"metricsAddress":":9082","pprofAddress":":9083","resources":{},"run":["all"],"securityContext":{}} ``` +### [statefulset.sideCars.controllers.createRBAC](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.controllers.createRBAC) + +DEPRECATED: Use `rbac.enabled` to control RBAC chart wide or control RBAC by selectively enabling/disabling specific sidecar controllers. Setting this field has no effect. + +**Default:** `true` + ### [statefulset.sideCars.controllers.resources](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.controllers.resources) To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed * Every container in the Pod must have a CPU limit and a CPU request. * For every container in the Pod, the CPU limit must equal the CPU request. * Every container in the Pod must have a CPU limit and a CPU request. * For every container in the Pod, the CPU limit must equal the CPU request. To maximize efficiency, use the `static` CPU manager policy by specifying an even integer for CPU resource requests and limits. This policy gives the Pods running Redpanda brokers access to exclusive CPUs on the node. For details, see https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/#static-policy **Default:** `{}` +### [statefulset.sideCars.controllers.run](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.controllers.run) + +DEPRECATED: Please use statefulset.sideCars.brokerDecommissioner and statefulset.sideCars.pvcUnbinder Setting this field has no effect. + +**Default:** `["all"]` + ### [statefulset.sideCars.extraVolumeMounts](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.extraVolumeMounts) **Default:** `""` diff --git a/charts/redpanda/chart/charts/console-3.3.0.tgz b/charts/redpanda/chart/charts/console-3.3.0.tgz new file mode 100644 index 000000000..fe2d92f45 Binary files /dev/null and b/charts/redpanda/chart/charts/console-3.3.0.tgz differ diff --git a/charts/redpanda/chart_test.go b/charts/redpanda/chart_test.go index 266e7824b..f56a4fb9d 100644 --- a/charts/redpanda/chart_test.go +++ b/charts/redpanda/chart_test.go @@ -171,7 +171,7 @@ func TestIntegrationChart(t *testing.T) { Values: partial, }) - rpk := Client{Ctl: env.Ctl(), Release: &rpRelease} + rpk := &Client{Ctl: env.Ctl(), Release: &rpRelease} dot := &helmette.Dot{ Values: *helmette.UnmarshalInto[*helmette.Values](partial), @@ -246,7 +246,7 @@ func TestIntegrationChart(t *testing.T) { Namespace: env.Namespace(), }) - rpk := Client{Ctl: env.Ctl(), Release: &rpRelease} + rpk := &Client{Ctl: env.Ctl(), Release: &rpRelease} dot := &helmette.Dot{ Values: *helmette.UnmarshalInto[*helmette.Values](partial), @@ -305,7 +305,7 @@ func TestIntegrationChart(t *testing.T) { Namespace: env.Namespace(), }) - rpk := Client{Ctl: env.Ctl(), Release: &rpRelease} + rpk := &Client{Ctl: env.Ctl(), Release: &rpRelease} dot := &helmette.Dot{ Values: *helmette.UnmarshalInto[*helmette.Values](partial), @@ -368,7 +368,7 @@ func TestIntegrationChart(t *testing.T) { Namespace: env.Namespace(), }) - rpk := Client{Ctl: env.Ctl(), Release: &rpRelease} + rpk := &Client{Ctl: env.Ctl(), Release: &rpRelease} dot := &helmette.Dot{ Values: *helmette.UnmarshalInto[*helmette.Values](partial), @@ -507,7 +507,7 @@ func TieredStorageSecretRefs(t *testing.T, secret *corev1.Secret) redpanda.Parti } } -func kafkaListenerTest(ctx context.Context, rpk Client) error { +func kafkaListenerTest(ctx context.Context, rpk *Client) error { input := "test-input" topicName := "testTopic" _, err := rpk.CreateTopic(ctx, topicName) @@ -532,7 +532,7 @@ func kafkaListenerTest(ctx context.Context, rpk Client) error { return nil } -func adminListenerTest(ctx context.Context, rpk Client) error { +func adminListenerTest(ctx context.Context, rpk *Client) error { deadline := time.After(1 * time.Minute) for { select { @@ -553,7 +553,7 @@ func adminListenerTest(ctx context.Context, rpk Client) error { } } -func superuserTest(ctx context.Context, rpk Client, superusers ...string) error { +func superuserTest(ctx context.Context, rpk *Client, superusers ...string) error { deadline := time.After(1 * time.Minute) for { select { @@ -594,7 +594,7 @@ func equalElements[T comparable](a, b []T) bool { return true } -func schemaRegistryListenerTest(ctx context.Context, rpk Client) ([]byte, string, error) { +func schemaRegistryListenerTest(ctx context.Context, rpk *Client) ([]byte, string, error) { // Test schema registry // Based on https://docs.redpanda.com/current/manage/schema-reg/schema-reg-api/ formats, err := rpk.QuerySupportedFormats(ctx) @@ -677,7 +677,7 @@ type HTTPResponse []struct { Offset int `json:"offset"` } -func httpProxyListenerTest(ctx context.Context, rpk Client) error { +func httpProxyListenerTest(ctx context.Context, rpk *Client) error { // Test http proxy // Based on https://docs.redpanda.com/current/develop/http-proxy/ _, err := rpk.ListTopics(ctx) @@ -903,6 +903,28 @@ func minimalValues(partials ...*redpanda.PartialValues) *redpanda.PartialValues PodTemplate: &redpanda.PartialPodTemplate{ Spec: applycorev1.PodSpec().WithTerminationGracePeriodSeconds(10), }, + SideCars: &redpanda.PartialSidecars{ + Image: &redpanda.PartialImage{ + Repository: ptr.To("localhost/redpanda-operator"), + Tag: ptr.To("dev"), + }, + Controllers: &struct { + DeprecatedImage *redpanda.PartialImage "json:\"image,omitempty\"" + Enabled *bool "json:\"enabled,omitempty\"" + CreateRBAC *bool "json:\"createRBAC,omitempty\"" + Resources any "json:\"resources,omitempty\"" + SecurityContext *corev1.SecurityContext "json:\"securityContext,omitempty\"" + HealthProbeAddress *string "json:\"healthProbeAddress,omitempty\"" + MetricsAddress *string "json:\"metricsAddress,omitempty\"" + PprofAddress *string "json:\"pprofAddress,omitempty\"" + Run []string "json:\"run,omitempty\"" + }{ + DeprecatedImage: &redpanda.PartialImage{ + Repository: ptr.To("localhost/redpanda-operator"), + Tag: ptr.To("dev"), + }, + }, + }, }, } diff --git a/charts/redpanda/post_install_upgrade_job.go b/charts/redpanda/post_install_upgrade_job.go index f0a0174b1..536e361be 100644 --- a/charts/redpanda/post_install_upgrade_job.go +++ b/charts/redpanda/post_install_upgrade_job.go @@ -33,8 +33,8 @@ func bootstrapYamlTemplater(dot *helmette.Dot) corev1.Container { env = append(env, additionalEnv...) image := fmt.Sprintf(`%s:%s`, - values.Statefulset.SideCars.Controllers.Image.Repository, - values.Statefulset.SideCars.Controllers.Image.Tag, + values.Statefulset.SideCars.Controllers.DeprecatedImage.Repository, + values.Statefulset.SideCars.Controllers.DeprecatedImage.Tag, ) return corev1.Container{ @@ -81,8 +81,8 @@ func PostInstallUpgradeJob(dot *helmette.Dot) *batchv1.Job { } image := fmt.Sprintf(`%s:%s`, - values.Statefulset.SideCars.Controllers.Image.Repository, - values.Statefulset.SideCars.Controllers.Image.Tag, + values.Statefulset.SideCars.Controllers.DeprecatedImage.Repository, + values.Statefulset.SideCars.Controllers.DeprecatedImage.Tag, ) job := &batchv1.Job{ diff --git a/charts/redpanda/rbac.go b/charts/redpanda/rbac.go index 91b248ea7..14c1e5f6f 100644 --- a/charts/redpanda/rbac.go +++ b/charts/redpanda/rbac.go @@ -24,9 +24,9 @@ func Roles(dot *helmette.Dot) []*rbacv1.Role { // path of static role definition -> Enabled mapping := map[string]bool{ - "files/sidecar.Role.yaml": values.RBAC.Enabled && values.Statefulset.SideCars.Controllers.CreateRBAC, - "files/pvcunbinder.Role.yaml": values.Statefulset.SideCars.ShouldCreateRBAC() && values.Statefulset.SideCars.PVCUnbinderEnabled(), - "files/decommission.Role.yaml": values.Statefulset.SideCars.ShouldCreateRBAC() && values.Statefulset.SideCars.BrokerDecommissionerEnabled(), + "files/sidecar.Role.yaml": values.RBAC.Enabled, + "files/pvcunbinder.Role.yaml": values.RBAC.Enabled && values.Statefulset.SideCars.PVCUnbinder.Enabled, + "files/decommission.Role.yaml": values.RBAC.Enabled && values.Statefulset.SideCars.BrokerDecommissioner.Enabled, "files/rpk-debug-bundle.Role.yaml": values.RBAC.Enabled && values.RBAC.RPKDebugBundle, } @@ -59,11 +59,10 @@ func ClusterRoles(dot *helmette.Dot) []*rbacv1.ClusterRole { // path of static ClusterRole definition -> Enabled mapping := map[string]bool{ - "files/pvcunbinder.ClusterRole.yaml": values.Statefulset.SideCars.ShouldCreateRBAC() && values.Statefulset.SideCars.PVCUnbinderEnabled(), - "files/decommission.ClusterRole.yaml": values.Statefulset.SideCars.ShouldCreateRBAC() && values.Statefulset.SideCars.BrokerDecommissionerEnabled(), + "files/pvcunbinder.ClusterRole.yaml": values.RBAC.Enabled && values.Statefulset.SideCars.PVCUnbinder.Enabled, + "files/decommission.ClusterRole.yaml": values.RBAC.Enabled && values.Statefulset.SideCars.BrokerDecommissioner.Enabled, "files/rack-awareness.ClusterRole.yaml": values.RBAC.Enabled && values.RackAwareness.Enabled, } - var clusterRoles []*rbacv1.ClusterRole for file, enabled := range helmette.SortedMap(mapping) { if !enabled { diff --git a/charts/redpanda/statefulset.go b/charts/redpanda/statefulset.go index 60acb102c..98c7ea6c0 100644 --- a/charts/redpanda/statefulset.go +++ b/charts/redpanda/statefulset.go @@ -831,6 +831,13 @@ func statefulSetContainerSidecar(dot *helmette.Dot) *corev1.Container { dot.Release.Namespace, `--redpanda-cluster-name`, Fullname(dot), + // Values pulled from FullLabels. + fmt.Sprintf( + "--selector=helm.sh/chart=%s,app.kubernetes.io/name=%s,app.kubernetes.io/instance=%s", + ChartLabel(dot), + Name(dot), + dot.Release.Name, + ), `--run-broker-probe`, `--broker-probe-broker-url`, // even though this is named "...URLs", it returns diff --git a/charts/redpanda/templates/_rbac.go.tpl b/charts/redpanda/templates/_rbac.go.tpl index c4cbb4e43..40e3a0954 100644 --- a/charts/redpanda/templates/_rbac.go.tpl +++ b/charts/redpanda/templates/_rbac.go.tpl @@ -5,7 +5,7 @@ {{- range $_ := (list 1) -}} {{- $_is_returning := false -}} {{- $values := $dot.Values.AsMap -}} -{{- $mapping := (dict "files/sidecar.Role.yaml" (and $values.rbac.enabled $values.statefulset.sideCars.controllers.createRBAC) "files/pvcunbinder.Role.yaml" (and (get (fromJson (include "redpanda.Sidecars.ShouldCreateRBAC" (dict "a" (list $values.statefulset.sideCars)))) "r") (get (fromJson (include "redpanda.Sidecars.PVCUnbinderEnabled" (dict "a" (list $values.statefulset.sideCars)))) "r")) "files/decommission.Role.yaml" (and (get (fromJson (include "redpanda.Sidecars.ShouldCreateRBAC" (dict "a" (list $values.statefulset.sideCars)))) "r") (get (fromJson (include "redpanda.Sidecars.BrokerDecommissionerEnabled" (dict "a" (list $values.statefulset.sideCars)))) "r")) "files/rpk-debug-bundle.Role.yaml" (and $values.rbac.enabled $values.rbac.rpkDebugBundle)) -}} +{{- $mapping := (dict "files/sidecar.Role.yaml" $values.rbac.enabled "files/pvcunbinder.Role.yaml" (and $values.rbac.enabled $values.statefulset.sideCars.pvcUnbinder.enabled) "files/decommission.Role.yaml" (and $values.rbac.enabled $values.statefulset.sideCars.brokerDecommissioner.enabled) "files/rpk-debug-bundle.Role.yaml" (and $values.rbac.enabled $values.rbac.rpkDebugBundle)) -}} {{- $roles := (coalesce nil) -}} {{- range $file, $enabled := $mapping -}} {{- if (not $enabled) -}} @@ -32,7 +32,7 @@ {{- range $_ := (list 1) -}} {{- $_is_returning := false -}} {{- $values := $dot.Values.AsMap -}} -{{- $mapping := (dict "files/pvcunbinder.ClusterRole.yaml" (and (get (fromJson (include "redpanda.Sidecars.ShouldCreateRBAC" (dict "a" (list $values.statefulset.sideCars)))) "r") (get (fromJson (include "redpanda.Sidecars.PVCUnbinderEnabled" (dict "a" (list $values.statefulset.sideCars)))) "r")) "files/decommission.ClusterRole.yaml" (and (get (fromJson (include "redpanda.Sidecars.ShouldCreateRBAC" (dict "a" (list $values.statefulset.sideCars)))) "r") (get (fromJson (include "redpanda.Sidecars.BrokerDecommissionerEnabled" (dict "a" (list $values.statefulset.sideCars)))) "r")) "files/rack-awareness.ClusterRole.yaml" (and $values.rbac.enabled $values.rackAwareness.enabled)) -}} +{{- $mapping := (dict "files/pvcunbinder.ClusterRole.yaml" (and $values.rbac.enabled $values.statefulset.sideCars.pvcUnbinder.enabled) "files/decommission.ClusterRole.yaml" (and $values.rbac.enabled $values.statefulset.sideCars.brokerDecommissioner.enabled) "files/rack-awareness.ClusterRole.yaml" (and $values.rbac.enabled $values.rackAwareness.enabled)) -}} {{- $clusterRoles := (coalesce nil) -}} {{- range $file, $enabled := $mapping -}} {{- if (not $enabled) -}} diff --git a/charts/redpanda/templates/_statefulset.go.tpl b/charts/redpanda/templates/_statefulset.go.tpl index e78c93e3f..3e77ca73c 100644 --- a/charts/redpanda/templates/_statefulset.go.tpl +++ b/charts/redpanda/templates/_statefulset.go.tpl @@ -447,7 +447,7 @@ {{- range $_ := (list 1) -}} {{- $_is_returning := false -}} {{- $values := $dot.Values.AsMap -}} -{{- $args := (list `/redpanda-operator` `sidecar` `--redpanda-yaml` `/etc/redpanda/redpanda.yaml` `--redpanda-cluster-namespace` $dot.Release.Namespace `--redpanda-cluster-name` (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot)))) "r") `--run-broker-probe` `--broker-probe-broker-url` (get (fromJson (include "redpanda.adminURLsCLI" (dict "a" (list $dot)))) "r")) -}} +{{- $args := (list `/redpanda-operator` `sidecar` `--redpanda-yaml` `/etc/redpanda/redpanda.yaml` `--redpanda-cluster-namespace` $dot.Release.Namespace `--redpanda-cluster-name` (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot)))) "r") (printf "--selector=helm.sh/chart=%s,app.kubernetes.io/name=%s,app.kubernetes.io/instance=%s" (get (fromJson (include "redpanda.ChartLabel" (dict "a" (list $dot)))) "r") (get (fromJson (include "redpanda.Name" (dict "a" (list $dot)))) "r") $dot.Release.Name) `--run-broker-probe` `--broker-probe-broker-url` (get (fromJson (include "redpanda.adminURLsCLI" (dict "a" (list $dot)))) "r")) -}} {{- if $values.statefulset.sideCars.brokerDecommissioner.enabled -}} {{- $args = (concat (default (list) $args) (default (list) (list `--run-decommissioner` (printf "--decommission-vote-interval=%s" $values.statefulset.sideCars.brokerDecommissioner.decommissionAfter) (printf "--decommission-requeue-timeout=%s" $values.statefulset.sideCars.brokerDecommissioner.decommissionRequeueTimeout) `--decommission-vote-count=2`))) -}} {{- end -}} diff --git a/charts/redpanda/templates/_values.go.tpl b/charts/redpanda/templates/_values.go.tpl index f6f9c0cae..a36bda58e 100644 --- a/charts/redpanda/templates/_values.go.tpl +++ b/charts/redpanda/templates/_values.go.tpl @@ -482,46 +482,6 @@ {{- end -}} {{- end -}} -{{- define "redpanda.Sidecars.PVCUnbinderEnabled" -}} -{{- $s := (index .a 0) -}} -{{- range $_ := (list 1) -}} -{{- $_is_returning := false -}} -{{- $_is_returning = true -}} -{{- (dict "r" (and $s.controllers.enabled $s.pvcUnbinder.enabled)) | toJson -}} -{{- break -}} -{{- end -}} -{{- end -}} - -{{- define "redpanda.Sidecars.BrokerDecommissionerEnabled" -}} -{{- $s := (index .a 0) -}} -{{- range $_ := (list 1) -}} -{{- $_is_returning := false -}} -{{- $_is_returning = true -}} -{{- (dict "r" (and $s.controllers.enabled $s.brokerDecommissioner.enabled)) | toJson -}} -{{- break -}} -{{- end -}} -{{- end -}} - -{{- define "redpanda.Sidecars.ShouldCreateRBAC" -}} -{{- $s := (index .a 0) -}} -{{- range $_ := (list 1) -}} -{{- $_is_returning := false -}} -{{- $_is_returning = true -}} -{{- (dict "r" (or ((and $s.controllers.enabled $s.controllers.createRBAC)) (get (fromJson (include "redpanda.Sidecars.AdditionalSidecarControllersEnabled" (dict "a" (list $s)))) "r"))) | toJson -}} -{{- break -}} -{{- end -}} -{{- end -}} - -{{- define "redpanda.Sidecars.AdditionalSidecarControllersEnabled" -}} -{{- $s := (index .a 0) -}} -{{- range $_ := (list 1) -}} -{{- $_is_returning := false -}} -{{- $_is_returning = true -}} -{{- (dict "r" (or $s.pvcUnbinder.enabled $s.brokerDecommissioner.enabled)) | toJson -}} -{{- break -}} -{{- end -}} -{{- end -}} - {{- define "redpanda.Listeners.CreateSeedServers" -}} {{- $l := (index .a 0) -}} {{- $replicas := (index .a 1) -}} @@ -640,9 +600,9 @@ {{- $seen := (dict) -}} {{- $deduped := (coalesce nil) -}} {{- range $_, $item := $items -}} -{{- $_1071___ok_11 := (get (fromJson (include "_shims.dicttest" (dict "a" (list $seen $item.key false)))) "r") -}} -{{- $_ := (index $_1071___ok_11 0) -}} -{{- $ok_11 := (index $_1071___ok_11 1) -}} +{{- $_1060___ok_11 := (get (fromJson (include "_shims.dicttest" (dict "a" (list $seen $item.key false)))) "r") -}} +{{- $_ := (index $_1060___ok_11 0) -}} +{{- $ok_11 := (index $_1060___ok_11 1) -}} {{- if $ok_11 -}} {{- continue -}} {{- end -}} @@ -754,9 +714,9 @@ {{- $name := (index .a 1) -}} {{- range $_ := (list 1) -}} {{- $_is_returning := false -}} -{{- $_1292_cert_ok := (get (fromJson (include "_shims.dicttest" (dict "a" (list $m $name (dict "enabled" (coalesce nil) "caEnabled" false "applyInternalDNSNames" (coalesce nil) "duration" "" "issuerRef" (coalesce nil) "secretRef" (coalesce nil) "clientSecretRef" (coalesce nil)))))) "r") -}} -{{- $cert := (index $_1292_cert_ok 0) -}} -{{- $ok := (index $_1292_cert_ok 1) -}} +{{- $_1281_cert_ok := (get (fromJson (include "_shims.dicttest" (dict "a" (list $m $name (dict "enabled" (coalesce nil) "caEnabled" false "applyInternalDNSNames" (coalesce nil) "duration" "" "issuerRef" (coalesce nil) "secretRef" (coalesce nil) "clientSecretRef" (coalesce nil)))))) "r") -}} +{{- $cert := (index $_1281_cert_ok 0) -}} +{{- $ok := (index $_1281_cert_ok 1) -}} {{- if (not $ok) -}} {{- $_ := (fail (printf "Certificate %q referenced, but not found in the tls.certs map" $name)) -}} {{- end -}} @@ -1502,9 +1462,9 @@ {{- $result := (dict) -}} {{- range $k, $v := $c -}} {{- if (not (empty $v)) -}} -{{- $_2128___ok_18 := (get (fromJson (include "_shims.asnumeric" (dict "a" (list $v)))) "r") -}} -{{- $_ := ((index $_2128___ok_18 0) | float64) -}} -{{- $ok_18 := (index $_2128___ok_18 1) -}} +{{- $_2117___ok_18 := (get (fromJson (include "_shims.asnumeric" (dict "a" (list $v)))) "r") -}} +{{- $_ := ((index $_2117___ok_18 0) | float64) -}} +{{- $ok_18 := (index $_2117___ok_18 1) -}} {{- if $ok_18 -}} {{- $_ := (set $result $k $v) -}} {{- else -}}{{- if (kindIs "bool" $v) -}} @@ -1530,9 +1490,9 @@ {{- $_is_returning := false -}} {{- $result := (dict) -}} {{- range $k, $v := $c -}} -{{- $_2148_b_19_ok_20 := (get (fromJson (include "_shims.typetest" (dict "a" (list "bool" $v false)))) "r") -}} -{{- $b_19 := (index $_2148_b_19_ok_20 0) -}} -{{- $ok_20 := (index $_2148_b_19_ok_20 1) -}} +{{- $_2137_b_19_ok_20 := (get (fromJson (include "_shims.typetest" (dict "a" (list "bool" $v false)))) "r") -}} +{{- $b_19 := (index $_2137_b_19_ok_20 0) -}} +{{- $ok_20 := (index $_2137_b_19_ok_20 1) -}} {{- if $ok_20 -}} {{- $_ := (set $result $k $b_19) -}} {{- continue -}} @@ -1575,15 +1535,15 @@ {{- $config := (index .a 1) -}} {{- range $_ := (list 1) -}} {{- $_is_returning := false -}} -{{- $_2193___hasAccessKey := (get (fromJson (include "_shims.dicttest" (dict "a" (list $config "cloud_storage_access_key" (coalesce nil))))) "r") -}} -{{- $_ := (index $_2193___hasAccessKey 0) -}} -{{- $hasAccessKey := (index $_2193___hasAccessKey 1) -}} -{{- $_2194___hasSecretKey := (get (fromJson (include "_shims.dicttest" (dict "a" (list $config "cloud_storage_secret_key" (coalesce nil))))) "r") -}} -{{- $_ := (index $_2194___hasSecretKey 0) -}} -{{- $hasSecretKey := (index $_2194___hasSecretKey 1) -}} -{{- $_2195___hasSharedKey := (get (fromJson (include "_shims.dicttest" (dict "a" (list $config "cloud_storage_azure_shared_key" (coalesce nil))))) "r") -}} -{{- $_ := (index $_2195___hasSharedKey 0) -}} -{{- $hasSharedKey := (index $_2195___hasSharedKey 1) -}} +{{- $_2182___hasAccessKey := (get (fromJson (include "_shims.dicttest" (dict "a" (list $config "cloud_storage_access_key" (coalesce nil))))) "r") -}} +{{- $_ := (index $_2182___hasAccessKey 0) -}} +{{- $hasAccessKey := (index $_2182___hasAccessKey 1) -}} +{{- $_2183___hasSecretKey := (get (fromJson (include "_shims.dicttest" (dict "a" (list $config "cloud_storage_secret_key" (coalesce nil))))) "r") -}} +{{- $_ := (index $_2183___hasSecretKey 0) -}} +{{- $hasSecretKey := (index $_2183___hasSecretKey 1) -}} +{{- $_2184___hasSharedKey := (get (fromJson (include "_shims.dicttest" (dict "a" (list $config "cloud_storage_azure_shared_key" (coalesce nil))))) "r") -}} +{{- $_ := (index $_2184___hasSharedKey 0) -}} +{{- $hasSharedKey := (index $_2184___hasSharedKey 1) -}} {{- $envvars := (coalesce nil) -}} {{- if (and (not $hasAccessKey) (get (fromJson (include "redpanda.SecretRef.IsValid" (dict "a" (list $tsc.accessKey)))) "r")) -}} {{- $envvars = (concat (default (list) $envvars) (list (mustMergeOverwrite (dict "name" "") (dict "name" "REDPANDA_CLOUD_STORAGE_ACCESS_KEY" "valueFrom" (get (fromJson (include "redpanda.SecretRef.AsSource" (dict "a" (list $tsc.accessKey)))) "r"))))) -}} @@ -1606,12 +1566,12 @@ {{- $c := (index .a 0) -}} {{- range $_ := (list 1) -}} {{- $_is_returning := false -}} -{{- $_2231___containerExists := (get (fromJson (include "_shims.dicttest" (dict "a" (list $c "cloud_storage_azure_container" (coalesce nil))))) "r") -}} -{{- $_ := (index $_2231___containerExists 0) -}} -{{- $containerExists := (index $_2231___containerExists 1) -}} -{{- $_2232___accountExists := (get (fromJson (include "_shims.dicttest" (dict "a" (list $c "cloud_storage_azure_storage_account" (coalesce nil))))) "r") -}} -{{- $_ := (index $_2232___accountExists 0) -}} -{{- $accountExists := (index $_2232___accountExists 1) -}} +{{- $_2220___containerExists := (get (fromJson (include "_shims.dicttest" (dict "a" (list $c "cloud_storage_azure_container" (coalesce nil))))) "r") -}} +{{- $_ := (index $_2220___containerExists 0) -}} +{{- $containerExists := (index $_2220___containerExists 1) -}} +{{- $_2221___accountExists := (get (fromJson (include "_shims.dicttest" (dict "a" (list $c "cloud_storage_azure_storage_account" (coalesce nil))))) "r") -}} +{{- $_ := (index $_2221___accountExists 0) -}} +{{- $accountExists := (index $_2221___accountExists 1) -}} {{- $_is_returning = true -}} {{- (dict "r" (and $containerExists $accountExists)) | toJson -}} {{- break -}} @@ -1622,9 +1582,9 @@ {{- $c := (index .a 0) -}} {{- range $_ := (list 1) -}} {{- $_is_returning := false -}} -{{- $_2237_value_ok := (get (fromJson (include "_shims.dicttest" (dict "a" (list $c `cloud_storage_cache_size` (coalesce nil))))) "r") -}} -{{- $value := (index $_2237_value_ok 0) -}} -{{- $ok := (index $_2237_value_ok 1) -}} +{{- $_2226_value_ok := (get (fromJson (include "_shims.dicttest" (dict "a" (list $c `cloud_storage_cache_size` (coalesce nil))))) "r") -}} +{{- $value := (index $_2226_value_ok 0) -}} +{{- $ok := (index $_2226_value_ok 1) -}} {{- if (not $ok) -}} {{- $_is_returning = true -}} {{- (dict "r" (coalesce nil)) | toJson -}} diff --git a/charts/redpanda/testdata/template-cases.golden.txtar b/charts/redpanda/testdata/template-cases.golden.txtar index 9733a292f..ff700faec 100644 --- a/charts/redpanda/testdata/template-cases.golden.txtar +++ b/charts/redpanda/testdata/template-cases.golden.txtar @@ -946,6 +946,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -2321,6 +2322,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -3538,6 +3540,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -4969,6 +4972,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -6302,6 +6306,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -7881,6 +7886,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -9467,6 +9473,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -11060,6 +11067,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -12598,6 +12606,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -14165,6 +14174,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -15724,6 +15734,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -17254,6 +17265,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -18727,6 +18739,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -20034,6 +20047,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -21317,6 +21331,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -22830,6 +22845,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -24314,6 +24330,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -25795,6 +25812,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -27335,6 +27353,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -28888,6 +28907,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -30441,6 +30461,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -31940,6 +31961,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -33494,6 +33516,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -35066,6 +35089,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -36638,6 +36662,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -38157,6 +38182,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -39729,6 +39755,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -41301,6 +41328,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -42873,6 +42901,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -44392,6 +44421,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -45907,6 +45937,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -47389,6 +47420,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -48870,6 +48902,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -50442,6 +50475,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -51941,6 +51975,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -53425,6 +53460,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -54961,6 +54997,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -56699,6 +56736,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -58180,6 +58218,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -59672,6 +59711,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).change-name.default.svc.cluster.local.:9644 @@ -61194,6 +61234,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -62709,6 +62750,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -64217,6 +64259,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -65506,6 +65549,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -67102,6 +67146,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -68578,6 +68623,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -70165,6 +70211,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -71653,6 +71700,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -73381,6 +73429,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -74913,6 +74962,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -76395,6 +76445,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -77877,6 +77928,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -79276,6 +79328,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local:9644 @@ -80814,6 +80867,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local:9644 @@ -82441,6 +82495,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -83995,6 +84050,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -85549,6 +85605,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -87085,6 +87142,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -88617,6 +88675,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -90113,6 +90172,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -91649,6 +91709,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -93181,6 +93242,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -94665,6 +94727,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -96201,6 +96264,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -97733,6 +97797,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -99217,6 +99282,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -100753,6 +100819,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -102285,6 +102352,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -103769,6 +103837,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -105305,6 +105374,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -106837,6 +106907,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -108321,6 +108392,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -109857,6 +109929,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -111389,6 +111462,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -112873,6 +112947,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -114166,6 +114241,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -117693,6 +117769,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -119437,6 +119514,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -124858,6 +124936,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -126420,6 +126499,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -128059,6 +128139,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -129634,6 +129715,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -131249,6 +131331,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -132781,6 +132864,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -134400,6 +134484,7 @@ spec: - default - --redpanda-cluster-name - also-not-redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=not-redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).also-not-redpanda.default.svc.cluster.local.:9644 @@ -135881,6 +135966,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -137362,6 +137448,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -138859,6 +138946,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -140686,6 +140774,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -142392,6 +142481,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -143928,6 +144018,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -145460,6 +145551,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -146944,6 +147036,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -148480,6 +148573,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -150012,6 +150106,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -151513,6 +151608,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 @@ -153146,6 +153242,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9643 @@ -154556,6 +154653,7 @@ spec: - default - --redpanda-cluster-name - redpanda + - --selector=helm.sh/chart=redpanda-5.9.29,app.kubernetes.io/name=redpanda,app.kubernetes.io/instance=redpanda - --run-broker-probe - --broker-probe-broker-url - $(SERVICE_NAME).redpanda.default.svc.cluster.local.:9644 diff --git a/charts/redpanda/values.go b/charts/redpanda/values.go index 61e119f6e..ba1bbb6cb 100644 --- a/charts/redpanda/values.go +++ b/charts/redpanda/values.go @@ -934,7 +934,10 @@ type Sidecars struct { SecurityContext *corev1.SecurityContext `json:"securityContext"` } `json:"configWatcher"` Controllers struct { - Image Image `json:"image"` + DeprecatedImage *Image `json:"image"` + // Enabled use to act as a global toggle for sidecar controllers. It + // was confusing and is no longer used. + // Deprecated. Enabled bool `json:"enabled"` CreateRBAC bool `json:"createRBAC"` Resources any `json:"resources"` @@ -942,26 +945,12 @@ type Sidecars struct { HealthProbeAddress string `json:"healthProbeAddress"` MetricsAddress string `json:"metricsAddress"` PprofAddress string `json:"pprofAddress"` - Run []string `json:"run"` + // Run used to be a string list of additional controllers to run. It is no longer used. + // Deprecated. + Run []string `json:"run"` } `json:"controllers"` } -func (s *Sidecars) PVCUnbinderEnabled() bool { - return s.Controllers.Enabled && s.PVCUnbinder.Enabled -} - -func (s *Sidecars) BrokerDecommissionerEnabled() bool { - return s.Controllers.Enabled && s.BrokerDecommissioner.Enabled -} - -func (s *Sidecars) ShouldCreateRBAC() bool { - return (s.Controllers.Enabled && s.Controllers.CreateRBAC) || s.AdditionalSidecarControllersEnabled() -} - -func (s *Sidecars) AdditionalSidecarControllersEnabled() bool { - return s.PVCUnbinder.Enabled || s.BrokerDecommissioner.Enabled -} - type Listeners struct { Admin AdminListeners `json:"admin" jsonschema:"required"` HTTP HTTPListeners `json:"http" jsonschema:"required"` diff --git a/charts/redpanda/values.yaml b/charts/redpanda/values.yaml index edec9f52b..11defc29d 100644 --- a/charts/redpanda/values.yaml +++ b/charts/redpanda/values.yaml @@ -736,8 +736,10 @@ statefulset: image: tag: v2.3.14-24.3.17 repository: docker.redpanda.com/redpandadata/redpanda-operator - # You must also enable RBAC, `rbac.enabled=true`, to deploy this sidecar enabled: false + # -- DEPRECATED: Use `rbac.enabled` to control RBAC chart wide or control RBAC by selectively enabling/disabling specific sidecar controllers. + # Setting this field has no effect. + createRBAC: true # -- To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see # https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed # @@ -755,9 +757,10 @@ statefulset: healthProbeAddress: ":8085" metricsAddress: ":9082" pprofAddress: ":9083" + # -- DEPRECATED: Please use statefulset.sideCars.brokerDecommissioner and statefulset.sideCars.pvcUnbinder + # Setting this field has no effect. run: - all - createRBAC: true initContainers: fsValidator: enabled: false diff --git a/charts/redpanda/values_partial.gen.go b/charts/redpanda/values_partial.gen.go index 0b68bb88e..3f613740a 100644 --- a/charts/redpanda/values_partial.gen.go +++ b/charts/redpanda/values_partial.gen.go @@ -380,7 +380,7 @@ type PartialSidecars struct { SecurityContext *corev1.SecurityContext "json:\"securityContext,omitempty\"" } "json:\"configWatcher,omitempty\"" Controllers *struct { - Image *PartialImage "json:\"image,omitempty\"" + DeprecatedImage *PartialImage "json:\"image,omitempty\"" Enabled *bool "json:\"enabled,omitempty\"" CreateRBAC *bool "json:\"createRBAC,omitempty\"" Resources any "json:\"resources,omitempty\"" diff --git a/gen/pipeline/pipeline.go b/gen/pipeline/pipeline.go index 103750d96..761c08635 100644 --- a/gen/pipeline/pipeline.go +++ b/gen/pipeline/pipeline.go @@ -36,7 +36,7 @@ var suites = []TestSuite{ { Name: "integration", Required: true, - Timeout: 30*time.Minute + time.Hour, + Timeout: 150 * time.Minute, Retry: ptr.To(3), }, { diff --git a/harpoon/go.mod b/harpoon/go.mod index 3e10a8837..b6538d6c5 100644 --- a/harpoon/go.mod +++ b/harpoon/go.mod @@ -8,7 +8,7 @@ require ( github.com/cucumber/messages/go/v21 v21.0.1 github.com/olekukonko/tablewriter v0.0.5 github.com/quasilyte/go-ruleguard/dsl v0.3.22 - github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20250123101329-b89e4b888a74 + github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20251125071431-634f74e9db59 github.com/stretchr/testify v1.10.0 golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e k8s.io/api v0.30.3 @@ -48,7 +48,7 @@ require ( github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-metrics v0.0.1 // 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/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/color v1.17.0 // indirect @@ -71,14 +71,14 @@ require ( github.com/gonvenience/text v1.0.7 // indirect github.com/gonvenience/wrap v1.2.0 // indirect github.com/gonvenience/ytbx v1.4.4 // indirect - github.com/google/btree v1.1.2 // indirect - github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/gnostic-models v0.6.9 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect github.com/gosuri/uitable v0.0.4 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -127,7 +127,7 @@ require ( github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.20.0 // 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 @@ -147,23 +147,23 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // 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/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/trace 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/metric v1.29.0 // indirect + go.opentelemetry.io/otel/trace v1.29.0 // indirect go.starlark.net v0.0.0-20231121155337-90ade8b19d09 // indirect golang.org/x/crypto v0.36.0 // indirect golang.org/x/net v0.38.0 // indirect - golang.org/x/oauth2 v0.22.0 // indirect + golang.org/x/oauth2 v0.28.0 // indirect golang.org/x/sync v0.12.0 // indirect golang.org/x/sys v0.31.0 // indirect golang.org/x/term v0.30.0 // indirect golang.org/x/text v0.23.0 // indirect - golang.org/x/time v0.6.0 // indirect - golang.org/x/tools v0.27.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240808171019-573a1156607a // indirect - google.golang.org/grpc v1.65.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect + golang.org/x/time v0.7.0 // indirect + golang.org/x/tools v0.29.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect + google.golang.org/grpc v1.67.1 // indirect + google.golang.org/protobuf v1.35.1 // indirect gopkg.in/evanphx/json-patch.v5 v5.7.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect @@ -179,7 +179,7 @@ require ( k8s.io/kubectl v0.30.3 // indirect k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect oras.land/oras-go v1.2.5 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/kustomize/api v0.16.0 // indirect sigs.k8s.io/kustomize/kyaml v0.17.2 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect diff --git a/harpoon/go.sum b/harpoon/go.sum index 56c742200..7743b339e 100644 --- a/harpoon/go.sum +++ b/harpoon/go.sum @@ -111,8 +111,8 @@ github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arX github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= 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/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= @@ -194,10 +194,10 @@ github.com/gonvenience/wrap v1.2.0 h1:CwAoa60QIBVmQn/aUregAbk9FstEr17k9vCYpKF972 github.com/gonvenience/wrap v1.2.0/go.mod h1:iNijaTmFD8+ORmNp9iS+dSBcCJrmIwwyoYLUngToGdk= github.com/gonvenience/ytbx v1.4.4 h1:jQopwyaLsVGuwdxSiN4WkXjsEaFNPJ3V4lUj7eyEpzo= github.com/gonvenience/ytbx v1.4.4/go.mod h1:w37+MKCPcCMY/jpPNmEklD4xKqrOAVBO6kIWW2+uI6M= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= -github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= +github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -215,8 +215,8 @@ github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= @@ -393,8 +393,8 @@ github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjz github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI= -github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +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.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= @@ -410,8 +410,8 @@ github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0leargg github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20250123101329-b89e4b888a74 h1:kUQfTikTwGpspksa78MyeC5LoqlRTY0XCeBId0VGAyU= -github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20250123101329-b89e4b888a74/go.mod h1:RLmeTQHyGNaTMZLzf+wPD7hFjkDMQMKz5gSG8X4Gp58= +github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20251125071431-634f74e9db59 h1:COc0Qp+e7ac+SVJoLrAxUIob09VdFZ146f1S+m9PNxQ= +github.com/redpanda-data/redpanda-operator/pkg v0.0.0-20251125071431-634f74e9db59/go.mod h1:sYyDsfxEjwNk1mtkON7VkGU9+ut0uaUW6+XJ+AZh1Ow= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -484,14 +484,14 @@ github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFi github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -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/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -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/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/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/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.starlark.net v0.0.0-20231121155337-90ade8b19d09 h1:hzy3LFnSN8kuQK8h9tHl4ndF6UruMj47OqwqsS+/Ai4= go.starlark.net v0.0.0-20231121155337-90ade8b19d09/go.mod h1:LcLNIzVOMp4oV+uusnpk+VU+SzXaJakUuBjoCSWH5dM= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -520,8 +520,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= -golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= +golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -547,24 +547,24 @@ 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.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= -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/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.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= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= -golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240808171019-573a1156607a h1:EKiZZXueP9/T68B8Nl0GAx9cjbQnCId0yP3qPMgaaHs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240808171019-573a1156607a/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 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= @@ -616,8 +616,8 @@ pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= sigs.k8s.io/controller-runtime v0.18.5 h1:nTHio/W+Q4aBlQMgbnC5hZb4IjIidyrizMai9P6n4Rk= sigs.k8s.io/controller-runtime v0.18.5/go.mod h1:TVoGrfdpbA9VRFaRnKgk9P5/atA0pMwq+f+msb9M8Sg= -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/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/kustomize/api v0.16.0 h1:/zAR4FOQDCkgSDmVzV2uiFbuy9bhu3jEzthrHCuvm1g= sigs.k8s.io/kustomize/api v0.16.0/go.mod h1:MnFZ7IP2YqVyVwMWoRxPtgl/5hpA+eCCrQR/866cm5c= sigs.k8s.io/kustomize/kyaml v0.17.2 h1:+AzvoJUY0kq4QAhH/ydPHHMRLijtUKiyVyh7fOSshr0= diff --git a/harpoon/internal/testing/helm.go b/harpoon/internal/testing/helm.go index d9ab0d1d1..7ffc4ed81 100644 --- a/harpoon/internal/testing/helm.go +++ b/harpoon/internal/testing/helm.go @@ -11,62 +11,59 @@ package testing import ( "context" + "strings" "github.com/stretchr/testify/require" - "k8s.io/client-go/rest" "github.com/redpanda-data/redpanda-operator/pkg/helm" ) -func (t *TestingT) InstallHelmChart(ctx context.Context, url, repo, chart string, options helm.InstallOptions) { - helmClient, err := helm.New(helm.Options{ - KubeConfig: rest.CopyConfig(t.restConfig), - }) - require.NoError(t, err) - require.NoError(t, helmClient.RepoAdd(ctx, repo, url)) +// AddHelmRepo adds a helm repository by name and URL. +func (t *TestingT) AddHelmRepo(ctx context.Context, name, url string) { + require.NoError(t, t.helmClient.RepoAdd(ctx, name, url)) +} + +// InstallHelmChart installs a helm chart from either a local path or a repo reference. +// +// t.InstallHelmChart("../charts/redpanda/chart") // Local chart +// t.InstallHelmChart("jetstack/cert-manager") // From repo +func (t *TestingT) InstallHelmChart(ctx context.Context, chart string, options helm.InstallOptions) { require.NotEqual(t, "", options.Namespace, "namespace must not be blank") require.NotEqual(t, "", options.Name, "name must not be blank") options.CreateNamespace = true - t.Logf("installing chart %q", repo+"/"+chart) - _, err = helmClient.Install(ctx, repo+"/"+chart, options) + t.Logf("installing chart %q", chart) + rel, err := t.helmClient.Install(ctx, chart, options) require.NoError(t, err) t.Cleanup(func(ctx context.Context) { - t.Logf("uninstalling chart %q", repo+"/"+chart) - require.NoError(t, helmClient.Uninstall(ctx, helm.Release{ - Name: options.Name, + t.Logf("uninstalling chart %q", chart) + err := t.helmClient.Uninstall(ctx, helm.Release{ + Name: rel.Name, Namespace: options.Namespace, - })) + }) + + // If the install fails due to a lack of a release, swallow the error. This + // is tear down code, so it's not critical for this to run without issue. + // Some test cases (Namely migration from chart -> operator) will manually + // remove the helm release, in which case we expect to see this error. + // Plumbing in the ability to skip this clean up is quite difficult as it + // would need to be come from a different step. + if err != nil && !strings.Contains(err.Error(), "release: not found") { + require.NoError(t, err) + } }) } -func (t *TestingT) InstallLocalHelmChart(ctx context.Context, path string, options helm.InstallOptions, deps ...helm.Dependency) { - helmClient, err := helm.New(helm.Options{ - KubeConfig: rest.CopyConfig(t.restConfig), - }) - require.NoError(t, err) +// UpgradeHelmChart upgrades a helm chart from either a local path or a repo reference. +// +// t.UpgradeHelmChart("../charts/redpanda/chart") // Local chart +// t.UpgradeHelmChart("jetstack/cert-manager") // From repo +func (t *TestingT) UpgradeHelmChart(ctx context.Context, release, chart string, options helm.UpgradeOptions) { require.NotEqual(t, "", options.Namespace, "namespace must not be blank") - require.NotEqual(t, "", options.Name, "name must not be blank") - - options.CreateNamespace = true - - for _, dep := range deps { - require.NoError(t, helmClient.RepoAdd(ctx, dep.Name, dep.Repository)) - } - - require.NoError(t, helmClient.DependencyBuild(ctx, path)) - t.Logf("installing chart %q", path) - _, err = helmClient.Install(ctx, path, options) + t.Logf("upgrading chart %q", chart) + _, err := t.helmClient.Upgrade(ctx, release, chart, options) require.NoError(t, err) - - t.Cleanup(func(ctx context.Context) { - t.Logf("uninstalling chart %q", path) - require.NoError(t, helmClient.Uninstall(ctx, helm.Release{ - Name: options.Name, - Namespace: options.Namespace, - })) - }) } diff --git a/harpoon/internal/testing/tags.go b/harpoon/internal/testing/tags.go index d5c271a0a..16fe3a566 100644 --- a/harpoon/internal/testing/tags.go +++ b/harpoon/internal/testing/tags.go @@ -19,9 +19,14 @@ import ( type CleanupFunc func(context.Context) type ParsedTagHandler struct { - Priority int + ParsedTag + Priority int + Handler func(context.Context, *TestingT, []string) context.Context +} + +type ParsedTag struct { + Name string Arguments []string - Handler func(context.Context, *TestingT, []string) context.Context } type PriorityTagHandler struct { @@ -60,9 +65,12 @@ func (r *TagRegistry) Handlers(tags []string) []ParsedTagHandler { if handler, ok := r.tags[tag]; ok { handlers = append(handlers, ParsedTagHandler{ - Arguments: args, - Priority: handler.Priority, - Handler: handler.Handler, + ParsedTag: ParsedTag{ + Name: tag, + Arguments: args, + }, + Priority: handler.Priority, + Handler: handler.Handler, }) } } @@ -74,3 +82,12 @@ func (r *TagRegistry) Handlers(tags []string) []ParsedTagHandler { return handlers } + +func ParsedTags(handlers []ParsedTagHandler) []ParsedTag { + tags := []ParsedTag{} + for _, handler := range handlers { + tags = append(tags, handler.ParsedTag) + } + + return tags +} diff --git a/harpoon/internal/testing/testing.go b/harpoon/internal/testing/testing.go index 07359b433..a59b8bc88 100644 --- a/harpoon/internal/testing/testing.go +++ b/harpoon/internal/testing/testing.go @@ -23,6 +23,8 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/redpanda-data/redpanda-operator/pkg/helm" ) type testingContext struct{} @@ -92,6 +94,7 @@ type TestingT struct { client.Client *Cleaner + helmClient *helm.Client lastError string activeSubtest *TestingT restConfig *rest.Config @@ -109,10 +112,16 @@ func NewTesting(ctx context.Context, options *TestingOptions, cleaner *Cleaner) restConfig, err := restConfig(options.KubectlOptions) require.NoError(t, err) + helmClient, err := helm.New(helm.Options{ + KubeConfig: rest.CopyConfig(restConfig), + }) + require.NoError(t, err) + return &TestingT{ TestingT: t, Client: client, Cleaner: cleaner, + helmClient: helmClient, restConfig: restConfig, options: options, } diff --git a/harpoon/internal/tracking/features.go b/harpoon/internal/tracking/features.go index 4c9ecc503..50f8adcd0 100644 --- a/harpoon/internal/tracking/features.go +++ b/harpoon/internal/tracking/features.go @@ -51,12 +51,12 @@ type FeatureHookTracker struct { registry *internaltesting.TagRegistry opts *internaltesting.TestingOptions - onFeatures []func(context.Context, *internaltesting.TestingT) + onFeatures []func(context.Context, *internaltesting.TestingT, []internaltesting.ParsedTag) features map[string]*feature mutex sync.RWMutex } -func NewFeatureHookTracker(registry *internaltesting.TagRegistry, opts *internaltesting.TestingOptions, onFeatures, onScenarios []func(context.Context, *internaltesting.TestingT)) *FeatureHookTracker { +func NewFeatureHookTracker(registry *internaltesting.TagRegistry, opts *internaltesting.TestingOptions, onFeatures, onScenarios []func(context.Context, *internaltesting.TestingT, []internaltesting.ParsedTag)) *FeatureHookTracker { return &FeatureHookTracker{ scenarios: newScenarioHookTracker(registry, opts, onScenarios), onFeatures: onFeatures, @@ -84,13 +84,15 @@ func (f *FeatureHookTracker) Scenario(ctx context.Context, scenario *godog.Scena features.Cleaner = cleaner features.t = t + tags := f.registry.Handlers(features.tags.flatten()) + // we process the configured hooks first and then tags for _, fn := range f.onFeatures { t.SetMessagePrefix("Feature Hook Failure: ") - internaltesting.WrapWithPanicHandler(false, internaltesting.ExitBehaviorNone, fn)(ctx, t) + internaltesting.WrapWithPanicHandler(false, internaltesting.ExitBehaviorNone, fn)(ctx, t, internaltesting.ParsedTags(tags)) } - for _, fn := range f.registry.Handlers(features.tags.flatten()) { + for _, fn := range tags { // iteratively inject tag handler context t.SetMessagePrefix("Feature Tag Failure: ") ctx = internaltesting.WrapWithPanicHandler(false, internaltesting.ExitBehaviorNone, fn.Handler)(ctx, t, fn.Arguments) @@ -114,10 +116,12 @@ func (f *FeatureHookTracker) ScenarioFinished(ctx context.Context, scenario *god f.features[scenario.Uri] = features f.scenarios.finish(ctx, scenario) + features.t.Logf("finished feature scenario, %d scenarios left", features.scenariosToRun) if features.scenariosToRun <= 0 { delete(f.features, scenario.Uri) features.t.SetMessagePrefix(fmt.Sprintf("Feature (%s) Cleanup Failure: ", features.name)) + features.t.Log("running cleanup handlers") internaltesting.WrapWithPanicHandler(false, f.opts.ExitBehavior, features.DoCleanup)(ctx, features.hasStepFailure) } } @@ -169,8 +173,7 @@ func (f *FeatureHookTracker) TestRunStarted() {} func (f *FeatureHookTracker) Defined(*messages.Pickle, *messages.PickleStep, *formatters.StepDefinition) { } -func (f *FeatureHookTracker) Pickle(pickle *messages.Pickle) { -} +func (f *FeatureHookTracker) Pickle(*messages.Pickle) {} func (f *FeatureHookTracker) Failed(*messages.Pickle, *messages.PickleStep, *formatters.StepDefinition, error) { } diff --git a/harpoon/internal/tracking/scenarios.go b/harpoon/internal/tracking/scenarios.go index 9bde21b84..999b92376 100644 --- a/harpoon/internal/tracking/scenarios.go +++ b/harpoon/internal/tracking/scenarios.go @@ -30,12 +30,12 @@ type scenarioHookTracker struct { registry *internaltesting.TagRegistry opts *internaltesting.TestingOptions - onScenarios []func(context.Context, *internaltesting.TestingT) + onScenarios []func(context.Context, *internaltesting.TestingT, []internaltesting.ParsedTag) scenarios map[string]*scenario mutex sync.Mutex } -func newScenarioHookTracker(registry *internaltesting.TagRegistry, opts *internaltesting.TestingOptions, onScenarios []func(context.Context, *internaltesting.TestingT)) *scenarioHookTracker { +func newScenarioHookTracker(registry *internaltesting.TagRegistry, opts *internaltesting.TestingOptions, onScenarios []func(context.Context, *internaltesting.TestingT, []internaltesting.ParsedTag)) *scenarioHookTracker { return &scenarioHookTracker{ registry: registry, opts: opts, @@ -57,13 +57,15 @@ func (s *scenarioHookTracker) start(ctx context.Context, isFirst bool, sc *godog feature.t.PropagateError(isFirst, t) + parsed := s.registry.Handlers(tags.flatten()) + // we process the configured hooks first and then tags for _, fn := range s.onScenarios { t.SetMessagePrefix("Scenario Hook Failure: ") - internaltesting.WrapWithPanicHandler(true, internaltesting.ExitBehaviorNone, fn)(ctx, t) + internaltesting.WrapWithPanicHandler(true, internaltesting.ExitBehaviorNone, fn)(ctx, t, internaltesting.ParsedTags(parsed)) } - for _, fn := range s.registry.Handlers(tags.flatten()) { + for _, fn := range parsed { // iteratively inject tag handler context t.SetMessagePrefix("Scenario Tag Failure: ") ctx = internaltesting.WrapWithPanicHandler(true, internaltesting.ExitBehaviorNone, fn.Handler)(ctx, t, fn.Arguments) diff --git a/harpoon/providers/k3d.go b/harpoon/providers/k3d.go new file mode 100644 index 000000000..34358ab6b --- /dev/null +++ b/harpoon/providers/k3d.go @@ -0,0 +1,93 @@ +// Copyright 2025 Redpanda Data, Inc. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.md +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0 + +package providers + +import ( + "context" + "errors" + "os" + + "github.com/redpanda-data/redpanda-operator/pkg/k3d" + "github.com/redpanda-data/redpanda-operator/pkg/kube" +) + +func NewK3D(nodes int) *K3DProvider { + return &K3DProvider{ + nodes: nodes, + } +} + +type K3DProvider struct { + nodes int + cluster *k3d.Cluster + retainCluster bool + configPath string +} + +func (p *K3DProvider) RetainCluster() *K3DProvider { + p.retainCluster = true + return p +} + +func (p *K3DProvider) Initialize() error { + return nil +} + +func (p *K3DProvider) Setup(_ context.Context) error { + cluster, err := k3d.GetOrCreate("harpoon", k3d.WithServerNoSchedule(), k3d.SkipManifestInstallation(), k3d.WithAgents(p.nodes)) + if err != nil { + return err + } + + configPath, err := os.CreateTemp("", "k3d-harpoon-") + if err != nil { + return errors.Join(err, cluster.Cleanup()) + } + + if err := kube.WriteToFile(kube.RestToConfig(cluster.RESTConfig()), configPath.Name()); err != nil { + return errors.Join(err, cluster.Cleanup(), os.RemoveAll(configPath.Name())) + } + + p.cluster = cluster + p.configPath = configPath.Name() + return nil +} + +func (p *K3DProvider) Teardown(_ context.Context) error { + if !p.retainCluster && p.cluster != nil { + return errors.Join(p.cluster.Cleanup(), os.RemoveAll(p.configPath)) + } + return nil +} + +func (p *K3DProvider) LoadImages(_ context.Context, images []string) error { + for _, image := range images { + if err := p.cluster.ImportImage(image); err != nil { + return err + } + } + return nil +} + +func (p *K3DProvider) DeleteNode(_ context.Context, name string) error { + return p.cluster.DeleteNode(name) +} + +func (p *K3DProvider) AddNode(_ context.Context, _ string) error { + return p.cluster.CreateNode() +} + +func (p *K3DProvider) GetBaseContext() context.Context { + return context.Background() +} + +func (p *K3DProvider) ConfigPath() string { + return p.configPath +} diff --git a/harpoon/suite.go b/harpoon/suite.go index 761928755..c8c2020ee 100644 --- a/harpoon/suite.go +++ b/harpoon/suite.go @@ -54,8 +54,8 @@ type SuiteBuilder struct { injectors []func(context.Context) context.Context crdDirectories []string helmCharts []helmChart - onFeatures []func(context.Context, *internaltesting.TestingT) - onScenarios []func(context.Context, *internaltesting.TestingT) + onFeatures []func(context.Context, *internaltesting.TestingT, []internaltesting.ParsedTag) + onScenarios []func(context.Context, *internaltesting.TestingT, []internaltesting.ParsedTag) exitOnCleanupFailures bool } @@ -138,18 +138,32 @@ func (b *SuiteBuilder) WithImportedImages(images ...string) *SuiteBuilder { return b } -func (b *SuiteBuilder) OnFeature(fn func(context.Context, TestingT)) *SuiteBuilder { - b.onFeatures = append(b.onFeatures, func(ctx context.Context, tt *internaltesting.TestingT) { +func (b *SuiteBuilder) OnFeature(fn func(context.Context, TestingT, ...ParsedTag)) *SuiteBuilder { + b.onFeatures = append(b.onFeatures, func(ctx context.Context, tt *internaltesting.TestingT, tags []internaltesting.ParsedTag) { + parsed := []ParsedTag{} + for _, tag := range tags { + parsed = append(parsed, ParsedTag{ + Name: tag.Name, + Arguments: tag.Arguments, + }) + } // wrap since we move into the internal implementation of the interface - fn(ctx, tt) + fn(ctx, tt, parsed...) }) return b } -func (b *SuiteBuilder) OnScenario(fn func(context.Context, TestingT)) *SuiteBuilder { - b.onScenarios = append(b.onScenarios, func(ctx context.Context, tt *internaltesting.TestingT) { +func (b *SuiteBuilder) OnScenario(fn func(context.Context, TestingT, ...ParsedTag)) *SuiteBuilder { + b.onScenarios = append(b.onScenarios, func(ctx context.Context, tt *internaltesting.TestingT, tags []internaltesting.ParsedTag) { + parsed := []ParsedTag{} + for _, tag := range tags { + parsed = append(parsed, ParsedTag{ + Name: tag.Name, + Arguments: tag.Arguments, + }) + } // wrap since we move into the internal implementation of the interface - fn(ctx, tt) + fn(ctx, tt, parsed...) }) return b } @@ -174,6 +188,11 @@ func (b *SuiteBuilder) WithCRDDirectory(directory string) *SuiteBuilder { return b } +func (b *SuiteBuilder) Strict() *SuiteBuilder { + b.opts.Strict = true + return b +} + func setupErrorCheck(ctx context.Context, err error, cleanupFn func(ctx context.Context)) { if err != nil { fmt.Printf("setting up test suite: %v\n", err) @@ -201,49 +220,61 @@ func (b *SuiteBuilder) Build() (*Suite, error) { return nil, err } ctx := provider.GetBaseContext() + ctx = internaltesting.ProviderIntoContext(ctx, provider) + opts.DefaultContext = ctx opts.Tags = fmt.Sprintf("~@skip:%s", providerName) - restConfig, err := b.testingOpts.KubectlOptions.RestConfig() - if err != nil { - return nil, err - } - - helmClient, err := helm.New(helm.Options{ - KubeConfig: restConfig, - }) - if err != nil { - return nil, err - } - + var kubeOptions *internaltesting.KubectlOptions + var helmClient *helm.Client return &Suite{ output: b.output, suite: &godog.TestSuite{ Name: "acceptance", TestSuiteInitializer: func(suiteContext *godog.TestSuiteContext) { cleanup := func(ctx context.Context) { - // teardown in reverse order from setup - for _, directory := range b.crdDirectories { - _, err := internaltesting.KubectlDelete(ctx, directory, b.testingOpts.KubectlOptions) - if err != nil { - fmt.Printf("WARNING: error uninstalling crds: %v\n", err) + if kubeOptions != nil { + // teardown in reverse order from setup + for _, directory := range b.crdDirectories { + _, err := internaltesting.KubectlDelete(ctx, directory, kubeOptions) + if err != nil { + fmt.Printf("WARNING: error uninstalling crds: %v\n", err) + } } } - for _, chart := range b.helmCharts { - if err := helmClient.Uninstall(ctx, helm.Release{ - Namespace: chart.options.Namespace, - Name: chart.options.Name, - }); err != nil { - fmt.Printf("WARNING: error uninstalling helm chart: %v\n", err) + + if helmClient != nil { + for _, chart := range b.helmCharts { + if err := helmClient.Uninstall(ctx, helm.Release{ + Namespace: chart.options.Namespace, + Name: chart.options.Name, + }); err != nil { + fmt.Printf("WARNING: error uninstalling helm chart: %v\n", err) + } } } + if err := provider.Teardown(ctx); err != nil { fmt.Printf("WARNING: error running provider teardown: %v\n", err) } } suiteContext.BeforeSuite(func() { - err = provider.Setup(ctx) + err := provider.Setup(ctx) + setupErrorCheck(ctx, err, cleanup) + + if provisioned, ok := provider.(internaltesting.ProvisionedProvider); ok { + fmt.Printf("Using Kubernetes configuration at: %v\n", provisioned.ConfigPath()) + b.testingOpts.KubectlOptions = internaltesting.NewKubectlOptions(provisioned.ConfigPath()) + } + kubeOptions = b.testingOpts.KubectlOptions + + restConfig, err := b.testingOpts.KubectlOptions.RestConfig() + setupErrorCheck(ctx, err, cleanup) + + helmClient, err = helm.New(helm.Options{ + KubeConfig: restConfig, + }) setupErrorCheck(ctx, err, cleanup) err = pullImages(b.images) diff --git a/harpoon/types.go b/harpoon/types.go index cb6572487..bd24ed872 100644 --- a/harpoon/types.go +++ b/harpoon/types.go @@ -31,6 +31,11 @@ type ( FullProvider = internaltesting.Provider ) +type ParsedTag struct { + Name string + Arguments []string +} + type TestingT interface { godog.TestingT client.Client @@ -49,8 +54,9 @@ type TestingT interface { IsolateNamespace(ctx context.Context) string - InstallHelmChart(ctx context.Context, url, repo, chart string, options helm.InstallOptions) - InstallLocalHelmChart(ctx context.Context, path string, options helm.InstallOptions, deps ...helm.Dependency) + AddHelmRepo(ctx context.Context, name, url string) + InstallHelmChart(ctx context.Context, chart string, options helm.InstallOptions) + UpgradeHelmChart(ctx context.Context, release, chart string, options helm.UpgradeOptions) Namespace() string RestConfig() *rest.Config diff --git a/operator/internal/controller/decommissioning/statefulset_decommissioner_test.go b/operator/internal/controller/decommissioning/statefulset_decommissioner_test.go index 9b6e524fb..ed58ce7d3 100644 --- a/operator/internal/controller/decommissioning/statefulset_decommissioner_test.go +++ b/operator/internal/controller/decommissioning/statefulset_decommissioner_test.go @@ -238,6 +238,12 @@ func (s *StatefulSetDecommissionerSuite) installChart(name string, overrides map values := map[string]any{ "statefulset": map[string]any{ "replicas": 1, + "sideCars": map[string]any{ + "image": map[string]any{ + "repository": "localhost/redpanda-operator", + "tag": "dev", + }, + }, }, "console": map[string]any{ "enabled": false, diff --git a/operator/internal/controller/redpanda/redpanda_controller_test.go b/operator/internal/controller/redpanda/redpanda_controller_test.go index 45e9b890c..9b990a789 100644 --- a/operator/internal/controller/redpanda/redpanda_controller_test.go +++ b/operator/internal/controller/redpanda/redpanda_controller_test.go @@ -941,12 +941,23 @@ func (s *RedpandaControllerSuite) setupRBAC() string { clusterRole := roles[0].(*rbacv1.ClusterRole) // Inject additional permissions required for running in testenv. - role.Rules = append(role.Rules, rbacv1.PolicyRule{ + clusterRole.Rules = append(clusterRole.Rules, rbacv1.PolicyRule{ APIGroups: []string{""}, Resources: []string{"pods/portforward"}, Verbs: []string{"*"}, }) + // Inject additional permission required for service lookup. + // After merging https://github.com/redpanda-data/redpanda-operator/pull/1029 service discovery + // for client construction backport and changing the helm chart dependency the operator integration + // test suite requires ClusterRole to be able to list pods. In 25.1.x and main that permission is + // already present as operator by default is cluster scoped. + clusterRole.Rules = append(clusterRole.Rules, rbacv1.PolicyRule{ + APIGroups: []string{""}, + Resources: []string{"pods"}, + Verbs: []string{"list"}, + }) + name := "testenv-" + testenv.RandString(6) role.Name = name diff --git a/operator/pkg/functional/map.go b/operator/pkg/functional/map.go index 323ec8637..3004712d2 100644 --- a/operator/pkg/functional/map.go +++ b/operator/pkg/functional/map.go @@ -63,6 +63,7 @@ func deepCopyElements(v []any) []any { // including merging arrays of matching keyed arrays. Note that // the array merging behavior is *not* the same as that of Helm // so this should not be used as a replacement for that. +// Precedence is given to `second`. func MergeMaps(first, second map[string]any) map[string]any { merged := deepCopyMap(first) for k, v := range second { @@ -72,11 +73,13 @@ func MergeMaps(first, second map[string]any) map[string]any { // the types must match, otherwise we can't merge them if vmap, ok := v.(map[string]any); ok { merged[k] = MergeMaps(cast, deepCopyMap(vmap)) + continue } case []any: // the types must match, otherwise we can't merge them if varray, ok := v.([]any); ok { merged[k] = append(cast, deepCopyElements(varray)) + continue } } } diff --git a/operator/pkg/functional/map_test.go b/operator/pkg/functional/map_test.go new file mode 100644 index 000000000..f1de0b146 --- /dev/null +++ b/operator/pkg/functional/map_test.go @@ -0,0 +1,119 @@ +// Copyright 2025 Redpanda Data, Inc. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.md +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0 + +package functional_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/redpanda-data/redpanda-operator/operator/pkg/functional" +) + +func TestMergeMaps(t *testing.T) { + cases := []struct { + First map[string]any + Second map[string]any + Expect map[string]any + }{ + { + First: map[string]any{}, + Second: map[string]any{}, + Expect: map[string]any{}, + }, + { + First: map[string]any{"a": 1}, + Second: map[string]any{"b": true}, + Expect: map[string]any{"a": 1, "b": true}, + }, + { + First: map[string]any{ + "a": map[string]any{ + "b": true, + }, + }, + Second: map[string]any{ + "a": map[string]any{ + "b": 2, + "c": 1, + }, + }, + Expect: map[string]any{ + "a": map[string]any{ + "b": 2, + "c": 1, + }, + }, + }, + { + First: map[string]any{ + "statefulset": map[string]any{ + "replicas": 1, + "sideCars": map[string]any{ + "image": map[string]any{ + "repository": "localhost/redpanda-operator", + "tag": "dev", + }, + }, + }, + }, + Second: map[string]any{ + "statefulset": map[string]any{ + "replicas": 5, + }, + }, + Expect: map[string]any{ + "statefulset": map[string]any{ + "replicas": 5, + "sideCars": map[string]any{ + "image": map[string]any{ + "repository": "localhost/redpanda-operator", + "tag": "dev", + }, + }, + }, + }, + }, + { + First: map[string]any{ + "statefulset": map[string]any{ + "replicas": 5, + }, + }, + Second: map[string]any{ + "statefulset": map[string]any{ + "replicas": 1, + "sideCars": map[string]any{ + "image": map[string]any{ + "repository": "localhost/redpanda-operator", + "tag": "dev", + }, + }, + }, + }, + Expect: map[string]any{ + "statefulset": map[string]any{ + "replicas": 1, + "sideCars": map[string]any{ + "image": map[string]any{ + "repository": "localhost/redpanda-operator", + "tag": "dev", + }, + }, + }, + }, + }, + } + + for _, tc := range cases { + actual := functional.MergeMaps(tc.First, tc.Second) + require.Equal(t, tc.Expect, actual) + } +}