From ed6bb92d86aebe9880ac24c7c22f3c336325d189 Mon Sep 17 00:00:00 2001 From: AlinsRan Date: Wed, 15 Jul 2026 09:36:54 +0800 Subject: [PATCH 1/9] feat: support Gateway API 1.6.0 Bump sigs.k8s.io/gateway-api from v1.3.0 to v1.6.0. This pulls in k8s.io v0.36 and controller-runtime v0.24, which require Go 1.26, so the go directive and CI Go version are bumped accordingly. Adapt to the Gateway API v1.6 changes: - Frontend mTLS validation moved from the per-listener TLS config (listener.tls.frontendValidation) to the Gateway level (spec.tls.frontend). Resolve the validation that applies to each HTTPS listener by port (PerPort overrides Default) in the gateway translator, indexer and status/reconcile paths. - listener.TLS type renamed GatewayTLSConfig -> ListenerTLSConfig. - HTTPCORSFilter.AllowCredentials is now *bool. - Policy status/target types (PolicyStatus, PolicyAncestorStatus, LocalPolicyTargetReferenceWithSectionName, Policy* condition/reason constants) graduated to apis/v1; switch usages off v1alpha2. - PortNumber is now an alias of int32; drop redundant conversions. Adapt to controller-runtime v0.24: - Webhook builder: NewWebhookManagedBy(mgr).For(obj) -> the generic NewWebhookManagedBy[runtime.Object](mgr, obj); WithValidator now takes the typed Validator[T] and CustomValidator/webhook.CustomValidator are deprecated aliases of Validator[runtime.Object]. Rewrite both conformance suites for the v1.6 conformance module API (RunConformanceWithOptions, report written via ReportOutputPath). Build golangci-lint from source with the local toolchain and pin the lint target Go version, since the released binary cannot type-check a Go 1.26 module. Suppress SA1019 for intentional legacy usage that the k8s v0.36 bump now flags (scheme.Builder scaffold, corev1.Endpoints). --- .github/workflows/apisix-conformance-test.yml | 2 +- .github/workflows/apisix-e2e-test.yml | 2 +- .github/workflows/conformance-test.yml | 2 +- .github/workflows/e2e-test.yml | 2 +- .github/workflows/golangci-lint.yml | 2 +- .github/workflows/lint-checker.yml | 2 +- .github/workflows/push-docker-v2-dev.yaml | 2 +- .github/workflows/push-docker.yaml | 2 +- .github/workflows/unit-test.yml | 2 +- .golangci.yml | 16 + Makefile | 12 +- api/v1alpha1/httproutepolicy_types.go | 4 +- api/v1alpha1/l4routepolicy_types.go | 4 +- api/v1alpha1/policies_type.go | 6 +- api/v1alpha1/zz_generated.deepcopy.go | 12 +- ...six.apache.org_backendtrafficpolicies.yaml | 36 +- .../apisix.apache.org_httproutepolicies.yaml | 36 +- .../apisix.apache.org_l4routepolicies.yaml | 36 +- go.mod | 182 +++---- go.sum | 471 +++++++++--------- internal/adc/translator/apisixroute.go | 2 +- internal/adc/translator/gateway.go | 32 +- internal/adc/translator/gateway_test.go | 11 +- internal/adc/translator/gatewayproxy.go | 2 +- internal/adc/translator/grpcroute.go | 2 +- internal/adc/translator/httproute.go | 6 +- internal/adc/translator/httproute_test.go | 25 +- internal/adc/translator/l4routepolicy_test.go | 12 +- internal/adc/translator/policies.go | 2 +- internal/adc/translator/tcproute.go | 2 +- internal/adc/translator/tlsroute.go | 2 +- internal/adc/translator/udproute.go | 2 +- internal/controller/gateway_controller.go | 22 +- .../controller/gatewayclass_controller.go | 4 +- internal/controller/grpcroute_controller.go | 2 +- internal/controller/httproute_controller.go | 7 +- internal/controller/httproutepolicy.go | 11 +- internal/controller/indexer/indexer.go | 51 +- internal/controller/policies.go | 16 +- internal/controller/status.go | 12 +- internal/controller/tcproute_controller.go | 2 +- internal/controller/tlsroute_controller.go | 2 +- internal/controller/udproute_controller.go | 2 +- internal/controller/utils.go | 5 +- internal/provider/provider.go | 2 +- internal/types/k8s.go | 6 +- internal/webhook/v1/apisixconsumer_webhook.go | 6 +- internal/webhook/v1/apisixroute_webhook.go | 6 +- internal/webhook/v1/apisixtls_webhook.go | 6 +- internal/webhook/v1/consumer_webhook.go | 6 +- internal/webhook/v1/gateway_webhook.go | 5 +- internal/webhook/v1/gateway_webhook_test.go | 4 +- internal/webhook/v1/gatewayproxy_webhook.go | 6 +- internal/webhook/v1/grpcroute_webhook.go | 6 +- internal/webhook/v1/httproute_webhook.go | 6 +- internal/webhook/v1/ingress_webhook.go | 5 +- internal/webhook/v1/ingressclass_webhook.go | 5 +- .../webhook/v1/ssl/conflict_detector_test.go | 8 +- internal/webhook/v1/tcproute_webhook.go | 6 +- internal/webhook/v1/udproute_webhook.go | 6 +- test/conformance/api7ee/conformance_test.go | 33 +- test/conformance/conformance_test.go | 33 +- test/e2e/gatewayapi/httproute.go | 18 +- test/e2e/gatewayapi/tcproute.go | 4 +- test/e2e/scaffold/k8s.go | 4 +- 65 files changed, 679 insertions(+), 571 deletions(-) diff --git a/.github/workflows/apisix-conformance-test.yml b/.github/workflows/apisix-conformance-test.yml index 82495fbbc..60f88cf56 100644 --- a/.github/workflows/apisix-conformance-test.yml +++ b/.github/workflows/apisix-conformance-test.yml @@ -52,7 +52,7 @@ jobs: - name: Setup Go Env uses: actions/setup-go@v4 with: - go-version: "1.24" + go-version: "1.26" - name: Install kind run: | go install sigs.k8s.io/kind@v0.23.0 diff --git a/.github/workflows/apisix-e2e-test.yml b/.github/workflows/apisix-e2e-test.yml index 29a156ad4..74578e6fa 100644 --- a/.github/workflows/apisix-e2e-test.yml +++ b/.github/workflows/apisix-e2e-test.yml @@ -54,7 +54,7 @@ jobs: - name: Setup Go Env uses: actions/setup-go@v4 with: - go-version: "1.24" + go-version: "1.26" - name: Login to Registry uses: docker/login-action@v3 diff --git a/.github/workflows/conformance-test.yml b/.github/workflows/conformance-test.yml index 6ab37de1c..ee89b89a4 100644 --- a/.github/workflows/conformance-test.yml +++ b/.github/workflows/conformance-test.yml @@ -47,7 +47,7 @@ jobs: - name: Setup Go Env uses: actions/setup-go@v4 with: - go-version: "1.24" + go-version: "1.26" - name: Install kind run: | diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index be53d82cd..67348341f 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -53,7 +53,7 @@ jobs: - name: Setup Go Env uses: actions/setup-go@v4 with: - go-version: "1.24" + go-version: "1.26" - name: Install kind run: | diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index a8c4dd1a2..a10b580b9 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -33,7 +33,7 @@ jobs: - name: Setup Go Env uses: actions/setup-go@v4 with: - go-version: "1.24" + go-version: "1.26" - name: check go path for debug run: go env diff --git a/.github/workflows/lint-checker.yml b/.github/workflows/lint-checker.yml index 803040326..9dac4ff03 100644 --- a/.github/workflows/lint-checker.yml +++ b/.github/workflows/lint-checker.yml @@ -67,7 +67,7 @@ jobs: - name: Setup Go Env uses: actions/setup-go@v4 with: - go-version: "1.24" + go-version: "1.26" - name: run gofmt working-directory: ./ run: | diff --git a/.github/workflows/push-docker-v2-dev.yaml b/.github/workflows/push-docker-v2-dev.yaml index 7c08fc15a..4f2eea85b 100644 --- a/.github/workflows/push-docker-v2-dev.yaml +++ b/.github/workflows/push-docker-v2-dev.yaml @@ -35,7 +35,7 @@ jobs: - name: Setup Go Env uses: actions/setup-go@v4 with: - go-version: "1.24" + go-version: "1.26" # - name: Set up QEMU # uses: docker/setup-qemu-action@v3 diff --git a/.github/workflows/push-docker.yaml b/.github/workflows/push-docker.yaml index 7e9c9b960..a8eb13b2d 100644 --- a/.github/workflows/push-docker.yaml +++ b/.github/workflows/push-docker.yaml @@ -33,7 +33,7 @@ jobs: - name: Setup Go Env uses: actions/setup-go@v4 with: - go-version: "1.24" + go-version: "1.26" - name: Set up QEMU uses: docker/setup-qemu-action@v3 diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 8c7018b08..63c569f7d 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -34,7 +34,7 @@ jobs: - name: Setup Go Env uses: actions/setup-go@v4 with: - go-version: "1.24" + go-version: "1.26" - name: Run unit test working-directory: ./ run: | diff --git a/.golangci.yml b/.golangci.yml index bca8438e6..62878d549 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -18,6 +18,10 @@ version: "2" run: allow-parallel-runners: true + # Pin the analysis target Go version: the go.mod directive is 1.26 (required by + # k8s.io 0.36 / gateway-api 1.6), but the released golangci-lint binary is built + # with an older Go and refuses to target a newer one. + go: "1.24" linters: default: none enable: @@ -57,6 +61,18 @@ linters: - staticcheck text: "ST1001:" path: test/.* + # kubebuilder-generated scaffold: controller-runtime v0.24 deprecated + # scheme.Builder, but the generated group-version files still rely on it. + - linters: + - staticcheck + text: "SA1019:.*scheme.Builder" + path: api/.*/groupversion_info.go + # corev1.Endpoints/EndpointSubset are deprecated in k8s v1.33+, but the + # controller still uses them intentionally for endpoint discovery; the + # EndpointSlice migration is tracked separately. + - linters: + - staticcheck + text: 'SA1019:.*corev1\.(Endpoints|EndpointSubset)' paths: - third_party$ - builtin$ diff --git a/Makefile b/Makefile index 599a47a9c..f2fd3dc8d 100644 --- a/Makefile +++ b/Makefile @@ -55,11 +55,11 @@ BUILDOSSYM="github.com/apache/apisix-ingress-controller/internal/version._buildO GO_LDFLAGS ?= "-X=$(VERSYM)=$(VERSION) -X=$(GITSHASYM)=$(GITSHA) -X=$(BUILDOSSYM)=$(OSNAME)/$(OSARCH)" # gateway-api -GATEAY_API_VERSION ?= v1.3.0 -## https://github.com/kubernetes-sigs/gateway-api/blob/v1.3.0/pkg/features/httproute.go +GATEAY_API_VERSION ?= v1.6.0 +## https://github.com/kubernetes-sigs/gateway-api/blob/v1.6.0/pkg/features/httproute.go SUPPORTED_EXTENDED_FEATURES = "HTTPRouteDestinationPortMatching,HTTPRouteMethodMatching,HTTPRoutePortRedirect,HTTPRouteRequestMirror,HTTPRouteSchemeRedirect,GatewayAddressEmpty,HTTPRouteResponseHeaderModification,GatewayPort8080,HTTPRouteHostRewrite,HTTPRouteQueryParamMatching,HTTPRoutePathRewrite,HTTPRouteBackendProtocolWebSocket" CONFORMANCE_TEST_REPORT_OUTPUT ?= $(DIR)/apisix-ingress-controller-conformance-report.yaml -## https://github.com/kubernetes-sigs/gateway-api/blob/v1.3.0/conformance/utils/suite/profiles.go +## https://github.com/kubernetes-sigs/gateway-api/blob/v1.6.0/conformance/utils/suite/profiles.go CONFORMANCE_PROFILES ?= GATEWAY-HTTP,GATEWAY-GRPC,GATEWAY-TLS # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) @@ -374,7 +374,7 @@ ADC_BIN ?= $(LOCALBIN)/adc KUSTOMIZE_VERSION ?= v5.4.2 CONTROLLER_TOOLS_VERSION ?= v0.17.2 ENVTEST_VERSION ?= release-0.18 -GOLANGCI_LINT_VERSION ?= v2.1.5 +GOLANGCI_LINT_VERSION ?= v2.7.1 ## export PATH so that the tools are found export PATH := $(LOCALBIN):$(PATH) @@ -397,7 +397,9 @@ $(ENVTEST): $(LOCALBIN) .PHONY: golangci-lint golangci-lint: $(GOLANGCI_LINT) ## Download golangci-lint locally if necessary. $(GOLANGCI_LINT): $(LOCALBIN) - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s -- -b $(LOCALBIN) $(GOLANGCI_LINT_VERSION) + # Build from source with the local Go toolchain: the prebuilt release binary is + # compiled with an older Go and panics type-checking a go 1.26 module. + $(call go-install-tool,$(GOLANGCI_LINT),github.com/golangci/golangci-lint/v2/cmd/golangci-lint,$(GOLANGCI_LINT_VERSION)) .PHONY: adc adc: $(ADC_BIN) ## Download adc locally if necessary. diff --git a/api/v1alpha1/httproutepolicy_types.go b/api/v1alpha1/httproutepolicy_types.go index 0a1d2e6e1..d9d08d96f 100644 --- a/api/v1alpha1/httproutepolicy_types.go +++ b/api/v1alpha1/httproutepolicy_types.go @@ -20,7 +20,7 @@ package v1alpha1 import ( apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2" + gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" ) // HTTPRoutePolicySpec defines the desired state of HTTPRoutePolicy. @@ -28,7 +28,7 @@ type HTTPRoutePolicySpec struct { // TargetRef identifies an API object (i.e. HTTPRoute, Ingress) to apply HTTPRoutePolicy to. // +kubebuilder:validation:MinItems=1 // +kubebuilder:validation:MaxItems=16 - TargetRefs []gatewayv1alpha2.LocalPolicyTargetReferenceWithSectionName `json:"targetRefs"` + TargetRefs []gatewayv1.LocalPolicyTargetReferenceWithSectionName `json:"targetRefs"` // Priority sets the priority for route. when multiple routes have the same URI path, // a higher value sets a higher priority in route matching. Priority *int64 `json:"priority,omitempty" yaml:"priority,omitempty"` diff --git a/api/v1alpha1/l4routepolicy_types.go b/api/v1alpha1/l4routepolicy_types.go index 5bc81e667..21ae13f72 100644 --- a/api/v1alpha1/l4routepolicy_types.go +++ b/api/v1alpha1/l4routepolicy_types.go @@ -19,7 +19,7 @@ package v1alpha1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2" + gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" ) // L4RoutePolicySpec defines the desired state of L4RoutePolicy. @@ -31,7 +31,7 @@ type L4RoutePolicySpec struct { // +kubebuilder:validation:MaxItems=16 // +kubebuilder:validation:XValidation:rule="self.all(r, r.kind == 'TCPRoute' || r.kind == 'UDPRoute' || r.kind == 'TLSRoute')",message="targetRefs kind must be TCPRoute, UDPRoute, or TLSRoute" // +kubebuilder:validation:XValidation:rule="self.all(r, r.group == 'gateway.networking.k8s.io')",message="targetRefs group must be gateway.networking.k8s.io" - TargetRefs []gatewayv1alpha2.LocalPolicyTargetReferenceWithSectionName `json:"targetRefs"` + TargetRefs []gatewayv1.LocalPolicyTargetReferenceWithSectionName `json:"targetRefs"` // Plugins is the list of APISIX stream plugins to attach to the targeted L4 routes. // Plugin names should be valid APISIX stream plugin names (e.g., limit-conn, ip-restriction). diff --git a/api/v1alpha1/policies_type.go b/api/v1alpha1/policies_type.go index 23561ed04..9619e7b6d 100644 --- a/api/v1alpha1/policies_type.go +++ b/api/v1alpha1/policies_type.go @@ -17,9 +17,9 @@ package v1alpha1 -import gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2" +import gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" -type PolicyStatus gatewayv1alpha2.PolicyStatus +type PolicyStatus gatewayv1.PolicyStatus // +kubebuilder:validation:XValidation:rule="self.kind == 'Service' && self.group == \"\"" -type BackendPolicyTargetReferenceWithSectionName gatewayv1alpha2.LocalPolicyTargetReferenceWithSectionName +type BackendPolicyTargetReferenceWithSectionName gatewayv1.LocalPolicyTargetReferenceWithSectionName diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 3413663c3..6d89538db 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -24,7 +24,7 @@ import ( "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/gateway-api/apis/v1alpha2" + apisv1 "sigs.k8s.io/gateway-api/apis/v1" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -140,10 +140,10 @@ func (in *AdminKeyValueFrom) DeepCopy() *AdminKeyValueFrom { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BackendPolicyTargetReferenceWithSectionName) DeepCopyInto(out *BackendPolicyTargetReferenceWithSectionName) { *out = *in - in.LocalPolicyTargetReference.DeepCopyInto(&out.LocalPolicyTargetReference) + out.LocalPolicyTargetReference = in.LocalPolicyTargetReference if in.SectionName != nil { in, out := &in.SectionName, &out.SectionName - *out = new(v1alpha2.SectionName) + *out = new(apisv1.SectionName) **out = **in } } @@ -663,7 +663,7 @@ func (in *HTTPRoutePolicySpec) DeepCopyInto(out *HTTPRoutePolicySpec) { *out = *in if in.TargetRefs != nil { in, out := &in.TargetRefs, &out.TargetRefs - *out = make([]v1alpha2.LocalPolicyTargetReferenceWithSectionName, len(*in)) + *out = make([]apisv1.LocalPolicyTargetReferenceWithSectionName, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -781,7 +781,7 @@ func (in *L4RoutePolicySpec) DeepCopyInto(out *L4RoutePolicySpec) { *out = *in if in.TargetRefs != nil { in, out := &in.TargetRefs, &out.TargetRefs - *out = make([]v1alpha2.LocalPolicyTargetReferenceWithSectionName, len(*in)) + *out = make([]apisv1.LocalPolicyTargetReferenceWithSectionName, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -986,7 +986,7 @@ func (in *PolicyStatus) DeepCopyInto(out *PolicyStatus) { *out = *in if in.Ancestors != nil { in, out := &in.Ancestors, &out.Ancestors - *out = make([]v1alpha2.PolicyAncestorStatus, len(*in)) + *out = make([]apisv1.PolicyAncestorStatus, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } diff --git a/config/crd/bases/apisix.apache.org_backendtrafficpolicies.yaml b/config/crd/bases/apisix.apache.org_backendtrafficpolicies.yaml index 8b771c804..0ea770692 100644 --- a/config/crd/bases/apisix.apache.org_backendtrafficpolicies.yaml +++ b/config/crd/bases/apisix.apache.org_backendtrafficpolicies.yaml @@ -590,8 +590,38 @@ spec: - name type: object conditions: - description: Conditions describes the status of the Policy with - respect to the given Ancestor. + description: |- + Conditions describes the status of the Policy with respect to the given Ancestor. + + + + Notes for implementors: + + Conditions are a listType `map`, which means that they function like a + map with a key of the `type` field _in the k8s apiserver_. + + This means that implementations must obey some rules when updating this + section. + + * Implementations MUST perform a read-modify-write cycle on this field + before modifying it. That is, when modifying this field, implementations + must be confident they have fetched the most recent version of this field, + and ensure that changes they make are on that recent version. + * Implementations MUST NOT remove or reorder Conditions that they are not + directly responsible for. For example, if an implementation sees a Condition + with type `special.io/SomeField`, it MUST NOT remove, change or update that + Condition. + * Implementations MUST always _merge_ changes into Conditions of the same Type, + rather than creating more than one Condition of the same Type. + * Implementations MUST always update the `observedGeneration` field of the + Condition to the `metadata.generation` of the Gateway at the time of update creation. + * If the `observedGeneration` of a Condition is _greater than_ the value the + implementation knows about, then it MUST NOT perform the update on that Condition, + but must wait for a future reconciliation and status update. (The assumption is that + the implementation's copy of the object is stale and an update will be re-triggered + if relevant.) + + items: description: Condition contains details for one aspect of the current state of this API Resource. @@ -674,10 +704,12 @@ spec: type: string required: - ancestorRef + - conditions - controllerName type: object maxItems: 16 type: array + x-kubernetes-list-type: atomic required: - ancestors type: object diff --git a/config/crd/bases/apisix.apache.org_httproutepolicies.yaml b/config/crd/bases/apisix.apache.org_httproutepolicies.yaml index ea4fa0d4f..e01d5b33d 100644 --- a/config/crd/bases/apisix.apache.org_httproutepolicies.yaml +++ b/config/crd/bases/apisix.apache.org_httproutepolicies.yaml @@ -318,8 +318,38 @@ spec: - name type: object conditions: - description: Conditions describes the status of the Policy with - respect to the given Ancestor. + description: |- + Conditions describes the status of the Policy with respect to the given Ancestor. + + + + Notes for implementors: + + Conditions are a listType `map`, which means that they function like a + map with a key of the `type` field _in the k8s apiserver_. + + This means that implementations must obey some rules when updating this + section. + + * Implementations MUST perform a read-modify-write cycle on this field + before modifying it. That is, when modifying this field, implementations + must be confident they have fetched the most recent version of this field, + and ensure that changes they make are on that recent version. + * Implementations MUST NOT remove or reorder Conditions that they are not + directly responsible for. For example, if an implementation sees a Condition + with type `special.io/SomeField`, it MUST NOT remove, change or update that + Condition. + * Implementations MUST always _merge_ changes into Conditions of the same Type, + rather than creating more than one Condition of the same Type. + * Implementations MUST always update the `observedGeneration` field of the + Condition to the `metadata.generation` of the Gateway at the time of update creation. + * If the `observedGeneration` of a Condition is _greater than_ the value the + implementation knows about, then it MUST NOT perform the update on that Condition, + but must wait for a future reconciliation and status update. (The assumption is that + the implementation's copy of the object is stale and an update will be re-triggered + if relevant.) + + items: description: Condition contains details for one aspect of the current state of this API Resource. @@ -402,10 +432,12 @@ spec: type: string required: - ancestorRef + - conditions - controllerName type: object maxItems: 16 type: array + x-kubernetes-list-type: atomic required: - ancestors type: object diff --git a/config/crd/bases/apisix.apache.org_l4routepolicies.yaml b/config/crd/bases/apisix.apache.org_l4routepolicies.yaml index 3981fb4f8..752086e03 100644 --- a/config/crd/bases/apisix.apache.org_l4routepolicies.yaml +++ b/config/crd/bases/apisix.apache.org_l4routepolicies.yaml @@ -331,8 +331,38 @@ spec: - name type: object conditions: - description: Conditions describes the status of the Policy with - respect to the given Ancestor. + description: |- + Conditions describes the status of the Policy with respect to the given Ancestor. + + + + Notes for implementors: + + Conditions are a listType `map`, which means that they function like a + map with a key of the `type` field _in the k8s apiserver_. + + This means that implementations must obey some rules when updating this + section. + + * Implementations MUST perform a read-modify-write cycle on this field + before modifying it. That is, when modifying this field, implementations + must be confident they have fetched the most recent version of this field, + and ensure that changes they make are on that recent version. + * Implementations MUST NOT remove or reorder Conditions that they are not + directly responsible for. For example, if an implementation sees a Condition + with type `special.io/SomeField`, it MUST NOT remove, change or update that + Condition. + * Implementations MUST always _merge_ changes into Conditions of the same Type, + rather than creating more than one Condition of the same Type. + * Implementations MUST always update the `observedGeneration` field of the + Condition to the `metadata.generation` of the Gateway at the time of update creation. + * If the `observedGeneration` of a Condition is _greater than_ the value the + implementation knows about, then it MUST NOT perform the update on that Condition, + but must wait for a future reconciliation and status update. (The assumption is that + the implementation's copy of the object is stale and an update will be re-triggered + if relevant.) + + items: description: Condition contains details for one aspect of the current state of this API Resource. @@ -415,10 +445,12 @@ spec: type: string required: - ancestorRef + - conditions - controllerName type: object maxItems: 16 type: array + x-kubernetes-list-type: atomic required: - ancestors type: object diff --git a/go.mod b/go.mod index 9e4f14f6b..8cae75b80 100644 --- a/go.mod +++ b/go.mod @@ -1,55 +1,55 @@ module github.com/apache/apisix-ingress-controller -go 1.24.0 - -toolchain go1.24.7 +go 1.26.0 require ( github.com/Masterminds/sprig/v3 v3.2.3 github.com/api7/gopkg v0.2.1-0.20230601092738-0f3730f9b57a github.com/eclipse/paho.mqtt.golang v1.5.0 github.com/gavv/httpexpect/v2 v2.16.0 - github.com/go-logr/logr v1.4.2 + github.com/go-logr/logr v1.4.3 github.com/go-logr/zapr v1.3.0 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 - github.com/gorilla/websocket v1.5.3 + github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 github.com/gruntwork-io/terratest v0.50.0 github.com/hashicorp/go-memdb v1.3.4 github.com/imdario/mergo v0.3.16 github.com/incubator4/go-resty-expr v0.1.1 - github.com/onsi/ginkgo/v2 v2.22.0 - github.com/onsi/gomega v1.36.1 + github.com/onsi/ginkgo/v2 v2.28.1 + github.com/onsi/gomega v1.40.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.19.1 + github.com/prometheus/client_golang v1.23.2 github.com/samber/lo v1.47.0 - github.com/spf13/cobra v1.9.1 - github.com/stretchr/testify v1.10.0 - go.uber.org/zap v1.27.0 - golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 - google.golang.org/grpc v1.71.1 + github.com/spf13/cobra v1.10.2 + github.com/stretchr/testify v1.11.1 + go.uber.org/zap v1.28.0 + golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 + google.golang.org/grpc v1.81.1 gopkg.in/yaml.v3 v3.0.1 helm.sh/helm/v3 v3.15.4 - k8s.io/api v0.32.3 - k8s.io/apiextensions-apiserver v0.32.3 - k8s.io/apimachinery v0.32.3 - k8s.io/client-go v0.32.3 - k8s.io/kubectl v0.30.3 - k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 - sigs.k8s.io/controller-runtime v0.20.4 - sigs.k8s.io/gateway-api v1.3.0 - sigs.k8s.io/yaml v1.4.0 + k8s.io/api v0.36.1 + k8s.io/apiextensions-apiserver v0.36.1 + k8s.io/apimachinery v0.36.1 + k8s.io/apiserver v0.36.1 + k8s.io/client-go v0.36.1 + k8s.io/kubectl v0.36.1 + k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 + sigs.k8s.io/controller-runtime v0.24.1 + sigs.k8s.io/gateway-api v1.6.0 + sigs.k8s.io/gateway-api/conformance v1.6.0 + sigs.k8s.io/yaml v1.6.0 ) require ( - cel.dev/expr v0.19.1 // indirect + cel.dev/expr v0.25.1 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // 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 - github.com/Masterminds/semver/v3 v3.2.1 // indirect + github.com/Masterminds/semver/v3 v3.4.0 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect github.com/Microsoft/hcsshim v0.11.4 // indirect github.com/TylerBrock/colorjson v0.0.0-20200706003622-8a50f05110d2 // indirect @@ -96,7 +96,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect github.com/containerd/containerd v1.7.15 // indirect @@ -104,44 +104,50 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/distribution/reference v0.5.0 // indirect + github.com/distribution/reference v0.6.0 // indirect github.com/docker/cli v27.1.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect github.com/docker/docker v26.1.4+incompatible // indirect github.com/docker/docker-credential-helpers v0.7.0 // indirect 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.0 // indirect + github.com/emicklei/go-restful/v3 v3.13.0 // indirect github.com/evanphx/json-patch v5.9.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.9.11 // indirect - github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect + github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/color v1.18.0 // indirect github.com/fatih/structs v1.1.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.1 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.21.0 // indirect - github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-openapi/jsonpointer v0.23.1 // indirect + github.com/go-openapi/jsonreference v0.21.5 // indirect + github.com/go-openapi/swag v0.26.0 // indirect + github.com/go-openapi/swag/cmdutils v0.26.0 // indirect + github.com/go-openapi/swag/conv v0.26.0 // indirect + github.com/go-openapi/swag/fileutils v0.26.0 // indirect + github.com/go-openapi/swag/jsonname v0.26.0 // indirect + github.com/go-openapi/swag/jsonutils v0.26.0 // indirect + github.com/go-openapi/swag/loading v0.26.0 // indirect + github.com/go-openapi/swag/mangling v0.26.0 // indirect + github.com/go-openapi/swag/netutils v0.26.0 // indirect + github.com/go-openapi/swag/stringutils v0.26.0 // indirect + github.com/go-openapi/swag/typeutils v0.26.0 // indirect + github.com/go-openapi/swag/yamlutils v0.26.0 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/google/btree v1.1.3 // indirect - github.com/google/cel-go v0.22.0 // indirect - github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/cel-go v0.26.0 // indirect + github.com/google/gnostic-models v0.7.1 // indirect github.com/google/go-querystring v1.1.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect - github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/gosuri/uitable v0.0.4 // indirect - github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 // indirect github.com/gruntwork-io/go-commons v0.8.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect @@ -158,49 +164,46 @@ require ( github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmoiron/sqlx v1.3.5 // indirect - github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.4 // indirect + github.com/klauspost/compress v1.18.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 github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect - github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mattn/go-sqlite3 v1.14.19 // indirect github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326 // indirect - github.com/miekg/dns v1.1.65 // indirect + github.com/miekg/dns v1.1.72 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/locker v1.0.1 // indirect - github.com/moby/spdystream v0.5.0 // indirect + github.com/moby/spdystream v0.5.1 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/pquerna/otp v1.4.0 // 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 + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.20.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rubenv/sql-migrate v1.5.2 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sanity-io/litter v1.5.5 // indirect - github.com/sergi/go-diff v1.3.1 // indirect + github.com/sergi/go-diff v1.4.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/pflag v1.0.10 // indirect github.com/stoewer/go-strcase v1.3.0 // indirect github.com/urfave/cli v1.22.16 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect @@ -213,47 +216,48 @@ require ( github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect github.com/yudai/gojsondiff v1.0.0 // indirect github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect - go.opentelemetry.io/otel v1.34.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect - go.opentelemetry.io/otel/metric v1.34.0 // indirect - go.opentelemetry.io/otel/sdk v1.34.0 // indirect - go.opentelemetry.io/otel/trace v1.34.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect - go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 // indirect + go.opentelemetry.io/otel v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/otel/sdk v1.43.0 // indirect + go.opentelemetry.io/otel/trace v1.43.0 // indirect + go.opentelemetry.io/proto/otlp v1.9.0 // indirect go.uber.org/multierr v1.11.0 // indirect + go.yaml.in/yaml/v2 v2.4.4 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/arch v0.6.0 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/mod v0.23.0 // indirect - golang.org/x/net v0.39.0 // indirect - golang.org/x/oauth2 v0.27.0 // indirect - golang.org/x/sync v0.13.0 // indirect - golang.org/x/sys v0.32.0 // indirect - golang.org/x/term v0.31.0 // indirect - golang.org/x/text v0.24.0 // indirect - golang.org/x/time v0.8.0 // indirect - golang.org/x/tools v0.30.0 // indirect + golang.org/x/crypto v0.51.0 // indirect + golang.org/x/mod v0.36.0 // indirect + golang.org/x/net v0.55.0 // indirect + golang.org/x/oauth2 v0.36.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.45.0 // indirect + golang.org/x/term v0.43.0 // indirect + golang.org/x/text v0.37.0 // indirect + golang.org/x/time v0.15.0 // indirect + golang.org/x/tools v0.45.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect - google.golang.org/protobuf v1.36.6 // indirect - gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4 // indirect + google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/fsnotify.v1 v1.4.7 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/apiserver v0.32.3 // indirect - k8s.io/cli-runtime v0.30.3 // indirect - k8s.io/component-base v0.32.3 // indirect - k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect + k8s.io/cli-runtime v0.36.1 // indirect + k8s.io/component-base v0.36.1 // indirect + k8s.io/klog/v2 v2.140.0 // indirect + k8s.io/kube-openapi v0.0.0-20260501160325-927ab1f70cd6 // indirect + k8s.io/streaming v0.36.1 // indirect moul.io/http2curl/v2 v2.3.0 // indirect oras.land/oras-go v1.2.5 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 // indirect - sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect - sigs.k8s.io/kustomize/api v0.17.2 // indirect - sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/kustomize/api v0.21.1 // indirect + sigs.k8s.io/kustomize/kyaml v0.21.1 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.4.0 // indirect ) diff --git a/go.sum b/go.sum index e7c1f08ca..6e64d0d45 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,5 @@ -cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4= -cel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= @@ -17,8 +16,8 @@ github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6 github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= -github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= @@ -137,17 +136,12 @@ github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXe github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/cch123/supermonkey v1.0.1 h1:sPNQhaqMpfpERGb1oNoPcYV5tGln72SLlG2q2ozpzqg= github.com/cch123/supermonkey v1.0.1/go.mod h1:d5jXTCyG6nu/pu0vYmoC0P/l0eBGesv3oQQ315uNBOA= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/containerd/containerd v1.7.15 h1:afEHXdil9iAm03BmhjzKyXnnEBtjaLJefdU7DV0IFes= @@ -156,6 +150,10 @@ github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= +github.com/coreos/go-systemd/v22 v22.7.0 h1:LAEzFkke61DFROc7zNLX/WA2i5J8gYqe0rSj9KI28KA= +github.com/coreos/go-systemd/v22 v22.7.0/go.mod h1:xNUYtjHu2EDXbsxz1i41wouACIwT7Ybq9o0BQhMwD0w= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= @@ -172,8 +170,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aBfCb7iqHmDEIp6fBvC/hQUddQfg+3qdYjwzaiP9Hnc= github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2/go.mod h1:WHNsWjnIn2V1LYOrME7e8KxSeKunYHsxEm4am0BUtcI= -github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= -github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/cli v27.1.1+incompatible h1:goaZxOqs4QKxznZjjBWKONQci/MywhtRv2oNn0GkeZE= github.com/docker/cli v27.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= @@ -192,16 +190,14 @@ 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/eclipse/paho.mqtt.golang v1.5.0 h1:EH+bUVJNgttidWFkLLVKaQPGmkTUfQQqjOsyvMGvD6o= github.com/eclipse/paho.mqtt.golang v1.5.0/go.mod h1:du/2qNQVqJf/Sqs4MEL77kR8QTqANF7XU7Fk0aOTAgk= -github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= -github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= +github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= 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.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= @@ -213,14 +209,20 @@ github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6 github.com/foxcpp/go-mockdns v1.0.0/go.mod h1:lgRN6+KxQBawyIghpnl5CezHFGS9VLzvtVlwxvzXTQ4= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.9.1 h1:2rWm8B193Ll4VdjsJY28jxs70IdDsHRWgQYAI80+rMQ= +github.com/fxamacker/cbor/v2 v2.9.1/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/gavv/httpexpect/v2 v2.16.0 h1:Ty2favARiTYTOkCRZGX7ojXXjGyNAIohM1lZ3vqaEwI= github.com/gavv/httpexpect/v2 v2.16.0/go.mod h1:uJLaO+hQ25ukBJtQi750PsztObHybNllN+t+MbbW8PY= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE= +github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= @@ -230,18 +232,46 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= -github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4= +github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY= +github.com/go-openapi/jsonreference v0.21.5 h1:6uCGVXU/aNF13AQNggxfysJ+5ZcU4nEAe+pJyVWRdiE= +github.com/go-openapi/jsonreference v0.21.5/go.mod h1:u25Bw85sX4E2jzFodh1FOKMTZLcfifd1Q+iKKOUxExw= +github.com/go-openapi/swag v0.26.0 h1:GVDXCmfvhfu1BxiHo8/FA+BbKmhecHnG3varjON5/RI= +github.com/go-openapi/swag v0.26.0/go.mod h1:82g3193sZJRbocs7bNCqGfIgq8pkuwVwCfhKIRlEQF0= +github.com/go-openapi/swag/cmdutils v0.26.0 h1:iowihOcvq7y4egO8cOq0dmfohz6wfeQ63U1EnuhO2TU= +github.com/go-openapi/swag/cmdutils v0.26.0/go.mod h1:Sm1MVFMkF6guJJ+pQqHnQA3N0j9qALV3NxzDSv6bETM= +github.com/go-openapi/swag/conv v0.26.0 h1:5yGGsPYI1ZCva93U0AoKi/iZrNhaJEjr324YVsiD89I= +github.com/go-openapi/swag/conv v0.26.0/go.mod h1:tpAmIL7X58VPnHHiSO4uE3jBeRamGsFsfdDeDtb5ECE= +github.com/go-openapi/swag/fileutils v0.26.0 h1:WJoPRvsA7QRiiWluowkLJa9jaYR7FCuxmDvnCgaRRxU= +github.com/go-openapi/swag/fileutils v0.26.0/go.mod h1:0WDJ7lp67eNjPMO50wAWYlKvhOb6CQ37rzR7wrgI8Tc= +github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w= +github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M= +github.com/go-openapi/swag/jsonutils v0.26.0 h1:FawFML2iAXsPqmERscuMPIHmFsoP1tOqWkxBaKNMsnA= +github.com/go-openapi/swag/jsonutils v0.26.0/go.mod h1:2VmA0CJlyFqgawOaPI9psnjFDqzyivIqLYN34t9p91E= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0 h1:apqeINu/ICHouqiRZbyFvuDge5jCmmLTqGQ9V95EaOM= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.26.0/go.mod h1:AyM6QT8uz5IdKxk5akv0y6u4QvcL9GWERt0Jx/F/R8Y= +github.com/go-openapi/swag/loading v0.26.0 h1:Apg6zaKhCJurpJer0DCxq99qwmhFddBhaMX7kilDcko= +github.com/go-openapi/swag/loading v0.26.0/go.mod h1:dBxQ/6V2uBaAQdevN18VELE6xSpJWZxLX4txe12JwDg= +github.com/go-openapi/swag/mangling v0.26.0 h1:Du2YC4YLA/Y5m/YKQd7AnY5qq0wRKSFZTTt8ktFaXcQ= +github.com/go-openapi/swag/mangling v0.26.0/go.mod h1:jifS7W9vbg+pw63bT+GI53otluMQL3CeemuyCHKwVx0= +github.com/go-openapi/swag/netutils v0.26.0 h1:CmZp+ZT7HrmFwrC3GdGsXBq2+42T1bjKBapcqVpIs3c= +github.com/go-openapi/swag/netutils v0.26.0/go.mod h1:5iK+Ok3ZohWWex1C50BFTPexi03UaPwjW4Oj8kgrpwo= +github.com/go-openapi/swag/stringutils v0.26.0 h1:qZQngLxs5s7SLijc3N2ZO+fUq2o8LjuWAASSrJuh+xg= +github.com/go-openapi/swag/stringutils v0.26.0/go.mod h1:sWn5uY+QIIspwPhvgnqJsH8xqFT2ZbYcvbcFanRyhFE= +github.com/go-openapi/swag/typeutils v0.26.0 h1:2kdEwdiNWy+JJdOvu5MA2IIg2SylWAFuuyQIKYybfq4= +github.com/go-openapi/swag/typeutils v0.26.0/go.mod h1:oovDuIUvTrEHVMqWilQzKzV4YlSKgyZmFh7AlfABNVE= +github.com/go-openapi/swag/yamlutils v0.26.0 h1:H7O8l/8NJJQ/oiReEN+oMpnGMyt8G0hl460nRZxhLMQ= +github.com/go-openapi/swag/yamlutils v0.26.0/go.mod h1:1evKEGAtP37Pkwcc7EWMF0hedX0/x3Rkvei2wtG/TbU= +github.com/go-openapi/testify/enable/yaml/v2 v2.4.2 h1:5zRca5jw7lzVREKCZVNBpysDNBjj74rBh0N2BGQbSR0= +github.com/go-openapi/testify/enable/yaml/v2 v2.4.2/go.mod h1:XVevPw5hUXuV+5AkI1u1PeAm27EQVrhXTTCPAF85LmE= +github.com/go-openapi/testify/v2 v2.4.2 h1:tiByHpvE9uHrrKjOszax7ZvKB7QOgizBWGBLuq0ePx4= +github.com/go-openapi/testify/v2 v2.4.2/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= @@ -261,22 +291,16 @@ github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXs 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.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= 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/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= @@ -284,19 +308,13 @@ github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= 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.22.0 h1:b3FJZxpiv1vTMo2/5RDUqAHPxkT8mmMfJIrq1llbf7g= -github.com/google/cel-go v0.22.0/go.mod h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/cel-go v0.26.0 h1:DPGjXackMpJWH680oGY4lZhYjIameYmR+/6RBdDGmaI= +github.com/google/cel-go v0.26.0/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= +github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c= +github.com/google/gnostic-models v0.7.1/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -304,10 +322,8 @@ github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 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-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= -github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= -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/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -316,14 +332,17 @@ 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.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= -github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= +github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= 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= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 h1:QGLs/O40yoNK9vmy4rhUGBVyMf1lISBGtXRpsu/Qu/o= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0/go.mod h1:hM2alZsMUni80N33RBe6J0e423LB+odMj7d3EMP9l20= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 h1:B+8ClL/kCQkRiU82d9xajRPKYMrB7E0MbtzWVi1K4ns= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3/go.mod h1:NbCUVmiS4foBGBHOYlCT25+YmGpJ32dZPi75pGEUpj4= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7 h1:X+2YciYSxvMQK0UZ7sg45ZVabVZBeBuvMkmuI2V3Fak= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.7/go.mod h1:lW34nIZuQ8UDPdkon5fmfp2l3+ZkQ2me/+oecHYLOII= github.com/gruntwork-io/go-commons v0.8.0 h1:k/yypwrPqSeYHevLlEDmvmgQzcyTwrlZGRaxEM6G0ro= github.com/gruntwork-io/go-commons v0.8.0/go.mod h1:gtp0yTtIBExIZp7vyIV9I0XQkVwiQZze678hvDXof78= github.com/gruntwork-io/terratest v0.50.0 h1:AbBJ7IRCpLZ9H4HBrjeoWESITv8nLjN6/f1riMNcAsw= @@ -375,8 +394,8 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= +github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -385,11 +404,9 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -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.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -401,6 +418,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= 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= @@ -411,14 +430,14 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY= github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI= github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= @@ -437,8 +456,10 @@ github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb44 github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326 h1:ofNAzWCcyTALn2Zv40+8XitdzCgXY6e9qvXwN9W0YXg= github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc= -github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck= +github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= +github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= +github.com/miekg/dns v1.1.72 h1:vhmr+TF2A3tuoGNkLDFK9zi36F2LS+hKTRW0Uf8kbzI= +github.com/miekg/dns v1.1.72/go.mod h1:+EuEPhdHOsfk6Wk5TT2CzssZdqkmFhf8r+aVyDEToIs= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -451,8 +472,8 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= -github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/moby/spdystream v0.5.1 h1:9sNYeYZUcci9R6/w7KDaFWEWeV4LStVG78Mpyq/Zm/Y= +github.com/moby/spdystream v0.5.1/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= @@ -462,21 +483,20 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= -github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= -github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw= -github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/onsi/ginkgo/v2 v2.28.1 h1:S4hj+HbZp40fNKuLUQOYLDgZLwNUVn19N3Atb98NCyI= +github.com/onsi/ginkgo/v2 v2.28.1/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE= +github.com/onsi/gomega v1.40.0 h1:Vtol0e1MghCD2ZVIilPDIg44XSL9l2QAn8ZNaljWcJc= +github.com/onsi/gomega v1.40.0/go.mod h1:M/Uqpu/8qTjtzCLUA2zJHX9Iilrau25x1PdoSRbWh5A= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -503,29 +523,28 @@ github.com/pquerna/otp v1.4.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1 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.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= 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= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= +github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rubenv/sql-migrate v1.5.2 h1:bMDqOnrJVV/6JQgQ/MxOpU+AdO8uzYYA/TxFUBzFtS0= github.com/rubenv/sql-migrate v1.5.2/go.mod h1:H38GW8Vqf8F0Su5XignRyaRcbXbJunSWxs+kmzlg0Is= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -536,8 +555,8 @@ github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5 github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= +github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -552,10 +571,11 @@ github.com/sony/sonyflake v1.1.0/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/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= @@ -576,9 +596,17 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tailscale/depaware v0.0.0-20210622194025-720c4b409502/go.mod h1:p9lPsd+cx33L3H9nNoecRRxPssFKUwwI50I3pZ0yT+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.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -608,7 +636,6 @@ github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3Ifn github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= @@ -617,30 +644,36 @@ github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMzt github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +go.etcd.io/etcd/api/v3 v3.6.8 h1:gqb1VN92TAI6G2FiBvWcqKtHiIjr4SU2GdXxTwyexbM= +go.etcd.io/etcd/api/v3 v3.6.8/go.mod h1:qyQj1HZPUV3B5cbAL8scG62+fyz5dSxxu0w8pn28N6Q= +go.etcd.io/etcd/client/pkg/v3 v3.6.8 h1:Qs/5C0LNFiqXxYf2GU8MVjYUEXJ6sZaYOz0zEqQgy50= +go.etcd.io/etcd/client/pkg/v3 v3.6.8/go.mod h1:GsiTRUZE2318PggZkAo6sWb6l8JLVrnckTNfbG8PWtw= +go.etcd.io/etcd/client/v3 v3.6.8 h1:B3G76t1UykqAOrbio7s/EPatixQDkQBevN8/mwiplrY= +go.etcd.io/etcd/client/v3 v3.6.8/go.mod h1:MVG4BpSIuumPi+ELF7wYtySETmoTWBHVcDoHdVupwt8= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -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.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= -go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= -go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= -go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= -go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= -go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= -go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= -go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= -go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= -go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0 h1:XmiuHzgJt067+a6kwyAzkhXooYVv3/TOw9cM2VfJgUM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0/go.mod h1:KDgtbWKTQs4bM+VPUr6WlL9m/WXcmkCcBlIzqxPGzmI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 h1:DvJDOPmSWQHWywQS6lKL+pb8s3gBLOZUtw4N+mavW1I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0/go.mod h1:EtekO9DEJb4/jRyN4v4Qjc2yA7AtfCBuz2FynRUWTXs= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= +go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= @@ -648,8 +681,12 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= +go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= +go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= +go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/arch v0.0.0-20200826200359-b19915210f00/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc= golang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= @@ -661,50 +698,37 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= +golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= -golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4= +golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= -golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= 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= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -728,68 +752,47 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= -golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= 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.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= -golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= -golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= -golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= -golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= +golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= +golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= 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/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= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422 h1:GVIKPyP/kLIyVOgOnTwFOrvQaQUzOzGMCxgFUOEmm24= -google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422/go.mod h1:b6h1vNKhxaSoEI+5jc3PJUCustfli/mRab7295pY7rw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= -google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 h1:tu/dtnW1o3wfaxCOjSLn5IRX4YDcJrtlpzYkhHhGaC4= +google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171/go.mod h1:M5krXqk4GhBKvB596udGL3UyjL4I1+cTbK0orROM9ng= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4 h1:tEkOQcXgF6dH1G+MVKZrfpYvozGrzb91k6ha7jireSM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= +google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= 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-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -797,8 +800,8 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= -gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= @@ -819,50 +822,52 @@ gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= helm.sh/helm/v3 v3.15.4 h1:UFHd6oZ1IN3FsUZ7XNhOQDyQ2QYknBNWRHH57e9cbHY= helm.sh/helm/v3 v3.15.4/go.mod h1:phOwlxqGSgppCY/ysWBNRhG3MtnpsttOzxaTK+Mt40E= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= -k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= -k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY= -k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss= -k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/apiserver v0.32.3 h1:kOw2KBuHOA+wetX1MkmrxgBr648ksz653j26ESuWNY8= -k8s.io/apiserver v0.32.3/go.mod h1:q1x9B8E/WzShF49wh3ADOh6muSfpmFL0I2t+TG0Zdgc= -k8s.io/cli-runtime v0.30.3 h1:aG69oRzJuP2Q4o8dm+f5WJIX4ZBEwrvdID0+MXyUY6k= -k8s.io/cli-runtime v0.30.3/go.mod h1:hwrrRdd9P84CXSKzhHxrOivAR9BRnkMt0OeP5mj7X30= -k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= -k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= -k8s.io/component-base v0.32.3 h1:98WJvvMs3QZ2LYHBzvltFSeJjEx7t5+8s71P7M74u8k= -k8s.io/component-base v0.32.3/go.mod h1:LWi9cR+yPAv7cu2X9rZanTiFKB2kHA+JjmhkKjCZRpI= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= -k8s.io/kubectl v0.30.3 h1:YIBBvMdTW0xcDpmrOBzcpUVsn+zOgjMYIu7kAq+yqiI= -k8s.io/kubectl v0.30.3/go.mod h1:IcR0I9RN2+zzTRUa1BzZCm4oM0NLOawE6RzlDvd1Fpo= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/api v0.36.1 h1:XbL/EMj8K2aJpJtePmqUyQMsM0D4QI2pvl7YKJ20FTY= +k8s.io/api v0.36.1/go.mod h1:KOWo4ey3TINlXjeHVuwB3i+tXXnu+UcwFBHlI/9dvEo= +k8s.io/apiextensions-apiserver v0.36.1 h1:6JfYmPUsuUIHuN+3QxutXYWj492RqF5fBSx67GYK5Ks= +k8s.io/apiextensions-apiserver v0.36.1/go.mod h1:pLzZin90riwisdzKwv/GoTwENooytoIx5zWJb4Hkby8= +k8s.io/apimachinery v0.36.1 h1:G63Gjx2W+q0YD+72Vo8oY0nDnePVwnuzTmmy5ENrVSA= +k8s.io/apimachinery v0.36.1/go.mod h1:ibYOR00vW/I1kzvi5SF0dRuJ52BvKtfvRdOn35GPQ+8= +k8s.io/apiserver v0.36.1 h1:iMS5V+rPUertv5P9RaqJgmHHTuh4quWpoxchvMUY+JY= +k8s.io/apiserver v0.36.1/go.mod h1:Cby1PbLWztu0GDOxoO6iFOyyqIsziHNEW+w9zVQ22Kw= +k8s.io/cli-runtime v0.36.1 h1:yuC/BGnnj1YYPh6D1P+pZnzinCs6DvMq86yAeNqoqzM= +k8s.io/cli-runtime v0.36.1/go.mod h1:ZQWHGt8xAF7KnviB79vX0lYNyUUqKIpU+LQg7exuFAw= +k8s.io/client-go v0.36.1 h1:FN/K8QIT2CEDt+2WB2HnWrUANZ50AP5GII43/SP2JR0= +k8s.io/client-go v0.36.1/go.mod h1:s6rAnCtTGYDQnpNjEhSaISV+2O8jwruZ6m3QOYBFbtU= +k8s.io/component-base v0.36.1 h1:iG6GsELftXqTNG9HG6kiVjatSgAw1sf5pJ6R5a6N0kA= +k8s.io/component-base v0.36.1/go.mod h1:nf9XPlntRdqO6WMeEWAA5F93Y4ICZQdeT9GeqLDB3JI= +k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= +k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= +k8s.io/kube-openapi v0.0.0-20260501160325-927ab1f70cd6 h1:ngxu1nL4SbFuXwu1EY7cSKcVqSjTQPVbYQT6WNjTXaU= +k8s.io/kube-openapi v0.0.0-20260501160325-927ab1f70cd6/go.mod h1:uGBT7iTA6c6MvqUvSXIaYZo9ukscABYi2btjhvgKGZ0= +k8s.io/kubectl v0.36.1 h1:96HqS9twIdHM0MlJLTwbo14b9kUKPkOzZ4tlRDLv4qI= +k8s.io/kubectl v0.36.1/go.mod h1:/DGPAIewKsFWF9VFgGvkPhao2Ev4SNuE3BioZo8yPbk= +k8s.io/streaming v0.36.1 h1:L+K68n4Gg940BGNNYtUBvL1WTLL0YnKT3s+P1MNAmR4= +k8s.io/streaming v0.36.1/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s= +k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 h1:kBawHLSnx/mYHmRnNUf9d4CpjREbeZuxoSGOX/J+aYM= +k8s.io/utils v0.0.0-20260319190234-28399d86e0b5/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 h1:CPT0ExVicCzcpeN4baWEV2ko2Z/AsiZgEdwgcfwLgMo= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= -sigs.k8s.io/controller-runtime v0.20.4 h1:X3c+Odnxz+iPTRobG4tp092+CvBU9UK0t/bRf+n0DGU= -sigs.k8s.io/controller-runtime v0.20.4/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY= -sigs.k8s.io/gateway-api v1.3.0 h1:q6okN+/UKDATola4JY7zXzx40WO4VISk7i9DIfOvr9M= -sigs.k8s.io/gateway-api v1.3.0/go.mod h1:d8NV8nJbaRbEKem+5IuxkL8gJGOZ+FJ+NvOIltV8gDk= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= -sigs.k8s.io/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g= -sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0= -sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ= -sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016 h1:kXv6kKdoEtedwuqMmkqhbkgvYKeycVbC8+iPCP9j5kQ= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= -sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +sigs.k8s.io/controller-runtime v0.24.1 h1:miPEwrmirImAvgME1L9qebGHrOnGJoVmVdtOU9fRfo4= +sigs.k8s.io/controller-runtime v0.24.1/go.mod h1:vFkfY5fGt5xAC/sKb8IBFKgWPNKG9OUG29dR8Y2wImw= +sigs.k8s.io/gateway-api v1.6.0 h1:735YBRj5NXFrOGX0GoSjwzUIzbz8kiEOfADsqHFmHgE= +sigs.k8s.io/gateway-api v1.6.0/go.mod h1:FVfx3t389ybeXOqvDghLbdvJdSCfI/PReqCUI3lu3mY= +sigs.k8s.io/gateway-api/conformance v1.6.0 h1:jyH7Jtx46hEeBQnmSErn2cbp0k4OmT3FLRBnu77c4Ko= +sigs.k8s.io/gateway-api/conformance v1.6.0/go.mod h1:JD6CHFrpzVyvgivIzhu0My27sOk3I3IphxJe4CIjGb4= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/kustomize/api v0.21.1 h1:lzqbzvz2CSvsjIUZUBNFKtIMsEw7hVLJp0JeSIVmuJs= +sigs.k8s.io/kustomize/api v0.21.1/go.mod h1:f3wkKByTrgpgltLgySCntrYoq5d3q7aaxveSagwTlwI= +sigs.k8s.io/kustomize/kyaml v0.21.1 h1:IVlbmhC076nf6foyL6Taw4BkrLuEsXUXNpsE+ScX7fI= +sigs.k8s.io/kustomize/kyaml v0.21.1/go.mod h1:hmxADesM3yUN2vbA5z1/YTBnzLJ1dajdqpQonwBL1FQ= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.4.0 h1:qmp2e3ZfFi1/jJbDGpD4mt3wyp6PE1NfKHCYLqgNQJo= +sigs.k8s.io/structured-merge-diff/v6 v6.4.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/internal/adc/translator/apisixroute.go b/internal/adc/translator/apisixroute.go index f89a2053f..5c7eda3f1 100644 --- a/internal/adc/translator/apisixroute.go +++ b/internal/adc/translator/apisixroute.go @@ -463,7 +463,7 @@ func (t *Translator) translateApisixRouteBackendResolveGranularityEndpoint(tctx Kind: (*gatewayv1.Kind)(ptr.To(internaltypes.KindService)), Name: gatewayv1.ObjectName(backend.ServiceName), Namespace: (*gatewayv1.Namespace)(&arNN.Namespace), - Port: (*gatewayv1.PortNumber)(&port), + Port: &port, }, Weight: &weight, } diff --git a/internal/adc/translator/gateway.go b/internal/adc/translator/gateway.go index a5af37380..765b70f8a 100644 --- a/internal/adc/translator/gateway.go +++ b/internal/adc/translator/gateway.go @@ -144,16 +144,36 @@ func (t *Translator) translateSecret(tctx *provider.TranslateContext, listener g return sslObjs, nil } -// translateFrontendValidation builds the downstream mTLS client configuration from a -// listener's frontendValidation. The referenced CA certificates (ConfigMap, key `ca.crt`) -// are bundled into a single trust anchor used to validate client certificates. +// frontendTLSValidation resolves the Gateway-level frontend TLS client-cert +// validation that applies to the given HTTPS listener. In Gateway API v1.6, +// frontendValidation moved from the per-listener TLS config to the Gateway-level +// spec.tls.frontend: Default applies to all HTTPS listeners, and a PerPort entry +// overrides it for listeners on the matching port. +func frontendTLSValidation(obj *gatewayv1.Gateway, listener gatewayv1.Listener) *gatewayv1.FrontendTLSValidation { + if obj.Spec.TLS == nil || obj.Spec.TLS.Frontend == nil { + return nil + } + frontend := obj.Spec.TLS.Frontend + for i := range frontend.PerPort { + if frontend.PerPort[i].Port == listener.Port { + return frontend.PerPort[i].TLS.Validation + } + } + return frontend.Default.Validation +} + +// translateFrontendValidation builds the downstream mTLS client configuration from the +// Gateway's frontendValidation that applies to the listener. The referenced CA +// certificates (ConfigMap, key `ca.crt`) are bundled into a single trust anchor used +// to validate client certificates. func (t *Translator) translateFrontendValidation(tctx *provider.TranslateContext, listener gatewayv1.Listener, obj *gatewayv1.Gateway) (*adctypes.ClientClass, error) { - if listener.TLS.FrontendValidation == nil || len(listener.TLS.FrontendValidation.CACertificateRefs) == 0 { + validation := frontendTLSValidation(obj, listener) + if validation == nil || len(validation.CACertificateRefs) == 0 { return nil, nil } - cas := make([]string, 0, len(listener.TLS.FrontendValidation.CACertificateRefs)) - for _, ref := range listener.TLS.FrontendValidation.CACertificateRefs { + cas := make([]string, 0, len(validation.CACertificateRefs)) + for _, ref := range validation.CACertificateRefs { // caCertificateRefs must be in the core API group. ConfigMap is the // Gateway API Core support; Secret is an implementation-specific extension. if ref.Group != "" && string(ref.Group) != corev1.GroupName { diff --git a/internal/adc/translator/gateway_test.go b/internal/adc/translator/gateway_test.go index 4c2c6caef..444d66aa1 100644 --- a/internal/adc/translator/gateway_test.go +++ b/internal/adc/translator/gateway_test.go @@ -50,11 +50,19 @@ func newTLSGateway(frontendValidation *gatewayv1.FrontendTLSValidation) *gateway Name: "gw", }, Spec: gatewayv1.GatewaySpec{ + // In Gateway API v1.6 frontendValidation is declared at the Gateway level. + TLS: &gatewayv1.GatewayTLSConfig{ + Frontend: &gatewayv1.FrontendTLSConfig{ + Default: gatewayv1.TLSConfig{ + Validation: frontendValidation, + }, + }, + }, Listeners: []gatewayv1.Listener{ { Name: "https", Hostname: ptr.To(gatewayv1.Hostname("example.com")), - TLS: &gatewayv1.GatewayTLSConfig{ + TLS: &gatewayv1.ListenerTLSConfig{ Mode: ptr.To(gatewayv1.TLSModeTerminate), CertificateRefs: []gatewayv1.SecretObjectReference{ { @@ -62,7 +70,6 @@ func newTLSGateway(frontendValidation *gatewayv1.FrontendTLSValidation) *gateway Name: gatewayv1.ObjectName("server-cert"), }, }, - FrontendValidation: frontendValidation, }, }, }, diff --git a/internal/adc/translator/gatewayproxy.go b/internal/adc/translator/gatewayproxy.go index 13ace18d6..3a9a00f47 100644 --- a/internal/adc/translator/gatewayproxy.go +++ b/internal/adc/translator/gatewayproxy.go @@ -111,7 +111,7 @@ func (t *Translator) TranslateGatewayProxyToConfig(tctx *provider.TranslateConte BackendObjectReference: gatewayv1.BackendObjectReference{ Name: gatewayv1.ObjectName(cp.Service.Name), Namespace: (*gatewayv1.Namespace)(&gatewayProxy.Namespace), - Port: ptr.To(gatewayv1.PortNumber(cp.Service.Port)), + Port: ptr.To(cp.Service.Port), }, }, func(endpoint *discoveryv1.Endpoint) bool { if endpoint.Conditions.Terminating != nil && *endpoint.Conditions.Terminating { diff --git a/internal/adc/translator/grpcroute.go b/internal/adc/translator/grpcroute.go index d1fa2eb4a..af10db126 100644 --- a/internal/adc/translator/grpcroute.go +++ b/internal/adc/translator/grpcroute.go @@ -205,7 +205,7 @@ func (t *Translator) TranslateGRPCRoute(tctx *provider.TranslateContext, grpcRou kind = string(*backend.Kind) } if backend.Port != nil { - port = int32(*backend.Port) + port = *backend.Port } namespace := string(*backend.Namespace) name := string(backend.Name) diff --git a/internal/adc/translator/httproute.go b/internal/adc/translator/httproute.go index 3dcb00a8f..0a54ffd84 100644 --- a/internal/adc/translator/httproute.go +++ b/internal/adc/translator/httproute.go @@ -191,7 +191,9 @@ func (t *Translator) fillPluginFromHTTPCORSFilter(plugins adctypes.Plugins, cors } plugin.ExposeHeaders = strings.Join(exposeHeaders, ",") } - plugin.AllowCredential = bool(cors.AllowCredentials) + if cors.AllowCredentials != nil { + plugin.AllowCredential = *cors.AllowCredentials + } } func (t *Translator) fillPluginFromHTTPRequestHeaderFilter(plugins adctypes.Plugins, reqHeaderModifier *gatewayv1.HTTPHeaderFilter) { @@ -585,7 +587,7 @@ func (t *Translator) TranslateHTTPRoute(tctx *provider.TranslateContext, httpRou kind = string(*backend.Kind) } if backend.Port != nil { - port = int32(*backend.Port) + port = *backend.Port } namespace := string(*backend.Namespace) name := string(backend.Name) diff --git a/internal/adc/translator/httproute_test.go b/internal/adc/translator/httproute_test.go index 9ce113b31..423413e1f 100644 --- a/internal/adc/translator/httproute_test.go +++ b/internal/adc/translator/httproute_test.go @@ -31,7 +31,6 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/utils/ptr" gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" - gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2" adctypes "github.com/apache/apisix-ingress-controller/api/adc" "github.com/apache/apisix-ingress-controller/api/v1alpha1" @@ -111,9 +110,9 @@ func TestTranslateHTTPRouteUpstreamScheme(t *testing.T) { }, Spec: v1alpha1.BackendTrafficPolicySpec{ TargetRefs: []v1alpha1.BackendPolicyTargetReferenceWithSectionName{{ - LocalPolicyTargetReference: gatewayv1alpha2.LocalPolicyTargetReference{ - Name: gatewayv1alpha2.ObjectName(serviceName), - Kind: gatewayv1alpha2.Kind(internaltypes.KindService), + LocalPolicyTargetReference: gatewayv1.LocalPolicyTargetReference{ + Name: gatewayv1.ObjectName(serviceName), + Kind: gatewayv1.Kind(internaltypes.KindService), }, }}, Scheme: tt.policyScheme, @@ -132,7 +131,7 @@ func TestTranslateHTTPRouteUpstreamScheme(t *testing.T) { BackendRef: gatewayv1.BackendRef{ BackendObjectReference: gatewayv1.BackendObjectReference{ Name: gatewayv1.ObjectName(serviceName), - Port: ptr.To(gatewayv1.PortNumber(portNumber)), + Port: ptr.To(portNumber), }, }, }}, @@ -338,20 +337,20 @@ func TestAttachBackendTrafficPolicyToUpstreamSectionName(t *testing.T) { BackendObjectReference: gatewayv1.BackendObjectReference{ Name: gatewayv1.ObjectName(serviceName), Namespace: ptr.To(gatewayv1.Namespace(namespace)), - Port: ptr.To(gatewayv1.PortNumber(port)), + Port: ptr.To(port), }, } } newPolicy := func(name, sectionName, scheme string) *v1alpha1.BackendTrafficPolicy { targetRef := v1alpha1.BackendPolicyTargetReferenceWithSectionName{ - LocalPolicyTargetReference: gatewayv1alpha2.LocalPolicyTargetReference{ - Name: gatewayv1alpha2.ObjectName(serviceName), - Kind: gatewayv1alpha2.Kind(internaltypes.KindService), + LocalPolicyTargetReference: gatewayv1.LocalPolicyTargetReference{ + Name: gatewayv1.ObjectName(serviceName), + Kind: gatewayv1.Kind(internaltypes.KindService), }, } if sectionName != "" { - targetRef.SectionName = ptr.To(gatewayv1alpha2.SectionName(sectionName)) + targetRef.SectionName = ptr.To(gatewayv1.SectionName(sectionName)) } return &v1alpha1.BackendTrafficPolicy{ ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace}, @@ -409,9 +408,9 @@ func TestAttachBackendTrafficPolicyToUpstreamSectionName(t *testing.T) { ObjectMeta: metav1.ObjectMeta{Name: "p", Namespace: namespace}, Spec: v1alpha1.BackendTrafficPolicySpec{ TargetRefs: []v1alpha1.BackendPolicyTargetReferenceWithSectionName{{ - LocalPolicyTargetReference: gatewayv1alpha2.LocalPolicyTargetReference{ - Name: gatewayv1alpha2.ObjectName(serviceName), - Kind: gatewayv1alpha2.Kind("ServiceImport"), + LocalPolicyTargetReference: gatewayv1.LocalPolicyTargetReference{ + Name: gatewayv1.ObjectName(serviceName), + Kind: gatewayv1.Kind("ServiceImport"), }, }}, Scheme: apiv2.SchemeHTTPS, diff --git a/internal/adc/translator/l4routepolicy_test.go b/internal/adc/translator/l4routepolicy_test.go index 180106e4d..05324c653 100644 --- a/internal/adc/translator/l4routepolicy_test.go +++ b/internal/adc/translator/l4routepolicy_test.go @@ -26,7 +26,7 @@ import ( apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" k8stypes "k8s.io/apimachinery/pkg/types" - gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2" + gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" adctypes "github.com/apache/apisix-ingress-controller/api/adc" "github.com/apache/apisix-ingress-controller/api/v1alpha1" @@ -39,12 +39,12 @@ func makeL4RoutePolicy(namespace, name, targetKind, targetName string, plugins [ Name: name, }, Spec: v1alpha1.L4RoutePolicySpec{ - TargetRefs: []gatewayv1alpha2.LocalPolicyTargetReferenceWithSectionName{ + TargetRefs: []gatewayv1.LocalPolicyTargetReferenceWithSectionName{ { - LocalPolicyTargetReference: gatewayv1alpha2.LocalPolicyTargetReference{ - Group: gatewayv1alpha2.GroupName, - Kind: gatewayv1alpha2.Kind(targetKind), - Name: gatewayv1alpha2.ObjectName(targetName), + LocalPolicyTargetReference: gatewayv1.LocalPolicyTargetReference{ + Group: gatewayv1.GroupName, + Kind: gatewayv1.Kind(targetKind), + Name: gatewayv1.ObjectName(targetName), }, }, }, diff --git a/internal/adc/translator/policies.go b/internal/adc/translator/policies.go index 849458776..87220062e 100644 --- a/internal/adc/translator/policies.go +++ b/internal/adc/translator/policies.go @@ -104,7 +104,7 @@ func backendRefMatchesSectionName(ref gatewayv1.BackendRef, namespace, sectionNa return false } for _, port := range svc.Spec.Ports { - if port.Port == int32(*ref.Port) { + if port.Port == *ref.Port { return port.Name == sectionName } } diff --git a/internal/adc/translator/tcproute.go b/internal/adc/translator/tcproute.go index 36c438802..81e12a341 100644 --- a/internal/adc/translator/tcproute.go +++ b/internal/adc/translator/tcproute.go @@ -81,7 +81,7 @@ func (t *Translator) TranslateTCPRoute(tctx *provider.TranslateContext, tcpRoute kind = string(*backend.Kind) } if backend.Port != nil { - port = int32(*backend.Port) + port = *backend.Port } namespace := string(*backend.Namespace) name := string(backend.Name) diff --git a/internal/adc/translator/tlsroute.go b/internal/adc/translator/tlsroute.go index 236612f4a..6df8aca1d 100644 --- a/internal/adc/translator/tlsroute.go +++ b/internal/adc/translator/tlsroute.go @@ -74,7 +74,7 @@ func (t *Translator) TranslateTLSRoute(tctx *provider.TranslateContext, tlsRoute kind = string(*backend.Kind) } if backend.Port != nil { - port = int32(*backend.Port) + port = *backend.Port } namespace := string(*backend.Namespace) name := string(backend.Name) diff --git a/internal/adc/translator/udproute.go b/internal/adc/translator/udproute.go index 650c42564..cc7b6361d 100644 --- a/internal/adc/translator/udproute.go +++ b/internal/adc/translator/udproute.go @@ -70,7 +70,7 @@ func (t *Translator) TranslateUDPRoute(tctx *provider.TranslateContext, udpRoute kind = string(*backend.Kind) } if backend.Port != nil { - port = int32(*backend.Port) + port = *backend.Port } namespace := string(*backend.Namespace) name := string(backend.Name) diff --git a/internal/controller/gateway_controller.go b/internal/controller/gateway_controller.go index 13e88c1f5..ec1498da6 100644 --- a/internal/controller/gateway_controller.go +++ b/internal/controller/gateway_controller.go @@ -463,6 +463,22 @@ func (r *GatewayReconciler) processInfrastructure(tctx *provider.TranslateContex return ProcessGatewayProxy(r.Client, r.Log, tctx, gateway, utils.NamespacedNameKind(gateway)) } +// frontendTLSValidationForListener resolves the Gateway-level frontend TLS client-cert +// validation (Gateway API v1.6 spec.tls.frontend) that applies to the given HTTPS +// listener: a PerPort entry matching the listener's port overrides the Default. +func frontendTLSValidationForListener(gateway *gatewayv1.Gateway, listener gatewayv1.Listener) *gatewayv1.FrontendTLSValidation { + if gateway.Spec.TLS == nil || gateway.Spec.TLS.Frontend == nil { + return nil + } + frontend := gateway.Spec.TLS.Frontend + for i := range frontend.PerPort { + if frontend.PerPort[i].Port == listener.Port { + return frontend.PerPort[i].TLS.Validation + } + } + return frontend.Default.Validation +} + func (r *GatewayReconciler) processListenerConfig(tctx *provider.TranslateContext, gateway *gatewayv1.Gateway) { listeners := gateway.Spec.Listeners for _, listener := range listeners { @@ -490,8 +506,10 @@ func (r *GatewayReconciler) processListenerConfig(tctx *provider.TranslateContex } } // frontendValidation references CA ConfigMaps or Secrets used for downstream mTLS. - if listener.TLS.FrontendValidation != nil { - for _, ref := range listener.TLS.FrontendValidation.CACertificateRefs { + // In Gateway API v1.6 it is declared at the Gateway level (spec.tls.frontend); + // resolve the config that applies to this HTTPS listener by its port. + if validation := frontendTLSValidationForListener(gateway, listener); validation != nil { + for _, ref := range validation.CACertificateRefs { ns := gateway.GetNamespace() if ref.Namespace != nil { ns = string(*ref.Namespace) diff --git a/internal/controller/gatewayclass_controller.go b/internal/controller/gatewayclass_controller.go index 61d87683a..320e3d6ea 100644 --- a/internal/controller/gatewayclass_controller.go +++ b/internal/controller/gatewayclass_controller.go @@ -56,7 +56,9 @@ type GatewayClassReconciler struct { //nolint:revive // SetupWithManager sets up the controller with the Manager. func (r *GatewayClassReconciler) SetupWithManager(mgr ctrl.Manager) error { - r.EventRecorder = mgr.GetEventRecorderFor("gatewayclass-controller") + // GetEventRecorderFor returns the legacy record.EventRecorder; the suggested + // GetEventRecorder uses the new events API with an incompatible interface. + r.EventRecorder = mgr.GetEventRecorderFor("gatewayclass-controller") //nolint:staticcheck return ctrl.NewControllerManagedBy(mgr). For(&gatewayv1.GatewayClass{}). WithEventFilter(predicate.NewPredicateFuncs(r.GatewayClassFilter)). diff --git a/internal/controller/grpcroute_controller.go b/internal/controller/grpcroute_controller.go index 3b4234171..b49bed69c 100644 --- a/internal/controller/grpcroute_controller.go +++ b/internal/controller/grpcroute_controller.go @@ -436,7 +436,7 @@ func (r *GRPCRouteReconciler) processGRPCRouteBackendRefs(tctx *provider.Transla portExists := false for _, port := range service.Spec.Ports { - if port.Port == int32(*backend.Port) { + if port.Port == *backend.Port { portExists = true break } diff --git a/internal/controller/httproute_controller.go b/internal/controller/httproute_controller.go index 216b50e15..4d3097b0c 100644 --- a/internal/controller/httproute_controller.go +++ b/internal/controller/httproute_controller.go @@ -40,7 +40,6 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/source" gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" - "sigs.k8s.io/gateway-api/apis/v1alpha2" "sigs.k8s.io/gateway-api/apis/v1beta1" "github.com/apache/apisix-ingress-controller/api/v1alpha1" @@ -564,7 +563,7 @@ func (r *HTTPRouteReconciler) processHTTPRouteBackendRefs(tctx *provider.Transla portExists := false for _, port := range service.Spec.Ports { - if port.Port == int32(*backend.Port) { + if port.Port == *backend.Port { portExists = true break } @@ -639,8 +638,8 @@ func httpRoutePolicyPredicateFuncs(channel chan event.GenericEvent) predicate.Pr if !ok0 || !ok1 { return false } - discardsRefs := slices.DeleteFunc(oldPolicy.Spec.TargetRefs, func(oldRef v1alpha2.LocalPolicyTargetReferenceWithSectionName) bool { - return slices.ContainsFunc(newPolicy.Spec.TargetRefs, func(newRef v1alpha2.LocalPolicyTargetReferenceWithSectionName) bool { + discardsRefs := slices.DeleteFunc(oldPolicy.Spec.TargetRefs, func(oldRef gatewayv1.LocalPolicyTargetReferenceWithSectionName) bool { + return slices.ContainsFunc(newPolicy.Spec.TargetRefs, func(newRef gatewayv1.LocalPolicyTargetReferenceWithSectionName) bool { return oldRef.LocalPolicyTargetReference == newRef.LocalPolicyTargetReference && ptr.Equal(oldRef.SectionName, newRef.SectionName) }) }) diff --git a/internal/controller/httproutepolicy.go b/internal/controller/httproutepolicy.go index 65282ea5a..2a9510bc5 100644 --- a/internal/controller/httproutepolicy.go +++ b/internal/controller/httproutepolicy.go @@ -28,7 +28,6 @@ import ( "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/client" gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" - "sigs.k8s.io/gateway-api/apis/v1alpha2" "github.com/apache/apisix-ingress-controller/api/v1alpha1" "github.com/apache/apisix-ingress-controller/internal/controller/indexer" @@ -81,7 +80,7 @@ func (r *HTTPRouteReconciler) processHTTPRoutePolicies(tctx *provider.TranslateC ) if _, conflict := conflicts[namespacedName]; conflict { condition.Status = metav1.ConditionFalse - condition.Reason = string(v1alpha2.PolicyReasonConflicted) + condition.Reason = string(gatewayv1.PolicyReasonConflicted) condition.Message = "HTTPRoutePolicy conflict with others target to the HTTPRoute" } else { tctx.HTTPRoutePolicies = append(tctx.HTTPRoutePolicies, policy) @@ -153,7 +152,7 @@ func (r *IngressReconciler) processHTTPRoutePolicies(tctx *provider.TranslateCon ) if conflict := checkPoliciesConflict(list.Items); conflict { condition.Status = metav1.ConditionFalse - condition.Reason = string(v1alpha2.PolicyReasonConflicted) + condition.Reason = string(gatewayv1.PolicyReasonConflicted) condition.Message = "HTTPRoutePolicy conflict with others target to the Ingress" } else { tctx.HTTPRoutePolicies = list.Items @@ -221,11 +220,11 @@ func (r *IngressReconciler) updateHTTPRoutePolicyStatusOnDeleting(ctx context.Co func setAncestorsForHTTPRoutePolicyStatus(parentRefs []gatewayv1.ParentReference, policy *v1alpha1.HTTPRoutePolicy, condition metav1.Condition) bool { return SetAncestors(&policy.Status, parentRefs, metav1.Condition{ - Type: cmp.Or(condition.Type, string(v1alpha2.PolicyConditionAccepted)), + Type: cmp.Or(condition.Type, string(gatewayv1.PolicyConditionAccepted)), Status: cmp.Or(condition.Status, metav1.ConditionTrue), ObservedGeneration: policy.GetGeneration(), LastTransitionTime: metav1.Now(), - Reason: cmp.Or(condition.Reason, string(v1alpha2.PolicyReasonAccepted)), + Reason: cmp.Or(condition.Reason, string(gatewayv1.PolicyReasonAccepted)), Message: condition.Message, }) } @@ -264,7 +263,7 @@ func findPoliciesWhichTargetRefTheRule(ruleName *gatewayv1.SectionName, kind str // updateDeleteAncestors removes ancestor references from HTTPRoutePolicy statuses that are no longer present in the provided parentRefs. func updateDeleteAncestors(updater status.Updater, policy v1alpha1.HTTPRoutePolicy, parentRefs []gatewayv1.ParentReference) { length := len(policy.Status.Ancestors) - policy.Status.Ancestors = slices.DeleteFunc(policy.Status.Ancestors, func(ancestor v1alpha2.PolicyAncestorStatus) bool { + policy.Status.Ancestors = slices.DeleteFunc(policy.Status.Ancestors, func(ancestor gatewayv1.PolicyAncestorStatus) bool { return !slices.ContainsFunc(parentRefs, func(ref gatewayv1.ParentReference) bool { return parentRefValueEqual(ancestor.AncestorRef, ref) }) diff --git a/internal/controller/indexer/indexer.go b/internal/controller/indexer/indexer.go index 81b9c0ef2..9363b538e 100644 --- a/internal/controller/indexer/indexer.go +++ b/internal/controller/indexer/indexer.go @@ -622,33 +622,50 @@ func GatewaySecretIndexFunc(rawObj client.Object) (keys []string) { } add(namespace, string(ref.Name)) } - // frontendValidation CA references that are Secrets. - if listener.TLS.FrontendValidation != nil { - for _, ref := range listener.TLS.FrontendValidation.CACertificateRefs { - if string(ref.Kind) != internaltypes.KindSecret { - continue - } - namespace := gateway.GetNamespace() - if ref.Namespace != nil { - namespace = string(*ref.Namespace) - } - add(namespace, string(ref.Name)) + } + // frontendValidation CA references that are Secrets. In Gateway API v1.6 these + // live at the Gateway level (spec.tls.frontend), not on individual listeners. + for _, validation := range gatewayFrontendValidations(gateway) { + for _, ref := range validation.CACertificateRefs { + if string(ref.Kind) != internaltypes.KindSecret { + continue } + namespace := gateway.GetNamespace() + if ref.Namespace != nil { + namespace = string(*ref.Namespace) + } + add(namespace, string(ref.Name)) } } return keys } +// gatewayFrontendValidations returns all frontend TLS client-cert validation configs +// declared on a Gateway (the Default plus every PerPort override). +func gatewayFrontendValidations(gateway *gatewayv1.Gateway) []*gatewayv1.FrontendTLSValidation { + if gateway.Spec.TLS == nil || gateway.Spec.TLS.Frontend == nil { + return nil + } + frontend := gateway.Spec.TLS.Frontend + validations := make([]*gatewayv1.FrontendTLSValidation, 0, len(frontend.PerPort)+1) + if frontend.Default.Validation != nil { + validations = append(validations, frontend.Default.Validation) + } + for i := range frontend.PerPort { + if frontend.PerPort[i].TLS.Validation != nil { + validations = append(validations, frontend.PerPort[i].TLS.Validation) + } + } + return validations +} + // GatewayConfigMapIndexFunc indexes Gateways by the CA ConfigMaps referenced via -// listener TLS frontendValidation, so that ConfigMap changes can trigger reconciliation. +// Gateway TLS frontendValidation, so that ConfigMap changes can trigger reconciliation. func GatewayConfigMapIndexFunc(rawObj client.Object) (keys []string) { gateway := rawObj.(*gatewayv1.Gateway) var m = make(map[string]struct{}) - for _, listener := range gateway.Spec.Listeners { - if listener.TLS == nil || listener.TLS.FrontendValidation == nil { - continue - } - for _, ref := range listener.TLS.FrontendValidation.CACertificateRefs { + for _, validation := range gatewayFrontendValidations(gateway) { + for _, ref := range validation.CACertificateRefs { if ref.Kind != "" && string(ref.Kind) != internaltypes.KindConfigMap { continue } diff --git a/internal/controller/policies.go b/internal/controller/policies.go index 64c5d5ce4..5f90fff6b 100644 --- a/internal/controller/policies.go +++ b/internal/controller/policies.go @@ -197,7 +197,7 @@ func processPolicyStatus(policy *v1alpha1.BackendTrafficPolicy, func SetAncestors(status *v1alpha1.PolicyStatus, parentRefs []gatewayv1.ParentReference, condition metav1.Condition) bool { updated := false for _, parent := range parentRefs { - ancestorStatus := gatewayv1alpha2.PolicyAncestorStatus{ + ancestorStatus := gatewayv1.PolicyAncestorStatus{ AncestorRef: parent, Conditions: []metav1.Condition{condition}, ControllerName: gatewayv1alpha2.GatewayController(config.ControllerConfig.ControllerName), @@ -209,7 +209,7 @@ func SetAncestors(status *v1alpha1.PolicyStatus, parentRefs []gatewayv1.ParentRe return updated } -func SetAncestorStatus(status *v1alpha1.PolicyStatus, ancestorStatus gatewayv1alpha2.PolicyAncestorStatus) bool { +func SetAncestorStatus(status *v1alpha1.PolicyStatus, ancestorStatus gatewayv1.PolicyAncestorStatus) bool { if len(ancestorStatus.Conditions) == 0 { return false } @@ -308,20 +308,20 @@ func ProcessL4RoutePolicy( var condition metav1.Condition if i == 0 { condition = metav1.Condition{ - Type: string(gatewayv1alpha2.PolicyConditionAccepted), + Type: string(gatewayv1.PolicyConditionAccepted), Status: metav1.ConditionTrue, ObservedGeneration: policy.GetGeneration(), LastTransitionTime: metav1.Now(), - Reason: string(gatewayv1alpha2.PolicyReasonAccepted), + Reason: string(gatewayv1.PolicyReasonAccepted), Message: "Policy has been accepted", } } else { condition = metav1.Condition{ - Type: string(gatewayv1alpha2.PolicyConditionAccepted), + Type: string(gatewayv1.PolicyConditionAccepted), Status: metav1.ConditionFalse, ObservedGeneration: policy.GetGeneration(), LastTransitionTime: metav1.Now(), - Reason: string(gatewayv1alpha2.PolicyReasonConflicted), + Reason: string(gatewayv1.PolicyReasonConflicted), Message: fmt.Sprintf("Conflicts with L4RoutePolicy %s/%s which was created earlier", winner.Namespace, winner.Name), } } @@ -401,7 +401,7 @@ func l4RouteParentRefs(ctx context.Context, c client.Client, kind string, nn typ func updateL4RoutePolicyDeleteAncestors(updater status.Updater, policy v1alpha1.L4RoutePolicy, parentRefs []gatewayv1.ParentReference) { length := len(policy.Status.Ancestors) - policy.Status.Ancestors = slices.DeleteFunc(policy.Status.Ancestors, func(ancestor gatewayv1alpha2.PolicyAncestorStatus) bool { + policy.Status.Ancestors = slices.DeleteFunc(policy.Status.Ancestors, func(ancestor gatewayv1.PolicyAncestorStatus) bool { return !slices.ContainsFunc(parentRefs, func(ref gatewayv1.ParentReference) bool { return parentRefValueEqual(ancestor.AncestorRef, ref) }) @@ -412,7 +412,7 @@ func updateL4RoutePolicyDeleteAncestors(updater status.Updater, policy v1alpha1. // status.ancestors is a required field; ensure a fully-cleared list serializes to [] // rather than null, which the CRD schema rejects. if policy.Status.Ancestors == nil { - policy.Status.Ancestors = []gatewayv1alpha2.PolicyAncestorStatus{} + policy.Status.Ancestors = []gatewayv1.PolicyAncestorStatus{} } updater.Update(status.Update{ NamespacedName: utils.NamespacedName(&policy), diff --git a/internal/controller/status.go b/internal/controller/status.go index 7281836bf..920bb9cb4 100644 --- a/internal/controller/status.go +++ b/internal/controller/status.go @@ -21,7 +21,7 @@ import ( "github.com/go-logr/logr" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2" + gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" "github.com/apache/apisix-ingress-controller/internal/controller/status" "github.com/apache/apisix-ingress-controller/internal/provider" @@ -69,14 +69,14 @@ func VerifyConditions(conditions *[]metav1.Condition, newCondition metav1.Condit func NewPolicyCondition(observedGeneration int64, status bool, message string) metav1.Condition { conditionStatus := metav1.ConditionTrue - reason := string(gatewayv1alpha2.PolicyReasonAccepted) + reason := string(gatewayv1.PolicyReasonAccepted) if !status { conditionStatus = metav1.ConditionFalse - reason = string(gatewayv1alpha2.PolicyReasonInvalid) + reason = string(gatewayv1.PolicyReasonInvalid) } return metav1.Condition{ - Type: string(gatewayv1alpha2.PolicyConditionAccepted), + Type: string(gatewayv1.PolicyConditionAccepted), Reason: reason, Status: conditionStatus, Message: message, @@ -87,8 +87,8 @@ func NewPolicyCondition(observedGeneration int64, status bool, message string) m func NewPolicyConflictCondition(observedGeneration int64, message string) metav1.Condition { return metav1.Condition{ - Type: string(gatewayv1alpha2.PolicyConditionAccepted), - Reason: string(gatewayv1alpha2.PolicyReasonConflicted), + Type: string(gatewayv1.PolicyConditionAccepted), + Reason: string(gatewayv1.PolicyReasonConflicted), Status: metav1.ConditionFalse, Message: message, ObservedGeneration: observedGeneration, diff --git a/internal/controller/tcproute_controller.go b/internal/controller/tcproute_controller.go index f3487547a..f76f6855e 100644 --- a/internal/controller/tcproute_controller.go +++ b/internal/controller/tcproute_controller.go @@ -434,7 +434,7 @@ func (r *TCPRouteReconciler) processTCPRouteBackendRefs(tctx *provider.Translate portExists := false for _, port := range service.Spec.Ports { - if port.Port == int32(*backend.Port) { + if port.Port == *backend.Port { portExists = true break } diff --git a/internal/controller/tlsroute_controller.go b/internal/controller/tlsroute_controller.go index ecf466001..dd6b7ff4f 100644 --- a/internal/controller/tlsroute_controller.go +++ b/internal/controller/tlsroute_controller.go @@ -434,7 +434,7 @@ func (r *TLSRouteReconciler) processTLSRouteBackendRefs(tctx *provider.Translate portExists := false for _, port := range service.Spec.Ports { - if port.Port == int32(*backend.Port) { + if port.Port == *backend.Port { portExists = true break } diff --git a/internal/controller/udproute_controller.go b/internal/controller/udproute_controller.go index 070cee767..33c698ae8 100644 --- a/internal/controller/udproute_controller.go +++ b/internal/controller/udproute_controller.go @@ -434,7 +434,7 @@ func (r *UDPRouteReconciler) processUDPRouteBackendRefs(tctx *provider.Translate portExists := false for _, port := range service.Spec.Ports { - if port.Port == int32(*backend.Port) { + if port.Port == *backend.Port { portExists = true break } diff --git a/internal/controller/utils.go b/internal/controller/utils.go index 044006091..789b4f14b 100644 --- a/internal/controller/utils.go +++ b/internal/controller/utils.go @@ -942,9 +942,10 @@ func getListenerStatus( } // frontendValidation (downstream mTLS) only applies to Terminate listeners. - if listener.TLS.FrontendValidation != nil && + // In Gateway API v1.6 it is declared at the Gateway level (spec.tls.frontend). + if validation := frontendTLSValidationForListener(gateway, listener); validation != nil && (listener.TLS.Mode == nil || *listener.TLS.Mode == gatewayv1.TLSModeTerminate) { - validateListenerFrontendValidation(ctx, mrgc, gateway, listener.TLS.FrontendValidation, &conditionResolvedRefs, &conditionProgrammed) + validateListenerFrontendValidation(ctx, mrgc, gateway, validation, &conditionResolvedRefs, &conditionProgrammed) } } diff --git a/internal/provider/provider.go b/internal/provider/provider.go index 51d27cb8a..f18076540 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -44,7 +44,7 @@ type TranslateContext struct { context.Context RouteParentRefs []gatewayv1.ParentReference BackendRefs []gatewayv1.BackendRef - GatewayTLSConfig []gatewayv1.GatewayTLSConfig + GatewayTLSConfig []gatewayv1.ListenerTLSConfig Credentials []v1alpha1.Credential Listeners []gatewayv1.Listener diff --git a/internal/types/k8s.go b/internal/types/k8s.go index 7bc4cb810..064749248 100644 --- a/internal/types/k8s.go +++ b/internal/types/k8s.go @@ -152,11 +152,11 @@ func GvkOf(obj any) schema.GroupVersionKind { kind := KindOf(obj) switch obj.(type) { case *gatewayv1.Gateway, *gatewayv1.HTTPRoute, *gatewayv1.GatewayClass, *gatewayv1.GRPCRoute: - return gatewayv1.SchemeGroupVersion.WithKind(kind) + return schema.GroupVersion(gatewayv1.GroupVersion).WithKind(kind) case *gatewayv1alpha2.TCPRoute, *gatewayv1alpha2.UDPRoute, *gatewayv1alpha2.TLSRoute: - return gatewayv1alpha2.SchemeGroupVersion.WithKind(kind) + return schema.GroupVersion(gatewayv1alpha2.GroupVersion).WithKind(kind) case *gatewayv1beta1.ReferenceGrant: - return gatewayv1beta1.SchemeGroupVersion.WithKind(kind) + return schema.GroupVersion(gatewayv1beta1.GroupVersion).WithKind(kind) case *netv1.Ingress, *netv1.IngressClass: return netv1.SchemeGroupVersion.WithKind(kind) case *netv1beta1.IngressClass: diff --git a/internal/webhook/v1/apisixconsumer_webhook.go b/internal/webhook/v1/apisixconsumer_webhook.go index 57c704f91..82a25973c 100644 --- a/internal/webhook/v1/apisixconsumer_webhook.go +++ b/internal/webhook/v1/apisixconsumer_webhook.go @@ -25,7 +25,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" apisixv2 "github.com/apache/apisix-ingress-controller/api/v2" @@ -36,8 +35,7 @@ import ( var apisixConsumerLog = logf.Log.WithName("apisixconsumer-resource") func SetupApisixConsumerWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&apisixv2.ApisixConsumer{}). + return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &apisixv2.ApisixConsumer{}). WithValidator(NewApisixConsumerCustomValidator(mgr.GetClient())). Complete() } @@ -51,7 +49,7 @@ type ApisixConsumerCustomValidator struct { initErr error } -var _ webhook.CustomValidator = &ApisixConsumerCustomValidator{} +var _ admission.Validator[runtime.Object] = &ApisixConsumerCustomValidator{} func NewApisixConsumerCustomValidator(c client.Client) *ApisixConsumerCustomValidator { adcValidator, err := newADCAdmissionValidator(c, apisixConsumerLog) diff --git a/internal/webhook/v1/apisixroute_webhook.go b/internal/webhook/v1/apisixroute_webhook.go index 92d19dae1..0b3d2fc12 100644 --- a/internal/webhook/v1/apisixroute_webhook.go +++ b/internal/webhook/v1/apisixroute_webhook.go @@ -24,7 +24,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" apisixv2 "github.com/apache/apisix-ingress-controller/api/v2" @@ -35,8 +34,7 @@ import ( var apisixRouteLog = logf.Log.WithName("apisixroute-resource") func SetupApisixRouteWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&apisixv2.ApisixRoute{}). + return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &apisixv2.ApisixRoute{}). WithValidator(NewApisixRouteCustomValidator(mgr.GetClient())). Complete() } @@ -50,7 +48,7 @@ type ApisixRouteCustomValidator struct { initErr error } -var _ webhook.CustomValidator = &ApisixRouteCustomValidator{} +var _ admission.Validator[runtime.Object] = &ApisixRouteCustomValidator{} func NewApisixRouteCustomValidator(c client.Client) *ApisixRouteCustomValidator { adcValidator, err := newADCAdmissionValidator(c, apisixRouteLog) diff --git a/internal/webhook/v1/apisixtls_webhook.go b/internal/webhook/v1/apisixtls_webhook.go index 0b27ee280..bc72b7fda 100644 --- a/internal/webhook/v1/apisixtls_webhook.go +++ b/internal/webhook/v1/apisixtls_webhook.go @@ -24,7 +24,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" apisixv2 "github.com/apache/apisix-ingress-controller/api/v2" @@ -36,8 +35,7 @@ import ( var apisixTlsLog = logf.Log.WithName("apisixtls-resource") func SetupApisixTlsWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&apisixv2.ApisixTls{}). + return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &apisixv2.ApisixTls{}). WithValidator(NewApisixTlsCustomValidator(mgr.GetClient())). Complete() } @@ -51,7 +49,7 @@ type ApisixTlsCustomValidator struct { initErr error } -var _ webhook.CustomValidator = &ApisixTlsCustomValidator{} +var _ admission.Validator[runtime.Object] = &ApisixTlsCustomValidator{} func NewApisixTlsCustomValidator(c client.Client) *ApisixTlsCustomValidator { adcValidator, err := newADCAdmissionValidator(c, apisixTlsLog) diff --git a/internal/webhook/v1/consumer_webhook.go b/internal/webhook/v1/consumer_webhook.go index 577675201..99aa03404 100644 --- a/internal/webhook/v1/consumer_webhook.go +++ b/internal/webhook/v1/consumer_webhook.go @@ -27,7 +27,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" apisixv1alpha1 "github.com/apache/apisix-ingress-controller/api/v1alpha1" @@ -39,8 +38,7 @@ import ( var consumerLog = logf.Log.WithName("consumer-resource") func SetupConsumerWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&apisixv1alpha1.Consumer{}). + return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &apisixv1alpha1.Consumer{}). WithValidator(NewConsumerCustomValidator(mgr.GetClient())). Complete() } @@ -54,7 +52,7 @@ type ConsumerCustomValidator struct { initErr error } -var _ webhook.CustomValidator = &ConsumerCustomValidator{} +var _ admission.Validator[runtime.Object] = &ConsumerCustomValidator{} func NewConsumerCustomValidator(c client.Client) *ConsumerCustomValidator { adcValidator, err := newADCAdmissionValidator(c, consumerLog) diff --git a/internal/webhook/v1/gateway_webhook.go b/internal/webhook/v1/gateway_webhook.go index 55b7900b1..27dadb7ff 100644 --- a/internal/webhook/v1/gateway_webhook.go +++ b/internal/webhook/v1/gateway_webhook.go @@ -26,7 +26,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" @@ -42,7 +41,7 @@ var gatewaylog = logf.Log.WithName("gateway-resource") // SetupGatewayWebhookWithManager registers the webhook for Gateway in the manager. func SetupGatewayWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr).For(&gatewayv1.Gateway{}). + return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &gatewayv1.Gateway{}). WithValidator(NewGatewayCustomValidator(mgr.GetClient())). Complete() } @@ -61,7 +60,7 @@ type GatewayCustomValidator struct { checker reference.Checker } -var _ webhook.CustomValidator = &GatewayCustomValidator{} +var _ admission.Validator[runtime.Object] = &GatewayCustomValidator{} func NewGatewayCustomValidator(c client.Client) *GatewayCustomValidator { return &GatewayCustomValidator{ diff --git a/internal/webhook/v1/gateway_webhook_test.go b/internal/webhook/v1/gateway_webhook_test.go index c47be6bc5..fa33a9932 100644 --- a/internal/webhook/v1/gateway_webhook_test.go +++ b/internal/webhook/v1/gateway_webhook_test.go @@ -64,7 +64,7 @@ func TestGatewayCustomValidator_WarnsWhenTLSSecretMissing(t *testing.T) { Name: "https", Port: 443, Protocol: gatewayv1.HTTPSProtocolType, - TLS: &gatewayv1.GatewayTLSConfig{ + TLS: &gatewayv1.ListenerTLSConfig{ CertificateRefs: []gatewayv1.SecretObjectReference{{ Name: "missing-cert", }}, @@ -98,7 +98,7 @@ func TestGatewayCustomValidator_NoWarningsWhenSecretExists(t *testing.T) { Name: "https", Port: 443, Protocol: gatewayv1.HTTPSProtocolType, - TLS: &gatewayv1.GatewayTLSConfig{ + TLS: &gatewayv1.ListenerTLSConfig{ CertificateRefs: []gatewayv1.SecretObjectReference{{ Name: "tls-cert", }}, diff --git a/internal/webhook/v1/gatewayproxy_webhook.go b/internal/webhook/v1/gatewayproxy_webhook.go index 18ced0a48..412a3cf22 100644 --- a/internal/webhook/v1/gatewayproxy_webhook.go +++ b/internal/webhook/v1/gatewayproxy_webhook.go @@ -26,7 +26,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" v1alpha1 "github.com/apache/apisix-ingress-controller/api/v1alpha1" @@ -36,8 +35,7 @@ import ( var gatewayProxyLog = logf.Log.WithName("gatewayproxy-resource") func SetupGatewayProxyWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&v1alpha1.GatewayProxy{}). + return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &v1alpha1.GatewayProxy{}). WithValidator(NewGatewayProxyCustomValidator(mgr.GetClient())). Complete() } @@ -49,7 +47,7 @@ type GatewayProxyCustomValidator struct { checker reference.Checker } -var _ webhook.CustomValidator = &GatewayProxyCustomValidator{} +var _ admission.Validator[runtime.Object] = &GatewayProxyCustomValidator{} func NewGatewayProxyCustomValidator(c client.Client) *GatewayProxyCustomValidator { return &GatewayProxyCustomValidator{ diff --git a/internal/webhook/v1/grpcroute_webhook.go b/internal/webhook/v1/grpcroute_webhook.go index acb95c72a..a84cc6f05 100644 --- a/internal/webhook/v1/grpcroute_webhook.go +++ b/internal/webhook/v1/grpcroute_webhook.go @@ -25,7 +25,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" @@ -36,8 +35,7 @@ import ( var grpcRouteLog = logf.Log.WithName("grpcroute-resource") func SetupGRPCRouteWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&gatewayv1.GRPCRoute{}). + return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &gatewayv1.GRPCRoute{}). WithValidator(NewGRPCRouteCustomValidator(mgr.GetClient())). Complete() } @@ -49,7 +47,7 @@ type GRPCRouteCustomValidator struct { checker reference.Checker } -var _ webhook.CustomValidator = &GRPCRouteCustomValidator{} +var _ admission.Validator[runtime.Object] = &GRPCRouteCustomValidator{} func NewGRPCRouteCustomValidator(c client.Client) *GRPCRouteCustomValidator { return &GRPCRouteCustomValidator{ diff --git a/internal/webhook/v1/httproute_webhook.go b/internal/webhook/v1/httproute_webhook.go index 7cf8fe999..7a4d04ff5 100644 --- a/internal/webhook/v1/httproute_webhook.go +++ b/internal/webhook/v1/httproute_webhook.go @@ -25,7 +25,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" @@ -36,8 +35,7 @@ import ( var httpRouteLog = logf.Log.WithName("httproute-resource") func SetupHTTPRouteWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&gatewayv1.HTTPRoute{}). + return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &gatewayv1.HTTPRoute{}). WithValidator(NewHTTPRouteCustomValidator(mgr.GetClient())). Complete() } @@ -49,7 +47,7 @@ type HTTPRouteCustomValidator struct { checker reference.Checker } -var _ webhook.CustomValidator = &HTTPRouteCustomValidator{} +var _ admission.Validator[runtime.Object] = &HTTPRouteCustomValidator{} func NewHTTPRouteCustomValidator(c client.Client) *HTTPRouteCustomValidator { return &HTTPRouteCustomValidator{ diff --git a/internal/webhook/v1/ingress_webhook.go b/internal/webhook/v1/ingress_webhook.go index a2f9f2d42..326acc60a 100644 --- a/internal/webhook/v1/ingress_webhook.go +++ b/internal/webhook/v1/ingress_webhook.go @@ -25,7 +25,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" "github.com/apache/apisix-ingress-controller/internal/controller" @@ -37,7 +36,7 @@ var ingresslog = logf.Log.WithName("ingress-resource") // SetupIngressWebhookWithManager registers the webhook for Ingress in the manager. func SetupIngressWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr).For(&networkingv1.Ingress{}). + return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &networkingv1.Ingress{}). WithValidator(NewIngressCustomValidator(mgr.GetClient())). Complete() } @@ -56,7 +55,7 @@ type IngressCustomValidator struct { checker reference.Checker } -var _ webhook.CustomValidator = &IngressCustomValidator{} +var _ admission.Validator[runtime.Object] = &IngressCustomValidator{} func NewIngressCustomValidator(c client.Client) *IngressCustomValidator { return &IngressCustomValidator{ diff --git a/internal/webhook/v1/ingressclass_webhook.go b/internal/webhook/v1/ingressclass_webhook.go index 4d77fe8a5..7829e0f8a 100644 --- a/internal/webhook/v1/ingressclass_webhook.go +++ b/internal/webhook/v1/ingressclass_webhook.go @@ -25,7 +25,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" v1alpha1 "github.com/apache/apisix-ingress-controller/api/v1alpha1" @@ -39,7 +38,7 @@ var ingressclasslog = logf.Log.WithName("ingressclass-resource") // SetupIngressClassWebhookWithManager registers the webhook for IngressClass in the manager. func SetupIngressClassWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr).For(&networkingv1.IngressClass{}). + return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &networkingv1.IngressClass{}). WithValidator(&IngressClassCustomValidator{Client: mgr.GetClient()}). Complete() } @@ -57,7 +56,7 @@ type IngressClassCustomValidator struct { Client client.Client } -var _ webhook.CustomValidator = &IngressClassCustomValidator{} +var _ admission.Validator[runtime.Object] = &IngressClassCustomValidator{} // ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type IngressClass. func (v *IngressClassCustomValidator) ValidateCreate(ctx context.Context, obj runtime.Object) (admission.Warnings, error) { diff --git a/internal/webhook/v1/ssl/conflict_detector_test.go b/internal/webhook/v1/ssl/conflict_detector_test.go index d9d3063fb..64ac79be6 100644 --- a/internal/webhook/v1/ssl/conflict_detector_test.go +++ b/internal/webhook/v1/ssl/conflict_detector_test.go @@ -76,7 +76,7 @@ func TestConflictDetectorDetectsGatewayConflict(t *testing.T) { Protocol: gatewayv1.HTTPSProtocolType, Port: 443, Hostname: &hostname, - TLS: &gatewayv1.GatewayTLSConfig{ + TLS: &gatewayv1.ListenerTLSConfig{ Mode: &modeTerminate, CertificateRefs: []gatewayv1.SecretObjectReference{ {Name: gatewayv1.ObjectName(secretA.Name)}, @@ -181,7 +181,7 @@ func TestConflictDetectorAllowedWhenCertificateMatches(t *testing.T) { Protocol: gatewayv1.HTTPSProtocolType, Port: 443, Hostname: &listenerHostname, - TLS: &gatewayv1.GatewayTLSConfig{ + TLS: &gatewayv1.ListenerTLSConfig{ Mode: &modeTerminate, CertificateRefs: []gatewayv1.SecretObjectReference{{Name: gatewayv1.ObjectName(secret.Name)}}, }, @@ -305,7 +305,7 @@ func TestConflictDetectorDetectsSelfConflict(t *testing.T) { Protocol: gatewayv1.HTTPSProtocolType, Port: 443, Hostname: &hostname, - TLS: &gatewayv1.GatewayTLSConfig{ + TLS: &gatewayv1.ListenerTLSConfig{ Mode: &modeTerminate, CertificateRefs: []gatewayv1.SecretObjectReference{ {Name: gatewayv1.ObjectName(secretA.Name)}, @@ -317,7 +317,7 @@ func TestConflictDetectorDetectsSelfConflict(t *testing.T) { Protocol: gatewayv1.HTTPSProtocolType, Port: 8443, Hostname: &hostname, - TLS: &gatewayv1.GatewayTLSConfig{ + TLS: &gatewayv1.ListenerTLSConfig{ Mode: &modeTerminate, CertificateRefs: []gatewayv1.SecretObjectReference{ {Name: gatewayv1.ObjectName(secretB.Name)}, diff --git a/internal/webhook/v1/tcproute_webhook.go b/internal/webhook/v1/tcproute_webhook.go index 39ef5af61..fb0150e94 100644 --- a/internal/webhook/v1/tcproute_webhook.go +++ b/internal/webhook/v1/tcproute_webhook.go @@ -25,7 +25,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2" @@ -36,8 +35,7 @@ import ( var tcpRouteLog = logf.Log.WithName("tcproute-resource") func SetupTCPRouteWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&gatewayv1alpha2.TCPRoute{}). + return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &gatewayv1alpha2.TCPRoute{}). WithValidator(NewTCPRouteCustomValidator(mgr.GetClient())). Complete() } @@ -49,7 +47,7 @@ type TCPRouteCustomValidator struct { checker reference.Checker } -var _ webhook.CustomValidator = &TCPRouteCustomValidator{} +var _ admission.Validator[runtime.Object] = &TCPRouteCustomValidator{} func NewTCPRouteCustomValidator(c client.Client) *TCPRouteCustomValidator { return &TCPRouteCustomValidator{ diff --git a/internal/webhook/v1/udproute_webhook.go b/internal/webhook/v1/udproute_webhook.go index aeb40eabc..bef723ab6 100644 --- a/internal/webhook/v1/udproute_webhook.go +++ b/internal/webhook/v1/udproute_webhook.go @@ -25,7 +25,6 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" logf "sigs.k8s.io/controller-runtime/pkg/log" - "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2" @@ -36,8 +35,7 @@ import ( var udpRouteLog = logf.Log.WithName("udproute-resource") func SetupUDPRouteWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy(mgr). - For(&gatewayv1alpha2.UDPRoute{}). + return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &gatewayv1alpha2.UDPRoute{}). WithValidator(NewUDPRouteCustomValidator(mgr.GetClient())). Complete() } @@ -49,7 +47,7 @@ type UDPRouteCustomValidator struct { checker reference.Checker } -var _ webhook.CustomValidator = &UDPRouteCustomValidator{} +var _ admission.Validator[runtime.Object] = &UDPRouteCustomValidator{} func NewUDPRouteCustomValidator(c client.Client) *UDPRouteCustomValidator { return &UDPRouteCustomValidator{ diff --git a/test/conformance/api7ee/conformance_test.go b/test/conformance/api7ee/conformance_test.go index 544363d7c..627eb6758 100644 --- a/test/conformance/api7ee/conformance_test.go +++ b/test/conformance/api7ee/conformance_test.go @@ -18,16 +18,11 @@ package api7ee import ( - "os" "testing" - "github.com/stretchr/testify/require" "sigs.k8s.io/gateway-api/conformance" conformancev1 "sigs.k8s.io/gateway-api/conformance/apis/v1" "sigs.k8s.io/gateway-api/conformance/tests" - "sigs.k8s.io/gateway-api/conformance/utils/flags" - "sigs.k8s.io/gateway-api/conformance/utils/suite" - "sigs.k8s.io/yaml" ) var skippedTestsForSSL = []string{ @@ -43,7 +38,7 @@ func TestGatewayAPIConformance(t *testing.T) { opts.Debug = true opts.CleanupBaseResources = true opts.GatewayClassName = gatewayClassName - opts.SkipTests = skippedTestsForSSL + opts.SkipTests = append(opts.SkipTests, skippedTestsForSSL...) opts.Implementation = conformancev1.Implementation{ Organization: "APISIX", Project: "apisix-ingress-controller", @@ -51,29 +46,5 @@ func TestGatewayAPIConformance(t *testing.T) { Version: "v2.0.0", } - cSuite, err := suite.NewConformanceTestSuite(opts) - require.NoError(t, err) - - t.Log("starting the gateway conformance test suite") - cSuite.Setup(t, tests.ConformanceTests) - - if err := cSuite.Run(t, tests.ConformanceTests); err != nil { - t.Fatalf("failed to run the gateway conformance test suite: %v", err) - } - - report, err := cSuite.Report() - if err != nil { - t.Fatalf("failed to get the gateway conformance test report: %v", err) - } - - rawReport, err := yaml.Marshal(report) - if err != nil { - t.Fatalf("failed to marshal the gateway conformance test report: %v", err) - } - f, err := os.Create(*flags.ReportOutput) - require.NoError(t, err) - defer func() { _ = f.Close() }() - - _, err = f.Write(rawReport) - require.NoError(t, err) + conformance.RunConformanceWithOptions(t, opts) } diff --git a/test/conformance/conformance_test.go b/test/conformance/conformance_test.go index 8574f7f6e..636c7494f 100644 --- a/test/conformance/conformance_test.go +++ b/test/conformance/conformance_test.go @@ -18,16 +18,11 @@ package conformance import ( - "os" "testing" - "github.com/stretchr/testify/require" "sigs.k8s.io/gateway-api/conformance" conformancev1 "sigs.k8s.io/gateway-api/conformance/apis/v1" "sigs.k8s.io/gateway-api/conformance/tests" - "sigs.k8s.io/gateway-api/conformance/utils/flags" - "sigs.k8s.io/gateway-api/conformance/utils/suite" - "sigs.k8s.io/yaml" ) // https://github.com/kubernetes-sigs/gateway-api/blob/5c5fc388829d24e8071071b01e8313ada8f15d9f/conformance/utils/suite/suite.go#L358. SAN includes '*' @@ -46,7 +41,7 @@ func TestGatewayAPIConformance(t *testing.T) { opts.Debug = true opts.CleanupBaseResources = true opts.GatewayClassName = gatewayClassName - opts.SkipTests = skippedTestsForSSL + opts.SkipTests = append(opts.SkipTests, skippedTestsForSSL...) opts.Implementation = conformancev1.Implementation{ Organization: "APISIX", Project: "apisix-ingress-controller", @@ -54,29 +49,5 @@ func TestGatewayAPIConformance(t *testing.T) { Version: "v2.0.0", } - cSuite, err := suite.NewConformanceTestSuite(opts) - require.NoError(t, err) - - t.Log("starting the gateway conformance test suite") - cSuite.Setup(t, tests.ConformanceTests) - - if err := cSuite.Run(t, tests.ConformanceTests); err != nil { - t.Fatalf("failed to run the gateway conformance test suite: %v", err) - } - - report, err := cSuite.Report() - if err != nil { - t.Fatalf("failed to get the gateway conformance test report: %v", err) - } - - rawReport, err := yaml.Marshal(report) - if err != nil { - t.Fatalf("failed to marshal the gateway conformance test report: %v", err) - } - f, err := os.Create(*flags.ReportOutput) - require.NoError(t, err) - defer func() { _ = f.Close() }() - - _, err = f.Write(rawReport) - require.NoError(t, err) + conformance.RunConformanceWithOptions(t, opts) } diff --git a/test/e2e/gatewayapi/httproute.go b/test/e2e/gatewayapi/httproute.go index 8e869bc5a..aad849d07 100644 --- a/test/e2e/gatewayapi/httproute.go +++ b/test/e2e/gatewayapi/httproute.go @@ -33,7 +33,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/utils/ptr" - "sigs.k8s.io/gateway-api/apis/v1alpha2" + gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" "github.com/apache/apisix-ingress-controller/api/v1alpha1" "github.com/apache/apisix-ingress-controller/test/e2e/framework" @@ -1265,7 +1265,7 @@ spec: types.NamespacedName{Namespace: s.Namespace(), Name: name}, spec, metav1.Condition{ - Type: string(v1alpha2.PolicyConditionAccepted), + Type: string(gatewayv1.PolicyConditionAccepted), }, ) } @@ -1274,9 +1274,9 @@ spec: types.NamespacedName{Namespace: s.Namespace(), Name: s.Namespace()}, types.NamespacedName{Namespace: s.Namespace(), Name: name}, metav1.Condition{ - Type: string(v1alpha2.PolicyConditionAccepted), + Type: string(gatewayv1.PolicyConditionAccepted), Status: metav1.ConditionFalse, - Reason: string(v1alpha2.PolicyReasonConflicted), + Reason: string(gatewayv1.PolicyReasonConflicted), }, ) } @@ -1302,9 +1302,9 @@ spec: types.NamespacedName{Namespace: s.Namespace(), Name: s.Namespace()}, types.NamespacedName{Namespace: s.Namespace(), Name: name}, metav1.Condition{ - Type: string(v1alpha2.PolicyConditionAccepted), + Type: string(gatewayv1.PolicyConditionAccepted), Status: metav1.ConditionTrue, - Reason: string(v1alpha2.PolicyReasonAccepted), + Reason: string(gatewayv1.PolicyReasonAccepted), }, ) } @@ -1327,7 +1327,7 @@ spec: types.NamespacedName{Namespace: s.Namespace(), Name: s.Namespace()}, types.NamespacedName{Namespace: s.Namespace(), Name: "http-route-policy-1"}, metav1.Condition{ - Type: string(v1alpha2.PolicyConditionAccepted), + Type: string(gatewayv1.PolicyConditionAccepted), }, ) for _, name := range []string{"http-route-policy-0", "http-route-policy-1"} { @@ -1335,9 +1335,9 @@ spec: types.NamespacedName{Namespace: s.Namespace(), Name: s.Namespace()}, types.NamespacedName{Namespace: s.Namespace(), Name: name}, metav1.Condition{ - Type: string(v1alpha2.PolicyConditionAccepted), + Type: string(gatewayv1.PolicyConditionAccepted), Status: metav1.ConditionFalse, - Reason: string(v1alpha2.PolicyReasonConflicted), + Reason: string(gatewayv1.PolicyReasonConflicted), }, ) } diff --git a/test/e2e/gatewayapi/tcproute.go b/test/e2e/gatewayapi/tcproute.go index 080bfdb6c..3af0d4eae 100644 --- a/test/e2e/gatewayapi/tcproute.go +++ b/test/e2e/gatewayapi/tcproute.go @@ -25,7 +25,7 @@ import ( . "github.com/onsi/gomega" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - gatewayv1alpha2 "sigs.k8s.io/gateway-api/apis/v1alpha2" + gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" "github.com/apache/apisix-ingress-controller/test/e2e/scaffold" ) @@ -183,7 +183,7 @@ spec: types.NamespacedName{Namespace: s.Namespace(), Name: "tcp-block-all"}, l4RoutePolicyBlockAll, metav1.Condition{ - Type: string(gatewayv1alpha2.PolicyConditionAccepted), + Type: string(gatewayv1.PolicyConditionAccepted), Status: metav1.ConditionTrue, }, ) diff --git a/test/e2e/scaffold/k8s.go b/test/e2e/scaffold/k8s.go index bb5be9fd0..faebe9bc3 100644 --- a/test/e2e/scaffold/k8s.go +++ b/test/e2e/scaffold/k8s.go @@ -282,7 +282,7 @@ func (s *Scaffold) ApplyHTTPRoutePolicy(refNN, hrpNN types.NamespacedName, spec if len(conditions) == 0 { conditions = []metav1.Condition{ { - Type: string(v1alpha2.PolicyConditionAccepted), + Type: string(gatewayv1.PolicyConditionAccepted), Status: metav1.ConditionTrue, }, } @@ -298,7 +298,7 @@ func (s *Scaffold) ApplyL4RoutePolicy(refNN, policyNN types.NamespacedName, spec if len(conditions) == 0 { conditions = []metav1.Condition{ { - Type: string(v1alpha2.PolicyConditionAccepted), + Type: string(gatewayv1.PolicyConditionAccepted), Status: metav1.ConditionTrue, }, } From cbb4c43cc223b84c1d3e4c668dfbbf1f10c0f999 Mon Sep 17 00:00:00 2001 From: AlinsRan Date: Wed, 15 Jul 2026 17:57:44 +0800 Subject: [PATCH 2/9] fix: CI compatibility for Gateway API 1.6.0 CRDs The v1.6 experimental CRDs use CEL functions (isIP, format.dns1123Label) that only exist on Kubernetes 1.31+, and exceed the client-side apply annotation size limit. Fix CI and reflect the raised requirement: - Install Gateway API CRDs with server-side apply to avoid the 262144-byte last-applied-configuration annotation limit. - Bump kind to v0.27.0 (Kubernetes 1.32) in e2e/conformance workflows so the CRDs' CEL rules compile. - Raise MIN_K8S_VERSION to 1.31.0 (the effective minimum for Gateway API 1.6); the check only logs a warning. - Bump golang.org/x/crypto to v0.54.0 to clear known vulnerabilities. --- .github/workflows/apisix-conformance-test.yml | 2 +- .github/workflows/apisix-e2e-test.yml | 2 +- .github/workflows/conformance-test.yml | 2 +- .github/workflows/e2e-test.yml | 2 +- Makefile | 4 ++- go.mod | 16 +++++----- go.sum | 32 +++++++++---------- 7 files changed, 31 insertions(+), 29 deletions(-) diff --git a/.github/workflows/apisix-conformance-test.yml b/.github/workflows/apisix-conformance-test.yml index 60f88cf56..dbff2fba8 100644 --- a/.github/workflows/apisix-conformance-test.yml +++ b/.github/workflows/apisix-conformance-test.yml @@ -55,7 +55,7 @@ jobs: go-version: "1.26" - name: Install kind run: | - go install sigs.k8s.io/kind@v0.23.0 + go install sigs.k8s.io/kind@v0.27.0 - name: Login to Registry uses: docker/login-action@v3 diff --git a/.github/workflows/apisix-e2e-test.yml b/.github/workflows/apisix-e2e-test.yml index 74578e6fa..9cb800609 100644 --- a/.github/workflows/apisix-e2e-test.yml +++ b/.github/workflows/apisix-e2e-test.yml @@ -70,7 +70,7 @@ jobs: - name: Install kind run: | - go install sigs.k8s.io/kind@v0.23.0 + go install sigs.k8s.io/kind@v0.27.0 - name: Install ginkgo run: | diff --git a/.github/workflows/conformance-test.yml b/.github/workflows/conformance-test.yml index ee89b89a4..fe890388b 100644 --- a/.github/workflows/conformance-test.yml +++ b/.github/workflows/conformance-test.yml @@ -51,7 +51,7 @@ jobs: - name: Install kind run: | - go install sigs.k8s.io/kind@v0.23.0 + go install sigs.k8s.io/kind@v0.27.0 - name: Install Helm run: | diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 67348341f..c4a375250 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -57,7 +57,7 @@ jobs: - name: Install kind run: | - go install sigs.k8s.io/kind@v0.23.0 + go install sigs.k8s.io/kind@v0.27.0 - name: Install Helm run: | diff --git a/Makefile b/Makefile index f2fd3dc8d..4535e8269 100644 --- a/Makefile +++ b/Makefile @@ -328,7 +328,9 @@ endif .PHONY: install-gateway-api install-gateway-api: ## Install Gateway API CRDs into the K8s cluster specified in ~/.kube/config. - kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/$(GATEAY_API_VERSION)/experimental-install.yaml + # Server-side apply: the v1.6 CRDs exceed the 262144-byte annotation limit of + # client-side apply (last-applied-configuration). + kubectl apply --server-side --force-conflicts -f https://github.com/kubernetes-sigs/gateway-api/releases/download/$(GATEAY_API_VERSION)/experimental-install.yaml .PHONY: uninstall-gateway-api uninstall-gateway-api: ## Uninstall Gateway API CRDs from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. diff --git a/go.mod b/go.mod index 8cae75b80..511d62689 100644 --- a/go.mod +++ b/go.mod @@ -229,16 +229,16 @@ require ( go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/arch v0.6.0 // indirect - golang.org/x/crypto v0.51.0 // indirect - golang.org/x/mod v0.36.0 // indirect - golang.org/x/net v0.55.0 // indirect + golang.org/x/crypto v0.54.0 // indirect + golang.org/x/mod v0.37.0 // indirect + golang.org/x/net v0.56.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect - golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.45.0 // indirect - golang.org/x/term v0.43.0 // indirect - golang.org/x/text v0.37.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/term v0.45.0 // indirect + golang.org/x/text v0.40.0 // indirect golang.org/x/time v0.15.0 // indirect - golang.org/x/tools v0.45.0 // indirect + golang.org/x/tools v0.47.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260226221140-a57be14db171 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260427160629-7cedc36a6bc4 // indirect diff --git a/go.sum b/go.sum index 6e64d0d45..8929fc6ed 100644 --- a/go.sum +++ b/go.sum @@ -698,15 +698,15 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= -golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/crypto v0.54.0 h1:YLIA59K4fiNzHzjnZt2tUJQjQtUWfWbeHBqKtk3eScw= +golang.org/x/crypto v0.54.0/go.mod h1:KWL8ny2AZdGR2cWmzeHrp2azQPGogOv+HeQaVEXC2dk= golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4= -golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= +golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ= +golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -718,8 +718,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= -golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -727,8 +727,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -752,20 +752,20 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= -golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= -golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0= +golang.org/x/term v0.45.0/go.mod h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w= 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.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= -golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs= +golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -773,8 +773,8 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201211185031-d93e913c1a58/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= -golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= +golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q= +golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA= 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= From 2a5304112c5538b77179cf32c46cba2019862813 Mon Sep 17 00:00:00 2001 From: AlinsRan Date: Thu, 16 Jul 2026 07:13:46 +0800 Subject: [PATCH 3/9] fix: webhook validators panic on Gateway API 1.6 upgrade MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The controller-runtime v0.24 migration routed our runtime.Object-typed CustomValidators through the generic WithValidator[runtime.Object] path. That path builds the decode target from the generic type parameter, and reflect.TypeOf on a nil runtime.Object interface panics with a nil pointer dereference — so every admission request (e.g. creating a GatewayProxy) was denied with a panic, failing all webhook e2e setup. Use WithCustomValidator with the concrete apiType so the request decodes into the right type, and exclude its (cosmetic) SA1019 deprecation for the webhook package. --- .golangci.yml | 7 +++++++ internal/webhook/v1/apisixconsumer_webhook.go | 4 ++-- internal/webhook/v1/apisixroute_webhook.go | 4 ++-- internal/webhook/v1/apisixtls_webhook.go | 4 ++-- internal/webhook/v1/consumer_webhook.go | 4 ++-- internal/webhook/v1/gateway_webhook.go | 4 ++-- internal/webhook/v1/gatewayproxy_webhook.go | 4 ++-- internal/webhook/v1/grpcroute_webhook.go | 4 ++-- internal/webhook/v1/httproute_webhook.go | 4 ++-- internal/webhook/v1/ingress_webhook.go | 4 ++-- internal/webhook/v1/ingressclass_webhook.go | 4 ++-- internal/webhook/v1/tcproute_webhook.go | 4 ++-- internal/webhook/v1/udproute_webhook.go | 4 ++-- 13 files changed, 31 insertions(+), 24 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 62878d549..8c06a3774 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -73,6 +73,13 @@ linters: - linters: - staticcheck text: 'SA1019:.*corev1\.(Endpoints|EndpointSubset)' + # controller-runtime v0.24 deprecated WithCustomValidator in favour of the + # generic WithValidator, but that path decodes via the generic type and + # panics for our runtime.Object-typed CustomValidators; keep the working API. + - linters: + - staticcheck + text: "WithCustomValidator is deprecated" + path: internal/webhook/.* paths: - third_party$ - builtin$ diff --git a/internal/webhook/v1/apisixconsumer_webhook.go b/internal/webhook/v1/apisixconsumer_webhook.go index 82a25973c..af0c67501 100644 --- a/internal/webhook/v1/apisixconsumer_webhook.go +++ b/internal/webhook/v1/apisixconsumer_webhook.go @@ -35,8 +35,8 @@ import ( var apisixConsumerLog = logf.Log.WithName("apisixconsumer-resource") func SetupApisixConsumerWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &apisixv2.ApisixConsumer{}). - WithValidator(NewApisixConsumerCustomValidator(mgr.GetClient())). + return ctrl.NewWebhookManagedBy(mgr, &apisixv2.ApisixConsumer{}). + WithCustomValidator(NewApisixConsumerCustomValidator(mgr.GetClient())). Complete() } diff --git a/internal/webhook/v1/apisixroute_webhook.go b/internal/webhook/v1/apisixroute_webhook.go index 0b3d2fc12..0ce6560f4 100644 --- a/internal/webhook/v1/apisixroute_webhook.go +++ b/internal/webhook/v1/apisixroute_webhook.go @@ -34,8 +34,8 @@ import ( var apisixRouteLog = logf.Log.WithName("apisixroute-resource") func SetupApisixRouteWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &apisixv2.ApisixRoute{}). - WithValidator(NewApisixRouteCustomValidator(mgr.GetClient())). + return ctrl.NewWebhookManagedBy(mgr, &apisixv2.ApisixRoute{}). + WithCustomValidator(NewApisixRouteCustomValidator(mgr.GetClient())). Complete() } diff --git a/internal/webhook/v1/apisixtls_webhook.go b/internal/webhook/v1/apisixtls_webhook.go index bc72b7fda..44d0b5fed 100644 --- a/internal/webhook/v1/apisixtls_webhook.go +++ b/internal/webhook/v1/apisixtls_webhook.go @@ -35,8 +35,8 @@ import ( var apisixTlsLog = logf.Log.WithName("apisixtls-resource") func SetupApisixTlsWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &apisixv2.ApisixTls{}). - WithValidator(NewApisixTlsCustomValidator(mgr.GetClient())). + return ctrl.NewWebhookManagedBy(mgr, &apisixv2.ApisixTls{}). + WithCustomValidator(NewApisixTlsCustomValidator(mgr.GetClient())). Complete() } diff --git a/internal/webhook/v1/consumer_webhook.go b/internal/webhook/v1/consumer_webhook.go index 99aa03404..d511a5ea5 100644 --- a/internal/webhook/v1/consumer_webhook.go +++ b/internal/webhook/v1/consumer_webhook.go @@ -38,8 +38,8 @@ import ( var consumerLog = logf.Log.WithName("consumer-resource") func SetupConsumerWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &apisixv1alpha1.Consumer{}). - WithValidator(NewConsumerCustomValidator(mgr.GetClient())). + return ctrl.NewWebhookManagedBy(mgr, &apisixv1alpha1.Consumer{}). + WithCustomValidator(NewConsumerCustomValidator(mgr.GetClient())). Complete() } diff --git a/internal/webhook/v1/gateway_webhook.go b/internal/webhook/v1/gateway_webhook.go index 27dadb7ff..a47181f3f 100644 --- a/internal/webhook/v1/gateway_webhook.go +++ b/internal/webhook/v1/gateway_webhook.go @@ -41,8 +41,8 @@ var gatewaylog = logf.Log.WithName("gateway-resource") // SetupGatewayWebhookWithManager registers the webhook for Gateway in the manager. func SetupGatewayWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &gatewayv1.Gateway{}). - WithValidator(NewGatewayCustomValidator(mgr.GetClient())). + return ctrl.NewWebhookManagedBy(mgr, &gatewayv1.Gateway{}). + WithCustomValidator(NewGatewayCustomValidator(mgr.GetClient())). Complete() } diff --git a/internal/webhook/v1/gatewayproxy_webhook.go b/internal/webhook/v1/gatewayproxy_webhook.go index 412a3cf22..a8b9e5c42 100644 --- a/internal/webhook/v1/gatewayproxy_webhook.go +++ b/internal/webhook/v1/gatewayproxy_webhook.go @@ -35,8 +35,8 @@ import ( var gatewayProxyLog = logf.Log.WithName("gatewayproxy-resource") func SetupGatewayProxyWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &v1alpha1.GatewayProxy{}). - WithValidator(NewGatewayProxyCustomValidator(mgr.GetClient())). + return ctrl.NewWebhookManagedBy(mgr, &v1alpha1.GatewayProxy{}). + WithCustomValidator(NewGatewayProxyCustomValidator(mgr.GetClient())). Complete() } diff --git a/internal/webhook/v1/grpcroute_webhook.go b/internal/webhook/v1/grpcroute_webhook.go index a84cc6f05..91e8c5dcc 100644 --- a/internal/webhook/v1/grpcroute_webhook.go +++ b/internal/webhook/v1/grpcroute_webhook.go @@ -35,8 +35,8 @@ import ( var grpcRouteLog = logf.Log.WithName("grpcroute-resource") func SetupGRPCRouteWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &gatewayv1.GRPCRoute{}). - WithValidator(NewGRPCRouteCustomValidator(mgr.GetClient())). + return ctrl.NewWebhookManagedBy(mgr, &gatewayv1.GRPCRoute{}). + WithCustomValidator(NewGRPCRouteCustomValidator(mgr.GetClient())). Complete() } diff --git a/internal/webhook/v1/httproute_webhook.go b/internal/webhook/v1/httproute_webhook.go index 7a4d04ff5..ede956462 100644 --- a/internal/webhook/v1/httproute_webhook.go +++ b/internal/webhook/v1/httproute_webhook.go @@ -35,8 +35,8 @@ import ( var httpRouteLog = logf.Log.WithName("httproute-resource") func SetupHTTPRouteWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &gatewayv1.HTTPRoute{}). - WithValidator(NewHTTPRouteCustomValidator(mgr.GetClient())). + return ctrl.NewWebhookManagedBy(mgr, &gatewayv1.HTTPRoute{}). + WithCustomValidator(NewHTTPRouteCustomValidator(mgr.GetClient())). Complete() } diff --git a/internal/webhook/v1/ingress_webhook.go b/internal/webhook/v1/ingress_webhook.go index 326acc60a..4f4dbe5f7 100644 --- a/internal/webhook/v1/ingress_webhook.go +++ b/internal/webhook/v1/ingress_webhook.go @@ -36,8 +36,8 @@ var ingresslog = logf.Log.WithName("ingress-resource") // SetupIngressWebhookWithManager registers the webhook for Ingress in the manager. func SetupIngressWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &networkingv1.Ingress{}). - WithValidator(NewIngressCustomValidator(mgr.GetClient())). + return ctrl.NewWebhookManagedBy(mgr, &networkingv1.Ingress{}). + WithCustomValidator(NewIngressCustomValidator(mgr.GetClient())). Complete() } diff --git a/internal/webhook/v1/ingressclass_webhook.go b/internal/webhook/v1/ingressclass_webhook.go index 7829e0f8a..b63013baa 100644 --- a/internal/webhook/v1/ingressclass_webhook.go +++ b/internal/webhook/v1/ingressclass_webhook.go @@ -38,8 +38,8 @@ var ingressclasslog = logf.Log.WithName("ingressclass-resource") // SetupIngressClassWebhookWithManager registers the webhook for IngressClass in the manager. func SetupIngressClassWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &networkingv1.IngressClass{}). - WithValidator(&IngressClassCustomValidator{Client: mgr.GetClient()}). + return ctrl.NewWebhookManagedBy(mgr, &networkingv1.IngressClass{}). + WithCustomValidator(&IngressClassCustomValidator{Client: mgr.GetClient()}). Complete() } diff --git a/internal/webhook/v1/tcproute_webhook.go b/internal/webhook/v1/tcproute_webhook.go index fb0150e94..c2febbb2c 100644 --- a/internal/webhook/v1/tcproute_webhook.go +++ b/internal/webhook/v1/tcproute_webhook.go @@ -35,8 +35,8 @@ import ( var tcpRouteLog = logf.Log.WithName("tcproute-resource") func SetupTCPRouteWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &gatewayv1alpha2.TCPRoute{}). - WithValidator(NewTCPRouteCustomValidator(mgr.GetClient())). + return ctrl.NewWebhookManagedBy(mgr, &gatewayv1alpha2.TCPRoute{}). + WithCustomValidator(NewTCPRouteCustomValidator(mgr.GetClient())). Complete() } diff --git a/internal/webhook/v1/udproute_webhook.go b/internal/webhook/v1/udproute_webhook.go index bef723ab6..23376e113 100644 --- a/internal/webhook/v1/udproute_webhook.go +++ b/internal/webhook/v1/udproute_webhook.go @@ -35,8 +35,8 @@ import ( var udpRouteLog = logf.Log.WithName("udproute-resource") func SetupUDPRouteWebhookWithManager(mgr ctrl.Manager) error { - return ctrl.NewWebhookManagedBy[runtime.Object](mgr, &gatewayv1alpha2.UDPRoute{}). - WithValidator(NewUDPRouteCustomValidator(mgr.GetClient())). + return ctrl.NewWebhookManagedBy(mgr, &gatewayv1alpha2.UDPRoute{}). + WithCustomValidator(NewUDPRouteCustomValidator(mgr.GetClient())). Complete() } From e2a9587016a8a5ce9c567ae81ecf8ce6e587d4f3 Mon Sep 17 00:00:00 2001 From: AlinsRan Date: Thu, 16 Jul 2026 07:22:00 +0800 Subject: [PATCH 4/9] fix: add required Implementation.Contact to conformance report Gateway API v1.6 validates the conformance Implementation when a report output path is set, and now requires a non-empty Contact field. --- test/conformance/api7ee/conformance_test.go | 1 + test/conformance/conformance_test.go | 1 + 2 files changed, 2 insertions(+) diff --git a/test/conformance/api7ee/conformance_test.go b/test/conformance/api7ee/conformance_test.go index 627eb6758..a9572a9f2 100644 --- a/test/conformance/api7ee/conformance_test.go +++ b/test/conformance/api7ee/conformance_test.go @@ -44,6 +44,7 @@ func TestGatewayAPIConformance(t *testing.T) { Project: "apisix-ingress-controller", URL: "https://github.com/apache/apisix-ingress-controller.git", Version: "v2.0.0", + Contact: []string{"https://github.com/apache/apisix-ingress-controller/issues"}, } conformance.RunConformanceWithOptions(t, opts) diff --git a/test/conformance/conformance_test.go b/test/conformance/conformance_test.go index 636c7494f..e3e8fed1b 100644 --- a/test/conformance/conformance_test.go +++ b/test/conformance/conformance_test.go @@ -47,6 +47,7 @@ func TestGatewayAPIConformance(t *testing.T) { Project: "apisix-ingress-controller", URL: "https://github.com/apache/apisix-ingress-controller.git", Version: "v2.0.0", + Contact: []string{"https://github.com/apache/apisix-ingress-controller/issues"}, } conformance.RunConformanceWithOptions(t, opts) From f8c64f94158ad20e0f18cddd35b22b09ec0b5e67 Mon Sep 17 00:00:00 2001 From: AlinsRan Date: Thu, 16 Jul 2026 07:58:10 +0800 Subject: [PATCH 5/9] test: use Gateway-level frontendValidation in downstream mTLS e2e Gateway API v1.6 removed listener.tls.frontendValidation; the Gateway manifest in the downstream mTLS test now declares it under spec.tls.frontend.default.validation, matching the controller. --- test/e2e/gatewayapi/gateway.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/test/e2e/gatewayapi/gateway.go b/test/e2e/gatewayapi/gateway.go index e43979022..6057e8eeb 100644 --- a/test/e2e/gatewayapi/gateway.go +++ b/test/e2e/gatewayapi/gateway.go @@ -265,6 +265,8 @@ metadata: spec: controllerName: "%s" ` + // Gateway API v1.6 moved frontendValidation from the listener TLS config + // to the Gateway-level spec.tls.frontend. var defaultGateway = fmt.Sprintf(` apiVersion: gateway.networking.k8s.io/v1 kind: Gateway @@ -272,6 +274,14 @@ metadata: name: %s spec: gatewayClassName: %s + tls: + frontend: + default: + validation: + caCertificateRefs: + - kind: ConfigMap + group: "" + name: %s listeners: - name: http1 protocol: HTTPS @@ -282,17 +292,12 @@ spec: - kind: Secret group: "" name: %s - frontendValidation: - caCertificateRefs: - - kind: ConfigMap - group: "" - name: %s infrastructure: parametersRef: group: apisix.apache.org kind: GatewayProxy name: apisix-proxy-config -`, s.Namespace(), gatewayClassName, host, secretName, caConfigMapName) +`, s.Namespace(), gatewayClassName, caConfigMapName, host, secretName) By("create GatewayClass") err = s.CreateResourceFromStringWithNamespace(fmt.Sprintf(defaultGatewayClass, gatewayClassName, s.GetControllerName()), "") From 0a3442bc633df7d5a725c68cbe6792aaf353ed05 Mon Sep 17 00:00:00 2001 From: AlinsRan Date: Thu, 16 Jul 2026 08:51:35 +0800 Subject: [PATCH 6/9] fix: bump kind node image to k8s 1.32 for Gateway API 1.6 CRDs The api7 e2e/conformance workflows pin the kind node image via KIND_NODE_IMAGE, which overrode the kind v0.27 default; the pinned v1.30 node cannot compile the v1.6 CRDs' CEL rules (isIP, format). Pin v1.32.2 (kind v0.27.0's default) instead. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 4535e8269..d4dad5bff 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ IMG ?= api7/api7-ingress-controller:$(IMAGE_TAG) # ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary. ENVTEST_K8S_VERSION = 1.30.0 KIND_NAME ?= apisix-ingress-cluster -KIND_NODE_IMAGE ?= kindest/node:v1.30.0@sha256:047357ac0cfea04663786a612ba1eaba9702bef25227a794b52890dd8bcd692e +KIND_NODE_IMAGE ?= kindest/node:v1.32.2@sha256:f226345927d7e348497136874b6d207e0b32cc52154ad8323129352923a3142f DASHBOARD_VERSION ?= dev ADC_VERSION ?= 0.22.1 From cf43a47937b4eb6782cd8068a8dde5a6af37095a Mon Sep 17 00:00:00 2001 From: AlinsRan Date: Thu, 16 Jul 2026 09:05:45 +0800 Subject: [PATCH 7/9] test: force IPv4 for APISIX TCP tunnel endpoint terratest's Tunnel.Endpoint() returns localhost:, which resolves to ::1 first. The client-go port-forward does not reliably bind ::1, so raw TCP dials (MQTT client, net.Dial) in the stream/L4 tests fail with 'dial tcp [::1]: connection refused'. Force 127.0.0.1, which the port-forward always binds. --- test/e2e/scaffold/scaffold.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/test/e2e/scaffold/scaffold.go b/test/e2e/scaffold/scaffold.go index 45a4c96bb..84ef6c9fe 100644 --- a/test/e2e/scaffold/scaffold.go +++ b/test/e2e/scaffold/scaffold.go @@ -217,7 +217,7 @@ func (s *Scaffold) NewAPISIXClient() *httpexpect.Expect { func (s *Scaffold) NewAPISIXClientOnTCPPort() *httpexpect.Expect { u := url.URL{ Scheme: "http", - Host: s.apisixTunnels.TCP.Endpoint(), + Host: s.apisixTCPEndpoint(), } return httpexpect.WithConfig(httpexpect.Config{ BaseURL: u.String(), @@ -243,7 +243,15 @@ func (s *Scaffold) GetAPISIXHTTPSEndpoint() string { } func (s *Scaffold) GetAPISIXTCPEndpoint() string { - return s.apisixTunnels.TCP.Endpoint() + return s.apisixTCPEndpoint() +} + +// apisixTCPEndpoint returns the local TCP tunnel address forced to IPv4. +// terratest's Endpoint() yields "localhost:", which resolves to ::1 +// first; the client-go port-forward is not guaranteed to bind ::1, so raw TCP +// dials (e.g. the MQTT client, net.Dial) fail with "connection refused" on IPv6. +func (s *Scaffold) apisixTCPEndpoint() string { + return strings.Replace(s.apisixTunnels.TCP.Endpoint(), "localhost", "127.0.0.1", 1) } func (s *Scaffold) UpdateNamespace(ns string) { @@ -277,7 +285,7 @@ func (s *Scaffold) NewAPISIXHttpsClient(host string) *httpexpect.Expect { func (s *Scaffold) NewAPISIXClientWithTCPProxy() *httpexpect.Expect { u := url.URL{ Scheme: apiv2.SchemeHTTP, - Host: s.apisixTunnels.TCP.Endpoint(), + Host: s.apisixTCPEndpoint(), } return httpexpect.WithConfig(httpexpect.Config{ BaseURL: u.String(), From 6d34288f679358a198a28bcd075e0829c24bac8e Mon Sep 17 00:00:00 2001 From: AlinsRan Date: Thu, 16 Jul 2026 10:08:32 +0800 Subject: [PATCH 8/9] test: use WebSocket-capable port-forward for the TCP tunnel terratest's tunnel port-forwards over SPDY only. Kubernetes >= 1.31 is deprecating SPDY, and its tunnel tears down entirely on a single data-connection reset (which APISIX's stream proxy triggers by closing connections), breaking the raw-TCP/L4 e2e tests with 'connection refused' after the first request. Add a wsTunnel that port-forwards via client-go's WebSocket-over-SPDY fallback dialer (as kubectl does) and use it for the TCP stream port; HTTP/HTTPS/HTTP2/TLS tunnels are unchanged. Tunnels fields become an interface so both tunnel implementations satisfy them. --- go.mod | 2 +- test/e2e/scaffold/scaffold.go | 16 ++-- test/e2e/scaffold/tunnel.go | 148 ++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 9 deletions(-) create mode 100644 test/e2e/scaffold/tunnel.go diff --git a/go.mod b/go.mod index 511d62689..7424a518f 100644 --- a/go.mod +++ b/go.mod @@ -34,6 +34,7 @@ require ( k8s.io/apiserver v0.36.1 k8s.io/client-go v0.36.1 k8s.io/kubectl v0.36.1 + k8s.io/streaming v0.36.1 k8s.io/utils v0.0.0-20260319190234-28399d86e0b5 sigs.k8s.io/controller-runtime v0.24.1 sigs.k8s.io/gateway-api v1.6.0 @@ -251,7 +252,6 @@ require ( k8s.io/component-base v0.36.1 // indirect k8s.io/klog/v2 v2.140.0 // indirect k8s.io/kube-openapi v0.0.0-20260501160325-927ab1f70cd6 // indirect - k8s.io/streaming v0.36.1 // indirect moul.io/http2curl/v2 v2.3.0 // indirect oras.land/oras-go v1.2.5 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 // indirect diff --git a/test/e2e/scaffold/scaffold.go b/test/e2e/scaffold/scaffold.go index 84ef6c9fe..41ac85c74 100644 --- a/test/e2e/scaffold/scaffold.go +++ b/test/e2e/scaffold/scaffold.go @@ -86,11 +86,11 @@ type Scaffold struct { } type Tunnels struct { - HTTP *k8s.Tunnel - HTTPS *k8s.Tunnel - TCP *k8s.Tunnel - HTTP2 *k8s.Tunnel - TLS *k8s.Tunnel + HTTP Tunnel + HTTPS Tunnel + TCP Tunnel + HTTP2 Tunnel + TLS Tunnel } func (t *Tunnels) Close() { @@ -441,8 +441,6 @@ func (s *Scaffold) createDataplaneTunnels( 0, httpPort) httpsTunnel := k8s.NewTunnel(kubectlOpts, k8s.ResourceTypeService, serviceName, 0, httpsPort) - tcpTunnel := k8s.NewTunnel(kubectlOpts, k8s.ResourceTypeService, serviceName, - 0, tcpPort) http2Tunnel := k8s.NewTunnel(kubectlOpts, k8s.ResourceTypeService, serviceName, 0, http2Port) tlsTunnel := k8s.NewTunnel(kubectlOpts, k8s.ResourceTypeService, serviceName, @@ -458,7 +456,9 @@ func (s *Scaffold) createDataplaneTunnels( } tunnels.HTTPS = httpsTunnel - if err := tcpTunnel.ForwardPortE(s.t); err != nil { + // The raw-TCP stream port uses a WebSocket-capable tunnel; see wsTunnel. + tcpTunnel, err := newWebsocketServiceTunnel(s.t, kubectlOpts, serviceName, tcpPort) + if err != nil { return nil, err } tunnels.TCP = tcpTunnel diff --git a/test/e2e/scaffold/tunnel.go b/test/e2e/scaffold/tunnel.go new file mode 100644 index 000000000..3f1ebc5e0 --- /dev/null +++ b/test/e2e/scaffold/tunnel.go @@ -0,0 +1,148 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package scaffold + +import ( + "fmt" + "io" + "net/http" + + "github.com/gruntwork-io/terratest/modules/k8s" + "github.com/gruntwork-io/terratest/modules/testing" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/client-go/tools/portforward" + "k8s.io/client-go/transport/spdy" + "k8s.io/streaming/pkg/httpstream" +) + +// Tunnel is the subset of a port-forward tunnel used by the scaffold. +type Tunnel interface { + Endpoint() string + Close() +} + +// wsTunnel is a service port-forward that negotiates the connection over +// WebSockets first, falling back to SPDY. Kubernetes >= 1.31 apiservers are +// deprecating SPDY, and terratest's SPDY-only tunnel tears down completely on a +// single data-connection reset (common when APISIX's stream proxy closes a +// connection), which breaks the raw-TCP/L4 e2e tests. The WebSocket tunneling +// path is far more resilient, matching `kubectl port-forward`. +type wsTunnel struct { + localPort int + stopChan chan struct{} +} + +// Endpoint returns the local IPv4 address the tunnel listens on. +func (t *wsTunnel) Endpoint() string { return fmt.Sprintf("127.0.0.1:%d", t.localPort) } + +func (t *wsTunnel) Close() { + select { + case <-t.stopChan: + default: + close(t.stopChan) + } +} + +// newWebsocketServiceTunnel port-forwards servicePort of the named Service using a +// WebSocket-over-SPDY fallback dialer, and blocks until the tunnel is ready. +func newWebsocketServiceTunnel(t testing.TestingT, opts *k8s.KubectlOptions, serviceName string, servicePort int) (*wsTunnel, error) { + clientset, err := k8s.GetKubernetesClientFromOptionsE(t, opts) + if err != nil { + return nil, err + } + config := opts.RestConfig + if config == nil { + path, err := opts.GetConfigPath(t) + if err != nil { + return nil, err + } + if config, err = k8s.LoadApiClientConfigE(path, opts.ContextName); err != nil { + return nil, err + } + } + + // Resolve the Service to a ready pod and the pod-side target port. + service, err := k8s.GetServiceE(t, opts, serviceName) + if err != nil { + return nil, err + } + pods, err := k8s.ListPodsE(t, opts, metav1.ListOptions{ + LabelSelector: labels.SelectorFromSet(service.Spec.Selector).String(), + }) + if err != nil { + return nil, err + } + var podName string + for i := range pods { + if k8s.IsPodAvailable(&pods[i]) { + podName = pods[i].Name + break + } + } + if podName == "" { + return nil, fmt.Errorf("no available pod for service %s", serviceName) + } + targetPort := servicePort + for _, p := range service.Spec.Ports { + if int(p.Port) == servicePort { + if p.TargetPort.Type == intstr.Int { + targetPort = p.TargetPort.IntValue() + } + break + } + } + + localPort, err := k8s.GetAvailablePortE(t) + if err != nil { + return nil, err + } + + pfURL := clientset.CoreV1().RESTClient().Post(). + Resource("pods").Namespace(opts.Namespace).Name(podName). + SubResource("portforward").URL() + + spdyRT, upgrader, err := spdy.RoundTripperFor(config) + if err != nil { + return nil, err + } + spdyDialer := spdy.NewDialer(upgrader, &http.Client{Transport: spdyRT}, "POST", pfURL) + wsDialer, err := portforward.NewSPDYOverWebsocketDialer(pfURL, config) + if err != nil { + return nil, err + } + dialer := portforward.NewFallbackDialer(wsDialer, spdyDialer, func(err error) bool { + return httpstream.IsUpgradeFailure(err) || httpstream.IsHTTPSProxyError(err) + }) + + stopChan := make(chan struct{}) + readyChan := make(chan struct{}) + fw, err := portforward.New(dialer, []string{fmt.Sprintf("%d:%d", localPort, targetPort)}, stopChan, readyChan, io.Discard, io.Discard) + if err != nil { + return nil, err + } + errChan := make(chan error, 1) + go func() { errChan <- fw.ForwardPorts() }() + select { + case <-readyChan: + return &wsTunnel{localPort: localPort, stopChan: stopChan}, nil + case err := <-errChan: + return nil, fmt.Errorf("failed to establish port forward to service %s: %w", serviceName, err) + } +} From 4014fd0ba421ac77a4b2096879913d00ef7a115b Mon Sep 17 00:00:00 2001 From: AlinsRan Date: Thu, 16 Jul 2026 10:41:17 +0800 Subject: [PATCH 9/9] test: make the WebSocket TCP tunnel self-healing The WebSocket tunnel still dies when ForwardPorts returns (a transient drop or an APISIX pod restart), leaving the raw-TCP/L4 tests with 'connection refused'. Re-establish the forward (re-resolving the backing pod) whenever a session ends, keeping the local port listening; the tests' retry assertions then reconnect through the healed tunnel. --- test/e2e/scaffold/tunnel.go | 167 ++++++++++++++++++++++++++---------- 1 file changed, 120 insertions(+), 47 deletions(-) diff --git a/test/e2e/scaffold/tunnel.go b/test/e2e/scaffold/tunnel.go index 3f1ebc5e0..7b44c0214 100644 --- a/test/e2e/scaffold/tunnel.go +++ b/test/e2e/scaffold/tunnel.go @@ -21,12 +21,15 @@ import ( "fmt" "io" "net/http" + "time" "github.com/gruntwork-io/terratest/modules/k8s" "github.com/gruntwork-io/terratest/modules/testing" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" "k8s.io/client-go/tools/portforward" "k8s.io/client-go/transport/spdy" "k8s.io/streaming/pkg/httpstream" @@ -38,15 +41,25 @@ type Tunnel interface { Close() } -// wsTunnel is a service port-forward that negotiates the connection over -// WebSockets first, falling back to SPDY. Kubernetes >= 1.31 apiservers are -// deprecating SPDY, and terratest's SPDY-only tunnel tears down completely on a -// single data-connection reset (common when APISIX's stream proxy closes a -// connection), which breaks the raw-TCP/L4 e2e tests. The WebSocket tunneling -// path is far more resilient, matching `kubectl port-forward`. +// wsTunnel is a self-healing service port-forward that negotiates the connection +// over WebSockets first, falling back to SPDY. Two properties make it fit the +// raw-TCP/L4 e2e tests where terratest's SPDY-only tunnel is unreliable against +// Kubernetes >= 1.31: +// - WebSocket tunneling (as `kubectl port-forward` uses) survives data-connection +// resets that tear down a SPDY tunnel — APISIX's stream proxy triggers these by +// closing connections. +// - It re-establishes the forward (re-resolving the backing pod) whenever +// ForwardPorts returns, so the local port keeps listening across transient +// drops or an APISIX pod restart, instead of dying permanently. type wsTunnel struct { - localPort int - stopChan chan struct{} + t testing.TestingT + opts *k8s.KubectlOptions + clientset *kubernetes.Clientset + config *rest.Config + serviceName string + servicePort int + localPort int + stopChan chan struct{} } // Endpoint returns the local IPv4 address the tunnel listens on. @@ -60,34 +73,28 @@ func (t *wsTunnel) Close() { } } -// newWebsocketServiceTunnel port-forwards servicePort of the named Service using a -// WebSocket-over-SPDY fallback dialer, and blocks until the tunnel is ready. -func newWebsocketServiceTunnel(t testing.TestingT, opts *k8s.KubectlOptions, serviceName string, servicePort int) (*wsTunnel, error) { - clientset, err := k8s.GetKubernetesClientFromOptionsE(t, opts) - if err != nil { - return nil, err - } - config := opts.RestConfig - if config == nil { - path, err := opts.GetConfigPath(t) - if err != nil { - return nil, err - } - if config, err = k8s.LoadApiClientConfigE(path, opts.ContextName); err != nil { - return nil, err - } +func (t *wsTunnel) stopped() bool { + select { + case <-t.stopChan: + return true + default: + return false } +} - // Resolve the Service to a ready pod and the pod-side target port. - service, err := k8s.GetServiceE(t, opts, serviceName) +// forwardOnce establishes a single port-forward session and blocks until it ends +// (tunnel closed or a forwarding error). ready is closed once the local port is +// listening; it is only meaningful on the first successful call. +func (t *wsTunnel) forwardOnce(ready chan<- struct{}) error { + service, err := k8s.GetServiceE(t.t, t.opts, t.serviceName) if err != nil { - return nil, err + return err } - pods, err := k8s.ListPodsE(t, opts, metav1.ListOptions{ + pods, err := k8s.ListPodsE(t.t, t.opts, metav1.ListOptions{ LabelSelector: labels.SelectorFromSet(service.Spec.Selector).String(), }) if err != nil { - return nil, err + return err } var podName string for i := range pods { @@ -97,11 +104,11 @@ func newWebsocketServiceTunnel(t testing.TestingT, opts *k8s.KubectlOptions, ser } } if podName == "" { - return nil, fmt.Errorf("no available pod for service %s", serviceName) + return fmt.Errorf("no available pod for service %s", t.serviceName) } - targetPort := servicePort + targetPort := t.servicePort for _, p := range service.Spec.Ports { - if int(p.Port) == servicePort { + if int(p.Port) == t.servicePort { if p.TargetPort.Type == intstr.Int { targetPort = p.TargetPort.IntValue() } @@ -109,40 +116,106 @@ func newWebsocketServiceTunnel(t testing.TestingT, opts *k8s.KubectlOptions, ser } } - localPort, err := k8s.GetAvailablePortE(t) - if err != nil { - return nil, err - } - - pfURL := clientset.CoreV1().RESTClient().Post(). - Resource("pods").Namespace(opts.Namespace).Name(podName). + pfURL := t.clientset.CoreV1().RESTClient().Post(). + Resource("pods").Namespace(t.opts.Namespace).Name(podName). SubResource("portforward").URL() - spdyRT, upgrader, err := spdy.RoundTripperFor(config) + spdyRT, upgrader, err := spdy.RoundTripperFor(t.config) if err != nil { - return nil, err + return err } spdyDialer := spdy.NewDialer(upgrader, &http.Client{Transport: spdyRT}, "POST", pfURL) - wsDialer, err := portforward.NewSPDYOverWebsocketDialer(pfURL, config) + wsDialer, err := portforward.NewSPDYOverWebsocketDialer(pfURL, t.config) if err != nil { - return nil, err + return err } dialer := portforward.NewFallbackDialer(wsDialer, spdyDialer, func(err error) bool { return httpstream.IsUpgradeFailure(err) || httpstream.IsHTTPSProxyError(err) }) - stopChan := make(chan struct{}) readyChan := make(chan struct{}) - fw, err := portforward.New(dialer, []string{fmt.Sprintf("%d:%d", localPort, targetPort)}, stopChan, readyChan, io.Discard, io.Discard) + fw, err := portforward.New(dialer, []string{fmt.Sprintf("%d:%d", t.localPort, targetPort)}, t.stopChan, readyChan, io.Discard, io.Discard) if err != nil { - return nil, err + return err } errChan := make(chan error, 1) go func() { errChan <- fw.ForwardPorts() }() select { case <-readyChan: - return &wsTunnel{localPort: localPort, stopChan: stopChan}, nil + if ready != nil { + close(ready) + } + return <-errChan case err := <-errChan: + return err + } +} + +// newWebsocketServiceTunnel port-forwards servicePort of the named Service and +// keeps it alive until Close, re-establishing on failure. It blocks until the +// first session is ready. +func newWebsocketServiceTunnel(t testing.TestingT, opts *k8s.KubectlOptions, serviceName string, servicePort int) (*wsTunnel, error) { + clientset, err := k8s.GetKubernetesClientFromOptionsE(t, opts) + if err != nil { + return nil, err + } + config := opts.RestConfig + if config == nil { + path, err := opts.GetConfigPath(t) + if err != nil { + return nil, err + } + if config, err = k8s.LoadApiClientConfigE(path, opts.ContextName); err != nil { + return nil, err + } + } + localPort, err := k8s.GetAvailablePortE(t) + if err != nil { + return nil, err + } + + tunnel := &wsTunnel{ + t: t, + opts: opts, + clientset: clientset, + config: config, + serviceName: serviceName, + servicePort: servicePort, + localPort: localPort, + stopChan: make(chan struct{}), + } + + ready := make(chan struct{}) + firstErr := make(chan error, 1) + go func() { + first := true + for !tunnel.stopped() { + var r chan<- struct{} + if first { + r = ready + } + err := tunnel.forwardOnce(r) + if first { + select { + case <-ready: + // became ready at least once; from here on just keep healing + default: + firstErr <- err + return + } + first = false + } + if tunnel.stopped() { + return + } + time.Sleep(500 * time.Millisecond) + } + }() + + select { + case <-ready: + return tunnel, nil + case err := <-firstErr: return nil, fmt.Errorf("failed to establish port forward to service %s: %w", serviceName, err) } }